package helm

import (
	"io"
	"net/http"
	"net/http/httptest"
	"testing"

	portainer "github.com/portainer/portainer/api"
	"github.com/portainer/portainer/api/http/security"
	"github.com/portainer/portainer/api/internal/testhelpers"
	"github.com/portainer/portainer/pkg/libhelm/options"
	"github.com/portainer/portainer/pkg/libhelm/release"

	"github.com/segmentio/encoding/json"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func Test_helmGetHistory(t *testing.T) {
	is := assert.New(t)
	h := newTestHelmHandler(t)

	// Install a single chart, to be retrieved by the handler
	options := options.InstallOptions{Name: "nginx-1", Chart: "nginx", Namespace: "default"}

	_, err := h.helmPackageManager.Upgrade(options)
	require.NoError(t, err)

	t.Run("helmGetHistory sucessfuly retrieves helm release history", func(t *testing.T) {
		req := httptest.NewRequest(http.MethodGet, "/1/kubernetes/helm/"+options.Name+"/history?namespace="+options.Namespace, nil)
		ctx := security.StoreTokenData(req, &portainer.TokenData{ID: 1, Username: "admin", Role: 1})
		req = req.WithContext(ctx)
		testhelpers.AddTestSecurityCookie(req, "Bearer dummytoken")

		rr := httptest.NewRecorder()
		h.ServeHTTP(rr, req)

		data := []release.Release{}
		body, err := io.ReadAll(rr.Body)
		require.NoError(t, err, "ReadAll should not return error")

		err = json.Unmarshal(body, &data)
		require.NoError(t, err)
		is.Equal(http.StatusOK, rr.Code, "Status should be 200")
		is.Len(data, 1)
		is.Equal("nginx-1", data[0].Name)
	})
}
