/*******************************************************************************
* Copyright 2006 - 2012 Vienna University of Technology,
* Department of Software Technology and Interactive Systems, IFS
*
* Licensed 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 eu.scape_project.pw.idp.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class IdpUserTest {
private static EntityManagerFactory emFactory;
private static EntityManager em;
@Before
public void setUp() {
emFactory = Persistence.createEntityManagerFactory("idpdbtest");
em = emFactory.createEntityManager();
}
@After
public void tearDown() {
em.close();
emFactory.close();
}
// Create
@Test
public void persistAndRetrieveUserWithRelations() throws Exception {
// ----- set-up -----
// add test-user and relating objects
IdpRole role0 = new IdpRole();
role0.setRoleName("role0");
IdpRole role1 = new IdpRole();
role1.setRoleName("role1");
IdpUser user = createUser("testUser", role0, role1);
user.getRoles().add(role0);
user.getRoles().add(role1);
em.getTransaction().begin();
em.persist(role0);
em.persist(role1);
em.persist(user);
em.getTransaction().commit();
em.clear();
// ---- test -----
IdpUser fetchedUser = (IdpUser) em.createQuery("SELECT u FROM IdpUser u WHERE u.username = :username")
.setParameter("username", "testUser").getSingleResult();
assertNotNull(fetchedUser);
assertEquals(user.getUsername(), fetchedUser.getUsername());
assertEquals(null, fetchedUser.getPlainPassword());
assertEquals("a029d0df84eb5549c641e04a9ef389e5", fetchedUser.getPassword());
assertEquals(user.getFirstName(), fetchedUser.getFirstName());
assertEquals(user.getLastName(), fetchedUser.getLastName());
assertEquals(user.getFullName(), fetchedUser.getFullName());
assertEquals(user.getEmail(), fetchedUser.getEmail());
assertEquals(user.getStatus(), fetchedUser.getStatus());
assertEquals(user.getActionToken(), fetchedUser.getActionToken());
assertTrue(user.getRoles().contains(role0));
assertTrue(user.getRoles().contains(role1));
}
// Update
@Test
public void updateAndRetrieveUserWithRelations() throws Exception {
// ----- set-up -----
// add test-user and relating objects
IdpRole role0 = new IdpRole();
role0.setRoleName("role0");
IdpRole role1 = new IdpRole();
role1.setRoleName("role1");
IdpUser user = createUser("testUser", role0, role1);
em.getTransaction().begin();
em.persist(role0);
em.persist(role1);
em.persist(user);
em.getTransaction().commit();
em.clear();
// ---- test -----
// update user
em.getTransaction().begin();
user.getRoles().remove(role0);
user.setFirstName("Markus");
user.setPlainPassword("newPassword");
em.persist(em.merge(user));
em.getTransaction().commit();
em.clear();
// see if update was successful
IdpUser fetchedUser = (IdpUser) em.createQuery("SELECT u FROM IdpUser u WHERE u.username = :username")
.setParameter("username", "testUser").getSingleResult();
assertNotNull(fetchedUser);
assertEquals(user.getUsername(), fetchedUser.getUsername());
assertEquals(null, fetchedUser.getPlainPassword());
assertEquals("a029d0df84eb5549c641e04a9ef389e5", fetchedUser.getPassword());
assertEquals(user.getFirstName(), fetchedUser.getFirstName());
assertEquals(user.getLastName(), fetchedUser.getLastName());
assertEquals(user.getFullName(), fetchedUser.getFullName());
assertEquals(user.getEmail(), fetchedUser.getEmail());
assertEquals(user.getStatus(), fetchedUser.getStatus());
assertEquals(user.getActionToken(), fetchedUser.getActionToken());
assertTrue(user.getRoles().contains(role1));
assertFalse(user.getRoles().contains(role0));
}
// Delete
@Test
public void deleteUserWithAssignedRoles_shouldNotDeleteRolesAsWell() throws Exception {
// ----- set-up -----
// add test-user and relating objects
IdpRole role0 = new IdpRole();
role0.setRoleName("role0");
IdpRole role1 = new IdpRole();
role1.setRoleName("role1");
IdpUser user = createUser("testUser", role0, role1);
em.getTransaction().begin();
em.persist(role0);
em.persist(role1);
em.persist(user);
em.getTransaction().commit();
em.clear();
// ---- test -----
deleteUserIfExistent("testUser");
IdpRole fetchedAdminRole = em.find(IdpRole.class, role0.getId());
IdpRole fetchedManagerRole = em.find(IdpRole.class, role1.getId());
assertNotNull(fetchedAdminRole);
assertNotNull(fetchedManagerRole);
}
private IdpUser createUser(String username, IdpRole... roles) {
IdpUser user = new IdpUser();
user.setUsername(username);
user.setPlainPassword("mypass");
user.setFirstName("Max");
user.setLastName("Mustermann");
user.setEmail(username + "@mustermann.at");
user.setStatus(IdpUserState.CREATED);
user.setActionToken("uid-123-uid-456");
for (IdpRole role : roles) {
user.getRoles().add(role);
}
return user;
}
private void deleteUserIfExistent(String username) {
// delete probably conflicting test-user
em.getTransaction().begin();
List<IdpUser> userToDelete = em
.createQuery("SELECT u FROM IdpUser u WHERE u.username = :username", IdpUser.class)
.setParameter("username", username).getResultList();
for (IdpUser delUser : userToDelete) {
em.remove(delUser);
}
em.getTransaction().commit();
}
private void deleteRoleIfExistent(String roleName) {
// delete probably conflicting test-user
em.getTransaction().begin();
List<IdpRole> rolesToDelete = em
.createQuery("SELECT r FROM IdpRole r WHERE r.roleName = :roleName", IdpRole.class)
.setParameter("roleName", roleName).getResultList();
for (IdpRole delRole : rolesToDelete) {
em.remove(delRole);
}
em.getTransaction().commit();
}
}