package utils

import (
	"net/url"
	"testing"

	. "github.com/smartystreets/goconvey/convey"
)

func TestRedactSourceURI(t *testing.T) {
	Convey("RedactSourceURI", t, func() {
		Convey("returns empty for empty input", func() {
			So(RedactSourceURI(""), ShouldEqual, "")
		})

		Convey("keeps normal bucket URIs unchanged", func() {
			uri := "s3://my-bucket/path/to/data"
			So(RedactSourceURI(uri), ShouldEqual, uri)
		})

		Convey("redacts azure sas-token query parameter", func() {
			in := "azure://acc/container/path/file.csv?sas-token=sv%3D2020-08-04%26sig%3Dabc&foo=bar"
			out := RedactSourceURI(in)

			u, err := url.Parse(out)
			So(err, ShouldBeNil)
			q := u.Query()
			So(q.Get("sas-token"), ShouldEqual, "redacted")
			So(q.Get("foo"), ShouldEqual, "bar")
		})

		Convey("redacts s3 secret-access-key query parameter", func() {
			in := "s3://bucket/prefix?access-key=AKIA&secret-access-key=SECRET&region=us-west-2"
			out := RedactSourceURI(in)

			u, err := url.Parse(out)
			So(err, ShouldBeNil)
			q := u.Query()
			So(q.Get("access-key"), ShouldEqual, "AKIA")
			So(q.Get("secret-access-key"), ShouldEqual, "redacted")
			So(q.Get("region"), ShouldEqual, "us-west-2")
		})

		Convey("redacts sensitive query keys case-insensitively", func() {
			in := "https://example.com/a?SAS-TOKEN=AAA&SeCrEt-AccEsS-KeY=BBB&x=y"
			out := RedactSourceURI(in)

			u, err := url.Parse(out)
			So(err, ShouldBeNil)
			q := u.Query()
			So(q.Get("SAS-TOKEN"), ShouldEqual, "redacted")
			So(q.Get("SeCrEt-AccEsS-KeY"), ShouldEqual, "redacted")
			So(q.Get("x"), ShouldEqual, "y")
		})
	})
}
