github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cloud/cloud_status_manager_test.go (about) 1 package cloud 2 3 import ( 4 "context" 5 "encoding/json" 6 "reflect" 7 "testing" 8 "time" 9 10 "github.com/jonboulle/clockwork" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/tilt-dev/tilt/internal/store" 15 "github.com/tilt-dev/tilt/internal/testutils" 16 "github.com/tilt-dev/tilt/internal/testutils/httptest" 17 ) 18 19 const testCloudAddress = "tiltcloud.example.com" 20 21 func TestWhoAmI(t *testing.T) { 22 f := newCloudStatusManagerTestFixture(t) 23 24 resp := whoAmIResponse{ 25 SuggestedTiltVersion: "10.0.0", 26 } 27 28 respBytes, err := json.Marshal(resp) 29 require.NoError(t, err) 30 31 f.httpClient.SetResponse(string(respBytes)) 32 f.Run(func(state *store.EngineState) { 33 state.TiltBuildInfo.Version = "test tilt version" 34 }) 35 36 expectedAction := store.TiltCloudStatusReceivedAction{ 37 SuggestedTiltVersion: "10.0.0", 38 } 39 40 a := store.WaitForAction(t, reflect.TypeOf(store.TiltCloudStatusReceivedAction{}), f.st.Actions).(store.TiltCloudStatusReceivedAction) 41 require.Equal(t, expectedAction, a) 42 } 43 44 func TestStatusRefresh(t *testing.T) { 45 f := newCloudStatusManagerTestFixture(t) 46 47 f.httpClient.SetResponse(`{"Username": "user1", "Found": true, "SuggestedTiltVersion": "10.0.0"}`) 48 f.Run(func(state *store.EngineState) { 49 state.TiltBuildInfo.Version = "test tilt version" 50 }) 51 52 expected := store.TiltCloudStatusReceivedAction{SuggestedTiltVersion: "10.0.0"} 53 a := store.WaitForAction(t, reflect.TypeOf(store.TiltCloudStatusReceivedAction{}), f.st.Actions) 54 require.Equal(t, expected, a) 55 56 f.st.ClearActions() 57 58 // check that setting a team id triggers a refresh 59 f.httpClient.SetResponse(`{"Username": "user2", "Found": true}`) 60 f.Run(func(state *store.EngineState) { 61 state.TeamID = "test team id" 62 state.Token = "test token" 63 state.TiltBuildInfo.Version = "test tilt version" 64 }) 65 66 expected = store.TiltCloudStatusReceivedAction{} 67 a = store.WaitForAction(t, reflect.TypeOf(store.TiltCloudStatusReceivedAction{}), f.st.Actions) 68 require.Equal(t, expected, a) 69 70 f.st.ClearActions() 71 72 _ = f.um.OnChange(f.ctx, f.st, store.LegacyChangeSummary()) 73 store.AssertNoActionOfType(t, reflect.TypeOf(store.TiltCloudStatusReceivedAction{}), f.st.Actions) 74 75 // check that we periodically refresh 76 f.clock.Advance(24 * time.Hour) 77 78 _ = f.um.OnChange(f.ctx, f.st, store.LegacyChangeSummary()) 79 a = store.WaitForAction(t, reflect.TypeOf(store.TiltCloudStatusReceivedAction{}), f.st.Actions) 80 require.Equal(t, expected, a) 81 } 82 83 type cloudStatusManagerTestFixture struct { 84 um *CloudStatusManager 85 httpClient *httptest.FakeClient 86 st *store.TestingStore 87 ctx context.Context 88 t *testing.T 89 clock clockwork.FakeClock 90 } 91 92 func newCloudStatusManagerTestFixture(t *testing.T) *cloudStatusManagerTestFixture { 93 st := store.NewTestingStore() 94 95 httpClient := httptest.NewFakeClient() 96 97 ctx, _, _ := testutils.CtxAndAnalyticsForTest() 98 99 clock := clockwork.NewFakeClock() 100 101 return &cloudStatusManagerTestFixture{ 102 st: st, 103 httpClient: httpClient, 104 clock: clock, 105 um: NewStatusManager(httpClient, clock), 106 ctx: ctx, 107 t: t, 108 } 109 } 110 111 func (f *cloudStatusManagerTestFixture) Run(mutateState func(state *store.EngineState)) { 112 state := store.EngineState{ 113 CloudAddress: testCloudAddress, 114 } 115 mutateState(&state) 116 f.st.SetState(state) 117 _ = f.um.OnChange(f.ctx, f.st, store.LegacyChangeSummary()) 118 }