package utils

import (
	"net/url"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestJoinStorageURIWithSubDir(t *testing.T) {
	tests := map[string]struct {
		storageURI string
		subDir     string
		check      func(uri string)
	}{
		"azure uri keeps sas query": {
			storageURI: "azure://container/base/path?account-name=acct&sas-token=sv%3D2021-06-08%26sig%3Dfakesig",
			subDir:     "v1/compactions/downstream/",
			check: func(uri string) {
				parsed, err := url.Parse(uri)
				assert.NoError(t, err)
				assert.Equal(t, "/base/path/v1/compactions/downstream/", parsed.Path)
				assert.Equal(t, "acct", parsed.Query().Get("account-name"))
				assert.Equal(t, "sv=2021-06-08&sig=fakesig", parsed.Query().Get("sas-token"))
			},
		},
		"s3 uri appends cleanly": {
			storageURI: "s3://test-bucket/base/path/",
			subDir:     "/v1/migrations",
			check: func(uri string) {
				assert.Equal(t, "s3://test-bucket/base/path/v1/migrations", uri)
			},
		},
		"root base url": {
			storageURI: "s3://abc",
			subDir:     "/v1/migrations",
			check: func(uri string) {
				assert.Equal(t, "s3://abc/v1/migrations", uri)
			},
		},
		"suffix slash will be kept": {
			storageURI: "s3://abc",
			subDir:     "xyz/",
			check: func(uri string) {
				assert.Equal(t, "s3://abc/xyz/", uri)
			},
		},
	}

	for name, tc := range tests {
		t.Run(name, func(t *testing.T) {
			uri, err := JoinStorageURIWithSubDir(tc.storageURI, tc.subDir)
			if err != nil {
				t.Fatalf("unexpected error: %v", err)
			}
			tc.check(uri)
		})
	}
}
