github.com/grahambrereton-form3/tilt@v0.10.18/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  
    11  func TestIncludeThreeTiltfiles(t *testing.T) {
    12  	f := newFixture(t)
    13  	defer f.TearDown()
    14  
    15  	f.setupFooAndBar()
    16  	f.file("foo/Tiltfile", `
    17  docker_build('gcr.io/foo', '.')
    18  `)
    19  	f.file("bar/Tiltfile", `
    20  docker_build('gcr.io/bar', '.')
    21  `)
    22  	f.file("Tiltfile", `
    23  include('./foo/Tiltfile')
    24  include('./bar/Tiltfile')
    25  k8s_yaml(['foo.yaml', 'bar.yaml'])
    26  `)
    27  
    28  	f.load()
    29  	f.assertNextManifest("foo",
    30  		db(image("gcr.io/foo")),
    31  		deployment("foo"))
    32  	f.assertNextManifest("bar",
    33  		db(image("gcr.io/bar")),
    34  		deployment("bar"))
    35  }
    36  
    37  func TestIncludeCircular(t *testing.T) {
    38  	f := newFixture(t)
    39  	defer f.TearDown()
    40  
    41  	f.file("foo/Tiltfile", `
    42  include('../Tiltfile')
    43  `)
    44  	f.file("Tiltfile", `
    45  include('./foo/Tiltfile')
    46  `)
    47  
    48  	f.loadErrString("Circular load")
    49  }
    50  
    51  func TestIncludeTriangular(t *testing.T) {
    52  	f := newFixture(t)
    53  	defer f.TearDown()
    54  
    55  	f.file("foo/Tiltfile", `
    56  print('foo')
    57  `)
    58  	f.file("bar/Tiltfile", `
    59  include('../foo/Tiltfile')
    60  `)
    61  	f.file("Tiltfile", `
    62  include('./foo/Tiltfile')
    63  include('./bar/Tiltfile')
    64  `)
    65  
    66  	f.load()
    67  
    68  	// make sure foo/Tiltfile is only loaded once
    69  	assertContainsOnce(
    70  		t,
    71  		f.out.String(),
    72  		"Beginning Tiltfile execution\nfoo\nSuccessfully loaded Tiltfile")
    73  }
    74  
    75  func TestIncludeMissing(t *testing.T) {
    76  	f := newFixture(t)
    77  	defer f.TearDown()
    78  
    79  	f.file("Tiltfile", `
    80  include('./foo/Tiltfile')
    81  `)
    82  
    83  	f.loadErrString(
    84  		"Tiltfile:2:8: in <toplevel>",
    85  		"no such file or directory")
    86  }
    87  
    88  func TestIncludeError(t *testing.T) {
    89  	f := newFixture(t)
    90  	defer f.TearDown()
    91  
    92  	f.file("Tiltfile", `
    93  include('./foo/Tiltfile')
    94  `)
    95  	f.file("foo/Tiltfile", `
    96  local('exit 1')
    97  `)
    98  
    99  	f.loadErrString(
   100  		fmt.Sprintf("%s/Tiltfile:2:8: in <toplevel>", f.Path()),
   101  		fmt.Sprintf("%s/foo/Tiltfile:2:6: in <toplevel>", f.Path()),
   102  		"exit status 1")
   103  }
   104  
   105  func TestLoadFunction(t *testing.T) {
   106  	f := newFixture(t)
   107  	defer f.TearDown()
   108  
   109  	f.file("boo/Tiltfile", `
   110  def shout():
   111    print('boo')
   112  `)
   113  	f.file("Tiltfile", `
   114  load('./boo/Tiltfile', 'shout')
   115  shout()
   116  `)
   117  
   118  	f.load()
   119  	assertContainsOnce(
   120  		t,
   121  		f.out.String(),
   122  		"Beginning Tiltfile execution\nboo\nSuccessfully loaded Tiltfile")
   123  
   124  }
   125  
   126  func TestLoadError(t *testing.T) {
   127  	f := newFixture(t)
   128  	defer f.TearDown()
   129  
   130  	f.file("Tiltfile", `
   131  load('./foo/Tiltfile', "x")
   132  `)
   133  	f.file("foo/Tiltfile", `
   134  x = 1
   135  local('exit 1')
   136  `)
   137  
   138  	f.loadErrString(
   139  		fmt.Sprintf("%s/Tiltfile:2:1: in <toplevel>", f.Path()),
   140  		fmt.Sprintf("%s/foo/Tiltfile:3:6: in <toplevel>", f.Path()),
   141  		"exit status 1")
   142  }
   143  
   144  func assertContainsOnce(t *testing.T, s, contains string) {
   145  	assert.Contains(t, s, contains)
   146  	assert.Equal(t, 1, strings.Count(s, contains))
   147  }