mirror of https://github.com/knative/func.git
				
				
				
			
		
			
				
	
	
		
			182 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Go
		
	
	
	
| package cmd_test
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"encoding/json"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"sort"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/ory/viper"
 | |
| 	fnCmd "knative.dev/func/cmd"
 | |
| 	fn "knative.dev/func/pkg/functions"
 | |
| )
 | |
| 
 | |
| func TestListEnvs(t *testing.T) {
 | |
| 	mock := newMockLoaderSaver()
 | |
| 	foo := "foo"
 | |
| 	bar := "bar"
 | |
| 	envs := []fn.Env{{Name: &foo, Value: &bar}}
 | |
| 	mock.load = func(path string) (fn.Function, error) {
 | |
| 		if path != "<path>" {
 | |
| 			t.Fatalf("bad path, got %q but expected <path>", path)
 | |
| 		}
 | |
| 		return fn.Function{Run: fn.RunSpec{Envs: envs}}, nil
 | |
| 	}
 | |
| 
 | |
| 	cmd := fnCmd.NewConfigCmd(mock, fnCmd.NewClient)
 | |
| 	cmd.SetArgs([]string{"envs", "-o=json", "--path=<path>"})
 | |
| 
 | |
| 	var buff bytes.Buffer
 | |
| 	cmd.SetOut(&buff)
 | |
| 	cmd.SetErr(&buff)
 | |
| 
 | |
| 	err := cmd.Execute()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	var data []fn.Env
 | |
| 	err = json.Unmarshal(buff.Bytes(), &data)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	if !envsEqual(envs, data) {
 | |
| 		t.Errorf("env mismatch, expedted %v but got %v", envs, data)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestListEnvAdd(t *testing.T) {
 | |
| 	// strings as vars so we can take address of them
 | |
| 	foo := "foo"
 | |
| 	bar := "bar"
 | |
| 	answer := "answer"
 | |
| 	fortyTwo := "42"
 | |
| 	configMapExpression := "{{ configMap:myMap }}"
 | |
| 
 | |
| 	mock := newMockLoaderSaver()
 | |
| 	mock.load = func(path string) (fn.Function, error) {
 | |
| 		return fn.Function{Run: fn.RunSpec{Envs: []fn.Env{{Name: &foo, Value: &bar}}}}, nil
 | |
| 	}
 | |
| 	var expectedEnvs []fn.Env
 | |
| 	mock.save = func(f fn.Function) error {
 | |
| 		if !envsEqual(expectedEnvs, f.Run.Envs) {
 | |
| 			return fmt.Errorf("unexpected envs: got %v but %v was expected", f.Run.Envs, expectedEnvs)
 | |
| 		}
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	expectedEnvs = []fn.Env{{Name: &foo, Value: &bar}, {Name: &answer, Value: &fortyTwo}}
 | |
| 	cmd := fnCmd.NewConfigCmd(mock, fnCmd.NewClient)
 | |
| 	cmd.SetArgs([]string{"envs", "add", "--name=answer", "--value=42"})
 | |
| 	cmd.SetOut(io.Discard)
 | |
| 	cmd.SetErr(io.Discard)
 | |
| 
 | |
| 	err := cmd.Execute()
 | |
| 	if err != nil {
 | |
| 		t.Error(err)
 | |
| 	}
 | |
| 
 | |
| 	viper.Reset()
 | |
| 	expectedEnvs = []fn.Env{{Name: &foo, Value: &bar}, {Name: nil, Value: &configMapExpression}}
 | |
| 	cmd = fnCmd.NewConfigCmd(mock, fnCmd.NewClient)
 | |
| 	cmd.SetArgs([]string{"envs", "add", "--value={{ configMap:myMap }}"})
 | |
| 	cmd.SetOut(io.Discard)
 | |
| 	cmd.SetErr(io.Discard)
 | |
| 
 | |
| 	err = cmd.Execute()
 | |
| 	if err != nil {
 | |
| 		t.Error(err)
 | |
| 	}
 | |
| 
 | |
| 	viper.Reset()
 | |
| 	cmd = fnCmd.NewConfigCmd(mock, fnCmd.NewClient)
 | |
| 	cmd.SetArgs([]string{"envs", "add", "--name=1", "--value=abc"})
 | |
| 	cmd.SetOut(io.Discard)
 | |
| 	cmd.SetErr(io.Discard)
 | |
| 
 | |
| 	err = cmd.Execute()
 | |
| 	if err == nil {
 | |
| 		t.Error("expected variable name error but got nil")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func envsEqual(a, b []fn.Env) bool {
 | |
| 	if len(a) != len(b) {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	strPtrEq := func(x, y *string) bool {
 | |
| 		switch {
 | |
| 		case x == nil && y == nil:
 | |
| 			return true
 | |
| 		case x != nil && y != nil:
 | |
| 			return *x == *y
 | |
| 		default:
 | |
| 			return false
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	strPtrLess := func(x, y *string) bool {
 | |
| 		switch {
 | |
| 		case x == nil && y == nil:
 | |
| 			return false
 | |
| 		case x != nil && y != nil:
 | |
| 			return *x < *y
 | |
| 		case x == nil:
 | |
| 			return true
 | |
| 		default:
 | |
| 			return false
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	lessForSlice := func(s []fn.Env) func(i, j int) bool {
 | |
| 		return func(i, j int) bool {
 | |
| 			x := s[i]
 | |
| 			y := s[j]
 | |
| 			if strPtrLess(x.Name, y.Name) {
 | |
| 				return true
 | |
| 			}
 | |
| 			return strPtrLess(x.Value, y.Value)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	sort.Slice(a, lessForSlice(a))
 | |
| 	sort.Slice(b, lessForSlice(b))
 | |
| 
 | |
| 	for i := range a {
 | |
| 		x := a[i]
 | |
| 		y := b[i]
 | |
| 		if !strPtrEq(x.Name, y.Name) || !strPtrEq(x.Value, y.Value) {
 | |
| 			return false
 | |
| 		}
 | |
| 	}
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| func newMockLoaderSaver() *mockLoaderSaver {
 | |
| 	return &mockLoaderSaver{
 | |
| 		load: func(path string) (fn.Function, error) {
 | |
| 			return fn.Function{}, nil
 | |
| 		},
 | |
| 		save: func(f fn.Function) error {
 | |
| 			return nil
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| type mockLoaderSaver struct {
 | |
| 	load func(path string) (fn.Function, error)
 | |
| 	save func(f fn.Function) error
 | |
| }
 | |
| 
 | |
| func (m mockLoaderSaver) Load(path string) (fn.Function, error) {
 | |
| 	return m.load(path)
 | |
| }
 | |
| 
 | |
| func (m mockLoaderSaver) Save(f fn.Function) error {
 | |
| 	return m.save(f)
 | |
| }
 |