package store

import (
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/pingcap/test-infra/common/model"
	"github.com/pingcap/test-infra/services/tcms/utils"
)

const token = "this is rms token"
const endpoint = "http://rms.pingcap.net:30007"
const stagingEndpoint = "http://rms-staging.pingcap.net:30007"

func TestRMS(t *testing.T) {
	s := setup(t)
	defer s.Shutdown()
	rmsSvc, resourcePoolSvc := s.RMS.(*rmsService), s.ResourcePool.(*resourcePoolService)
	ctx := utils.FakeCtx()

	if assert.Error(t, rmsSvc.Delete(ctx, "prod")) {
		if assert.NoError(t, resourcePoolSvc.Delete(
			ctx,
			"prod",
			[]string{"default", "rp_name0", "rp_name1", "rp_name2"})) {
			if assert.NoError(t, rmsSvc.Delete(ctx, "prod")) {
				rms, err := rmsSvc.Get(ctx, "prod")
				assert.NoError(t, err)
				assert.Nil(t, rms)
			}
		}
	}

	_, err := rmsSvc.Create(ctx, model.RMS{
		Name:     "prod",
		Endpoint: endpoint,
		Token:    token,
	})
	assert.NoError(t, err)

	RMSs, err := rmsSvc.List(ctx)
	if assert.NoError(t, err) {
		if !assert.Equal(t, 2, len(RMSs)) {
			return
		}
		assert.Equal(t, "prod", RMSs[1].Name)
		assert.Equal(t, endpoint, RMSs[1].Endpoint)
		assert.Equal(t, "", RMSs[1].Token)
	}

	rms, err := rmsSvc.Get(ctx, "prod")
	if assert.NoError(t, err) {
		assert.Equal(t, "prod", rms.Name)
		assert.Equal(t, endpoint, rms.Endpoint)
		assert.Equal(t, token, rms.Token)
	}

	err = rmsSvc.Update(ctx, model.RMS{
		Name:     "prod",
		Endpoint: stagingEndpoint,
		Token:    "",
	})
	rms, _ = rmsSvc.Get(ctx, "prod")
	if assert.NoError(t, err) {
		assert.Equal(t, "prod", rms.Name)
		assert.Equal(t, stagingEndpoint, rms.Endpoint)
		assert.Equal(t, token, rms.Token)
	}
}
