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  }