github.com/kyma-project/kyma-environment-broker@v0.0.1/common/runtime/client_test.go (about) 1 package runtime 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 "net/http/httptest" 9 "strconv" 10 "testing" 11 "time" 12 13 "github.com/kyma-project/kyma-environment-broker/common/pagination" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 "golang.org/x/oauth2" 17 ) 18 19 type FakeTokenSource string 20 21 var fixToken FakeTokenSource = "fake-token-1234" 22 23 func (t FakeTokenSource) Token() (*oauth2.Token, error) { 24 return &oauth2.Token{ 25 AccessToken: string(t), 26 Expiry: time.Now().Add(time.Duration(12 * time.Hour)), 27 }, nil 28 } 29 30 var runtime1 = fixRuntimeDTO("runtime1") 31 var runtime2 = fixRuntimeDTO("runtime2") 32 var runtime3 = fixRuntimeDTO("runtime3") 33 34 func TestClient_ListRuntimes(t *testing.T) { 35 t.Run("test request URL and response are correct", func(t *testing.T) { 36 //given 37 called := 0 38 params := ListParameters{ 39 Page: 1, 40 PageSize: 50, 41 OperationDetail: LastOperation, 42 KymaConfig: true, 43 ClusterConfig: true, 44 GlobalAccountIDs: []string{"sa1", "ga2"}, 45 SubAccountIDs: []string{"sa1", "sa2"}, 46 InstanceIDs: []string{"id1", "id2"}, 47 RuntimeIDs: []string{"rid1", "rid2"}, 48 Regions: []string{"region1", "region2"}, 49 Shoots: []string{"shoot1", "shoot2"}, 50 Plans: []string{"plan1", "plan2"}, 51 States: []State{StateFailed, StateSucceeded}, 52 } 53 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 54 called++ 55 assert.Equal(t, http.MethodGet, r.Method) 56 assert.Equal(t, "/runtimes", r.URL.Path) 57 assert.Equal(t, r.Header.Get("Authorization"), fmt.Sprintf("Bearer %s", fixToken)) 58 query := r.URL.Query() 59 assert.ElementsMatch(t, []string{strconv.Itoa(params.Page)}, query[pagination.PageParam]) 60 assert.ElementsMatch(t, []string{strconv.Itoa(params.PageSize)}, query[pagination.PageSizeParam]) 61 assert.ElementsMatch(t, []string{string(LastOperation)}, query[OperationDetailParam]) 62 assert.ElementsMatch(t, []string{"true"}, query[KymaConfigParam]) 63 assert.ElementsMatch(t, []string{"true"}, query[ClusterConfigParam]) 64 assert.ElementsMatch(t, params.GlobalAccountIDs, query[GlobalAccountIDParam]) 65 assert.ElementsMatch(t, params.SubAccountIDs, query[SubAccountIDParam]) 66 assert.ElementsMatch(t, params.InstanceIDs, query[InstanceIDParam]) 67 assert.ElementsMatch(t, params.RuntimeIDs, query[RuntimeIDParam]) 68 assert.ElementsMatch(t, params.Regions, query[RegionParam]) 69 assert.ElementsMatch(t, params.Shoots, query[ShootParam]) 70 assert.ElementsMatch(t, params.Plans, query[PlanParam]) 71 stateParams := query[StateParam] 72 assert.Len(t, stateParams, 2) 73 assert.EqualValues(t, params.States[0], stateParams[0]) 74 assert.EqualValues(t, params.States[1], stateParams[1]) 75 76 err := respondRuntimes(w, []RuntimeDTO{runtime1, runtime2}, 2) 77 require.NoError(t, err) 78 })) 79 defer ts.Close() 80 client := NewClient(ts.URL, oauth2.NewClient(context.Background(), fixToken)) 81 82 //when 83 rp, err := client.ListRuntimes(params) 84 85 //then 86 require.NoError(t, err) 87 assert.Equal(t, 1, called) 88 assert.Equal(t, 2, rp.Count) 89 assert.Equal(t, 2, rp.TotalCount) 90 assert.Len(t, rp.Data, 2) 91 assert.Equal(t, rp.Data[0].InstanceID, runtime1.InstanceID) 92 assert.Equal(t, rp.Data[1].InstanceID, runtime2.InstanceID) 93 }) 94 95 t.Run("test pagination", func(t *testing.T) { 96 called := 0 97 params := ListParameters{ 98 PageSize: 2, 99 } 100 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 101 called++ 102 103 err := respondRuntimes(w, []RuntimeDTO{runtime1, runtime2}, 4) 104 require.NoError(t, err) 105 })) 106 defer ts.Close() 107 client := NewClient(ts.URL, oauth2.NewClient(context.Background(), fixToken)) 108 109 //when 110 rp, err := client.ListRuntimes(params) 111 112 //then 113 require.NoError(t, err) 114 assert.Equal(t, 2, called) 115 assert.Equal(t, 4, rp.Count) 116 assert.Equal(t, 4, rp.TotalCount) 117 assert.Len(t, rp.Data, 4) 118 }) 119 } 120 121 func fixRuntimeDTO(id string) RuntimeDTO { 122 return RuntimeDTO{ 123 InstanceID: id, 124 RuntimeID: id, 125 GlobalAccountID: id, 126 SubAccountID: id, 127 ProviderRegion: id, 128 SubAccountRegion: id, 129 ShootName: id, 130 ServiceClassID: id, 131 ServiceClassName: id, 132 ServicePlanID: id, 133 ServicePlanName: id, 134 Status: RuntimeStatus{ 135 CreatedAt: time.Now(), 136 ModifiedAt: time.Now(), 137 Provisioning: &Operation{ 138 State: id, 139 Description: id, 140 }, 141 }, 142 } 143 } 144 145 func respondRuntimes(w http.ResponseWriter, runtimes []RuntimeDTO, totalCount int) error { 146 rp := RuntimesPage{ 147 Data: runtimes, 148 Count: len(runtimes), 149 TotalCount: totalCount, 150 } 151 data, err := json.Marshal(rp) 152 if err != nil { 153 w.WriteHeader(http.StatusInternalServerError) 154 return err 155 } 156 157 w.Header().Set("Content-Type", "application/json") 158 w.WriteHeader(http.StatusOK) 159 _, err = w.Write(data) 160 return err 161 }