diff --git a/pkg/api/list.go b/pkg/api/list.go index befa6362e..8f15225cd 100644 --- a/pkg/api/list.go +++ b/pkg/api/list.go @@ -12,12 +12,12 @@ type ListRequest struct { } type ListResponse struct { - Error string `json:"error,omitempty"` - Data []Releases + Error string `json:"error,omitempty"` + Releases []Release } -type Releases struct { - Release string `json:"release"` +type Release struct { + Name string `json:"release"` Namespace string `json:"namespace"` } diff --git a/pkg/api/list_api_test.go b/pkg/api/list_api_test.go index 40ba27116..b4428237e 100644 --- a/pkg/api/list_api_test.go +++ b/pkg/api/list_api_test.go @@ -79,7 +79,7 @@ func (s *ListTestSuite) TestShouldReturnReleasesWhenSuccessfulAPICall() { assert.Equal(s.T(), 200, resp.StatusCode) - expectedResponse := `{"Data":[{"release":"test-release","namespace":"test-namespace"}]}` + expectedResponse := `{"Releases":[{"release":"test-release","namespace":"test-namespace"}]}` respBody, _ := ioutil.ReadAll(resp.Body) assert.Equal(s.T(), expectedResponse, string(respBody)) @@ -96,7 +96,7 @@ func (s *ListTestSuite) TestShouldReturnBadRequestErrorIfItHasInvalidCharacter() assert.Equal(s.T(), 400, resp.StatusCode) - expectedResponse := `{"error":"invalid character '\"' after object key:value pair","Data":null}` + expectedResponse := `{"error":"invalid character '\"' after object key:value pair","Releases":null}` respBody, _ := ioutil.ReadAll(resp.Body) assert.Equal(s.T(), expectedResponse, string(respBody)) require.NoError(s.T(), err) diff --git a/pkg/api/service.go b/pkg/api/service.go index 653ae0224..b76c2a931 100644 --- a/pkg/api/service.go +++ b/pkg/api/service.go @@ -2,6 +2,7 @@ package api import ( "context" + "errors" "fmt" "helm.sh/helm/v3/pkg/action" @@ -77,18 +78,28 @@ func (s Service) installChart(icfg InstallConfig, ch *chart.Chart, vals ChartVal return result, nil } -func (s Service) List(releaseStatus string) ([]Releases, error) { +func (s Service) List(releaseStatus string) ([]Release, error) { listStates := new(action.ListStates) - s.lister.SetState(listStates.FromName(releaseStatus)) + + state := action.ListAll + if releaseStatus != "" { + state = listStates.FromName(releaseStatus) + } + + if state == action.ListUnknown { + return nil, errors.New("invalid release status") + } + + s.lister.SetState(state) s.lister.SetStateMask() releases, err := s.lister.Run() if err != nil { return nil, err } - var helmReleases []Releases + var helmReleases []Release for _, eachRes := range releases { - r := Releases{Release: eachRes.Name, Namespace: eachRes.Namespace} + r := Release{Name: eachRes.Name, Namespace: eachRes.Namespace} helmReleases = append(helmReleases, r) } diff --git a/pkg/api/service_test.go b/pkg/api/service_test.go index 03f2d330f..a25bd965c 100644 --- a/pkg/api/service_test.go +++ b/pkg/api/service_test.go @@ -3,6 +3,7 @@ package api_test import ( "context" "errors" + "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/api" "testing" @@ -55,7 +56,7 @@ func (s *ServiceTestSuite) TestInstallShouldReturnErrorOnInvalidChart() { s.installer.AssertNotCalled(t, "Run") } -func (s *ServiceTestSuite) TestInstallShouldReturnErrorOnFailedIntallRun() { +func (s *ServiceTestSuite) TestInstallShouldReturnErrorOnFailedInstallRun() { chartName := "stable/valid-chart" cfg := api.InstallConfig{ Name: "some-component", @@ -100,6 +101,77 @@ func (s *ServiceTestSuite) TestInstallShouldReturnResultOnSuccess() { s.installer.AssertExpectations(t) } +func (s *ServiceTestSuite) TestListShouldReturnErrorOnFailureOfListRun() { + s.lister.On("SetState", action.ListDeployed) + s.lister.On("SetStateMask") + + var releases []*release.Release + + s.lister.On("Run").Return(releases, errors.New("cluster issue")) + + releaseStatus := "deployed" + res, err := s.svc.List(releaseStatus) + + t := s.T() + assert.Error(t, err, "cluster issue") + assert.Nil(t, res) + + s.lister.AssertExpectations(t) +} + +func (s *ServiceTestSuite) TestListShouldReturnAllReleasesIfNoFilterIsPassed() { + s.lister.On("SetState", action.ListAll) + s.lister.On("SetStateMask") + + var releases []*release.Release + releases = append(releases, + &release.Release{Name: "test-release", + Namespace: "test-namespace", + Info: &release.Info{Status: release.StatusDeployed}}) + + s.lister.On("Run").Return(releases, nil) + + releaseStatus := "" + res, err := s.svc.List(releaseStatus) + + t := s.T() + assert.NoError(t, err) + require.NotNil(t, res) + + var response []api.Release + response = append(response, api.Release{"test-release", "test-namespace"}) + + assert.Equal(t, len(res), 1) + assert.Equal(t, "test-release", response[0].Name) + assert.Equal(t, "test-namespace", response[0].Namespace) + + s.lister.AssertExpectations(t) +} + +func (s *ServiceTestSuite) TestListShouldReturnDeployedReleasesIfDeployedIsPassedAsFilter() { + s.lister.On("SetState", action.ListDeployed) + s.lister.On("SetStateMask") + + var releases []*release.Release + s.lister.On("Run").Return(releases, nil) + + releaseStatus := "deployed" + _, err := s.svc.List(releaseStatus) + + t := s.T() + assert.NoError(t, err) + + s.lister.AssertExpectations(t) +} + +func (s *ServiceTestSuite) TestListShouldReturnErrorIfInvalidStatusIsPassedAsFilter() { + releaseStatus := "invalid" + _, err := s.svc.List(releaseStatus) + + t := s.T() + assert.Error(t, err, "invalid release status") +} + func TestServiceSuite(t *testing.T) { suite.Run(t, new(ServiceTestSuite)) } \ No newline at end of file