/*******************************************************************************
 * Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 * Edgar - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.emfstore.server.accesscontrol.test;

import static org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil.share;
import static org.eclipse.emf.emfstore.client.test.common.util.ServerUtil.createGroup;
import static org.eclipse.emf.emfstore.client.test.common.util.ServerUtil.createUser;
import static org.eclipse.emf.emfstore.client.test.common.util.ServerUtil.deleteGroup;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import org.eclipse.emf.emfstore.client.test.common.dsl.Roles;
import org.eclipse.emf.emfstore.client.test.common.util.ServerUtil;
import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESUsersessionImpl;
import org.eclipse.emf.emfstore.internal.server.exceptions.AccessControlException;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.ACOrgUnitId;
import org.eclipse.emf.emfstore.server.auth.ESProjectAdminPrivileges;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * Tests whether organizational units can be assigned to groups.
 * 
 * @author emueller
 * 
 */
public class AssignOrgUnitToGroupTests extends ProjectAdminTest {

	@BeforeClass
	public static void beforeClass() {
		startEMFStoreWithPAProperties(
			ESProjectAdminPrivileges.ShareProject,
			ESProjectAdminPrivileges.AssignRoleToOrgUnit,
			ESProjectAdminPrivileges.ChangeAssignmentsOfOrgUnits);
	}

	@AfterClass
	public static void afterClass() {
		stopEMFStore();
	}

	@Override
	@After
	public void after() {
		try {
			deleteGroup(getSuperUsersession(), getNewGroupName());
			deleteGroup(getSuperUsersession(), getNewOtherGroupName());
		} catch (final ESException ex) {
			fail(ex.getMessage());
		}
		super.after();
	}

	@Override
	@Before
	public void before() {
		super.before();
	}

	@Test(expected = AccessControlException.class)
	public void addMemberToGroupWhichBelongsToOtherProject() throws ESException {
		makeUserPA();
		share(getSuperUsersession(), getLocalProject());
		final ACOrgUnitId newUser = createUser(getSuperUsersession(), getNewUsername());
		final ACOrgUnitId group = createGroup(getSuperUsersession(), getNewGroupName());

		share(getUsersession(), getLocalProject());
		final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace());
		share(getSuperUsersession(), clonedProjectSpace.toAPI());

		getSuperAdminBroker().changeRole(clonedProjectSpace.getProjectId(), group, Roles.writer());

		// fails
		getAdminBroker().addMember(group, newUser);
	}

	@Test(expected = AccessControlException.class)
	public void removeMemberFromGroupWhichBelongsToOtherProject() throws ESException {
		makeUserPA();
		share(getSuperUsersession(), getLocalProject());
		final ACOrgUnitId newUser = createUser(getSuperUsersession(), getNewUsername());
		final ACOrgUnitId group = createGroup(getSuperUsersession(), getNewGroupName());

		share(getUsersession(), getLocalProject());
		final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace());
		share(getSuperUsersession(), clonedProjectSpace.toAPI());

		getSuperAdminBroker().changeRole(clonedProjectSpace.getProjectId(), group, Roles.writer());

		getSuperAdminBroker().addMember(group, newUser);
		getAdminBroker().removeMember(group, newUser);
	}

	@Test
	public void removeMemberFromGroupWithProject() throws ESException {
		makeUserPA();
		share(getUsersession(), getLocalProject());
		final ACOrgUnitId newUser = createUser(getSuperUsersession(), getNewUsername());
		final ACOrgUnitId group = createGroup(getSuperUsersession(), getNewGroupName());

		getAdminBroker().changeRole(getProjectSpace().getProjectId(), group, Roles.writer());

		getAdminBroker().addMember(group, newUser);
		getAdminBroker().removeMember(group, newUser);
		assertEquals(0, getAdminBroker().getMembers(group).size());
	}

	@Test
	public void addMemberToGroup() throws ESException {
		makeUserPA();
		final ACOrgUnitId newUser = createUser(getSuperUsersession(), getNewUsername());
		final ACOrgUnitId group = createGroup(getSuperUsersession(), getNewGroupName());
		getAdminBroker().addMember(group, newUser);
		assertEquals(1, getAdminBroker().getMembers(group).size());
	}

	@Test
	public void addParticipantAsPA() throws ESException {
		makeUserPA();
		final ACOrgUnitId newUserId = ServerUtil.createUser(getSuperUsersession(), getNewUsername());
		share(getUsersession(), getLocalProject());
		final int oldSize = getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size();
		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.reader());
		assertEquals(oldSize + 1, getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size());
	}

	@Test
	public void addReaderToDifferentProjectsAsPA() throws ESException {
		makeUserPA();
		final ACOrgUnitId newUserId = ServerUtil.createUser(getSuperUsersession(), getNewUsername());
		share(getUsersession(), getLocalProject());
		final int oldSize = getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size();

		final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace());
		share(getUsersession(), clonedProjectSpace.toAPI());

		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.reader());
		getAdminBroker().addParticipant(clonedProjectSpace.getProjectId(), newUserId, Roles.reader());
		assertEquals(oldSize + 1, getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size());
	}

	@Test
	public void addParticipantTwiceAsPA() throws ESException {
		makeUserPA();
		final ACOrgUnitId newUserId = ServerUtil.createUser(getSuperUsersession(), getNewUsername());
		share(getUsersession(), getLocalProject());
		final int oldSize = getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size();
		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.reader());
		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.reader());
		assertEquals(oldSize + 1, getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size());
	}

	@Test(expected = AccessControlException.class)
	public void addParticipantSAasPA() throws ESException {
		makeUserPA();
		final ACOrgUnitId newUserId = ServerUtil.createUser(getSuperUsersession(), getNewUsername());
		share(getUsersession(), getLocalProject());
		final int oldSize = getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size();
		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.serverAdmin());
		assertEquals(oldSize + 1, getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size());
	}

	@Test(expected = AccessControlException.class)
	public void addParticipantNotPA() throws ESException {
		final ACOrgUnitId newUserId = ServerUtil.createUser(getSuperUsersession(), getNewUsername());
		share(getUsersession(), getLocalProject());
		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.reader());
	}

	@Test
	public void removeParticipantPA() throws ESException {
		makeUserPA();
		final ACOrgUnitId newUserId = ServerUtil.createUser(getSuperUsersession(), getNewUsername());
		share(getUsersession(), getLocalProject());
		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.reader());
		final int oldSize = getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size();
		getAdminBroker().removeParticipant(getProjectSpace().getProjectId(), newUserId);
		assertEquals(oldSize - 1, getAdminBroker().getParticipants(getProjectSpace().getProjectId()).size());
	}

	@Test(expected = AccessControlException.class)
	public void removeParticipantNotPA() throws ESException {
		makeUserPA();
		final ACOrgUnitId newUserId = ServerUtil.createUser(getSuperUsersession(), getNewUsername());
		share(getUsersession(), getLocalProject());
		getAdminBroker().addParticipant(getProjectSpace().getProjectId(), newUserId, Roles.reader());
		// downgrade project admin
		getAdminBroker().changeRole(getProjectSpace().getProjectId(),
			ESUsersessionImpl.class.cast(getUsersession()).toInternalAPI().getACUser().getId(),
			Roles.writer());
		getAdminBroker().removeParticipant(getProjectSpace().getProjectId(), newUserId);
	}
}
