package api

import (
	"context"
	"encoding/base64"
	"testing"

	"github.com/golang/mock/gomock"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/ticdc-service/pkg/clusterproxy/client/mocks"
)

func TestQuerySQL(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	mockClient := mocks.NewMockClient(ctrl)
	sqlClient := NewSQLClient(mockClient)

	ctx := context.Background()
	operator := &ClusterOperator{
		Username:   "test_user",
		AuthMethod: AuthMethodPassword,
		Credential: "test_password",
	}
	sql := "SELECT * FROM test_table"
	var dest interface{}

	mockClient.EXPECT().GetClusterID().Return(uint64(12345)).Times(1)
	mockClient.EXPECT().Request(gomock.Any(), "POST", "/v1beta1/query", gomock.Any(), &dest).
		Return(nil).Times(1)

	err := sqlClient.QuerySQL(ctx, operator, sql, &dest)
	assert.NoError(t, err)
}

func TestAmendOperator(t *testing.T) {
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	mockClient := mocks.NewMockClient(ctrl)
	sqlClient := NewSQLClient(mockClient)

	ctx := context.Background()
	operator := &ClusterOperator{
		Username:   "test_user",
		AuthMethod: AuthMethodPassword,
		Credential: "test_password",
	}

	amendedOperator := sqlClient.(*sqlClientImpl).amendOperator(ctx, operator)

	expectedCredential := base64.URLEncoding.EncodeToString([]byte("test_password"))
	assert.Equal(t, "test_user", amendedOperator.Username)
	assert.Equal(t, AuthMethodPassword, amendedOperator.AuthMethod)
	assert.Equal(t, expectedCredential, amendedOperator.Credential)
}
