package utils

import (
	"net/url"
	"strings"
	"testing"

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

func TestSanitizeImportIntoSQL(t *testing.T) {
	extractURI := func(t *testing.T, sql string) string {
		t.Helper()
		upper := strings.ToUpper(sql)
		marker := "FROM '"
		idx := strings.Index(upper, marker)
		require.GreaterOrEqual(t, idx, 0)
		start := idx + len(marker)
		endRel := strings.Index(sql[start:], "'")
		require.GreaterOrEqual(t, endRel, 0)
		return sql[start : start+endRel]
	}

	t.Run("https azure with sas-token", func(t *testing.T) {
		inURI := "https://acc.blob.core.windows.net/c/p?foo=bar&sas-token=sv%3D2020-08-04%26sig%3Dabc"
		inSQL := "IMPORT INTO `db`.`t` FROM '" + inURI + "' WITH DETACHED"
		outSQL := SanitizeImportIntoSQL(inSQL)
		outURI := extractURI(t, outSQL)

		u, err := url.Parse(outURI)
		require.NoError(t, err)
		q := u.Query()
		require.Equal(t, "bar", q.Get("foo"))
		require.Equal(t, "redacted", q.Get("sas-token"))
	})

	t.Run("azure scheme with sas-token", func(t *testing.T) {
		inURI := "azure://acc/c/p?sas-token=sv%3D2020-08-04%26sig%3Dabc&x=y"
		inSQL := "IMPORT INTO `db`.`t` FROM '" + inURI + "' WITH DETACHED"
		outSQL := SanitizeImportIntoSQL(inSQL)
		outURI := extractURI(t, outSQL)

		u, err := url.Parse(outURI)
		require.NoError(t, err)
		q := u.Query()
		require.Equal(t, "redacted", q.Get("sas-token"))
		require.Equal(t, "y", q.Get("x"))
	})

	t.Run("s3 with secret-access-key", func(t *testing.T) {
		inURI := "s3://bucket/prefix?access-key=AKIA&secret-access-key=SECRET&region=us-west-2"
		inSQL := "IMPORT INTO `db`.`t` FROM '" + inURI + "' WITH DETACHED"
		outSQL := SanitizeImportIntoSQL(inSQL)
		outURI := extractURI(t, outSQL)

		u, err := url.Parse(outURI)
		require.NoError(t, err)
		q := u.Query()
		require.Equal(t, "AKIA", q.Get("access-key"))
		require.Equal(t, "redacted", q.Get("secret-access-key"))
		require.Equal(t, "us-west-2", q.Get("region"))
	})
}
