package org.apache.archiva.redback.rbac.jpa;

/*
 * 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.
 */

import org.apache.archiva.redback.rbac.RBACManager;
import org.apache.archiva.redback.rbac.RbacManagerException;
import org.apache.archiva.redback.tests.AbstractRbacManagerTestCase;
import org.junit.Before;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.transaction.annotation.Transactional;

import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.io.InputStream;
import java.util.Properties;

/**
 * JdoRbacManagerTest:
 *
 * @author Jesse McConnell
 * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
 */
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
@Transactional
public class JpaRbacManagerTest
    extends AbstractRbacManagerTestCase
{

    @Inject
    @Named(value = "rbacManager#jpa")
    RBACManager rbacManager;


    public static int EVENTCOUNT = 2;

    @Override
    public void assertEventCount()
    {
        assertEquals( EVENTCOUNT, eventTracker.initCount );
    }

    /**
     * Creates a new RbacStore which contains no data.
     */
    @Before
    public void setUp()
        throws Exception
    {

        super.setUp();
//        Properties props = new Properties();
//        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");
//        assert is!=null;
//        props.load(is);
//        is.close();
//        EntityManagerFactory emf = Persistence.createEntityManagerFactory("redback-jpa",props);
//
        log.info("test setup");
        // rbacManager.setEntityManager(emf.createEntityManager());
        super.setRbacManager(rbacManager);
        assertNotNull(rbacManager);
        log.info("injected rbac manager "+rbacManager);

    }


    @Override
    public void testGetAssignedRoles()
        throws RbacManagerException
    {
        super.testGetAssignedRoles();
    }

    @Override
    public void testGetAssignedPermissionsDeep()
        throws RbacManagerException
    {
        super.testGetAssignedPermissionsDeep();
    }

    @Override
    protected void afterSetup()
    {
        super.afterSetup();
    }

    @Override
    public void testLargeApplicationInit()
        throws RbacManagerException
    {
        this.clearCache();
        super.testLargeApplicationInit();
    }

    @Override
    public void testGetRolesDeep()
        throws RbacManagerException
    {
        this.clearCache();
        super.testGetRolesDeep();
    }


    @Override
    public void testStoreInitialization()
        throws Exception
    {
        this.clearCache();
        rbacManager.eraseDatabase();
        eventTracker.rbacInit( true );
        super.testStoreInitialization();
        assertEquals( EVENTCOUNT, eventTracker.initCount );
    }


}
