github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/v1alpha1/plugin_test.go (about) 1 package v1alpha1 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 9 "k8s.io/apimachinery/pkg/labels" 10 11 "github.com/tilt-dev/tilt/internal/k8s" 12 "github.com/tilt-dev/tilt/internal/tiltfile/starkit" 13 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 14 ) 15 16 func TestExtension(t *testing.T) { 17 f := newFixture(t) 18 19 f.File("Tiltfile", ` 20 v1alpha1.extension_repo(name='default', url='https://github.com/tilt-dev/tilt-extensions', ref='HEAD') 21 v1alpha1.extension(name='cancel', repo_name='default', repo_path='cancel') 22 `) 23 result, err := f.ExecFile("Tiltfile") 24 require.NoError(t, err) 25 26 set := MustState(result) 27 28 repo := set.GetSetForType(&v1alpha1.ExtensionRepo{})["default"].(*v1alpha1.ExtensionRepo) 29 require.NotNil(t, repo) 30 require.Equal(t, "https://github.com/tilt-dev/tilt-extensions", repo.Spec.URL) 31 require.Equal(t, "HEAD", repo.Spec.Ref) 32 33 ext := set.GetSetForType(&v1alpha1.Extension{})["cancel"].(*v1alpha1.Extension) 34 require.NotNil(t, ext) 35 require.Equal(t, "default", ext.Spec.RepoName) 36 } 37 38 func TestExtensionRepoTwice(t *testing.T) { 39 f := newFixture(t) 40 41 // Some teams include a team extension repo in each tiltfile. It's OK as long as they match. 42 f.File("Tiltfile", ` 43 v1alpha1.extension_repo(name='default', url='https://github.com/tilt-dev/tilt-extensions') 44 v1alpha1.extension_repo(name='default', url='https://github.com/tilt-dev/tilt-extensions') 45 `) 46 result, err := f.ExecFile("Tiltfile") 47 require.NoError(t, err) 48 49 set := MustState(result) 50 51 repo := set.GetSetForType(&v1alpha1.ExtensionRepo{})["default"].(*v1alpha1.ExtensionRepo) 52 require.NotNil(t, repo) 53 require.Equal(t, "https://github.com/tilt-dev/tilt-extensions", repo.Spec.URL) 54 } 55 56 func TestExtensionArgs(t *testing.T) { 57 f := newFixture(t) 58 59 f.File("Tiltfile", ` 60 v1alpha1.extension_repo(name='default', url='https://github.com/tilt-dev/tilt-extensions') 61 v1alpha1.extension(name='cancel', repo_name='default', repo_path='cancel', args=['--namespace=foo']) 62 `) 63 result, err := f.ExecFile("Tiltfile") 64 require.NoError(t, err) 65 66 set := MustState(result) 67 68 ext := set.GetSetForType(&v1alpha1.Extension{})["cancel"].(*v1alpha1.Extension) 69 require.NotNil(t, ext) 70 require.Equal(t, []string{"--namespace=foo"}, ext.Spec.Args) 71 } 72 73 func TestExtensionValidation(t *testing.T) { 74 f := newFixture(t) 75 76 f.File("Tiltfile", ` 77 v1alpha1.extension_repo(name='default', url='ftp://github.com/tilt-dev/tilt-extensions') 78 `) 79 _, err := f.ExecFile("Tiltfile") 80 require.Error(t, err) 81 require.Contains(t, err.Error(), "URLs must start with http(s):// or file://") 82 } 83 84 func TestFileWatchAsDict(t *testing.T) { 85 f := newFixture(t) 86 87 f.File("Tiltfile", ` 88 v1alpha1.file_watch(name='my-fw', watched_paths=['./dir'], ignores=[{'base_path': './dir/ignore', 'patterns': ['**']}]) 89 `) 90 result, err := f.ExecFile("Tiltfile") 91 require.NoError(t, err) 92 93 set := MustState(result) 94 95 fw := set.GetSetForType(&v1alpha1.FileWatch{})["my-fw"].(*v1alpha1.FileWatch) 96 require.NotNil(t, fw) 97 require.Equal(t, fw.Spec, v1alpha1.FileWatchSpec{ 98 WatchedPaths: []string{f.JoinPath("dir")}, 99 Ignores: []v1alpha1.IgnoreDef{ 100 v1alpha1.IgnoreDef{ 101 BasePath: f.JoinPath("dir", "ignore"), 102 Patterns: []string{"**"}, 103 }, 104 }, 105 }) 106 } 107 108 func TestFileWatchDisableOn(t *testing.T) { 109 f := newFixture(t) 110 111 f.File("Tiltfile", ` 112 v1alpha1.file_watch(name='my-fw', 113 watched_paths=['./dir'], 114 disable_source={'config_map':{'name':'my-fw','key':'disabled'}}) 115 `) 116 result, err := f.ExecFile("Tiltfile") 117 require.NoError(t, err) 118 119 set := MustState(result) 120 121 fw := set.GetSetForType(&v1alpha1.FileWatch{})["my-fw"].(*v1alpha1.FileWatch) 122 require.NotNil(t, fw) 123 require.Equal(t, fw.Spec, v1alpha1.FileWatchSpec{ 124 WatchedPaths: []string{f.JoinPath("dir")}, 125 DisableSource: &v1alpha1.DisableSource{ 126 ConfigMap: &v1alpha1.ConfigMapDisableSource{ 127 Name: "my-fw", 128 Key: "disabled", 129 }, 130 }, 131 }) 132 } 133 134 func TestFileWatchWithIgnoreBuiltin(t *testing.T) { 135 f := newFixture(t) 136 137 f.File("Tiltfile", ` 138 v1alpha1.file_watch( 139 name='my-fw', 140 watched_paths=['./dir'], 141 ignores=[v1alpha1.ignore_def(base_path='./dir/ignore', patterns=['**'])]) 142 `) 143 result, err := f.ExecFile("Tiltfile") 144 require.NoError(t, err) 145 146 set := MustState(result) 147 148 fw := set.GetSetForType(&v1alpha1.FileWatch{})["my-fw"].(*v1alpha1.FileWatch) 149 require.NotNil(t, fw) 150 require.Equal(t, fw.Spec, v1alpha1.FileWatchSpec{ 151 WatchedPaths: []string{f.JoinPath("dir")}, 152 Ignores: []v1alpha1.IgnoreDef{ 153 v1alpha1.IgnoreDef{ 154 BasePath: f.JoinPath("dir", "ignore"), 155 Patterns: []string{"**"}, 156 }, 157 }, 158 }) 159 } 160 161 func TestCmdDefaultDir(t *testing.T) { 162 f := newFixture(t) 163 164 f.File("Tiltfile", ` 165 v1alpha1.cmd( 166 name='my-cmd', 167 args=['echo', 'hello']) 168 `) 169 result, err := f.ExecFile("Tiltfile") 170 require.NoError(t, err) 171 172 set := MustState(result) 173 174 cmd := set.GetSetForType(&v1alpha1.Cmd{})["my-cmd"].(*v1alpha1.Cmd) 175 require.NotNil(t, cmd) 176 require.Equal(t, cmd.Spec, v1alpha1.CmdSpec{ 177 Args: []string{"echo", "hello"}, 178 Dir: f.Path(), 179 }) 180 } 181 182 func TestUIButton(t *testing.T) { 183 f := newFixture(t) 184 185 f.File("Tiltfile", ` 186 v1alpha1.ui_button( 187 name='my-button', 188 annotations={'tilt.dev/resource': 'fe', 'tilt.dev/log-span-id': 'fe'}, 189 text='hello world', 190 icon_name='circle', 191 location={'component_type': 'resource', 'component_id': 'fe'}) 192 `) 193 result, err := f.ExecFile("Tiltfile") 194 require.NoError(t, err) 195 196 set := MustState(result) 197 198 obj := set.GetSetForType(&v1alpha1.UIButton{})["my-button"].(*v1alpha1.UIButton) 199 require.NotNil(t, obj) 200 require.Equal(t, obj, &v1alpha1.UIButton{ 201 ObjectMeta: metav1.ObjectMeta{ 202 Name: "my-button", 203 Annotations: map[string]string{"tilt.dev/resource": "fe", "tilt.dev/log-span-id": "fe"}, 204 }, 205 Spec: v1alpha1.UIButtonSpec{ 206 Text: "hello world", 207 IconName: "circle", 208 Location: v1alpha1.UIComponentLocation{ComponentType: "resource", ComponentID: "fe"}, 209 }, 210 }) 211 } 212 213 func TestKubernetesDiscoveryu(t *testing.T) { 214 f := newFixture(t) 215 216 f.File("Tiltfile", ` 217 v1alpha1.kubernetes_discovery( 218 name='my-discovery', 219 annotations={'tilt.dev/resource': 'fe'}, 220 extra_selectors=[{'match_labels': {'app': 'fe'}}]) 221 `) 222 result, err := f.ExecFile("Tiltfile") 223 require.NoError(t, err) 224 225 set := MustState(result) 226 227 obj := set.GetSetForType(&v1alpha1.KubernetesDiscovery{})["my-discovery"].(*v1alpha1.KubernetesDiscovery) 228 require.NotNil(t, obj) 229 require.Equal(t, obj, &v1alpha1.KubernetesDiscovery{ 230 ObjectMeta: metav1.ObjectMeta{ 231 Name: "my-discovery", 232 Annotations: map[string]string{"tilt.dev/resource": "fe"}, 233 }, 234 Spec: v1alpha1.KubernetesDiscoverySpec{ 235 ExtraSelectors: k8s.SetsAsLabelSelectors([]labels.Set{{"app": "fe"}}), 236 }, 237 }) 238 } 239 240 func TestConfigMap(t *testing.T) { 241 f := newFixture(t) 242 243 f.File("Tiltfile", ` 244 v1alpha1.config_map( 245 name='my-config', 246 labels={'bar': 'baz'}, 247 data={'foo': 'bar'}) 248 `) 249 result, err := f.ExecFile("Tiltfile") 250 require.NoError(t, err) 251 252 set := MustState(result) 253 254 obj := set.GetSetForType(&v1alpha1.ConfigMap{})["my-config"].(*v1alpha1.ConfigMap) 255 require.NotNil(t, obj) 256 require.Equal(t, obj, &v1alpha1.ConfigMap{ 257 ObjectMeta: metav1.ObjectMeta{ 258 Name: "my-config", 259 Labels: map[string]string{"bar": "baz"}, 260 }, 261 Data: map[string]string{"foo": "bar"}, 262 }) 263 } 264 265 func TestKubernetesApply(t *testing.T) { 266 f := newFixture(t) 267 268 f.File("Tiltfile", ` 269 270 config=""" 271 apiVersion: v1 272 kind: ConfigMap 273 metadata: 274 name: my-config-map 275 data: 276 foo: bar 277 """ 278 279 v1alpha1.kubernetes_apply( 280 name='my-apply', 281 discovery_strategy='selectors-only', 282 timeout='2s', 283 yaml=config) 284 `) 285 result, err := f.ExecFile("Tiltfile") 286 require.NoError(t, err) 287 288 set := MustState(result) 289 290 obj := set.GetSetForType(&v1alpha1.KubernetesApply{})["my-apply"].(*v1alpha1.KubernetesApply) 291 require.NotNil(t, obj) 292 require.Equal(t, obj, &v1alpha1.KubernetesApply{ 293 ObjectMeta: metav1.ObjectMeta{ 294 Name: "my-apply", 295 }, 296 Spec: v1alpha1.KubernetesApplySpec{ 297 DiscoveryStrategy: "selectors-only", 298 Timeout: metav1.Duration{Duration: 2 * time.Second}, 299 YAML: ` 300 apiVersion: v1 301 kind: ConfigMap 302 metadata: 303 name: my-config-map 304 data: 305 foo: bar 306 `, 307 }, 308 }) 309 } 310 311 func newFixture(tb testing.TB) *starkit.Fixture { 312 return starkit.NewFixture(tb, NewPlugin()) 313 }