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  }