/*
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"
)

func TestRejectFalseness(t *testing.T) {
	cfg := &config.RejectParams{}
	builder := newRejectBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatal("Config should validate")
	}
	aspect, err := builder.NewListsAspect(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer aspect.Close()

	result, err := aspect.CheckList("false")
	if err != nil {
		t.Fatalf("Error on list check: %s", err)
	}
	if result {
		t.Fatal("List check returned true and should have failed")
	}
}

func TestRejectEmpty(t *testing.T) {
	cfg := &config.RejectParams{}
	builder := newRejectBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatal("Config should validate")
	}
	aspect, err := builder.NewListsAspect(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer aspect.Close()

	result, err := aspect.CheckList("")
	if err != nil {
		t.Fatalf("Error on list check: %s", err)
	}
	if result {
		t.Fatal("List check returned true and should have failed")
	}
}

func TestRejectTruthy(t *testing.T) {
	cfg := &config.RejectParams{}
	builder := newRejectBuilder()
	ce := builder.ValidateConfig(cfg)
	if ce != nil {
		t.Fatal("Config should validate")
	}
	aspect, err := builder.NewListsAspect(mockEnv, cfg)
	if err != nil {
		t.Fatalf("Error creating aspect: %s", err)
	}
	defer aspect.Close()

	result, err := aspect.CheckList("true")
	if err != nil {
		t.Fatalf("Error on list check: %s", err)
	}
	if !result {
		t.Fatal("List check returned false")
	}
}
