package impl

import (
	"testing"

	"github.com/stretchr/testify/assert"
	ticdc_mock "github.com/tidbcloud/dataflow-service/app/models/ticdc/mock"
	repo_mock "github.com/tidbcloud/dataflow-service/app/repo/mock"
	"github.com/tidbcloud/dataflow-service/idl/pbgen/proto/dataflow"
	encryptor_wrapper_mock "github.com/tidbcloud/dataflow-service/pkg/encryptor-wrapper/mock"
	grpcli_mock "github.com/tidbcloud/dataflow-service/pkg/grpc/grpcli/mock"
	regionalapi_mock "github.com/tidbcloud/dataflow-service/pkg/regional-api/mock"
)

func TestGetDownstreamAdaptor(t *testing.T) {
	testcases := []struct {
		downstreamType dataflow.ConnectorType
		err            bool
	}{
		{
			downstreamType: dataflow.ConnectorType_TOTAL,
			err:            true,
		},
		{
			downstreamType: dataflow.ConnectorType_KAFKA,
			err:            false,
		},
		{
			downstreamType: dataflow.ConnectorType_MYSQL,
			err:            false,
		},
		{
			downstreamType: dataflow.ConnectorType_SERVERLESS_TIDB,
			err:            false,
		},
		{
			downstreamType: dataflow.ConnectorType_S3,
			err:            false,
		},
		{
			downstreamType: dataflow.ConnectorType_GCS,
			err:            false,
		},
		{
			downstreamType: dataflow.ConnectorType_PULSAR,
			err:            false,
		},
	}

	encryptor := encryptor_wrapper_mock.NewEncryptor(t)
	cdcClusterModel := ticdc_mock.NewClusterModel(t)
	preCheckCli := regionalapi_mock.NewTiCDCPreCheckClient(t)
	privatelinkEndpointRepo := repo_mock.NewBizPrivateLinkEndpointRepo(t)
	coreGrpcCli := grpcli_mock.NewCoreGrpcClient(t)
	tidbClusterInfraCli := grpcli_mock.NewTiDBClusterInfraClient(t)
	factory := NewDownstreamAdaptorFactory(
		preCheckCli, cdcClusterModel, encryptor, privatelinkEndpointRepo, coreGrpcCli, tidbClusterInfraCli)
	for _, tc := range testcases {
		downstreamAdaptor, err := factory.Get(tc.downstreamType)
		if tc.err {
			assert.Error(t, err)
		} else {
			assert.NoError(t, err)
			assert.NotNil(t, downstreamAdaptor)
		}
	}
}
