// Copyright 2017 The OPA Authors.  All rights reserved.
// Use of this source code is governed by an Apache2
// license that can be found in the LICENSE file.

package authz

import (
	"testing"

	"github.com/open-policy-agent/opa/v1/ast"
	"github.com/open-policy-agent/opa/v1/rego"
	"github.com/open-policy-agent/opa/v1/storage"
	"github.com/open-policy-agent/opa/v1/storage/inmem"
)

func TestAuthz(t *testing.T) {

	profile := DataSetProfile{
		NumTokens: 1000,
		NumPaths:  10,
	}

	ctx := t.Context()
	data := GenerateDataset(profile)
	store := inmem.NewFromObject(data)
	txn := storage.NewTransactionOrDie(ctx, store)
	compiler := ast.NewCompiler()
	module := ast.MustParseModule(Policy)

	compiler.Compile(map[string]*ast.Module{"": module})
	if compiler.Failed() {
		t.Fatalf("Unexpected error(s): %v", compiler.Errors)
	}

	input, expected := GenerateInput(profile, ForbidPath)

	r := rego.New(
		rego.Compiler(compiler),
		rego.Store(store),
		rego.Transaction(txn),
		rego.Input(input),
		rego.Query(AllowQuery),
	)

	rs, err := r.Eval(ctx)

	if err != nil {
		t.Fatalf("Unexpected error(s): %v", err)
	}

	if rs.Allowed() != expected {
		t.Fatalf("Unexpected result: want %v, got %v", expected, rs.Allowed())
	}
}
