import assert = require("assert");
import winston = require("winston");
import { AccessController } from "../../../src/server/lib/access_control/AccessController";
import { ACLConfiguration } from "../../../src/types/Configuration";

describe("test access control manager", function () {
    let accessController: AccessController;
    let configuration: ACLConfiguration;

    beforeEach(function () {
        configuration = {
            default: [],
            users: {},
            groups: {}
        };
        accessController = new AccessController(configuration, winston);
    });

    describe("check access control matching", function () {
        beforeEach(function () {
            configuration.default = ["home.example.com", "*.public.example.com"];
            configuration.users = {
                user1: ["user1.example.com", "user1.mail.example.com"]
            };
            configuration.groups = {
                group1: ["secret2.example.com"],
                group2: ["secret.example.com", "secret1.example.com"]
            };
        });

        it("should allow access to secret.example.com", function () {
            assert(accessController.isDomainAllowedForUser("secret.example.com", "user", ["group1", "group2"]));
        });

        it("should deny access to secret3.example.com", function () {
            assert(!accessController.isDomainAllowedForUser("secret3.example.com", "user", ["group1", "group2"]));
        });

        it("should allow access to home.example.com", function () {
            assert(accessController.isDomainAllowedForUser("home.example.com", "user", ["group1", "group2"]));
        });

        it("should allow access to user1.example.com", function () {
            assert(accessController.isDomainAllowedForUser("user1.example.com", "user1", ["group1", "group2"]));
        });

        it("should allow access *.public.example.com", function () {
            assert(accessController.isDomainAllowedForUser("user.public.example.com", "nouser", []));
            assert(accessController.isDomainAllowedForUser("test.public.example.com", "nouser", []));
        });
    });
});