package ssi

import (
	"bytes"
	"fmt"
	"sort"
	"testing"

	assert "github.com/stretchr/testify/require"
	"go.skia.org/infra/go/testutils"
)

func TestProcessSSI(t *testing.T) {
	testutils.SmallTest(t)

	// Inject our test function below.
	processFNs["testfn"] = getTestProcessFn(t, "testfn")
	processFNs["errfn"] = func(map[string]string) ([]byte, error) {
		return nil, fmt.Errorf("Error!")
	}

	checkSSI(t, "<p><ssi:testfn k1=v2></p>", "<p>testfn:k1:v2:</p>")
	checkSSI(t, "<p><ssi:testfn k1=v2 k2=v2></p>", "<p>testfn:k1:v2:k2:v2:</p>")
	checkSSI(t, "<p><ssi:testfn></p>", "<p>testfn:</p>")

	_, err := ProcessSSI([]byte("<p><ssi:invalidfn k1=v1></p>"))
	assert.Error(t, err)
	_, err = ProcessSSI([]byte("<p><ssi:testfn =v1></p>"))
	assert.Error(t, err)
	_, err = ProcessSSI([]byte("<p><ssi:errfn k1=v1></p>"))
	assert.Error(t, err)
}

const (
	// Alternate row template to make testing easier.
	testRowTmpl = "{{.created}}:{{.url}}:{{.name}}:{{.date}}:{{.commit}}:{{.commit_url}}:{{.commit_message}}\n"

	// Expected output.
	expOutput = `2018-03-05T12:44:24Z:https://storage.cloud.google.com/skia-infra-testdata/skqp-testing/skqp-universal-006-debug.apk:skqp-universal-006-debug.apk: 2018-03-05T12:32:58Z:95a7b76a44edd2f25423a4d395df553b80fe06d7:https://example.com/+/95a7b76a44edd2f25423a4d395df553b80fe06d7:Add new feature to dm
2018-03-05T12:44:17Z:https://storage.cloud.google.com/skia-infra-testdata/skqp-testing/skqp-universal-005-debug.apk:skqp-universal-005-debug.apk: 2018-03-05T12:32:58Z:95a7b76a44edd2f25423a4d395df553b80fe06d7:https://example.com/+/95a7b76a44edd2f25423a4d395df553b80fe06d7:Add new feature to dm
2018-03-05T12:44:09Z:https://storage.cloud.google.com/skia-infra-testdata/skqp-testing/skqp-universal-004-debug.apk:skqp-universal-004-debug.apk: 2018-03-05T12:32:58Z:95a7b76a44edd2f25423a4d395df553b80fe06d7:https://example.com/+/95a7b76a44edd2f25423a4d395df553b80fe06d7:Add new feature to dm
2018-03-05T12:44:01Z:https://storage.cloud.google.com/skia-infra-testdata/skqp-testing/skqp-universal-003-debug.apk:skqp-universal-003-debug.apk: 2018-03-05T12:32:58Z:95a7b76a44edd2f25423a4d395df553b80fe06d7:https://example.com/+/95a7b76a44edd2f25423a4d395df553b80fe06d7:Add new feature to dm
2018-03-05T12:32:53Z:https://storage.cloud.google.com/skia-infra-testdata/skqp-testing/skqp-universal-002-debug.apk:skqp-universal-002-debug.apk: 2018-03-05T12:32:58Z:95a7b76a44edd2f25423a4d395df553b80fe06d7:https://example.com/+/95a7b76a44edd2f25423a4d395df553b80fe06d7:Add new feature to dm`
)

/* Test assumes a local JWT service account.
func TestGCEListing(t *testing.T) {

	testutils.MediumTest(t)

	// Swap out the templates to make testing easier.
	listGCSTagSnippet = "%s"
	gceListingRowTmpl = template.Must(template.New("row").Parse(testRowTmpl))

	tokenSrc, err := auth.NewJWTServiceAccountTokenSource("", "", storage.ScopeFullControl)
	assert.NoError(t, err)

	client, err := storage.NewClient(context.Background(), option.WithTokenSource(tokenSrc))
	assert.NoError(t, err)

	Init("https://example.com", client)
	doc, err := ProcessSSI([]byte("<ssi:listgce path=skia-infra-testdata/skqp-testing>"))
	assert.NoError(t, err)
	assert.NotNil(t, doc)
	assert.Equal(t, expOutput, strings.TrimSpace(string(doc)))
}
*/

func checkSSI(t *testing.T, tag, expDoc string) {
	doc, err := ProcessSSI([]byte(tag))
	assert.NoError(t, err)
	assert.Equal(t, expDoc, string(doc))
}

func getTestProcessFn(t *testing.T, tagName string) ssiProcessFn {
	return func(params map[string]string) ([]byte, error) {
		// Write the keys in alphabetical order.
		keys := []string{}
		for k := range params {
			keys = append(keys, k)
		}
		sort.Strings(keys)

		var buf bytes.Buffer
		buf.Write([]byte(tagName + ":"))
		for _, k := range keys {
			_, err := buf.Write([]byte(fmt.Sprintf("%s:%s:", k, params[k])))
			assert.NoError(t, err)
		}
		return buf.Bytes(), nil
	}
}
