@WorkerThread private void fetchUserByIdAndNotifyIfExistsSync(String userId) { UserEntity userEntity = mUsersRetriever.getUserById(userId); if (userEntity != null) { notifyUserDataFetched(userEntity); } }
@Provides UsersRetriever usersRetriever(ContentResolver contentResolver) { return new UsersRetriever(contentResolver); }
private List<UserEntity> getUsersWithSelection(String selection, String[] selectionArgs) { Cursor cursor = null; try { cursor = mContentResolver.query( Users.CONTENT_URI, Users.PROJECTION_ALL, selection, selectionArgs, Users.SORT_ORDER_DEFAULT); if (cursor != null && cursor.moveToFirst()) { List<UserEntity> results = new ArrayList<>(cursor.getCount()); do { results.add(createUserEntityFromCurrentCursorPosition(cursor)); } while (cursor.moveToNext()); return results; } else { return new ArrayList<>(0); } } finally { if (cursor != null) cursor.close(); } }
/** * @return user's data, or null if no data for user ID was found in cache */ @WorkerThread public @Nullable UserEntity getUserById(String userId) { String selection = Users.COL_USER_ID + " = ?"; String[] selectionArgs = new String[] {userId}; List<UserEntity> users = getUsersWithSelection(selection, selectionArgs); if (users.isEmpty()) { return null; } else { return users.get(0); } }
@WorkerThread private void fetchUsersByIdAndNotifySync(List<String> userIds, final UsersManagerListener listener) { final List<UserEntity> users = mUsersRetriever.getUsersByIds(userIds); mUiThreadPoster.post(new Runnable() { @Override public void run() { listener.onUsersFetched(users); } }); } }
@WorkerThread public void syncUsers() { mLogger.d(TAG, "syncUsers() called"); List<String> uniqueUserIds = mUsersRetriever.getAllUniqueUsersIdsRelatedToRequests(); String loggedInUserId = mLoginStateManager.getLoggedInUser().getUserId(); // if user logged in and his ID is not in the list - add it if (loggedInUserId != null && !loggedInUserId.isEmpty() && !uniqueUserIds.contains(loggedInUserId)) { uniqueUserIds.add(loggedInUserId); } syncUsersByIds(uniqueUserIds); }
@WorkerThread public List<UserEntity> getUsersByIds(List<String> userIds) { if (userIds.isEmpty()) { return new ArrayList<>(0); } ContentProviderUtils.SelectionAndSelectionArgsPair selectionsPair = ContentProviderUtils.getSelectionByColumnForListOfValues( Users.COL_USER_ID, userIds); return getUsersWithSelection(selectionsPair.getSelection(), selectionsPair.getSelectionArgs()); }
private void returnEntityMockFromRetrieverForAnyUserId() { when(mUsersRetrieverMock.getUserById(anyString())).thenReturn(mEntityMock); }
private void returnNullFromRetrieverForAnyUserId() { when(mUsersRetrieverMock.getUserById(anyString())).thenReturn(null); }
@Test public void fetchUserByIdAndNotifyIfExists_userExists_listenersNotifiedWithCorrectData() { // Arrange returnEntityMockFromRetrieverForAnyUserId(); // Act SUT.registerListener(mUsersDataMonitorListenerMock); SUT.fetchUserByIdAndNotifyIfExists(TEST_USER_ID); mThreadPostersTestDouble.join(); // Assert verify(mUsersRetrieverMock, times(1)).getUserById(mStringCaptor.capture()); verifyNoMoreInteractions(mUsersRetrieverMock); assertThat(mStringCaptor.getValue(), is(TEST_USER_ID)); verify(mUsersDataMonitorListenerMock, times(1)).onUserDataChange(mUserCaptor.capture()); verifyNoMoreInteractions(mUsersDataMonitorListenerMock); assertThat(mUserCaptor.getValue(), is(mEntityMock)); }
@Test public void fetchUserByIdAndNotifyIfExists_userDoesntExist_listenersNotNotified() { // Arrange returnNullFromRetrieverForAnyUserId(); // Act SUT.registerListener(mUsersDataMonitorListenerMock); SUT.fetchUserByIdAndNotifyIfExists(TEST_USER_ID); mThreadPostersTestDouble.join(); // Assert verify(mUsersRetrieverMock, times(1)).getUserById(mStringCaptor.capture()); verifyNoMoreInteractions(mUsersRetrieverMock); assertThat(mStringCaptor.getValue(), is(TEST_USER_ID)); verifyNoMoreInteractions(mUsersDataMonitorListenerMock); }
@Test public void onUserDataChanged_userDoesntExist_listenersNotNotified() { // Arrange returnNullFromRetrieverForAnyUserId(); // Act SUT.registerListener(mUsersDataMonitorListenerMock); SUT.onUserDataChanged(new UserDataChangedEvent(TEST_USER_ID)); mThreadPostersTestDouble.join(); // Assert verify(mUsersRetrieverMock, times(1)).getUserById(mStringCaptor.capture()); verifyNoMoreInteractions(mUsersRetrieverMock); assertThat(mStringCaptor.getValue(), is(TEST_USER_ID)); verifyNoMoreInteractions(mUsersDataMonitorListenerMock); }
@Test public void onUserDataChanged_userExists_listenersNotifiedWithCorrectData() { // Arrange returnEntityMockFromRetrieverForAnyUserId(); // Act SUT.registerListener(mUsersDataMonitorListenerMock); SUT.onUserDataChanged(new UserDataChangedEvent(TEST_USER_ID)); mThreadPostersTestDouble.join(); // Assert verify(mUsersRetrieverMock, times(1)).getUserById(mStringCaptor.capture()); verifyNoMoreInteractions(mUsersRetrieverMock); assertThat(mStringCaptor.getValue(), is(TEST_USER_ID)); verify(mUsersDataMonitorListenerMock, times(1)).onUserDataChange(mUserCaptor.capture()); verifyNoMoreInteractions(mUsersDataMonitorListenerMock); assertThat(mUserCaptor.getValue(), is(mEntityMock)); }