/** * 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.assertFalse; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.onebusaway.users.model.User; import org.onebusaway.users.model.UserIndex; import org.onebusaway.users.model.UserIndexKey; import org.onebusaway.users.services.StandardAuthoritiesService; import org.onebusaway.users.services.UserDao; import org.onebusaway.users.services.UserIndexTypes; import org.onebusaway.users.services.UserPropertiesService; import org.onebusaway.users.services.internal.UserIndexRegistrationService; import org.onebusaway.users.services.internal.UserRegistration; import org.springframework.security.context.SecurityContext; import org.springframework.security.context.SecurityContextHolder; public class UserServiceImplTest { private UserServiceImpl _service; private UserDao _userDao; private StandardAuthoritiesService _authoritiesService = new MockStandardAuthoritiesServiceImpl(); @Before public void setup() { _service = new UserServiceImpl(); _service.setAuthoritiesService(_authoritiesService); _userDao = Mockito.mock(UserDao.class); _service.setUserDao(_userDao); } @After public void tearDown() { SecurityContext context = SecurityContextHolder.getContext(); context.setAuthentication(null); } @Test public void testGetNumberOfUsers() { Mockito.when(_userDao.getNumberOfUsers()).thenReturn(5); assertEquals(5, _service.getNumberOfUsers()); Mockito.verify(_userDao).getNumberOfUsers(); } @Test public void getAllUserIds() { List<Integer> ids = Arrays.asList(1, 2, 3); Mockito.when(_userDao.getAllUserIds()).thenReturn(ids); assertEquals(ids, _service.getAllUserIds()); Mockito.verify(_userDao).getAllUserIds(); } @Test public void getAllUserIdsForRange() { List<Integer> ids = Arrays.asList(1, 2, 3); Mockito.when(_userDao.getAllUserIdsInRange(0, 3)).thenReturn(ids); assertEquals(ids, _service.getAllUserIdsInRange(0, 3)); Mockito.verify(_userDao).getAllUserIdsInRange(0, 3); } @Test public void testRegisterPhoneNumber() { User user = createUser(1234); double total = 0; int n = 100; for (int i = 0; i < n; i++) { UserIndexRegistrationService registration = Mockito.mock(UserIndexRegistrationService.class); _service.setUserIndexRegistrationService(registration); String code = _service.registerPhoneNumber(user, "+12065551234"); UserIndexKey key = new UserIndexKey(UserIndexTypes.PHONE_NUMBER, "12065551234"); Mockito.verify(registration).setRegistrationForUserIndexKey(key, 1234, code); int codeAsNumber = Integer.parseInt(code); assertTrue(codeAsNumber >= 1000); assertTrue(codeAsNumber <= 9999); total += codeAsNumber; } double mu = total / n; assertEquals(5500, mu, 1000); } @Test public void testCompletePhoneNumberRegistration() { User userA = createUser(1234); UserIndexKey key = new UserIndexKey(UserIndexTypes.PHONE_NUMBER, "12065551234"); UserDao userDao = Mockito.mock(UserDao.class); _service.setUserDao(userDao); Mockito.when(userDao.getUserForId(1234)).thenReturn(userA); UserIndex migratedIndex = new UserIndex(); migratedIndex.setId(key); migratedIndex.setUser(userA); migratedIndex.setCredentials(""); Mockito.when(userDao.getUserIndexForId(key)).thenReturn(migratedIndex); UserIndexRegistrationService registrationService = Mockito.mock(UserIndexRegistrationService.class); _service.setUserIndexRegistrationService(registrationService); UserRegistration registration = new UserRegistration(1234, "5555"); Mockito.when(registrationService.getRegistrationForUserIndexKey(key)).thenReturn( registration); UserPropertiesService userPropertiesService = Mockito.mock(UserPropertiesService.class); _service.setUserPropertiesService(userPropertiesService); User userB = createUser(1235); UserIndex index = createUserIndex(key.getType(), key.getValue(), userB); UserIndex updated = _service.completePhoneNumberRegistration(index, "5554"); assertTrue(updated == null); updated = _service.completePhoneNumberRegistration(index, "5555"); assertTrue(updated != null); Mockito.verify(userPropertiesService).mergeProperties(userB, userA); } @Test public void testGetNumberOfStaleUsers() { ArgumentCaptor<Date> captor = ArgumentCaptor.forClass(Date.class); Mockito.when(_userDao.getNumberOfStaleUsers(captor.capture())).thenReturn( 10L); assertEquals(10, _service.getNumberOfStaleUsers()); Date actual = captor.getValue(); Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, -1); Date expected = c.getTime(); assertTrue(Math.abs(expected.getTime() - actual.getTime()) < 30 * 1000); } @Test public void deleteStaleUsers() { List<Integer> userIds = Arrays.asList(1, 2, 3); Mockito.when( _userDao.getStaleUserIdsInRange(Mockito.any(Date.class), Mockito.eq(0), Mockito.eq(100))).thenReturn(userIds); _service.start(); assertFalse(_service.isDeletingStaleUsers()); _service.deleteStaleUsers(); assertTrue(_service.isDeletingStaleUsers()); _service.cancelDeleteStaleUsers(); assertFalse(_service.isDeletingStaleUsers()); _service.stop(); } private User createUser(int userId) { User user = new User(); user.setId(userId); user.setCreationTime(new Date()); return user; } private UserIndex createUserIndex(String indexType, String indexValue, User user) { UserIndex index = new UserIndex(); index.setId(new UserIndexKey(indexType, indexValue)); index.setUser(user); index.setCredentials(""); user.getUserIndices().add(index); return index; } }