/*
Copyright 2017 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package adapter

import (
	"testing"

	"github.com/apid/istioApigeeAdapter/adapter/config"
	"github.com/apid/istioApigeeAdapter/mock"
)

func TestMissingKey(t *testing.T) {
	cfg := &config.VerifyKeyParams{
		Organization:    "foo",
		Environment:     "test",
		VerificationURL: "http://" + mockServer.Address(),
	}

	builder := newKeyAttrsBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatalf("Error validating config: %s", ce)
	}

	ag, err := builder.BuildAttributesGenerator(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer ag.Close()

	in := make(map[string]interface{})

	out, err := ag.Generate(in)
	if err != nil {
		t.Fatalf("Error checking parameters: %s", err)
	}
	if out[successParam] != false {
		t.Fatal("Expected success to be false")
	}
	if out[successStringParam] != "false" {
		t.Fatal("Expected success string to be false")
	}
}

func TestEmptyKey(t *testing.T) {
	cfg := &config.VerifyKeyParams{
		Organization:    "foo",
		Environment:     "test",
		VerificationURL: "http://" + mockServer.Address(),
	}

	builder := newKeyAttrsBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatalf("Error validating config: %s", ce)
	}

	ag, err := builder.BuildAttributesGenerator(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer ag.Close()

	in := make(map[string]interface{})
	in[keyParam] = "99999"
	in[pathParam] = "/"

	out, err := ag.Generate(in)
	if err != nil {
		t.Fatalf("Error checking parameters: %s", err)
	}
	if out[successParam] != false {
		t.Fatal("Expected success to be false")
	}
	if out[successStringParam] != "false" {
		t.Fatal("Expected success string to be false")
	}
}

func TestInvalidKeyAttributes(t *testing.T) {
	cfg := &config.VerifyKeyParams{
		Organization:    "foo",
		Environment:     "test",
		VerificationURL: "http://" + mockServer.Address(),
	}

	builder := newKeyAttrsBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatalf("Error validating config: %s", ce)
	}

	ag, err := builder.BuildAttributesGenerator(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer ag.Close()

	in := make(map[string]interface{})
	in[keyParam] = "99999"
	in[pathParam] = "/"

	out, err := ag.Generate(in)
	if err != nil {
		t.Fatalf("Error checking parameters: %s", err)
	}
	if out[successParam] != false {
		t.Fatal("Expected success to be false")
	}
	if out[successStringParam] != "false" {
		t.Fatal("Expected success string to be false")
	}
}

func TestValidKeyAttributes(t *testing.T) {
	cfg := &config.VerifyKeyParams{
		Organization:    "foo",
		Environment:     "test",
		VerificationURL: "http://" + mockServer.Address(),
	}

	builder := newKeyAttrsBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatalf("Error validating config: %s", ce)
	}

	ag, err := builder.BuildAttributesGenerator(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer ag.Close()

	in := make(map[string]interface{})
	in[keyParam] = mock.ValidAPIKey1
	in[pathParam] = "/"

	out, err := ag.Generate(in)
	if err != nil {
		t.Fatalf("Error checking parameters: %s", err)
	}
	if out[successParam] != true {
		t.Fatal("Expected success to be true")
	}
	if out[successStringParam] != "true" {
		t.Fatal("Expected success string to be true")
	}
	if out[clientIDParam] != mock.ValidAPIKey1 {
		t.Fatalf("Invalid client ID %s", out[clientIDParam])
	}
	if out[appNameParam] != "TestApp1" {
		t.Fatalf("Invalid application name %s", out[appNameParam])
	}
	if out[productNameParam] != "TestProduct1" {
		t.Fatalf("Invalid API product name %s", out[productNameParam])
	}
}

func TestValidKeyNoProducts(t *testing.T) {
	cfg := &config.VerifyKeyParams{
		Organization:    "foo",
		Environment:     "test",
		VerificationURL: "http://" + mockServer.Address(),
	}

	builder := newKeyAttrsBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatalf("Error validating config: %s", ce)
	}

	ag, err := builder.BuildAttributesGenerator(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer ag.Close()

	in := make(map[string]interface{})
	in[keyParam] = mock.ValidAPIKeyNoProducts
	in[pathParam] = "/"

	out, err := ag.Generate(in)
	if err != nil {
		t.Fatalf("Error checking parameters: %s", err)
	}
	if out[successParam] != false {
		t.Fatal("Expected success to be false")
	}
	if out[successStringParam] != "false" {
		t.Fatal("Expected success string to be false")
	}
	if out[clientIDParam] != mock.ValidAPIKeyNoProducts {
		t.Fatalf("Invalid client ID %s", out[clientIDParam])
	}
	if out[appNameParam] != "TestApp2" {
		t.Fatalf("Invalid application name %s", out[appNameParam])
	}
}
