github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/engine/uiresource/subscriber_test.go (about)

     1  package uiresource
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  	apierrors "k8s.io/apimachinery/pkg/api/errors"
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/apimachinery/pkg/types"
    13  	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
    14  
    15  	"github.com/tilt-dev/tilt/internal/controllers/fake"
    16  	"github.com/tilt-dev/tilt/internal/store"
    17  	"github.com/tilt-dev/tilt/internal/testutils/tempdir"
    18  	"github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1"
    19  	"github.com/tilt-dev/tilt/pkg/model"
    20  )
    21  
    22  func TestUpdateTiltfile(t *testing.T) {
    23  	f := newFixture(t)
    24  
    25  	r := &v1alpha1.UIResource{ObjectMeta: metav1.ObjectMeta{Name: "(Tiltfile)"}}
    26  	err := f.tc.Create(f.ctx, r)
    27  	require.NoError(t, err)
    28  
    29  	_ = f.sub.OnChange(f.ctx, f.store, store.LegacyChangeSummary())
    30  	r = f.resource("(Tiltfile)")
    31  	require.NotNil(t, r)
    32  	assert.Equal(t, "(Tiltfile)", r.ObjectMeta.Name)
    33  	assert.Equal(t, "2", r.ObjectMeta.ResourceVersion)
    34  
    35  	f.store.WithState(func(es *store.EngineState) {
    36  		es.TiltfileStates[model.MainTiltfileManifestName].CurrentBuilds["tiltfile"] = model.BuildRecord{StartTime: time.Now()}
    37  	})
    38  
    39  	_ = f.sub.OnChange(f.ctx, f.store, store.LegacyChangeSummary())
    40  
    41  	r = f.resource("(Tiltfile)")
    42  	require.NotNil(t, r)
    43  	assert.Equal(t, "3", r.ObjectMeta.ResourceVersion)
    44  	assert.Equal(t, "False", string(readyCondition(r).Status))
    45  	assert.Equal(t, "False", string(upToDateCondition(r).Status))
    46  
    47  	// Make sure OnChange is idempotent.
    48  	_ = f.sub.OnChange(f.ctx, f.store, store.LegacyChangeSummary())
    49  
    50  	r = f.resource("(Tiltfile)")
    51  	require.NotNil(t, r)
    52  	assert.Equal(t, "3", r.ObjectMeta.ResourceVersion)
    53  
    54  	f.store.WithState(func(es *store.EngineState) {
    55  		ms := es.TiltfileStates[model.MainTiltfileManifestName]
    56  		b := ms.EarliestCurrentBuild()
    57  		b.FinishTime = time.Now()
    58  		ms.AddCompletedBuild(b)
    59  		delete(ms.CurrentBuilds, "tiltfile")
    60  	})
    61  
    62  	_ = f.sub.OnChange(f.ctx, f.store, store.LegacyChangeSummary())
    63  	r = f.resource("(Tiltfile)")
    64  	require.NotNil(t, r)
    65  	assert.Equal(t, "4", r.ObjectMeta.ResourceVersion)
    66  	assert.Equal(t, "True", string(upToDateCondition(r).Status))
    67  	assert.Equal(t, "True", string(readyCondition(r).Status))
    68  }
    69  
    70  type fixture struct {
    71  	*tempdir.TempDirFixture
    72  	ctx   context.Context
    73  	store *store.TestingStore
    74  	tc    ctrlclient.Client
    75  	sub   *Subscriber
    76  }
    77  
    78  func newFixture(t *testing.T) *fixture {
    79  	tc := fake.NewFakeTiltClient()
    80  	return &fixture{
    81  		TempDirFixture: tempdir.NewTempDirFixture(t),
    82  		ctx:            context.Background(),
    83  		tc:             tc,
    84  		sub:            NewSubscriber(tc),
    85  		store:          store.NewTestingStore(),
    86  	}
    87  }
    88  
    89  func (f *fixture) resource(name string) *v1alpha1.UIResource {
    90  	r := &v1alpha1.UIResource{}
    91  	err := f.tc.Get(f.ctx, types.NamespacedName{Name: name}, r)
    92  	if apierrors.IsNotFound(err) {
    93  		return nil
    94  	}
    95  
    96  	require.NoError(f.T(), err)
    97  	return r
    98  }
    99  
   100  func readyCondition(r *v1alpha1.UIResource) *v1alpha1.UIResourceCondition {
   101  	for _, c := range r.Status.Conditions {
   102  		if c.Type == v1alpha1.UIResourceReady {
   103  			return &c
   104  		}
   105  	}
   106  	return nil
   107  }
   108  
   109  func upToDateCondition(r *v1alpha1.UIResource) *v1alpha1.UIResourceCondition {
   110  	for _, c := range r.Status.Conditions {
   111  		if c.Type == v1alpha1.UIResourceUpToDate {
   112  			return &c
   113  		}
   114  	}
   115  	return nil
   116  }