201 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Go
		
	
	
	
package state
 | 
						|
 | 
						|
import (
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/google/go-cmp/cmp"
 | 
						|
)
 | 
						|
 | 
						|
func TestSelectReleasesWithOverrides(t *testing.T) {
 | 
						|
	type testcase struct {
 | 
						|
		subject  string
 | 
						|
		selector []string
 | 
						|
		want     []string
 | 
						|
	}
 | 
						|
 | 
						|
	testcases := []testcase{
 | 
						|
		{
 | 
						|
			subject:  "multiple OR selectors (nillable label first)",
 | 
						|
			selector: []string{"type=bar", "name=nolabel2", "name=nolabel1"},
 | 
						|
			want:     []string{"nolabel1", "nolabel2", "foo"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "multiple OR selectors (non-nillable label first)",
 | 
						|
			selector: []string{"name=foo", "type!=bar"},
 | 
						|
			want:     []string{"nolabel1", "nolabel2", "foo", "bar", "foobar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "multiple AND conditions (nillable label first)",
 | 
						|
			selector: []string{"type!=bar,name!=nolabel2"},
 | 
						|
			want:     []string{"nolabel1", "bar", "foobar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "multiple AND conditions (non-nillable label first)",
 | 
						|
			selector: []string{"name!=nolabel2,type!=bar"},
 | 
						|
			want:     []string{"nolabel1", "bar", "foobar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "inequality on nillable label",
 | 
						|
			selector: []string{"type!=bar"},
 | 
						|
			want:     []string{"nolabel1", "nolabel2", "bar", "foobar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "equality on nillable label",
 | 
						|
			selector: []string{"type=bar"},
 | 
						|
			want:     []string{"foo"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "inequality on non-nillable label",
 | 
						|
			selector: []string{"name!=nolabel1"},
 | 
						|
			want:     []string{"nolabel2", "foo", "bar", "foobar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "equality on non-nillable label",
 | 
						|
			selector: []string{"name=nolabel1"},
 | 
						|
			want:     []string{"nolabel1"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "equality on non-alphabetic character label",
 | 
						|
			selector: []string{"version=1.2/3"},
 | 
						|
			want:     []string{"bar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "equality on non-alphabetic character label",
 | 
						|
			selector: []string{"version=1.2.3+123"},
 | 
						|
			want:     []string{"foobar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "inequality on non-alphatetic character label",
 | 
						|
			selector: []string{"version!=1.2/3"},
 | 
						|
			want:     []string{"nolabel1", "nolabel2", "foo", "foobar"},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:  "inequality on non-alphatetic character label",
 | 
						|
			selector: []string{"version!=1.2.3+123"},
 | 
						|
			want:     []string{"nolabel1", "nolabel2", "foo", "bar"},
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	example := []byte(`releases:
 | 
						|
- name: nolabel1
 | 
						|
  namespace: kube-system
 | 
						|
  chart: stable/nolabel
 | 
						|
- name: nolabel2
 | 
						|
  namespace: default
 | 
						|
  chart: stable/nolabel
 | 
						|
- name: foo
 | 
						|
  namespace: kube-system
 | 
						|
  chart: stable/foo
 | 
						|
  labels:
 | 
						|
    type: bar
 | 
						|
- name: bar
 | 
						|
  namespace: kube-system
 | 
						|
  chart: stable/bar
 | 
						|
  labels:
 | 
						|
    version: 1.2/3
 | 
						|
- name: foobar
 | 
						|
  namespace: kube-system
 | 
						|
  chart: stable/bar
 | 
						|
  labels:
 | 
						|
    version: 1.2.3+123
 | 
						|
`)
 | 
						|
 | 
						|
	state := stateTestEnv{
 | 
						|
		Files: map[string]string{
 | 
						|
			"/helmfile.yaml": string(example),
 | 
						|
		},
 | 
						|
		WorkDir: "/",
 | 
						|
	}.MustLoadState(t, "/helmfile.yaml", "default")
 | 
						|
 | 
						|
	for _, tc := range testcases {
 | 
						|
		state.Selectors = tc.selector
 | 
						|
 | 
						|
		state.Releases = state.GetReleasesWithOverrides()
 | 
						|
 | 
						|
		rs, err := state.GetSelectedReleases(false)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatalf("%s %s: %v", tc.selector, tc.subject, err)
 | 
						|
		}
 | 
						|
 | 
						|
		var got []string
 | 
						|
 | 
						|
		for _, r := range rs {
 | 
						|
			got = append(got, r.Name)
 | 
						|
		}
 | 
						|
 | 
						|
		if d := cmp.Diff(tc.want, got); d != "" {
 | 
						|
			t.Errorf("%s %s: %s", tc.selector, tc.subject, d)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestSelectReleasesWithOverridesWithIncludedTransitives(t *testing.T) {
 | 
						|
	type testcase struct {
 | 
						|
		subject                string
 | 
						|
		selector               []string
 | 
						|
		want                   []string
 | 
						|
		includeTransitiveNeeds bool
 | 
						|
	}
 | 
						|
 | 
						|
	testcases := []testcase{
 | 
						|
		{
 | 
						|
			subject:                "include transitives",
 | 
						|
			selector:               []string{"name=serviceA"},
 | 
						|
			want:                   []string{"serviceA"},
 | 
						|
			includeTransitiveNeeds: false,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			subject:                "include transitives",
 | 
						|
			selector:               []string{"name=serviceA"},
 | 
						|
			want:                   []string{"serviceA", "serviceB", "serviceC"},
 | 
						|
			includeTransitiveNeeds: true,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	example := []byte(`releases:
 | 
						|
- name: serviceA
 | 
						|
  namespace: default
 | 
						|
  chart: stable/testchart
 | 
						|
  needs:
 | 
						|
    - serviceB
 | 
						|
- name: serviceB
 | 
						|
  namespace: default
 | 
						|
  chart: stable/testchart
 | 
						|
  needs:
 | 
						|
    - serviceC
 | 
						|
- name: serviceC
 | 
						|
  namespace: default
 | 
						|
  chart: stable/testchart
 | 
						|
- name: serviceD
 | 
						|
  namespace: default
 | 
						|
  chart: stable/testchart
 | 
						|
`)
 | 
						|
 | 
						|
	state := stateTestEnv{
 | 
						|
		Files: map[string]string{
 | 
						|
			"/helmfile.yaml": string(example),
 | 
						|
		},
 | 
						|
		WorkDir: "/",
 | 
						|
	}.MustLoadState(t, "/helmfile.yaml", "default")
 | 
						|
 | 
						|
	for _, tc := range testcases {
 | 
						|
		state.Selectors = tc.selector
 | 
						|
		state.Releases = state.GetReleasesWithOverrides()
 | 
						|
 | 
						|
		rs, err := state.GetSelectedReleases(tc.includeTransitiveNeeds)
 | 
						|
		if err != nil {
 | 
						|
			t.Fatalf("%s %s: %v", tc.selector, tc.subject, err)
 | 
						|
		}
 | 
						|
 | 
						|
		var got []string
 | 
						|
 | 
						|
		for _, r := range rs {
 | 
						|
			got = append(got, r.Name)
 | 
						|
		}
 | 
						|
 | 
						|
		if d := cmp.Diff(tc.want, got); d != "" {
 | 
						|
			t.Errorf("%s %s: %s", tc.selector, tc.subject, d)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |