/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.masterdb.user;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.fail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.opengamma.DataDuplicationException;
import com.opengamma.DataNotFoundException;
import com.opengamma.core.user.UserAccount;
import com.opengamma.core.user.impl.SimpleUserAccount;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.user.HistoryEventType;
import com.opengamma.master.user.ManageableRole;
import com.opengamma.master.user.RoleEventHistoryRequest;
import com.opengamma.master.user.RoleEventHistoryResult;
import com.opengamma.master.user.RoleSearchRequest;
import com.opengamma.master.user.RoleSearchResult;
import com.opengamma.util.test.AbstractDbTest;
import com.opengamma.util.test.DbTest;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT_DB)
public class DbRoleMasterTest extends AbstractDbTest {
private static final Logger s_logger = LoggerFactory.getLogger(DbRoleMasterTest.class);
private static final String TEST_ROLE = "one";
private static final String TEST_ROLE2 = "two";
private DbRoleMaster _roleMaster;
@Factory(dataProvider = "databases", dataProviderClass = DbTest.class)
public DbRoleMasterTest(String databaseType, String databaseVersion) {
super(databaseType, databaseVersion);
s_logger.info("running testcases for {}", databaseType);
}
//-------------------------------------------------------------------------
@Override
protected void doSetUp() {
_roleMaster = new DbRoleMaster(getDbConnector());
}
@Override
protected void doTearDown() {
_roleMaster = null;
}
//-------------------------------------------------------------------------
@Test
public void test_basics() throws Exception {
assertNotNull(_roleMaster);
assertEquals(true, _roleMaster.getUniqueIdScheme().equals("DbUsrRole"));
assertNotNull(_roleMaster.getDbConnector());
assertNotNull(_roleMaster.getClock());
}
//-------------------------------------------------------------------------
@Test
public void test_example() throws Exception {
ManageableRole role = createRole();
assertEquals(false, _roleMaster.nameExists(role.getRoleName()));
UniqueId uid = _roleMaster.add(role);
assertEquals(true, _roleMaster.nameExists(role.getRoleName()));
role.setUniqueId(uid);
ManageableRole loaded = _roleMaster.getById(uid.getObjectId());
assertEquals(role, loaded);
}
@Test
public void test_no_users() throws Exception {
ManageableRole role = createRole();
role.getAssociatedUsers().clear();;
UniqueId uid = _roleMaster.add(role);
role.setUniqueId(uid);
ManageableRole loaded = _roleMaster.getById(uid.getObjectId());
assertEquals(role, loaded);
}
@Test
public void test_no_permissions() throws Exception {
ManageableRole role = createRole();
role.getAssociatedPermissions().clear();
UniqueId uid = _roleMaster.add(role);
role.setUniqueId(uid);
ManageableRole loaded = _roleMaster.getById(uid.getObjectId());
assertEquals(role, loaded);
}
@Test
public void test_no_roles() throws Exception {
ManageableRole role = createRole();
role.getAssociatedRoles().clear();
UniqueId uid = _roleMaster.add(role);
role.setUniqueId(uid);
ManageableRole loaded = _roleMaster.getById(uid.getObjectId());
assertEquals(role, loaded);
}
@Test
public void test_no_subTables() throws Exception {
ManageableRole role = createRole();
role.getAssociatedUsers().clear();
role.getAssociatedPermissions().clear();
role.getAssociatedRoles().clear();
UniqueId uid = _roleMaster.add(role);
role.setUniqueId(uid);
ManageableRole loaded = _roleMaster.getById(uid.getObjectId());
assertEquals(role, loaded);
}
//-------------------------------------------------------------------------
@Test
public void test_addNameExists() throws Exception {
ManageableRole role = createRole();
_roleMaster.add(role);
assertNotNull(_roleMaster.getByName(TEST_ROLE));
try {
_roleMaster.add(role);
fail();
} catch (DataDuplicationException ex) {
// expected
}
assertNotNull(_roleMaster.getByName(TEST_ROLE));
}
//-------------------------------------------------------------------------
@Test
public void test_removeByName() throws Exception {
ManageableRole role = createRole();
UniqueId uid = _roleMaster.add(role);
assertNotNull(_roleMaster.getById(uid.getObjectId()));
assertNotNull(_roleMaster.getByName(TEST_ROLE));
_roleMaster.removeByName(TEST_ROLE);
try {
_roleMaster.getByName(TEST_ROLE);
fail();
} catch (DataNotFoundException ex) {
// expected
}
try {
_roleMaster.getById(uid.getObjectId());
fail();
} catch (DataNotFoundException ex) {
// expected
}
_roleMaster.removeByName(TEST_ROLE); // idempotent
_roleMaster.removeById(uid.getObjectId()); // idempotent
RoleEventHistoryResult events = _roleMaster.eventHistory(new RoleEventHistoryRequest(TEST_ROLE));
assertEquals(2, events.getEvents().size());
assertEquals(HistoryEventType.ADDED, events.getEvents().get(0).getType());
assertEquals(0, events.getEvents().get(0).getChanges().size());
assertEquals(HistoryEventType.REMOVED, events.getEvents().get(1).getType());
assertEquals(0, events.getEvents().get(1).getChanges().size());
}
//-------------------------------------------------------------------------
@Test
public void test_removeById() throws Exception {
ManageableRole role = createRole();
UniqueId uid = _roleMaster.add(role);
assertNotNull(_roleMaster.getById(uid.getObjectId()));
assertNotNull(_roleMaster.getByName(TEST_ROLE));
_roleMaster.removeById(uid.getObjectId());
try {
_roleMaster.getById(uid.getObjectId());
fail();
} catch (DataNotFoundException ex) {
// expected
}
try {
_roleMaster.getByName(TEST_ROLE);
fail();
} catch (DataNotFoundException ex) {
// expected
}
_roleMaster.removeById(uid.getObjectId()); // idempotent
_roleMaster.removeByName(TEST_ROLE); // idempotent
RoleEventHistoryResult events = _roleMaster.eventHistory(new RoleEventHistoryRequest(uid.getObjectId()));
assertEquals(2, events.getEvents().size());
assertEquals(HistoryEventType.ADDED, events.getEvents().get(0).getType());
assertEquals(0, events.getEvents().get(0).getChanges().size());
assertEquals(HistoryEventType.REMOVED, events.getEvents().get(1).getType());
assertEquals(0, events.getEvents().get(1).getChanges().size());
}
//-------------------------------------------------------------------------
@Test
public void test_update_main() throws Exception {
ManageableRole role = createRole();
UniqueId uid1 = _roleMaster.add(role);
role = _roleMaster.getById(uid1.getObjectId());
role.setDescription("tester");
UniqueId uid2 = _roleMaster.update(role);
role.setUniqueId(uid2);
ManageableRole loaded = _roleMaster.getById(uid2.getObjectId());
assertEquals(role, loaded);
}
@Test
public void test_update_linked() throws Exception {
ManageableRole role = createRole();
UniqueId uid1 = _roleMaster.add(role);
role = _roleMaster.getById(uid1.getObjectId());
role.getAssociatedUsers().remove("adam");
role.getAssociatedUsers().add("david");
role.getAssociatedPermissions().remove("PERMISSION-2");
role.getAssociatedPermissions().add("NEWPERMISSION");
role.getAssociatedRoles().add("two");
UniqueId uid2 = _roleMaster.update(role);
role.setUniqueId(uid2);
ManageableRole loaded = _roleMaster.getById(uid2.getObjectId());
assertEquals(role, loaded);
RoleEventHistoryResult events = _roleMaster.eventHistory(new RoleEventHistoryRequest(uid2.getObjectId()));
assertEquals(2, events.getEvents().size());
assertEquals(HistoryEventType.ADDED, events.getEvents().get(0).getType());
assertEquals(0, events.getEvents().get(0).getChanges().size());
assertEquals(HistoryEventType.CHANGED, events.getEvents().get(1).getType());
assertEquals(5, events.getEvents().get(1).getChanges().size());
}
@Test
public void test_update_rename_succeed() throws Exception {
ManageableRole role = createRole();
UniqueId uid1 = _roleMaster.add(role);
role = _roleMaster.getById(uid1.getObjectId());
role.setRoleName("three");
UniqueId uid2 = _roleMaster.update(role);
role.setUniqueId(uid2);
assertEquals(role, _roleMaster.getById(uid2.getObjectId()));
assertEquals(role, _roleMaster.getByName(TEST_ROLE));
assertEquals(role, _roleMaster.getByName("three"));
}
@Test
public void test_update_rename_fail() throws Exception {
ManageableRole role1 = createRole();
UniqueId uid1 = _roleMaster.add(role1);
role1 = _roleMaster.getById(uid1.getObjectId());
ManageableRole role2 = createRole2();
UniqueId uid2 = _roleMaster.add(role2);
role2 = _roleMaster.getById(uid2.getObjectId());
role2.setRoleName(TEST_ROLE);
try {
_roleMaster.update(role2);
fail();
} catch (DataDuplicationException ex) {
// expected
}
}
//-------------------------------------------------------------------------
@Test
public void test_search() throws Exception {
ManageableRole role1 = createRole();
UniqueId uid1 = _roleMaster.add(role1);
role1 = _roleMaster.getById(uid1.getObjectId());
ManageableRole role2 = createRole2();
UniqueId uid2 = _roleMaster.add(role2);
role2 = _roleMaster.getById(uid2.getObjectId());
RoleSearchResult result = _roleMaster.search(new RoleSearchRequest());
assertEquals(2, result.getRoles().size());
assertEquals(role1, result.getRoles().get(0));
assertEquals(role2, result.getRoles().get(1));
}
@Test
public void test_search_noObjectIds() throws Exception {
ManageableRole role = createRole();
UniqueId uid1 = _roleMaster.add(role);
role = _roleMaster.getById(uid1.getObjectId());
RoleSearchRequest request = new RoleSearchRequest();
request.setObjectIds(ImmutableList.<ObjectId>of());
RoleSearchResult result = _roleMaster.search(request);
assertEquals(0, result.getRoles().size());
}
@Test
public void test_search_objectIdNotFound() throws Exception {
ManageableRole role = createRole();
UniqueId uid1 = _roleMaster.add(role);
role = _roleMaster.getById(uid1.getObjectId());
RoleSearchRequest request = new RoleSearchRequest();
request.setObjectIds(ImmutableList.of(ObjectId.of(_roleMaster.getUniqueIdScheme(), "-87578")));
RoleSearchResult result = _roleMaster.search(request);
assertEquals(0, result.getRoles().size());
}
//-------------------------------------------------------------------------
@Test
public void test_resolveAccount() throws Exception {
ManageableRole roleA = new ManageableRole("A");
roleA.getAssociatedUsers().add("adam");
roleA.getAssociatedPermissions().add("PERMISSION-1");
roleA.getAssociatedPermissions().add("PERMISSION-2");
roleA.getAssociatedRoles().add("AA");
roleA.getAssociatedRoles().add("AB");
_roleMaster.add(roleA);
ManageableRole roleAA = new ManageableRole("AA");
roleAA.getAssociatedUsers().add("charles");
roleAA.getAssociatedPermissions().add("PERMISSION-1");
roleAA.getAssociatedPermissions().add("PERMISSION-3");
roleAA.getAssociatedRoles().add("AAA");
roleAA.getAssociatedRoles().add("AB");
_roleMaster.add(roleAA);
ManageableRole roleAAA = new ManageableRole("AAA");
roleAAA.getAssociatedPermissions().add("PERMISSION-4");
_roleMaster.add(roleAAA);
ManageableRole roleAB = new ManageableRole("AB");
roleAB.getAssociatedUsers().add("adam");
roleAB.getAssociatedPermissions().add("PERMISSION-3");
roleAB.getAssociatedPermissions().add("PERMISSION-4");
roleAB.getAssociatedRoles().add("ABA");
_roleMaster.add(roleAB);
ManageableRole roleABA = new ManageableRole("ABA");
roleABA.getAssociatedPermissions().add("PERMISSION-5");
_roleMaster.add(roleABA);
ManageableRole roleB = new ManageableRole("B");
roleB.getAssociatedUsers().add("charles");
roleB.getAssociatedPermissions().add("PERMISSION-6");
_roleMaster.add(roleB);
ManageableRole roleC = new ManageableRole("C");
roleC.getAssociatedUsers().add("adam");
roleC.getAssociatedPermissions().add("PERMISSION-7");
_roleMaster.add(roleC);
SimpleUserAccount account1 = new SimpleUserAccount("adam");
account1.setEmailAddress("adam@test.com");
UserAccount resolved1 = _roleMaster.resolveAccount(account1);
assertEquals(6, resolved1.getRoles().size());
assertEquals(true, resolved1.getRoles().contains("A"));
assertEquals(true, resolved1.getRoles().contains("AA"));
assertEquals(true, resolved1.getRoles().contains("AAA"));
assertEquals(true, resolved1.getRoles().contains("AB"));
assertEquals(true, resolved1.getRoles().contains("ABA"));
assertEquals(true, resolved1.getRoles().contains("C"));
assertEquals(6, resolved1.getPermissions().size());
assertEquals(true, resolved1.getPermissions().contains("PERMISSION-1"));
assertEquals(true, resolved1.getPermissions().contains("PERMISSION-2"));
assertEquals(true, resolved1.getPermissions().contains("PERMISSION-3"));
assertEquals(true, resolved1.getPermissions().contains("PERMISSION-4"));
assertEquals(true, resolved1.getPermissions().contains("PERMISSION-5"));
assertEquals(true, resolved1.getPermissions().contains("PERMISSION-7"));
SimpleUserAccount account2 = new SimpleUserAccount("charles");
account2.setEmailAddress("charles@test.com");
UserAccount resolved2 = _roleMaster.resolveAccount(account2);
assertEquals(5, resolved2.getRoles().size());
assertEquals(true, resolved2.getRoles().contains("AA"));
assertEquals(true, resolved2.getRoles().contains("AAA"));
assertEquals(true, resolved2.getRoles().contains("AB"));
assertEquals(true, resolved2.getRoles().contains("ABA"));
assertEquals(true, resolved2.getRoles().contains("B"));
assertEquals(5, resolved2.getPermissions().size());
assertEquals(true, resolved2.getPermissions().contains("PERMISSION-1"));
assertEquals(true, resolved2.getPermissions().contains("PERMISSION-3"));
assertEquals(true, resolved2.getPermissions().contains("PERMISSION-4"));
assertEquals(true, resolved2.getPermissions().contains("PERMISSION-5"));
assertEquals(true, resolved2.getPermissions().contains("PERMISSION-6"));
}
//-------------------------------------------------------------------------
@Test
public void test_toString() {
assertEquals("DbRoleMaster[DbUsrRole]", _roleMaster.toString());
}
//-------------------------------------------------------------------------
private ManageableRole createRole() {
ManageableRole role = new ManageableRole(TEST_ROLE);
role.setDescription("foobar");
role.getAssociatedUsers().add("adam");
role.getAssociatedUsers().add("charles");
role.getAssociatedPermissions().add("PERMISSION-1");
role.getAssociatedPermissions().add("PERMISSION-2");
role.getAssociatedPermissions().add("PERMISSION-3");
role.getAssociatedRoles().add("zero");
return role;
}
private ManageableRole createRole2() {
ManageableRole role = new ManageableRole(TEST_ROLE2);
role.setDescription("foo");
role.getAssociatedUsers().add("adam");
role.getAssociatedUsers().add("charles");
role.getAssociatedPermissions().add("PERMISSION-1");
role.getAssociatedPermissions().add("PERMISSION-2");
role.getAssociatedRoles().add("zero");
return role;
}
}