/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
* Copyright (C) 2012 Google, Inc.
*
* 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.onebusaway.users.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onebusaway.users.model.User;
import org.onebusaway.users.model.UserIndex;
import org.onebusaway.users.model.UserIndexKey;
import org.onebusaway.users.model.UserPropertiesV1;
import org.onebusaway.users.model.UserRole;
import org.onebusaway.users.model.properties.UserPropertiesV2;
public class UserDaoImplTest {
private SessionFactory _sessionFactory;
private UserDaoImpl _dao;
@Before
public void setup() throws IOException {
Configuration config = new AnnotationConfiguration();
config = config.configure("org/onebusaway/users/hibernate-configuration.xml");
_sessionFactory = config.buildSessionFactory();
_dao = new UserDaoImpl();
_dao.setSessionFactory(_sessionFactory);
}
@After
public void teardown() {
if (_sessionFactory != null)
_sessionFactory.close();
}
@Test
public void test() {
assertEquals(0, _dao.getNumberOfUserRoles());
UserRole adminRole = new UserRole("admin");
UserRole userRole = new UserRole("user");
_dao.saveOrUpdateUserRole(adminRole);
_dao.saveOrUpdateUserRole(userRole);
assertEquals(2, _dao.getNumberOfUserRoles());
assertEquals(0, _dao.getNumberOfUsersWithRole(adminRole));
assertEquals(0, _dao.getNumberOfUsersWithRole(userRole));
User userA = new User();
userA.setCreationTime(new Date());
userA.setProperties(new UserPropertiesV1());
userA.getRoles().add(userRole);
_dao.saveOrUpdateUser(userA);
assertEquals(0, _dao.getNumberOfUsersWithRole(adminRole));
assertEquals(1, _dao.getNumberOfUsersWithRole(userRole));
User userB = new User();
userB.setCreationTime(new Date());
userB.setProperties(new UserPropertiesV1());
userB.getRoles().add(adminRole);
_dao.saveOrUpdateUser(userB);
assertEquals(1, _dao.getNumberOfUsersWithRole(adminRole));
assertEquals(1, _dao.getNumberOfUsersWithRole(userRole));
userA.getRoles().add(adminRole);
_dao.saveOrUpdateUser(userA);
assertEquals(2, _dao.getNumberOfUsersWithRole(adminRole));
assertEquals(1, _dao.getNumberOfUsersWithRole(userRole));
}
@Test
public void testGetNumberOfUsers() {
assertEquals(0, _dao.getNumberOfUsers());
User userA = new User();
userA.setCreationTime(new Date());
userA.setProperties(new UserPropertiesV1());
_dao.saveOrUpdateUser(userA);
assertEquals(1, _dao.getNumberOfUsers());
User userB = new User();
userB.setCreationTime(new Date());
userB.setProperties(new UserPropertiesV1());
_dao.saveOrUpdateUser(userB);
assertEquals(2, _dao.getNumberOfUsers());
}
@Test
public void testGetNumberOfStaleUsers() {
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
Date oneMonth = c.getTime();
c.add(Calendar.MONTH, -1);
Date twoMonth = c.getTime();
c.add(Calendar.MONTH, -1);
Date threeMonth = c.getTime();
assertEquals(0, _dao.getNumberOfStaleUsers(oneMonth));
User userA = new User();
userA.setCreationTime(new Date());
userA.setLastAccessTime(twoMonth);
userA.setProperties(new UserPropertiesV2());
_dao.saveOrUpdateUser(userA);
assertEquals(1, _dao.getNumberOfStaleUsers(oneMonth));
assertEquals(0, _dao.getNumberOfStaleUsers(twoMonth));
assertEquals(0, _dao.getNumberOfStaleUsers(threeMonth));
User userB = new User();
userB.setCreationTime(new Date());
userB.setLastAccessTime(threeMonth);
userB.setProperties(new UserPropertiesV2());
_dao.saveOrUpdateUser(userB);
assertEquals(2, _dao.getNumberOfStaleUsers(oneMonth));
assertEquals(1, _dao.getNumberOfStaleUsers(twoMonth));
assertEquals(0, _dao.getNumberOfStaleUsers(threeMonth));
}
@Test
public void testGetAllUserIds() {
Set<Integer> ids = new HashSet<Integer>();
for (int i = 0; i < 100; i++) {
User userA = new User();
userA.setCreationTime(new Date());
userA.setProperties(new UserPropertiesV1());
_dao.saveOrUpdateUser(userA);
ids.add(userA.getId());
}
int n = _dao.getNumberOfUsers();
assertEquals(100, n);
Set<Integer> retreivedIds = new HashSet<Integer>();
final int limit = 20;
for (int i = 0; i < n; i += limit) {
List<Integer> pageOfIds = _dao.getAllUserIdsInRange(i, limit);
assertTrue(pageOfIds.size() <= limit);
retreivedIds.addAll(pageOfIds);
}
assertEquals(ids, retreivedIds);
}
@Test
public void deleteUser() {
UserRole userRole = new UserRole("user");
_dao.saveOrUpdateUserRole(userRole);
User user = new User();
user.setCreationTime(new Date());
user.setProperties(new UserPropertiesV2());
user.getRoles().add(userRole);
UserIndexKey key = new UserIndexKey("phone", "2065551234");
UserIndex index = new UserIndex();
index.setId(key);
index.setUser(user);
user.getUserIndices().add(index);
_dao.saveOrUpdateUser(user);
assertEquals(1, _dao.getNumberOfUsers());
UserIndex index2 = _dao.getUserIndexForId(key);
assertEquals(key, index2.getId());
assertEquals(user, index2.getUser());
_dao.deleteUser(user);
assertEquals(0, _dao.getNumberOfUsers());
index2 = _dao.getUserIndexForId(key);
assertNull(index2);
}
@Test
public void testTransitionUserIndex() {
User userA = new User();
userA.setCreationTime(new Date());
userA.setProperties(new UserPropertiesV2());
UserIndex index = new UserIndex();
index.setId(new UserIndexKey("test", "A"));
index.setUser(userA);
userA.getUserIndices().add(index);
_dao.saveOrUpdateUser(userA);
User userB = new User();
userB.setCreationTime(new Date());
userB.setProperties(new UserPropertiesV2());
_dao.saveOrUpdateUser(userB);
assertEquals(1, _dao.getUserForId(userA.getId()).getUserIndices().size());
assertEquals(0, _dao.getUserForId(userB.getId()).getUserIndices().size());
index.setUser(userB);
userA.getUserIndices().remove(index);
userB.getUserIndices().add(index);
_dao.saveOrUpdateUsers(userA, userB);
assertEquals(0, _dao.getUserForId(userA.getId()).getUserIndices().size());
assertEquals(1, _dao.getUserForId(userB.getId()).getUserIndices().size());
}
}