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  }