github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/controllers/apis/configmap/disable_test.go (about)

     1  package configmap
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     9  	"k8s.io/apimachinery/pkg/types"
    10  	"k8s.io/utils/pointer"
    11  	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
    12  
    13  	"github.com/tilt-dev/tilt/internal/controllers/fake"
    14  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
    15  )
    16  
    17  const configMapName = "fe-disable"
    18  const configMap2Name = "be-disable"
    19  const key = "isDisabled"
    20  
    21  func TestMaybeNewDisableStatusNoSource(t *testing.T) {
    22  	f := newDisableFixture(t)
    23  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, nil, nil)
    24  	require.NoError(t, err)
    25  	require.NotNil(t, newStatus)
    26  	require.Equal(t, false, newStatus.Disabled)
    27  	require.Equal(t, v1alpha1.DisableStateEnabled, newStatus.State)
    28  	require.Contains(t, newStatus.Reason, "does not specify a DisableSource")
    29  }
    30  
    31  func TestMaybeNewDisableStatusNoConfigMapDisableSource(t *testing.T) {
    32  	f := newDisableFixture(t)
    33  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, &v1alpha1.DisableSource{}, nil)
    34  	require.NoError(t, err)
    35  	require.NotNil(t, newStatus)
    36  	require.Equal(t, true, newStatus.Disabled)
    37  	require.Equal(t, v1alpha1.DisableStateError, newStatus.State)
    38  	require.Contains(t, newStatus.Reason, "specifies no valid sources")
    39  }
    40  
    41  func TestMaybeNewDisableStatusNoConfigMap(t *testing.T) {
    42  	f := newDisableFixture(t)
    43  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil)
    44  	require.NoError(t, err)
    45  	require.NotNil(t, newStatus)
    46  	require.Equal(t, true, newStatus.Disabled)
    47  	require.Equal(t, v1alpha1.DisableStatePending, newStatus.State)
    48  	require.Contains(t, newStatus.Reason, "ConfigMap \"fe-disable\" does not exist")
    49  }
    50  
    51  func TestMaybeNewDisableStatusNoKey(t *testing.T) {
    52  	f := newDisableFixture(t)
    53  	f.createConfigMap(nil)
    54  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil)
    55  	require.NoError(t, err)
    56  	require.NotNil(t, newStatus)
    57  	require.Equal(t, true, newStatus.Disabled)
    58  	require.Equal(t, v1alpha1.DisableStateError, newStatus.State)
    59  	require.Contains(t, newStatus.Reason, "has no key")
    60  }
    61  
    62  func TestMaybeNewDisableStatusTrue(t *testing.T) {
    63  	f := newDisableFixture(t)
    64  	f.createConfigMap(pointer.StringPtr("true"))
    65  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil)
    66  	require.NoError(t, err)
    67  	require.NotNil(t, newStatus)
    68  	require.Equal(t, true, newStatus.Disabled)
    69  	require.Equal(t, v1alpha1.DisableStateDisabled, newStatus.State)
    70  	require.Contains(t, newStatus.Reason, "is true")
    71  }
    72  
    73  func TestMaybeNewDisableStatusFalse(t *testing.T) {
    74  	f := newDisableFixture(t)
    75  	f.createConfigMap(pointer.StringPtr("false"))
    76  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil)
    77  	require.NoError(t, err)
    78  	require.NotNil(t, newStatus)
    79  	require.Equal(t, false, newStatus.Disabled)
    80  	require.Equal(t, v1alpha1.DisableStateEnabled, newStatus.State)
    81  	require.Contains(t, newStatus.Reason, "is false")
    82  }
    83  
    84  func TestMaybeNewDisableStatusEveryTrue(t *testing.T) {
    85  	f := newDisableFixture(t)
    86  	f.createConfigMapNamed(configMapName, pointer.StringPtr("true"))
    87  	f.createConfigMapNamed(configMap2Name, pointer.StringPtr("true"))
    88  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, everyDisableSource(), nil)
    89  	require.NoError(t, err)
    90  	require.NotNil(t, newStatus)
    91  	require.Equal(t, true, newStatus.Disabled)
    92  	require.Equal(t, v1alpha1.DisableStateDisabled, newStatus.State)
    93  	require.Contains(t, newStatus.Reason, "Every ConfigMap disabled")
    94  }
    95  
    96  func TestMaybeNewDisableStatusEveryMixed(t *testing.T) {
    97  	f := newDisableFixture(t)
    98  	f.createConfigMapNamed(configMapName, pointer.StringPtr("true"))
    99  	f.createConfigMapNamed(configMap2Name, pointer.StringPtr("false"))
   100  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, everyDisableSource(), nil)
   101  	require.NoError(t, err)
   102  	require.NotNil(t, newStatus)
   103  	require.Equal(t, false, newStatus.Disabled)
   104  	require.Equal(t, v1alpha1.DisableStateEnabled, newStatus.State)
   105  	require.Contains(t, newStatus.Reason, "is false")
   106  }
   107  
   108  func TestMaybeNewDisableStatusGobbledygookValue(t *testing.T) {
   109  	f := newDisableFixture(t)
   110  	f.createConfigMap(pointer.StringPtr("asdf"))
   111  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil)
   112  	require.NoError(t, err)
   113  	require.NotNil(t, newStatus)
   114  	require.Equal(t, true, newStatus.Disabled)
   115  	require.Equal(t, v1alpha1.DisableStateError, newStatus.State)
   116  	require.Contains(t, newStatus.Reason, "strconv.ParseBool: parsing \"asdf\"")
   117  }
   118  
   119  func TestMaybeNewDisableStatusNoChange(t *testing.T) {
   120  	f := newDisableFixture(t)
   121  	f.createConfigMap(pointer.StringPtr("false"))
   122  	status, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), nil)
   123  	require.NoError(t, err)
   124  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), status)
   125  	require.NoError(t, err)
   126  	require.Same(t, status, newStatus)
   127  }
   128  
   129  func TestMaybeNewDisableStatusChange(t *testing.T) {
   130  	f := newDisableFixture(t)
   131  	f.createConfigMap(pointer.StringPtr("false"))
   132  	status, err := MaybeNewDisableStatus(
   133  		f.ctx,
   134  		f.fc,
   135  		disableSource(),
   136  		nil,
   137  	)
   138  	require.NoError(t, err)
   139  	f.updateConfigMap(pointer.StringPtr("true"))
   140  	newStatus, err := MaybeNewDisableStatus(f.ctx, f.fc, disableSource(), status)
   141  	require.NoError(t, err)
   142  	require.NotSame(t, status, newStatus)
   143  }
   144  
   145  type disableFixture struct {
   146  	t   *testing.T
   147  	fc  ctrlclient.Client
   148  	ctx context.Context
   149  }
   150  
   151  func (f *disableFixture) createConfigMap(isDisabled *string) {
   152  	f.createConfigMapNamed(configMapName, isDisabled)
   153  }
   154  
   155  func (f *disableFixture) createConfigMapNamed(name string, isDisabled *string) {
   156  	m := make(map[string]string)
   157  	if isDisabled != nil {
   158  		m[key] = *isDisabled
   159  	}
   160  	err := f.fc.Create(f.ctx, &v1alpha1.ConfigMap{
   161  		ObjectMeta: metav1.ObjectMeta{
   162  			Name: name,
   163  		},
   164  		Data: m,
   165  	})
   166  
   167  	require.NoError(f.t, err)
   168  }
   169  
   170  func (f *disableFixture) updateConfigMap(isDisabled *string) {
   171  	m := make(map[string]string)
   172  	if isDisabled != nil {
   173  		m[key] = *isDisabled
   174  	}
   175  	var cm v1alpha1.ConfigMap
   176  	err := f.fc.Get(f.ctx, types.NamespacedName{Name: configMapName}, &cm)
   177  	require.NoError(f.t, err)
   178  
   179  	cm.Data = m
   180  	err = f.fc.Update(f.ctx, &cm)
   181  	require.NoError(f.t, err)
   182  }
   183  
   184  func disableSource() *v1alpha1.DisableSource {
   185  	return &v1alpha1.DisableSource{
   186  		ConfigMap: &v1alpha1.ConfigMapDisableSource{
   187  			Name: configMapName,
   188  			Key:  key,
   189  		},
   190  	}
   191  }
   192  
   193  func everyDisableSource() *v1alpha1.DisableSource {
   194  	return &v1alpha1.DisableSource{
   195  		EveryConfigMap: []v1alpha1.ConfigMapDisableSource{
   196  			{
   197  				Name: configMapName,
   198  				Key:  key,
   199  			},
   200  			{
   201  				Name: configMap2Name,
   202  				Key:  key,
   203  			},
   204  		},
   205  	}
   206  }
   207  
   208  func newDisableFixture(t *testing.T) *disableFixture {
   209  	fc := fake.NewFakeTiltClient()
   210  	ctx := context.Background()
   211  	return &disableFixture{
   212  		t:   t,
   213  		fc:  fc,
   214  		ctx: ctx,
   215  	}
   216  }