// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package secrets

import (
	"context"
	"go.chromium.org/luci/lucictx"
	"net/http"
	"net/http/httptest"
	"reflect"
	"testing"
)

func TestGettingSecrets(t *testing.T) {
	secretBytes := []byte(`{"testNameA":"SECRETA","testNameB":"SECRETB"}`)
	swarming := lucictx.Swarming{
		SecretBytes: secretBytes,
	}
	ctx := lucictx.SetSwarming(context.Background(), &swarming)

	expectedSecrets := testSecrets{
		"testNameA": "SECRETA",
		"testNameB": "SECRETB",
	}
	actualSecrets := getSecrets(ctx)
	if actualSecrets == nil {
		t.Fatal("no secrets found")
	}
	if !reflect.DeepEqual(actualSecrets, &expectedSecrets) {
		t.Errorf("Returned secrets \"%v\" do not match the expected: \"%v\"\n",
			*actualSecrets, expectedSecrets)
	}
}

func TestServingSecrets(t *testing.T) {
	// Returns an GET request for the secret associated to |testName|.
	secretRequest := func(testName string) *http.Request {
		request, err := http.NewRequest(http.MethodGet, "/"+testName, nil)
		if err != nil {
			t.Fatal(err)
		}
		return request
	}

	secrets := testSecrets{
		"foo_unittests": "FOO-SECRET",
		"bar_e2e_tests": "BAR-SECRET",
	}
	handler := http.HandlerFunc(secrets.serveSecret)

	// Checks that the expected content and code were returned in a mock HTTP response.
	expectValidResponse := func(t *testing.T, testName string, expectedCode int,
		expectedContent string) {
		recorder := httptest.NewRecorder()
		handler.ServeHTTP(recorder, secretRequest(testName))
		if actualCode := recorder.Code; actualCode != expectedCode {
			t.Errorf("serveSecret() response code: %v\n; %v was expected for test \"%v\"\n",
				actualCode, expectedCode, testName)
		}
		if actualContent := recorder.Body.String(); actualContent != expectedContent {
			t.Errorf("serveSecret() failed to returned \"%v\" instead of \"%v\" for test \"%v\"\n",
				actualContent, expectedContent, testName)
		}
	}

	t.Run("Succeeds when associated secret exists", func(t *testing.T) {
		expectValidResponse(t, "foo_unittests", http.StatusOK, "FOO-SECRET")
	})

	t.Run("Fails when associated secret does not exist", func(t *testing.T) {
		expectValidResponse(t, "non_existant_unittests", http.StatusNotFound, "")
	})
}
