// // Copyright 2010 Cinch Logic Pty Ltd. // // http://www.chililog.com // // 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 org.chililog.server.data; import static org.junit.Assert.*; import java.util.List; import java.util.regex.Pattern; import org.bson.types.ObjectId; import org.chililog.server.common.ChiliLogException; import org.chililog.server.data.MongoConnection; import org.chililog.server.data.Strings; import org.chililog.server.data.UserBO; import org.chililog.server.data.UserController; import org.chililog.server.data.UserListCriteria; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; /** * Test UserBO and UserController * * @author vibul * */ public class UserTest { private static DB _db; @BeforeClass public static void classSetup() throws Exception { _db = MongoConnection.getInstance().getConnection(); assertNotNull(_db); // Clean up old test data if any exists DBCollection coll = _db.getCollection(UserController.MONGODB_COLLECTION_NAME); Pattern pattern = Pattern.compile("^UserTestUser[\\w]*$"); DBObject query = new BasicDBObject(); query.put(UserBO.USERNAME_FIELD_NAME, pattern); coll.remove(query); } @AfterClass public static void classTeardown() { // Clean up old test data if any exists DBCollection coll = _db.getCollection(UserController.MONGODB_COLLECTION_NAME); Pattern pattern = Pattern.compile("^UserTestUser[\\w]*$"); DBObject query = new BasicDBObject(); query.put(UserBO.USERNAME_FIELD_NAME, pattern); coll.remove(query); } @Test public void testPassword() throws ChiliLogException { UserBO user = new UserBO(); user.setPassword("abc", true); assertTrue(user.validatePassword("abc")); assertFalse(user.validatePassword("ABC")); } @Test(expected = ChiliLogException.class) public void testGetNotFound() throws ChiliLogException { UserController.getInstance().getByUsername(_db, "notfound"); } @Test public void testTryGetNotFound() throws ChiliLogException { UserBO user = UserController.getInstance().tryGetByUsername(_db, "notfound"); assertNull(user); } @Test public void testCRUD() throws ChiliLogException { // Insert UserBO user = new UserBO(); user.setUsername("UserTestUser1"); user.setPassword("abc123!", true); user.addRole("junittestrole1"); user.addRole("junittestrole2"); user.setDisplayName("Lloyd Christmas"); user.setEmailAddress("UserTestUser1@chililog.com"); assertFalse(user.isExistingRecord()); assertNull(user.getDocumentID()); assertEquals(-1, user.getDocumentVersion()); UserController.getInstance().save(_db, user); assertTrue(user.isExistingRecord()); assertNotNull(user.getDocumentID()); assertEquals(1, user.getDocumentVersion()); // Get UserBO user2 = UserController.getInstance().getByUsername(_db, "UserTestUser1"); assertEquals("UserTestUser1", user2.getUsername()); assertTrue(user2.hasRole("junittestrole1")); assertTrue(user2.hasRole("junittestrole2")); assertEquals(UserBO.Status.ENABLED, user2.getStatus()); assertEquals("Lloyd Christmas", user2.getDisplayName()); assertEquals("UserTestUser1@chililog.com", user2.getEmailAddress()); assertEquals(1, user2.getDocumentVersion()); String id = user.getDocumentID().toString(); user2 = UserController.getInstance().get(_db, new ObjectId(id)); assertEquals("UserTestUser1", user2.getUsername()); // Update user.setUsername("UserTestUser2"); user.addRole("junittestrole3"); user.setStatus(UserBO.Status.DISABLED); user.setDisplayName("Harry Dunne"); user.setEmailAddress("UserTestUser1update@chililog.com"); UserController.getInstance().save(_db, user); assertEquals(2, user.getDocumentVersion()); user2 = UserController.getInstance().getByEmailAddress(_db, "UserTestUser1update@chililog.com"); assertEquals("UserTestUser2", user2.getUsername()); assertTrue(user2.hasRole("junittestrole1")); assertTrue(user2.hasRole("junittestrole2")); assertTrue(user2.hasRole("junittestrole3")); assertEquals(UserBO.Status.DISABLED, user2.getStatus()); assertEquals("Harry Dunne", user2.getDisplayName()); assertEquals("UserTestUser1update@chililog.com", user2.getEmailAddress()); assertEquals(2, user2.getDocumentVersion()); // Remove UserController.getInstance().remove(_db, user); // Get again user2 = UserController.getInstance().tryGetByUsername(_db, "UserTestUser1"); assertNull(user2); user2 = UserController.getInstance().tryGetByUsername(_db, "UserTestUser2"); assertNull(user2); // Remove again should not throw an error UserController.getInstance().remove(_db, user); } public void testRoles() { UserBO user = new UserBO(); user.addRole("role1"); assertTrue(user.hasRole("role1")); user.addRole("role2"); assertTrue(user.hasRole("role2")); user.addRole("role3"); assertTrue(user.hasRole("role3")); String[] roles = user.getRoles(); assertEquals("role1", roles[0]); assertEquals("role2", roles[1]); assertEquals("role3", roles[2]); assertEquals(3, roles.length); user.removeRole("role1"); assertFalse(user.hasRole("role1")); assertTrue(user.hasRole("role2")); assertTrue(user.hasRole("role3")); roles = user.getRoles(); assertEquals("role2", roles[0]); assertEquals("role3", roles[1]); assertEquals(2, roles.length); } @Test public void testDuplicateUsername() throws ChiliLogException { try { // Insert UserBO user = new UserBO(); user.setUsername("UserTestUser3"); user.setPassword("abc123!", true); user.setEmailAddress("UserTestUser3@chililog.com"); UserController.getInstance().save(_db, user); UserBO user2 = new UserBO(); user2.setUsername("UserTestUser3"); user2.setPassword("abc123!", true); user.setEmailAddress("UserTestUser3@chililog.com"); UserController.getInstance().save(_db, user2); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.USER_DUPLICATE_USERNAME_ERROR, ex.getErrorCode()); } } @Test public void testEmptyUsername() throws ChiliLogException { try { // Insert UserBO user = new UserBO(); user.setUsername(""); user.setPassword("abc123!", true); UserController.getInstance().save(_db, user); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.MONGODB_MISSING_REQURIED_FIELD_ERROR, ex.getErrorCode()); } } @Test public void testDuplicateEmailAddress() throws ChiliLogException { try { // Insert UserBO user = new UserBO(); user.setUsername("UserTestUser6"); user.setPassword("abc123!", true); user.setEmailAddress("UserTestUser6@chililog.com"); UserController.getInstance().save(_db, user); UserBO user2 = new UserBO(); user2.setUsername("UserTestUser6.1"); user2.setPassword("abc123!", true); user2.setEmailAddress("UserTestUser6@chililog.com"); UserController.getInstance().save(_db, user2); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.USER_DUPLICATE_EMAIL_ADDRESS_ERROR, ex.getErrorCode()); } } @Test public void testBadEmailAddress() throws ChiliLogException { try { // Insert UserBO user = new UserBO(); user.setUsername("UserTestUser7"); user.setPassword("abc123!", true); user.setEmailAddress("bad email address"); UserController.getInstance().save(_db, user); fail("Exception expected"); } catch (ChiliLogException ex) { assertEquals(Strings.USER_EMAIL_ADDRESS_FORMAT_ERROR, ex.getErrorCode()); } } @Test public void testNoEmailAddress() throws ChiliLogException { UserBO user = new UserBO(); user.setUsername("UserTestUser8"); user.setPassword("abc123!", true); UserController.getInstance().save(_db, user); } @Test public void testList() throws ChiliLogException { // Insert UserBO user = new UserBO(); user.setUsername("UserTestUserList4"); user.setPassword("abc123!", true); user.addRole("ListRoleA"); user.addRole("ListRoleB"); user.setEmailAddress("UserTestUserList4@chililog.com"); UserController.getInstance().save(_db, user); UserBO user2 = new UserBO(); user2.setUsername("UserTestUserList5"); user2.setPassword("abc123!", true); user2.addRole("ListRoleA"); user2.addRole("ListRoleC"); user2.setEmailAddress("UserTestUserList5@chililog.com"); user2.setStatus(UserBO.Status.DISABLED); UserController.getInstance().save(_db, user2); List<UserBO> list = null; // *************************** // role // *************************** UserListCriteria criteria = new UserListCriteria(); criteria.setRole("ListRoleA"); list = UserController.getInstance().getList(_db, criteria); assertEquals(2, list.size()); assertEquals("UserTestUserList4", list.get(0).getUsername()); assertEquals("UserTestUserList5", list.get(1).getUsername()); criteria = new UserListCriteria(); criteria.setRole("ListRoleB"); list = UserController.getInstance().getList(_db, criteria); assertEquals(1, list.size()); assertEquals("UserTestUserList4", list.get(0).getUsername()); criteria = new UserListCriteria(); criteria.setRole("no matching role"); list = UserController.getInstance().getList(_db, criteria); assertEquals(0, list.size()); // *************************** // username pattern // *************************** criteria = new UserListCriteria(); criteria.setUsernamePattern("^UserTestUserList[\\w]*$"); list = UserController.getInstance().getList(_db, criteria); assertEquals(2, list.size()); assertEquals("UserTestUserList4", list.get(0).getUsername()); assertEquals("UserTestUserList5", list.get(1).getUsername()); criteria = new UserListCriteria(); criteria.setUsernamePattern("^no matches for sure[\\w]*$"); list = UserController.getInstance().getList(_db, criteria); assertEquals(0, list.size()); // *************************** // email address pattern // *************************** criteria = new UserListCriteria(); criteria.setEmailAddressPattern("^UserTestUserList[\\w]*@chililog\\.com$"); list = UserController.getInstance().getList(_db, criteria); assertEquals(2, list.size()); assertEquals("UserTestUserList4", list.get(0).getUsername()); assertEquals("UserTestUserList5", list.get(1).getUsername()); criteria = new UserListCriteria(); criteria.setEmailAddressPattern("^no matches for sure[\\w]*$"); list = UserController.getInstance().getList(_db, criteria); assertEquals(0, list.size()); // *************************** // status // *************************** criteria = new UserListCriteria(); criteria.setUsernamePattern("^UserTestUserList[\\w]*$"); criteria.setStatus(UserBO.Status.ENABLED); list = UserController.getInstance().getList(_db, criteria); assertEquals(1, list.size()); assertEquals("UserTestUserList4", list.get(0).getUsername()); criteria = new UserListCriteria(); criteria.setUsernamePattern("^UserTestUserList[\\w]*$"); criteria.setStatus(UserBO.Status.LOCKED); list = UserController.getInstance().getList(_db, criteria); assertEquals(0, list.size()); // *************************** // role pattern // *************************** criteria = new UserListCriteria(); criteria.setRolePattern("^ListRoleA$"); list = UserController.getInstance().getList(_db, criteria); assertEquals(2, list.size()); assertEquals("UserTestUserList4", list.get(0).getUsername()); assertEquals("UserTestUserList5", list.get(1).getUsername()); criteria = new UserListCriteria(); criteria.setRolePattern("^ListRoleB$"); list = UserController.getInstance().getList(_db, criteria); assertEquals(1, list.size()); assertEquals("UserTestUserList4", list.get(0).getUsername()); criteria = new UserListCriteria(); criteria.setRolePattern("^no matches for sure[\\w]*$"); list = UserController.getInstance().getList(_db, criteria); assertEquals(0, list.size()); } @Test public void testExtractRepositoryNameFromRole() { assertEquals("aaa", UserBO.extractRepositoryNameFromRole("repo.aaa.administrator")); assertEquals("bbb", UserBO.extractRepositoryNameFromRole("repo.bbb.workbench")); assertEquals("ccc", UserBO.extractRepositoryNameFromRole("repo.ccc.publisher")); assertEquals("ddd", UserBO.extractRepositoryNameFromRole("repo.ddd.subscriber")); assertNull(UserBO.extractRepositoryNameFromRole(UserBO.SYSTEM_ADMINISTRATOR_ROLE_NAME)); assertNull(UserBO.extractRepositoryNameFromRole("random string sssss")); } }