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 }