/*
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 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.Fatalf("Expected success to be false")
	}
	if out[successStringParam] != "false" {
		t.Fatalf("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.Fatalf("Expected success to be true")
	}
	if out[successStringParam] != "true" {
		t.Fatalf("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])
	}
}
