package handler

import (
	"testing"

	"github.com/labstack/echo/v4"
	"github.com/stretchr/testify/assert"

	respM "github.com/pingcap/test-infra/common/model/tcms/response"
	htest "github.com/pingcap/test-infra/services/tcms/tests/httptest"
)

var personalToken = "tcmsp_HHqCePDKggzFxwxVbsGy"

func TestValidateToken(t *testing.T) {
	h := setup(t)
	defer h.Shutdown()

	// pat
	_, u := htest.MustGET[respM.PersonalAccessTokenInfo](h.Echo, "/api/v1/tokens/validate?user=1&token="+personalToken)
	assert.Equal(t, 3, int(u.UserID))
	assert.Equal(t, "gaozifeng@pingcap.com", u.User.Email)

	// jwt
	_, u = htest.MustGET[respM.PersonalAccessTokenInfo](h.Echo, "/api/v1/tokens/validate?user=1&token="+genJWT(3))
	assert.Equal(t, 3, int(u.UserID))
	assert.Equal(t, "gaozifeng@pingcap.com", u.User.Email)
}

func TestListTokens(t *testing.T) {
	h := setup(t)
	defer h.Shutdown()

	_, tokens := htest.MustGET[respM.PersonalAccessTokenInfoListResponse](h.Echo, "/api/v1/tokens", htest.WithHeader(echo.HeaderAuthorization, "Bearer "+personalToken))
	assert.Equal(t, "token1", tokens.Data[0].Name)
}

func TestCreateToken(t *testing.T) {
	h := setup(t)
	defer h.Shutdown()

	tName := "hhhhhh"
	_, u := htest.MustPOST[echo.Map](h.Echo, "/api/v1/tokens?name="+tName, htest.WithHeader(echo.HeaderAuthorization, "Bearer "+personalToken))
	assert.NotNil(t, u["token"])
}

func TestRevokeToken(t *testing.T) {
	h := setup(t)
	defer h.Shutdown()

	_, result := htest.MustDELETE[echo.Map](h.Echo, "/api/v1/tokens", htest.WithHeader(echo.HeaderAuthorization, "Bearer "+personalToken))
	assert.Equal(t, "ok", result["result"])

	// the token list should be empty
	_, tokens := htest.MustGET[respM.PersonalAccessTokenInfoListResponse](h.Echo, "/api/v1/tokens", htest.WithUser(3))
	assert.Equal(t, 0, tokens.Total)
}
