package org.ovirt.engine.core.dao; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.businessentities.Permission; import org.ovirt.engine.core.common.businessentities.RoleType; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.compat.Guid; public class DbUserDaoTest extends BaseDaoTestCase { private static final Guid ADMIN_ROLE_TYPE_FROM_FIXTURE_ID = new Guid("F5972BFA-7102-4D33-AD22-9DD421BFBA78"); private static final Guid SYSTEM_OBJECT_ID = new Guid("AAA00000-0000-0000-0000-123456789AAA"); private DbUserDao dao; private DbUser existingUser; private DbUser deletableUser; private DbUser newUser; private Guid vm; @Override @Before public void setUp() throws Exception { super.setUp(); dao = dbFacade.getDbUserDao(); vm = new Guid("77296e00-0cad-4e5a-9299-008a7b6f4354"); existingUser = dao .get(new Guid("9bf7c640-b620-456f-a550-0348f366544a")); deletableUser = dao.get(new Guid("9bf7c640-b620-456f-a550-0348f366544b")); newUser = new DbUser(); newUser.setExternalId("0"); newUser.setId(Guid.newGuid()); newUser.setFirstName("Bob"); newUser.setLastName("Milqtoste"); newUser.setLoginName("newuser"); newUser.setEmail("newuser@redhat.com"); newUser.setDomain("domain"); newUser.setGroupNames(new LinkedList<>(Collections.singletonList("groups"))); newUser.setNamespace("*"); } /** * Ensures that trying to get a user using an invalid id fails. */ @Test public void testGetWithInvalidId() { DbUser result = dao.get(Guid.newGuid()); assertNull(result); } /** * Ensures that retrieving an object by id works as expected. */ @Test public void testGet() { DbUser result = dao.get(existingUser.getId()); assertNotNull(result); assertEquals(existingUser, result); } /** * Ensures that trying to get an user with an invalid external id fails. */ @Test public void testGetWithInvalidExternalId() { DbUser result = dao.getByExternalId("testportal.redhat.com", "0"); assertNull(result); } /** * Ensures that retrieving an user by external id works as expected. */ @Test public void testGetByExternalId() { DbUser result = dao.getByExternalId("testportal.redhat.com", "a"); assertNotNull(result); } /** * Ensures that update cycle doesn't change the external identifier. */ @Test public void testUpdateDoesntChangeExternalId() { DbUser userBefore = dao.get(existingUser.getId()); dao.update(userBefore); DbUser userAfter = dao.get(existingUser.getId()); assertEquals(userBefore.getExternalId(), userAfter.getExternalId()); } /** * Ensures that searching for a user by an unused name results in no user. */ @Test public void testGetByUsernameWithInvalidName() { DbUser result = dao.getByUsernameAndDomain("IdoNoExist", existingUser.getDomain()); assertNull(result); } /** * Ensures that retrieving by username works. */ @Test public void testGetByUsername() { DbUser result = dao.getByUsernameAndDomain(existingUser.getLoginName(), existingUser.getDomain()); assertNotNull(result); assertEquals(existingUser, result); } /** * Ensures that nothing is returned when the VM is invalid. */ @Test public void testGetAllForVmWithInvalidVm() { List<DbUser> result = dao.getAllForVm(Guid.newGuid()); assertTrue(result.isEmpty()); } /** * Ensures that retrieving all users for a VM works as expected. */ @Test public void testGetAllForVm() { List<DbUser> result = dao.getAllForVm(vm); assertNotNull(result); assertFalse(result.isEmpty()); } @Test public void testGetAll() { List<DbUser> result = dao.getAll(); assertNotNull(result); assertFalse(result.isEmpty()); assertEquals(4, result.size()); } @Test public void testGetFilteredWithPermissions() { List<DbUser> result = dao.getAll(PRIVILEGED_USER_ID, true); assertNotNull(result); assertFalse(result.isEmpty()); } @Test public void testGetFilteredWithoutPermissions() { List<DbUser> result = dao.getAll(UNPRIVILEGED_USER_ID, true); assertNotNull(result); assertTrue(result.isEmpty()); } /** * Retrieves all that match a specified query. */ @Test public void testGetAllWithQuery() { List<DbUser> result = dao.getAllWithQuery("select * from users"); assertFalse(result.isEmpty()); } /** * Ensures that saving a user works as expected. */ @Test public void testSave() { dao.save(newUser); DbUser result = dao.getByUsernameAndDomain(newUser.getLoginName(), newUser.getDomain()); assertEquals(newUser, result); } /** * Ensures that updating a user works as expected. */ @Test public void testUpdate() { existingUser.setFirstName("changedname"); existingUser.setLastName("changedsurname"); dao.update(existingUser); DbUser result = dao.get(existingUser.getId()); assertEquals(existingUser, result); } @Test public void testSaveOrUpdateExisting() { int sizeBeforeSave = dao.getAll().size(); existingUser.setFirstName("changedname"); existingUser.setLastName("changedsurname"); dao.saveOrUpdate(existingUser); int sizeAfterSave = dao.getAll().size(); DbUser result = dao.get(existingUser.getId()); assertEquals(existingUser, result); assertEquals(0, sizeAfterSave - sizeBeforeSave); } @Test public void testSaveOrUpdateNew() { int sizeBeforeSave = dao.getAll().size(); dao.saveOrUpdate(newUser); DbUser result = dao.getByUsernameAndDomain(newUser.getLoginName(), newUser.getDomain()); int sizeAfterSave = dao.getAll().size(); assertEquals(newUser, result); assertEquals(1, sizeAfterSave - sizeBeforeSave); } /** * Ensures that inserting an user with no external id fails, as it has a * not null constraint. */ @Test(expected = RuntimeException.class) public void testSaveUserWithoutExternalIdFails() { newUser.setExternalId(null); dao.save(newUser); } /** * Ensures that inserting an user with the same external id and domain than * an existing user fails, as there is a unique constraint for that pair * of attributes. */ @Test(expected = RuntimeException.class) public void testSaveUserDuplicatedDomainAndExternalId() { newUser.setDomain(existingUser.getDomain()); newUser.setExternalId(existingUser.getExternalId()); dao.save(newUser); } /** * Ensures that removing users works as expected. */ @Test public void testRemove() { dao.remove(deletableUser.getId()); DbUser result = dao.get(deletableUser.getId()); assertNull(result); } @Test public void testUpdateLastAdminCheckStatus() { // Getting a nonAdmin user that is defined in the fixtures DbUser nonAdminUser = dbFacade.getDbUserDao().getByUsernameAndDomain("userportal2@testportal.redhat.com", "testportal.redhat.com"); assertNotNull(nonAdminUser); assertFalse(nonAdminUser.isAdmin()); // execute and validate when not admin dao.updateLastAdminCheckStatus(nonAdminUser.getId()); nonAdminUser = dbFacade.getDbUserDao().get(nonAdminUser.getId()); assertFalse(nonAdminUser.isAdmin()); Permission perms = new Permission(); perms.setRoleType(RoleType.ADMIN); // An available role from the fixtures perms.setRoleId(ADMIN_ROLE_TYPE_FROM_FIXTURE_ID); perms.setAdElementId(nonAdminUser.getId()); perms.setObjectId(SYSTEM_OBJECT_ID); perms.setObjectType(VdcObjectType.System); // Save the permission to the DB and make sure it has been saved dbFacade.getPermissionDao().save(perms); assertNotNull(dbFacade.getPermissionDao().get(perms.getId())); // execute and validate when admin dao.updateLastAdminCheckStatus(nonAdminUser.getId()); nonAdminUser = dbFacade.getDbUserDao().get(nonAdminUser.getId()); assertTrue(nonAdminUser.isAdmin()); } }