projectLoader.loadUserProjectsInBackground(user); addProjectListFutureCallback( futureResult,
/** * Use {@link com.google.common.util.concurrent.Futures#addCallback(ListenableFuture, * FutureCallback)} to receive notifications of load completion and result or exceptions. */ ListenableFuture<List<Project>> loadUserProjectsInBackground(CredentialedUser user) { return ThreadUtil.getInstance().executeInBackground(() -> loadUserProjects(user)); }
/** Mocks list of project returned for a user when selection dialog calls for it. */ private void mockUserProjects(CredentialedUser user, List<Project> projectList) { @SuppressWarnings("unchecked") ListenableFuture<List<Project>> mockFuture = (ListenableFuture<List<Project>>) mock(ListenableFuture.class); when(mockProjectLoader.loadUserProjectsInBackground(user)).thenReturn(mockFuture); doAnswer( new Answer() { @Override @SuppressWarnings("unchecked") public Object answer(InvocationOnMock invocation) { ((FutureCallback<List<Project>>) invocation.getArgument(1)).onSuccess(projectList); return null; } }) .when(projectSelectionDialog) .addProjectListFutureCallback(any(), any()); } }
@Test public void multiPage_projectList_uses_valid_Tokens() throws IOException { ArgumentCaptor<String> pageTokenCaptor = mockTwoPageProjectsRespose("token"); projectLoader.loadUserProjectsInBackground(mockUser); // check page token is called only for tokens returned in responses. assertThat(pageTokenCaptor.getAllValues().size()).isEqualTo(1); assertThat(pageTokenCaptor.getAllValues().get(0)).isEqualTo("token"); }
@Test public void loadUserProjects_invokesCallback() { List<Project> projects = Arrays.asList(testProject1, testProject2); mockListProjectsResponse(projects); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onSuccess(projects); }
@Test public void nullProjectList_invokes_callback_withEmptyList() { mockListProjectsResponse(null); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onSuccess(Collections.emptyList()); }
@Test public void multiPage_projectList_merged_correctly() throws IOException { mockTwoPageProjectsRespose("token"); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onSuccess(Arrays.asList(testProject1, testProject2)); }
@Test public void exception_passed_intoCallback() throws IOException { mockListProjectsResponse(null); IOException ioException = new IOException("IO issue"); when(mockList.execute()).thenThrow(ioException); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onFailure(ioException); }
@Test public void deletedProjects_filteredFromResult() { List<Project> projects = Arrays.asList(testProject1, testProject2); testProject1.setLifecycleState("DELETE_REQUESTED"); mockListProjectsResponse(projects); projectLoader.loadUserProjectsInBackground(mockUser); List<Project> expectedList = Collections.singletonList(testProject2); verify(mockFutureCallback).onSuccess(expectedList); }
@Test public void projects_withEmptyId_filteredFromResult() { List<Project> projects = Arrays.asList(testProject1, testProject2); testProject1.setProjectId(null); testProject2.setProjectId(""); mockListProjectsResponse(projects); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onSuccess(Collections.emptyList()); }
@Test public void loadUserProjects_sortsProjects_byName() { Project aProject = new Project(); aProject.setName("a project"); aProject.setProjectId("The ID"); mockListProjectsResponse(Arrays.asList(testProject1, testProject2, aProject)); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onSuccess(Arrays.asList(aProject, testProject1, testProject2)); }
@Before public void setUp() { when(mockGoogleApiClientFactory.getCloudResourceManagerClient(any())) .thenReturn(mockCloudResourceManager); when(projectLoader.loadUserProjectsInBackground(any())) .then( (Answer<ListenableFuture<List<Project>>>) invocation -> { @SuppressWarnings("unchecked") ListenableFuture<List<Project>> result = (ListenableFuture<List<Project>>) invocation.callRealMethod(); Futures.addCallback(result, mockFutureCallback, MoreExecutors.directExecutor()); return result; }); testProject1 = new Project(); testProject1.setName("test-project"); testProject1.setProjectId("test-project-ID"); testProject2 = new Project(); testProject2.setName("test-project-2"); testProject2.setProjectId("test-project-2-ID"); }
@Test public void loadUserProjects_keeps_projectsWithSameName() { // two projects with the same name, different IDs. Project project1 = new Project(); String sameProjectName = "project"; project1.setName(sameProjectName); project1.setProjectId("GCP ID 1"); Project project2 = new Project(); project2.setName(sameProjectName); project2.setProjectId("GCP ID 2"); mockListProjectsResponse(Arrays.asList(project1, project2)); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onSuccess(Arrays.asList(project1, project2)); }