package cloud_storage

import (
	"testing"

	"github.com/aws/aws-sdk-go-v2/aws"
	. "github.com/onsi/gomega"
	"github.com/tidbcloud/pkgv2/bizerr"
)

func TestParseS3Params(t *testing.T) {
	g := NewGomegaWithT(t)
	testCases := []struct {
		uri            string
		expectedSchema string
		expectedBucket string
		expectedPrefix *string
		expectedError  bizerr.BizError
	}{
		{
			uri:            "s3://test/",
			expectedSchema: "s3",
			expectedBucket: "test",
			expectedPrefix: nil,
		},
		{
			uri:            "s3://test/test.csv",
			expectedSchema: "s3",
			expectedBucket: "test",
			expectedPrefix: aws.String("test.csv"),
		},
		{
			uri:            "s3://test/benchmark/",
			expectedSchema: "s3",
			expectedBucket: "test",
			expectedPrefix: aws.String("benchmark/"),
		},
		{
			uri:            "s3://tidbcloud-samples/hello?world/usern#ame.csv",
			expectedSchema: "s3",
			expectedBucket: "tidbcloud-samples",
			expectedPrefix: aws.String("hello?world/usern#ame.csv"),
		},
		{
			uri:           "s3://",
			expectedError: bizerr.New(bizerr.ErrCodeParams, "Invalid URL: Bucket name is missing or improperly specified."),
		},
	}
	for _, tc := range testCases {
		schema, bucket, prefix, err := parseS3Params(tc.uri)
		if tc.expectedError == nil {
			g.Expect(err).To(BeNil())
			g.Expect(bucket).To(Equal(tc.expectedBucket))
			g.Expect(schema).To(Equal(tc.expectedSchema))
			if tc.expectedPrefix == nil {
				g.Expect(prefix).To(BeNil())
			} else {
				g.Expect(prefix).To(Equal(tc.expectedPrefix))
			}
		} else {
			g.Expect(err).NotTo(BeNil())
			g.Expect(err.ErrMsg()).To(Equal(tc.expectedError.ErrMsg()))
		}
	}
}
