Golang's template package now has an option for failing if template variables are missing: https://golang.org/pkg/text/template/#Template.Option This updates the templater code to make use of that option and return the errors encountered during templating. This fixes #1
		
			
				
	
	
		
			155 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package templater
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/tazjin/kontemplate/context"
 | 
						|
	"reflect"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
func TestApplyNoLimits(t *testing.T) {
 | 
						|
	resources := []context.ResourceSet{
 | 
						|
		{
 | 
						|
			Name: "testResourceSet1",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name: "testResourceSet2",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	result := applyLimits(&resources, &[]string{}, &[]string{})
 | 
						|
 | 
						|
	if !reflect.DeepEqual(resources, *result) {
 | 
						|
		t.Error("Resource set slice changed, but shouldn't have.")
 | 
						|
		t.Errorf("Expected: %v\nResult: %v\n", resources, *result)
 | 
						|
		t.Fail()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestApplyIncludeLimits(t *testing.T) {
 | 
						|
	resources := []context.ResourceSet{
 | 
						|
		{
 | 
						|
			Name: "testResourceSet1",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name: "testResourceSet2",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:   "testResourceSet3",
 | 
						|
			Parent: "included",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	includes := []string{"testResourceSet1", "included"}
 | 
						|
 | 
						|
	result := applyLimits(&resources, &includes, &[]string{})
 | 
						|
 | 
						|
	expected := []context.ResourceSet{
 | 
						|
		{
 | 
						|
			Name: "testResourceSet1",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:   "testResourceSet3",
 | 
						|
			Parent: "included",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	if !reflect.DeepEqual(expected, *result) {
 | 
						|
		t.Error("Result does not contain expected resource sets.")
 | 
						|
		t.Errorf("Expected: %v\nResult: %v\n", expected, *result)
 | 
						|
		t.Fail()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestApplyExcludeLimits(t *testing.T) {
 | 
						|
	resources := []context.ResourceSet{
 | 
						|
		{
 | 
						|
			Name: "testResourceSet1",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name: "testResourceSet2",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:   "testResourceSet3",
 | 
						|
			Parent: "included",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	exclude := []string{"testResourceSet2"}
 | 
						|
 | 
						|
	result := applyLimits(&resources, &[]string{}, &exclude)
 | 
						|
 | 
						|
	expected := []context.ResourceSet{
 | 
						|
		{
 | 
						|
			Name: "testResourceSet1",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:   "testResourceSet3",
 | 
						|
			Parent: "included",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	if !reflect.DeepEqual(expected, *result) {
 | 
						|
		t.Error("Result does not contain expected resource sets.")
 | 
						|
		t.Errorf("Expected: %v\nResult: %v\n", expected, *result)
 | 
						|
		t.Fail()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestApplyLimitsExcludeIncludePrecedence(t *testing.T) {
 | 
						|
	resources := []context.ResourceSet{
 | 
						|
		{
 | 
						|
			Name:   "collection/nested1",
 | 
						|
			Parent: "collection",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:   "collection/nested2",
 | 
						|
			Parent: "collection",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:   "collection/nested3",
 | 
						|
			Parent: "collection",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name: "something-else",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	include := []string{"collection"}
 | 
						|
	exclude := []string{"collection/nested2"}
 | 
						|
 | 
						|
	result := applyLimits(&resources, &include, &exclude)
 | 
						|
 | 
						|
	expected := []context.ResourceSet{
 | 
						|
		{
 | 
						|
			Name:   "collection/nested1",
 | 
						|
			Parent: "collection",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:   "collection/nested3",
 | 
						|
			Parent: "collection",
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	if !reflect.DeepEqual(expected, *result) {
 | 
						|
		t.Error("Result does not contain expected resource sets.")
 | 
						|
		t.Errorf("Expected: %v\nResult: %v\n", expected, *result)
 | 
						|
		t.Fail()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestFailOnMissingKeys(t *testing.T) {
 | 
						|
	ctx := context.Context{}
 | 
						|
	resourceSet := context.ResourceSet{}
 | 
						|
 | 
						|
	_, err := templateFile(&ctx, &resourceSet, "testdata/test-template.txt")
 | 
						|
 | 
						|
	if err == nil {
 | 
						|
		t.Errorf("Template with missing keys should have failed.\n")
 | 
						|
		t.Fail()
 | 
						|
	}
 | 
						|
 | 
						|
	if !strings.Contains(err.Error(), "map has no entry for key \"testName\"") {
 | 
						|
		t.Errorf("Templating failed with unexpected error: %v\n", err)
 | 
						|
	}
 | 
						|
}
 |