addProjectListFutureCallback( futureResult, new FutureCallback<List<Project>>() {
private void showSignInRequest() { centerPanelWrapper.removeAll(); centerPanelWrapper.add(signInScreen); getDialogButton(refreshAction).setVisible(false); dialogWrapper.validate(); }
@VisibleForTesting CloudProject getSelectedProject() { CredentialedUser user = accountComboBox.getItemAt(accountComboBox.getSelectedIndex()); return CloudProject.create( getSelectedProjectName(), getSelectedProjectId(), getSelectedProjectNumber(), user.getEmail()); }
/** Updates project list if this list is for currently selected account. if not, does nothing. */ private void refreshProjectListUi(@Nullable CredentialedUser user) { if (Objects.equals(user, accountComboBox.getSelectedItem())) { if (cachedProjectList.containsKey(user)) { setLoading(false); projectListTableModel.setProjectList(cachedProjectList.get(user)); showProjectInList(selectedProjectsByAccount.get(user)); } else { // no data clears the list. projectListTableModel.setProjectList(Collections.emptyList()); } // if project list is loading, mark table as busy. if (runningProjectLoaderJobs.containsKey(user)) { setLoading(true); } } }
installTableSpeedSearch(projectListTable); installProgressBar(dialogWrapper); .subscribe( GoogleLoginListener.GOOGLE_LOGIN_LISTENER_TOPIC, () -> refreshDialog(Services.getLoginService().getActiveUser())); loadAllProjects(); setSelectedProject(cloudProject); return result == DialogWrapper.OK_EXIT_CODE ? getSelectedProject() : null;
@Before public void setUp() { projectSelectionDialog.setProjectLoader(mockProjectLoader); projectSelectionDialog.setDialogWrapper(dialogWrapper); doReturn(mockDialogButton).when(projectSelectionDialog).getDialogButton(any()); doNothing().when(projectSelectionDialog).installTableSpeedSearch(any()); doNothing().when(projectSelectionDialog).setLoading(anyBoolean()); projectSelectionDialog.loadAllProjects(); testUiProject = CloudProject.create(TEST_PROJECT_NAME, TEST_PROJECT_ID, TEST_USER_EMAIL); testGoogleProject = new Project(); testGoogleProject.setName(TEST_PROJECT_NAME); testGoogleProject.setProjectId(TEST_PROJECT_NAME + "-id"); when(mockTestUser.getEmail()).thenReturn(TEST_USER_EMAIL); }
@Test public void setCloudProject_updatesUi() { prepareOneTestUserOneTestProjectDialog(testUiProject); assertThat(projectSelectionDialog.getAccountComboBox().getSelectedItem()) .isEqualTo(mockTestUser); assertThat(projectSelectionDialog.getSelectedProjectName()) .isEqualTo(testGoogleProject.getName()); assertThat(projectSelectionDialog.getSelectedProjectId()) .isEqualTo(testGoogleProject.getProjectId()); assertThat(projectSelectionDialog.getProjectListTable().getSelectedRow()).isEqualTo(0); }
@VisibleForTesting void handleOpenProjectSelectionDialog() { ProjectSelectionDialog projectSelectionDialog = createProjectSelectionDialog(this); CloudProject newSelection = projectSelectionDialog.showDialog(cloudProject); // if null, it means no change or user cancelled selection dialog - no update required. if (newSelection != null) { setSelectedProject(newSelection); notifyProjectSelectionListeners(); // keep as last active project if IDE project has been specified. if (ideProject != null) { ActiveCloudProjectManager.getInstance().setActiveCloudProject(newSelection, ideProject); } } }
@Test public void getCloudProject_returns_selectedProject() { prepareOneTestUserOneTestProjectDialog(testUiProject); Project secondProject = new Project(); secondProject.setName("project-2"); secondProject.setProjectId("project-2-id"); mockUserProjects(mockTestUser, Arrays.asList(testGoogleProject, secondProject)); cleanLoadUsersAndProjects(); projectSelectionDialog.showProjectInList(secondProject.getName()); CloudProject selectedProject = projectSelectionDialog.getSelectedProject(); CloudProject expected = CloudProject.create( secondProject.getName(), secondProject.getProjectId(), mockTestUser.getEmail()); assertThat(selectedProject).isEqualTo(expected); }
/** Refreshes accounts and project lists and selects given account. */ private void refreshDialog(@Nullable CredentialedUser userToSelect) { loadAllProjects(); accountComboBox.setSelectedItem(userToSelect); }
private void validateProjectSelection() { int selectedRow = projectListTable.getSelectedRow(); // make explicit visible row check due to non-standard behavior of IDEA's TableSpeedSearch int visibleRowCount = projectListTable.getRowSorter().getViewRowCount(); if (selectedRow >= 0 && selectedRow < visibleRowCount) { dialogWrapper.setOKActionEnabled(true); selectedProjectsByAccount.put( (CredentialedUser) accountComboBox.getSelectedItem(), getSelectedProjectName()); } else if (selectedRow < 0) { /* nothing selected. */ dialogWrapper.setOKActionEnabled(false); selectedProjectsByAccount.remove((CredentialedUser) accountComboBox.getSelectedItem()); } }
/** * Prepares common test case with test user (active) and its one test project. * * @param selectedProject Project to set as selected for the dialog, may be null/empty. */ private void prepareOneTestUserOneTestProjectDialog(CloudProject selectedProject) { mockUserList(Collections.singletonList(mockTestUser)); mockUserProjects(mockTestUser, Collections.singletonList(testGoogleProject)); cleanLoadUsersAndProjects(); projectSelectionDialog.setSelectedProject(selectedProject); }
@Test public void removedListener_isNotCalled() { when(projectSelectionDialog.showDialog(any())).thenReturn(TEST_PROJECT); projectSelector.removeProjectSelectionListener(projectSelectionListener); projectSelector.handleOpenProjectSelectionDialog(); verifyNoMoreInteractions(projectSelectionListener); }
/** Loads users and projects and ensures UI events are processed before returning. */ private void cleanLoadUsersAndProjects() { // wait until UI events are processed. try { SwingUtilities.invokeAndWait(() -> projectSelectionDialog.loadAllProjects()); // second call to wait until project list is updated via invokeLater(). SwingUtilities.invokeAndWait(() -> {}); } catch (Exception ex) { // this should not happen in the test. throw new AssertionError(ex); } }
@Test public void projectChange_triggerListeners() { when(projectSelectionDialog.showDialog(any())).thenReturn(TEST_PROJECT); projectSelector.handleOpenProjectSelectionDialog(); verify(projectSelectionListener).projectSelected(TEST_PROJECT); }
private void hideSignInRequest() { if (!centerPanel.isShowing()) { centerPanelWrapper.removeAll(); centerPanelWrapper.add(centerPanel); Optional.ofNullable(getDialogButton(refreshAction)).ifPresent(b -> b.setVisible(true)); dialogWrapper.validate(); dialogWrapper.pack(); } }
/** 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 projectChange_updatesUi() { when(projectSelectionDialog.showDialog(any())).thenReturn(TEST_PROJECT); projectSelector.handleOpenProjectSelectionDialog(); verifyUiStateForProject(TEST_PROJECT); }
@Test public void projectChange_returnValidValue() { when(projectSelectionDialog.showDialog(any())).thenReturn(TEST_PROJECT); projectSelector.handleOpenProjectSelectionDialog(); assertThat(projectSelector.getSelectedProject()).isEqualTo(TEST_PROJECT); }
@Test public void lastSelectedProject_saved_withValidIdeProject() { projectSelector.setIdeProject(mockIdeProject); when(projectSelectionDialog.showDialog(any())).thenReturn(TEST_PROJECT); projectSelector.handleOpenProjectSelectionDialog(); verify(mockActiveCloudProjectManager).setActiveCloudProject(TEST_PROJECT, mockIdeProject); }