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  }