github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/controllers/apis/configmap/disable_test.go (about) 1 package configmap 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 9 "k8s.io/apimachinery/pkg/types" 10 "k8s.io/utils/pointer" 11 ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" 12 13 "github.com/tilt-dev/tilt/internal/controllers/fake" 14 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 15 ) 16 17 const configMapName = "fe-disable" 18 const configMap2Name = "be-disable" 19 const key = "isDisabled" 20 21 func TestMaybeNewDisableStatusNoSource(t *testing.T) { 22 f := newDisableFixture(t) 23 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, nil, nil) 24 require.NoError(t, err) 25 require.NotNil(t, newStatus) 26 require.Equal(t, false, newStatus.Disabled) 27 require.Equal(t, v1alpha1.DisableStateEnabled, newStatus.State) 28 require.Contains(t, newStatus.Reason, "does not specify a DisableSource") 29 } 30 31 func TestMaybeNewDisableStatusNoConfigMapDisableSource(t *testing.T) { 32 f := newDisableFixture(t) 33 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, &v1alpha1.DisableSource{}, nil) 34 require.NoError(t, err) 35 require.NotNil(t, newStatus) 36 require.Equal(t, true, newStatus.Disabled) 37 require.Equal(t, v1alpha1.DisableStateError, newStatus.State) 38 require.Contains(t, newStatus.Reason, "specifies no valid sources") 39 } 40 41 func TestMaybeNewDisableStatusNoConfigMap(t *testing.T) { 42 f := newDisableFixture(t) 43 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil) 44 require.NoError(t, err) 45 require.NotNil(t, newStatus) 46 require.Equal(t, true, newStatus.Disabled) 47 require.Equal(t, v1alpha1.DisableStatePending, newStatus.State) 48 require.Contains(t, newStatus.Reason, "ConfigMap \"fe-disable\" does not exist") 49 } 50 51 func TestMaybeNewDisableStatusNoKey(t *testing.T) { 52 f := newDisableFixture(t) 53 f.createConfigMap(nil) 54 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil) 55 require.NoError(t, err) 56 require.NotNil(t, newStatus) 57 require.Equal(t, true, newStatus.Disabled) 58 require.Equal(t, v1alpha1.DisableStateError, newStatus.State) 59 require.Contains(t, newStatus.Reason, "has no key") 60 } 61 62 func TestMaybeNewDisableStatusTrue(t *testing.T) { 63 f := newDisableFixture(t) 64 f.createConfigMap(pointer.StringPtr("true")) 65 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil) 66 require.NoError(t, err) 67 require.NotNil(t, newStatus) 68 require.Equal(t, true, newStatus.Disabled) 69 require.Equal(t, v1alpha1.DisableStateDisabled, newStatus.State) 70 require.Contains(t, newStatus.Reason, "is true") 71 } 72 73 func TestMaybeNewDisableStatusFalse(t *testing.T) { 74 f := newDisableFixture(t) 75 f.createConfigMap(pointer.StringPtr("false")) 76 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil) 77 require.NoError(t, err) 78 require.NotNil(t, newStatus) 79 require.Equal(t, false, newStatus.Disabled) 80 require.Equal(t, v1alpha1.DisableStateEnabled, newStatus.State) 81 require.Contains(t, newStatus.Reason, "is false") 82 } 83 84 func TestMaybeNewDisableStatusEveryTrue(t *testing.T) { 85 f := newDisableFixture(t) 86 f.createConfigMapNamed(configMapName, pointer.StringPtr("true")) 87 f.createConfigMapNamed(configMap2Name, pointer.StringPtr("true")) 88 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, everyDisableSource(), nil) 89 require.NoError(t, err) 90 require.NotNil(t, newStatus) 91 require.Equal(t, true, newStatus.Disabled) 92 require.Equal(t, v1alpha1.DisableStateDisabled, newStatus.State) 93 require.Contains(t, newStatus.Reason, "Every ConfigMap disabled") 94 } 95 96 func TestMaybeNewDisableStatusEveryMixed(t *testing.T) { 97 f := newDisableFixture(t) 98 f.createConfigMapNamed(configMapName, pointer.StringPtr("true")) 99 f.createConfigMapNamed(configMap2Name, pointer.StringPtr("false")) 100 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, everyDisableSource(), nil) 101 require.NoError(t, err) 102 require.NotNil(t, newStatus) 103 require.Equal(t, false, newStatus.Disabled) 104 require.Equal(t, v1alpha1.DisableStateEnabled, newStatus.State) 105 require.Contains(t, newStatus.Reason, "is false") 106 } 107 108 func TestMaybeNewDisableStatusGobbledygookValue(t *testing.T) { 109 f := newDisableFixture(t) 110 f.createConfigMap(pointer.StringPtr("asdf")) 111 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil) 112 require.NoError(t, err) 113 require.NotNil(t, newStatus) 114 require.Equal(t, true, newStatus.Disabled) 115 require.Equal(t, v1alpha1.DisableStateError, newStatus.State) 116 require.Contains(t, newStatus.Reason, "strconv.ParseBool: parsing \"asdf\"") 117 } 118 119 func TestMaybeNewDisableStatusNoChange(t *testing.T) { 120 f := newDisableFixture(t) 121 f.createConfigMap(pointer.StringPtr("false")) 122 status, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil) 123 require.NoError(t, err) 124 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), status) 125 require.NoError(t, err) 126 require.Same(t, status, newStatus) 127 } 128 129 func TestMaybeNewDisableStatusChange(t *testing.T) { 130 f := newDisableFixture(t) 131 f.createConfigMap(pointer.StringPtr("false")) 132 status, err := MaybeNewDisableStatus( 133 f.ctx, 134 f.fc, 135 disableSource(), 136 nil, 137 ) 138 require.NoError(t, err) 139 f.updateConfigMap(pointer.StringPtr("true")) 140 newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), status) 141 require.NoError(t, err) 142 require.NotSame(t, status, newStatus) 143 } 144 145 type disableFixture struct { 146 t *testing.T 147 fc ctrlclient.Client 148 ctx context.Context 149 } 150 151 func (f *disableFixture) createConfigMap(isDisabled *string) { 152 f.createConfigMapNamed(configMapName, isDisabled) 153 } 154 155 func (f *disableFixture) createConfigMapNamed(name string, isDisabled *string) { 156 m := make(map[string]string) 157 if isDisabled != nil { 158 m[key] = *isDisabled 159 } 160 err := f.fc.Create(f.ctx, &v1alpha1.ConfigMap{ 161 ObjectMeta: metav1.ObjectMeta{ 162 Name: name, 163 }, 164 Data: m, 165 }) 166 167 require.NoError(f.t, err) 168 } 169 170 func (f *disableFixture) updateConfigMap(isDisabled *string) { 171 m := make(map[string]string) 172 if isDisabled != nil { 173 m[key] = *isDisabled 174 } 175 var cm v1alpha1.ConfigMap 176 err := f.fc.Get(f.ctx, types.NamespacedName{Name: configMapName}, &cm) 177 require.NoError(f.t, err) 178 179 cm.Data = m 180 err = f.fc.Update(f.ctx, &cm) 181 require.NoError(f.t, err) 182 } 183 184 func disableSource() *v1alpha1.DisableSource { 185 return &v1alpha1.DisableSource{ 186 ConfigMap: &v1alpha1.ConfigMapDisableSource{ 187 Name: configMapName, 188 Key: key, 189 }, 190 } 191 } 192 193 func everyDisableSource() *v1alpha1.DisableSource { 194 return &v1alpha1.DisableSource{ 195 EveryConfigMap: []v1alpha1.ConfigMapDisableSource{ 196 { 197 Name: configMapName, 198 Key: key, 199 }, 200 { 201 Name: configMap2Name, 202 Key: key, 203 }, 204 }, 205 } 206 } 207 208 func newDisableFixture(t *testing.T) *disableFixture { 209 fc := fake.NewFakeTiltClient() 210 ctx := context.Background() 211 return &disableFixture{ 212 t: t, 213 fc: fc, 214 ctx: ctx, 215 } 216 }