@Test public void loadUserProjects_invokesCallback() { List<Project> projects = Arrays.asList(testProject1, testProject2); mockListProjectsResponse(projects); projectLoader.loadUserProjectsInBackground(mockUser); verify(mockFutureCallback).onSuccess(projects); }
@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 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)); }
/** * Mocks {@link ListProjectsResponse} to contain two pages, one test project per each, using the * specified token. * * @param token token to identify second page. * @return Argument captor to check which tokens are requested. */ private ArgumentCaptor<String> mockTwoPageProjectsRespose(String token) throws IOException { mockListProjectsResponse(null); // emulate page with size 1, one token returned, then completed. ListProjectsResponse firstResponse = new ListProjectsResponse(); firstResponse.setProjects(Collections.singletonList(testProject1)); firstResponse.setNextPageToken(token); ListProjectsResponse secondResponse = new ListProjectsResponse(); secondResponse.setProjects(Collections.singletonList(testProject2)); secondResponse.setNextPageToken(""); ArgumentCaptor<String> pageTokenCaptor = ArgumentCaptor.forClass(String.class); when(mockList.setPageToken(pageTokenCaptor.capture())).thenReturn(mockList); when(mockList.execute()).thenReturn(firstResponse, secondResponse); return pageTokenCaptor; } }
@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)); }