github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/enable_test.go (about)

     1  package cli
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  	"k8s.io/apimachinery/pkg/types"
    11  
    12  	"github.com/tilt-dev/tilt/internal/controllers/apis/uiresource"
    13  	"github.com/tilt-dev/tilt/internal/testutils/uiresourcebuilder"
    14  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
    15  	"github.com/tilt-dev/tilt/pkg/model"
    16  )
    17  
    18  func TestEnable(t *testing.T) {
    19  	for _, tc := range []struct {
    20  		name            string
    21  		args            []string
    22  		expectedEnabled []string
    23  		expectedError   string
    24  	}{
    25  		{
    26  			"normal",
    27  			[]string{"disabled_b", "disabled_c"},
    28  			[]string{"enabled_a", "enabled_b", "enabled_c", "disabled_b", "disabled_c", "(Tiltfile)"},
    29  			"",
    30  		},
    31  		{
    32  			"only",
    33  			[]string{"--only", "disabled_b"},
    34  			[]string{"disabled_b", "(Tiltfile)"},
    35  			"",
    36  		},
    37  		{
    38  			"all",
    39  			[]string{"--all"},
    40  			[]string{"enabled_a", "enabled_b", "enabled_c", "disabled_a", "disabled_b", "disabled_c", "(Tiltfile)"},
    41  			"",
    42  		},
    43  		{
    44  			"all+names",
    45  			[]string{"--all", "enabled_b"},
    46  			nil,
    47  			"cannot use --all with resource names",
    48  		},
    49  		{
    50  			"no names",
    51  			nil,
    52  			nil,
    53  			"must specify at least one resource",
    54  		},
    55  		{
    56  			"nonexistent resource",
    57  			[]string{"foo"},
    58  			nil,
    59  			"no such resource \"foo\"",
    60  		},
    61  		{
    62  			"labels",
    63  			[]string{"--labels", "a,b"},
    64  			[]string{"enabled_a", "enabled_b", "enabled_c", "disabled_a", "disabled_b", "(Tiltfile)"},
    65  			"",
    66  		},
    67  		{
    68  			"Tiltfile",
    69  			[]string{"(Tiltfile)"},
    70  			nil,
    71  			"(Tiltfile) cannot be enabled or disabled",
    72  		},
    73  	} {
    74  		t.Run(tc.name, func(t *testing.T) {
    75  			f := newEnableFixture(t)
    76  
    77  			f.createResources()
    78  
    79  			cmd := enableCmd{}
    80  			c := cmd.register()
    81  			err := c.Flags().Parse(tc.args)
    82  			require.NoError(t, err)
    83  			err = cmd.run(f.ctx, c.Flags().Args())
    84  			if tc.expectedError != "" {
    85  				require.Error(t, err)
    86  				require.Contains(t, err.Error(), tc.expectedError)
    87  				// if there's an error, the set of enabled resources shouldn't change
    88  				tc.expectedEnabled = []string{"enabled_a", "enabled_b", "enabled_c", "(Tiltfile)"}
    89  			} else {
    90  				require.NoError(t, err)
    91  			}
    92  
    93  			require.ElementsMatch(t, tc.expectedEnabled, f.enabledResources())
    94  		})
    95  	}
    96  }
    97  
    98  type enableFixture struct {
    99  	*serverFixture
   100  }
   101  
   102  func newEnableFixture(t *testing.T) enableFixture {
   103  	return enableFixture{newServerFixture(t)}
   104  }
   105  
   106  // makes 7 resources: enabled_a, enabled_b, enabled_c, disabled_a, disabled_b, disabled_c, (Tiltfile)
   107  // The first six are initially enabled/disabled according to their names
   108  // (Tiltfile) is always enabled
   109  func (f enableFixture) createResources() {
   110  	for _, isDisabled := range []bool{true, false} {
   111  		for _, n := range []string{"a", "b", "c"} {
   112  			name := fmt.Sprintf("enabled_%s", n)
   113  			if isDisabled {
   114  				name = fmt.Sprintf("disabled_%s", n)
   115  			}
   116  
   117  			source := v1alpha1.DisableSource{
   118  				ConfigMap: &v1alpha1.ConfigMapDisableSource{
   119  					Name: fmt.Sprintf("disable-%s", name),
   120  					Key:  "isDisabled",
   121  				},
   122  			}
   123  
   124  			uir := uiresourcebuilder.New(name).WithDisableSource(source).WithLabel(n).Build()
   125  			err := f.client.Create(f.ctx, uir)
   126  			require.NoError(f.T(), err)
   127  
   128  			cm := v1alpha1.ConfigMap{
   129  				ObjectMeta: metav1.ObjectMeta{Name: source.ConfigMap.Name},
   130  				Data:       map[string]string{source.ConfigMap.Key: strconv.FormatBool(isDisabled)},
   131  			}
   132  			err = f.client.Create(f.ctx, &cm)
   133  			require.NoError(f.T(), err)
   134  		}
   135  	}
   136  
   137  	uir := uiresourcebuilder.New(string(model.MainTiltfileManifestName)).Build()
   138  	err := f.client.Create(f.ctx, uir)
   139  	require.NoError(f.T(), err)
   140  }
   141  
   142  func (f enableFixture) enabledResources() []string {
   143  	var result []string
   144  
   145  	var uirs v1alpha1.UIResourceList
   146  	err := f.client.List(f.ctx, &uirs)
   147  	require.NoError(f.T(), err)
   148  	for _, uir := range uirs.Items {
   149  		drs, err := uiresource.DisableResourceStatus(func(name string) (v1alpha1.ConfigMap, error) {
   150  			var cm v1alpha1.ConfigMap
   151  			err := f.client.Get(f.ctx, types.NamespacedName{Name: name}, &cm)
   152  			return cm, err
   153  		}, uir.Status.DisableStatus.Sources)
   154  		require.NoError(f.T(), err)
   155  
   156  		if drs.State == v1alpha1.DisableStateEnabled {
   157  			result = append(result, uir.Name)
   158  		}
   159  	}
   160  
   161  	return result
   162  }