github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/enable_test.go (about) 1 package cli 2 3 import ( 4 "fmt" 5 "strconv" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 10 "k8s.io/apimachinery/pkg/types" 11 12 "github.com/tilt-dev/tilt/internal/controllers/apis/uiresource" 13 "github.com/tilt-dev/tilt/internal/testutils/uiresourcebuilder" 14 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 15 "github.com/tilt-dev/tilt/pkg/model" 16 ) 17 18 func TestEnable(t *testing.T) { 19 for _, tc := range []struct { 20 name string 21 args []string 22 expectedEnabled []string 23 expectedError string 24 }{ 25 { 26 "normal", 27 []string{"disabled_b", "disabled_c"}, 28 []string{"enabled_a", "enabled_b", "enabled_c", "disabled_b", "disabled_c", "(Tiltfile)"}, 29 "", 30 }, 31 { 32 "only", 33 []string{"--only", "disabled_b"}, 34 []string{"disabled_b", "(Tiltfile)"}, 35 "", 36 }, 37 { 38 "all", 39 []string{"--all"}, 40 []string{"enabled_a", "enabled_b", "enabled_c", "disabled_a", "disabled_b", "disabled_c", "(Tiltfile)"}, 41 "", 42 }, 43 { 44 "all+names", 45 []string{"--all", "enabled_b"}, 46 nil, 47 "cannot use --all with resource names", 48 }, 49 { 50 "no names", 51 nil, 52 nil, 53 "must specify at least one resource", 54 }, 55 { 56 "nonexistent resource", 57 []string{"foo"}, 58 nil, 59 "no such resource \"foo\"", 60 }, 61 { 62 "labels", 63 []string{"--labels", "a,b"}, 64 []string{"enabled_a", "enabled_b", "enabled_c", "disabled_a", "disabled_b", "(Tiltfile)"}, 65 "", 66 }, 67 { 68 "Tiltfile", 69 []string{"(Tiltfile)"}, 70 nil, 71 "(Tiltfile) cannot be enabled or disabled", 72 }, 73 } { 74 t.Run(tc.name, func(t *testing.T) { 75 f := newEnableFixture(t) 76 77 f.createResources() 78 79 cmd := enableCmd{} 80 c := cmd.register() 81 err := c.Flags().Parse(tc.args) 82 require.NoError(t, err) 83 err = cmd.run(f.ctx, c.Flags().Args()) 84 if tc.expectedError != "" { 85 require.Error(t, err) 86 require.Contains(t, err.Error(), tc.expectedError) 87 // if there's an error, the set of enabled resources shouldn't change 88 tc.expectedEnabled = []string{"enabled_a", "enabled_b", "enabled_c", "(Tiltfile)"} 89 } else { 90 require.NoError(t, err) 91 } 92 93 require.ElementsMatch(t, tc.expectedEnabled, f.enabledResources()) 94 }) 95 } 96 } 97 98 type enableFixture struct { 99 *serverFixture 100 } 101 102 func newEnableFixture(t *testing.T) enableFixture { 103 return enableFixture{newServerFixture(t)} 104 } 105 106 // makes 7 resources: enabled_a, enabled_b, enabled_c, disabled_a, disabled_b, disabled_c, (Tiltfile) 107 // The first six are initially enabled/disabled according to their names 108 // (Tiltfile) is always enabled 109 func (f enableFixture) createResources() { 110 for _, isDisabled := range []bool{true, false} { 111 for _, n := range []string{"a", "b", "c"} { 112 name := fmt.Sprintf("enabled_%s", n) 113 if isDisabled { 114 name = fmt.Sprintf("disabled_%s", n) 115 } 116 117 source := v1alpha1.DisableSource{ 118 ConfigMap: &v1alpha1.ConfigMapDisableSource{ 119 Name: fmt.Sprintf("disable-%s", name), 120 Key: "isDisabled", 121 }, 122 } 123 124 uir := uiresourcebuilder.New(name).WithDisableSource(source).WithLabel(n).Build() 125 err := f.client.Create(f.ctx, uir) 126 require.NoError(f.T(), err) 127 128 cm := v1alpha1.ConfigMap{ 129 ObjectMeta: metav1.ObjectMeta{Name: source.ConfigMap.Name}, 130 Data: map[string]string{source.ConfigMap.Key: strconv.FormatBool(isDisabled)}, 131 } 132 err = f.client.Create(f.ctx, &cm) 133 require.NoError(f.T(), err) 134 } 135 } 136 137 uir := uiresourcebuilder.New(string(model.MainTiltfileManifestName)).Build() 138 err := f.client.Create(f.ctx, uir) 139 require.NoError(f.T(), err) 140 } 141 142 func (f enableFixture) enabledResources() []string { 143 var result []string 144 145 var uirs v1alpha1.UIResourceList 146 err := f.client.List(f.ctx, &uirs) 147 require.NoError(f.T(), err) 148 for _, uir := range uirs.Items { 149 drs, err := uiresource.DisableResourceStatus(func(name string) (v1alpha1.ConfigMap, error) { 150 var cm v1alpha1.ConfigMap 151 err := f.client.Get(f.ctx, types.NamespacedName{Name: name}, &cm) 152 return cm, err 153 }, uir.Status.DisableStatus.Sources) 154 require.NoError(f.T(), err) 155 156 if drs.State == v1alpha1.DisableStateEnabled { 157 result = append(result, uir.Name) 158 } 159 } 160 161 return result 162 }