github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/include_test.go (about) 1 package tiltfile 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/tilt-dev/tilt/internal/testutils" 11 ) 12 13 func TestIncludeThreeTiltfiles(t *testing.T) { 14 f := newFixture(t) 15 16 f.setupFooAndBar() 17 f.file("foo/Tiltfile", ` 18 docker_build('gcr.io/foo', '.') 19 `) 20 f.file("bar/Tiltfile", ` 21 docker_build('gcr.io/bar', '.') 22 `) 23 f.file("Tiltfile", ` 24 include('./foo/Tiltfile') 25 include('./bar/Tiltfile') 26 k8s_yaml(['foo.yaml', 'bar.yaml']) 27 `) 28 29 f.load() 30 f.assertNextManifest("foo", 31 db(image("gcr.io/foo")), 32 deployment("foo")) 33 f.assertNextManifest("bar", 34 db(image("gcr.io/bar")), 35 deployment("bar")) 36 37 f.assertConfigFiles(".tiltignore", "Tiltfile", 38 "bar.yaml", "bar/.dockerignore", "bar/Dockerfile", "bar/Tiltfile", 39 "foo.yaml", "foo/.dockerignore", "foo/Dockerfile", "foo/Tiltfile") 40 } 41 42 func TestIncludeCircular(t *testing.T) { 43 f := newFixture(t) 44 45 f.file("foo/Tiltfile", ` 46 include('../Tiltfile') 47 `) 48 f.file("Tiltfile", ` 49 include('./foo/Tiltfile') 50 `) 51 52 f.loadErrString("Circular load") 53 } 54 55 func TestIncludeTriangular(t *testing.T) { 56 f := newFixture(t) 57 58 f.file("foo/Tiltfile", ` 59 print('foo') 60 `) 61 f.file("bar/Tiltfile", ` 62 include('../foo/Tiltfile') 63 `) 64 f.file("Tiltfile", ` 65 include('./foo/Tiltfile') 66 include('./bar/Tiltfile') 67 `) 68 69 f.load() 70 71 // make sure foo/Tiltfile is only loaded once 72 assertContainsOnce( 73 t, 74 f.out.String(), 75 "Loading Tiltfile at") 76 assertContainsOnce( 77 t, 78 f.out.String(), 79 "foo\nSuccessfully loaded Tiltfile") 80 } 81 82 func TestIncludeMissing(t *testing.T) { 83 f := newFixture(t) 84 85 f.file("Tiltfile", ` 86 include('./foo/Tiltfile') 87 `) 88 89 f.loadErrString( 90 "Tiltfile:2:8: in <toplevel>", 91 testutils.IsNotExistMessage()) 92 } 93 94 func TestIncludeError(t *testing.T) { 95 f := newFixture(t) 96 97 f.file("Tiltfile", ` 98 include('./foo/Tiltfile') 99 `) 100 f.file("foo/Tiltfile", ` 101 local('exit 1') 102 `) 103 104 f.loadErrString( 105 fmt.Sprintf("%s:2:8: in <toplevel>", f.JoinPath("Tiltfile")), 106 fmt.Sprintf("%s:2:6: in <toplevel>", f.JoinPath("foo", "Tiltfile")), 107 "exit status 1") 108 } 109 110 func TestLoadFunction(t *testing.T) { 111 f := newFixture(t) 112 113 f.file("boo/Tiltfile", ` 114 def shout(): 115 print('boo') 116 `) 117 f.file("Tiltfile", ` 118 load('./boo/Tiltfile', 'shout') 119 shout() 120 `) 121 122 f.load() 123 assertContainsOnce( 124 t, 125 f.out.String(), 126 "Loading Tiltfile at") 127 assertContainsOnce( 128 t, 129 f.out.String(), 130 "boo\nSuccessfully loaded Tiltfile") 131 132 } 133 134 func TestLoadError(t *testing.T) { 135 f := newFixture(t) 136 137 f.file("Tiltfile", ` 138 load('./foo/Tiltfile', "x") 139 `) 140 f.file("foo/Tiltfile", ` 141 x = 1 142 local('exit 1') 143 `) 144 145 f.loadErrString( 146 fmt.Sprintf("%s:2:1: in <toplevel>", f.JoinPath("Tiltfile")), 147 fmt.Sprintf("%s:3:6: in <toplevel>", f.JoinPath("foo", "Tiltfile")), 148 "exit status 1") 149 } 150 151 func TestLoadDynamic(t *testing.T) { 152 f := newFixture(t) 153 154 f.file("foo/Tiltfile", ` 155 x = 1 156 `) 157 f.file("Tiltfile", ` 158 print(load_dynamic('./foo/Tiltfile')) 159 `) 160 161 f.load() 162 assert.Contains(t, f.out.String(), `{"x": 1}`) 163 } 164 165 func assertContainsOnce(t *testing.T, s, contains string) { 166 assert.Contains(t, s, contains) 167 assert.Equal(t, 1, strings.Count(s, contains)) 168 }