/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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 org.apache.openaz.pepapi.std.test;

import org.apache.openaz.pepapi.*;
import org.apache.openaz.pepapi.std.StdPepAgentFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.net.URI;
import java.util.ArrayList;
import java.util.List;

public class TestCustomNamespace {

    private PepAgentFactory pepAgentFactory;

    @Before
    public void setup() {
        pepAgentFactory = new StdPepAgentFactory("properties/test-custom-namespace.xacml.properties");
    }

    /**
     *
     */
    @Test
    public void testPepAgent() {
        Assert.assertNotNull(getPepAgent());
    }

    /**
     *
     */
    @Test
    public void testPermit() {
        PepResponse response = getPepAgent().simpleDecide("Julius Hibbert", "read",
                                                          "http://medico.com/record/patient/BartSimpson");
        Assert.assertNotNull(response);
        Assert.assertEquals(true, response.allowed());
    }

    /**
     *
     */
    @Test
    public void testPermitWithLocationMatch() {
        Subject subject = Subject.newInstance("Bob");
        Action action = Action.newInstance("read");
        Resource resource = Resource.newInstance(URI.create("/record/patient/Alice"))
                .withLocation(URI.create("http://medical-records.com/"));
        PepResponse response = getPepAgent().decide(subject, action, resource);
        Assert.assertNotNull(response);
        Assert.assertEquals(true, response.allowed());
    }

    /**
     *
     */
    @Test
    public void testPermitWithLocationMismatch() {
        Subject subject = Subject.newInstance("Bob");
        Action action = Action.newInstance("read");
        Resource resource = Resource.newInstance(URI.create("/record/patient/Alice"))
                .withLocation(URI.create("http://restricted-records.com/"));
        PepResponse response = getPepAgent().decide(subject, action, resource);
        Assert.assertNotNull(response);
        Assert.assertEquals(false, response.allowed());
    }

    /**
     *
     */
    @Test
    public void testNotApplicable() {
        PepResponse response = getPepAgent().simpleDecide("Julius Hibbert", "read",
                                                          "http://medico.com/record/patient/JohnSmith");
        Assert.assertNotNull(response);
        Assert.assertEquals(false, response.allowed());
    }

    /**
     *
     */
    @Test
    public void testMultiRequest() {
        List<Action> actions = new ArrayList<Action>();
        actions.add(Action.newInstance("read"));
        actions.add(Action.newInstance("write"));
        actions.add(Action.newInstance("update"));
        actions.add(Action.newInstance("delete"));

        List<PepResponse> responses = getPepAgent()
            .bulkDecide(actions, Subject.newInstance("Julius Hibbert"),
                        Resource.newInstance("http://medico.com/record/patient/BartSimpson"));
        Assert.assertNotNull(responses);
        Assert.assertEquals(true, responses.get(0).allowed());
        Assert.assertEquals(true, responses.get(1).allowed());
        Assert.assertEquals(false, responses.get(2).allowed());
        Assert.assertEquals(false, responses.get(3).allowed());

    }

    public PepAgent getPepAgent() {
        return pepAgentFactory.getPepAgent();
    }
}
