From 87c95bc05d147ae016dd9ad5ea48961dec01de68 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Mon, 22 Aug 2016 13:20:05 +0200 Subject: [PATCH] SONAR-7847 Add a way to see scanner context in the background page --- .../BackgroundTasksTest.java | 26 +++++- .../java/pageobjects/BackgroundTaskItem.java | 56 ++++++++++++ .../java/pageobjects/BackgroundTasksPage.java | 47 ++++++++++ .../src/test/java/pageobjects/Navigation.java | 4 + server/sonar-web/src/main/js/api/ce.js | 4 +- .../apps/background-tasks/components/Task.js | 30 ++----- .../components/TaskActions.js | 86 +++++++++++++++++++ .../views/ScannerContextView.hbs | 17 ++++ .../ScannerContextView.js} | 42 +++++---- .../resources/org/sonar/l10n/core.properties | 2 + 10 files changed, 269 insertions(+), 45 deletions(-) create mode 100644 it/it-tests/src/test/java/pageobjects/BackgroundTaskItem.java create mode 100644 it/it-tests/src/test/java/pageobjects/BackgroundTasksPage.java create mode 100644 server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.js create mode 100644 server/sonar-web/src/main/js/apps/background-tasks/views/ScannerContextView.hbs rename server/sonar-web/src/main/js/apps/background-tasks/{components/TaskCancelButton.js => views/ScannerContextView.js} (58%) diff --git a/it/it-tests/src/test/java/it/projectAdministration/BackgroundTasksTest.java b/it/it-tests/src/test/java/it/projectAdministration/BackgroundTasksTest.java index 9e895ff444a..1a7f8795b05 100644 --- a/it/it-tests/src/test/java/it/projectAdministration/BackgroundTasksTest.java +++ b/it/it-tests/src/test/java/it/projectAdministration/BackgroundTasksTest.java @@ -23,8 +23,12 @@ import com.sonar.orchestrator.Orchestrator; import com.sonar.orchestrator.build.SonarScanner; import com.sonar.orchestrator.selenium.Selenese; import it.Category1Suite; +import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; +import pageobjects.BackgroundTaskItem; +import pageobjects.BackgroundTasksPage; +import pageobjects.Navigation; import util.selenium.SeleneseTest; import static util.ItUtils.projectDir; @@ -34,18 +38,34 @@ public class BackgroundTasksTest { @ClassRule public static Orchestrator orchestrator = Category1Suite.ORCHESTRATOR; - @Test - public void should_not_display_failing_and_search_and_filter_elements_on_project_level_page() throws Exception { + @BeforeClass + public static void beforeClass() { executeBuild("test-project", "Test Project"); executeBuild("test-project-2", "Another Test Project"); + } + @Test + public void should_not_display_failing_and_search_and_filter_elements_on_project_level_page() throws Exception { Selenese selenese = Selenese.builder().setHtmlTestsInClasspath("should_not_display_failing_and_search_and_filter_elements_on_project_level_page", "/projectAdministration/BackgroundTasksTest/should_not_display_failing_and_search_and_filter_elements_on_project_level_page.html" ).build(); new SeleneseTest(selenese).runOn(orchestrator); } - private void executeBuild(String projectKey, String projectName) { + @Test + public void display_scanner_context() { + Navigation nav = Navigation.get(orchestrator); + nav.openHomepage().logIn().submitCredentials("admin", "admin"); + BackgroundTasksPage page = nav.openBackgroundTasksPage(); + + BackgroundTaskItem task = page.getTasksAsItems().get(0); + task.openActions() + .openScannerContext() + .assertScannerContextContains("SonarQube plugins:") + .assertScannerContextContains("Global properties:"); + } + + private static void executeBuild(String projectKey, String projectName) { orchestrator.executeBuild( SonarScanner.create(projectDir("shared/xoo-sample")) .setProjectKey(projectKey) diff --git a/it/it-tests/src/test/java/pageobjects/BackgroundTaskItem.java b/it/it-tests/src/test/java/pageobjects/BackgroundTaskItem.java new file mode 100644 index 00000000000..e749c9c54e6 --- /dev/null +++ b/it/it-tests/src/test/java/pageobjects/BackgroundTaskItem.java @@ -0,0 +1,56 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package pageobjects; + +import com.codeborne.selenide.SelenideElement; + +import static com.codeborne.selenide.Condition.hasText; +import static com.codeborne.selenide.Condition.visible; +import static com.codeborne.selenide.Selenide.$; + +public class BackgroundTaskItem { + + private final SelenideElement elt; + + public BackgroundTaskItem(SelenideElement elt) { + this.elt = elt; + } + + public SelenideElement getComponent() { + return elt.$("td:nth-child(2)"); + } + + public BackgroundTaskItem openActions() { + elt.$(".js-task-action > .dropdown-toggle").click(); + elt.$(".js-task-action > .dropdown-menu").shouldBe(visible); + return this; + } + + public BackgroundTaskItem openScannerContext () { + elt.$(".js-task-show-scanner-context").click(); + $(".js-task-scanner-context").shouldBe(visible); + return this; + } + + public BackgroundTaskItem assertScannerContextContains(String text) { + $(".js-task-scanner-context").should(hasText(text)); + return this; + } +} diff --git a/it/it-tests/src/test/java/pageobjects/BackgroundTasksPage.java b/it/it-tests/src/test/java/pageobjects/BackgroundTasksPage.java new file mode 100644 index 00000000000..2793eeddc6d --- /dev/null +++ b/it/it-tests/src/test/java/pageobjects/BackgroundTasksPage.java @@ -0,0 +1,47 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package pageobjects; + +import com.codeborne.selenide.ElementsCollection; +import java.util.List; +import java.util.stream.Collectors; +import org.openqa.selenium.By; + +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Selenide.$; +import static com.codeborne.selenide.Selenide.$$; + +public class BackgroundTasksPage { + + public BackgroundTasksPage() { + $(By.cssSelector(".background-tasks")).should(exist); + } + + public ElementsCollection getTasks() { + return $$(".background-tasks > tbody > tr"); + } + + public List getTasksAsItems() { + return getTasks() + .stream() + .map(BackgroundTaskItem::new) + .collect(Collectors.toList()); + } +} diff --git a/it/it-tests/src/test/java/pageobjects/Navigation.java b/it/it-tests/src/test/java/pageobjects/Navigation.java index 3dbde027d3b..ecd9cc6bc67 100644 --- a/it/it-tests/src/test/java/pageobjects/Navigation.java +++ b/it/it-tests/src/test/java/pageobjects/Navigation.java @@ -80,6 +80,10 @@ public class Navigation extends ExternalResource { return open(url, ProjectKeyPage.class); } + public BackgroundTasksPage openBackgroundTasksPage() { + return open("/background_tasks", BackgroundTasksPage.class); + } + public void open(String relativeUrl) { Selenide.open(relativeUrl); } diff --git a/server/sonar-web/src/main/js/api/ce.js b/server/sonar-web/src/main/js/api/ce.js index 9eb33301774..3143a1ec9e4 100644 --- a/server/sonar-web/src/main/js/api/ce.js +++ b/server/sonar-web/src/main/js/api/ce.js @@ -39,9 +39,9 @@ export function getStatus (componentId) { return getJSON(url, data); } -export function getTask (id) { +export function getTask (id, additionalFields) { const url = '/api/ce/task'; - return getJSON(url, { id }).then(r => r.task); + return getJSON(url, { id, additionalFields }).then(r => r.task); } export function cancelTask (id) { diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/Task.js b/server/sonar-web/src/main/js/apps/background-tasks/components/Task.js index a2084647461..00e41c9b63e 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/Task.js +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/Task.js @@ -19,15 +19,13 @@ */ import React from 'react'; import shallowCompare from 'react-addons-shallow-compare'; - import TaskStatus from './TaskStatus'; import TaskComponent from './TaskComponent'; import TaskId from './TaskId'; import TaskDay from './TaskDay'; import TaskDate from './TaskDate'; import TaskExecutionTime from './TaskExecutionTime'; -import TaskCancelButton from './TaskCancelButton'; -import { STATUSES } from './../constants'; +import TaskActions from './TaskActions'; export default class Task extends React.Component { static propTypes = { @@ -44,13 +42,8 @@ export default class Task extends React.Component { return shallowCompare(this, nextProps, nextState); } - handleFilterTask (task, e) { - e.preventDefault(); - this.props.onFilterTask(task); - } - render () { - const { task, index, tasks, component, types, onCancelTask } = this.props; + const { task, index, tasks, component, types, onCancelTask, onFilterTask } = this.props; const prevTask = index > 0 ? tasks[index - 1] : null; @@ -64,20 +57,11 @@ export default class Task extends React.Component { - - - {!component && ( - - )} - {task.status === STATUSES.PENDING && ( - - )} - + ); } diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.js b/server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.js new file mode 100644 index 00000000000..82be5d23870 --- /dev/null +++ b/server/sonar-web/src/main/js/apps/background-tasks/components/TaskActions.js @@ -0,0 +1,86 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import React from 'react'; +import shallowCompare from 'react-addons-shallow-compare'; +import ScannerContextView from '../views/ScannerContextView'; +import { STATUSES } from './../constants'; +import { translate } from '../../../helpers/l10n'; + +export default class TaskActions extends React.Component { + shouldComponentUpdate (nextProps, nextState) { + return shallowCompare(this, nextProps, nextState); + } + + handleFilterClick (e) { + e.preventDefault(); + this.props.onFilterTask(this.props.task); + } + + handleCancelClick (e) { + e.preventDefault(); + this.props.onCancelTask(this.props.task); + } + + handleShowScannerContextClick (e) { + e.preventDefault(); + new ScannerContextView({ task: this.props.task }).render(); + } + + render () { + const { component, task } = this.props; + + return ( + + + + ); + } +} diff --git a/server/sonar-web/src/main/js/apps/background-tasks/views/ScannerContextView.hbs b/server/sonar-web/src/main/js/apps/background-tasks/views/ScannerContextView.hbs new file mode 100644 index 00000000000..d1de3da84c7 --- /dev/null +++ b/server/sonar-web/src/main/js/apps/background-tasks/views/ScannerContextView.hbs @@ -0,0 +1,17 @@ +
+ + + +
diff --git a/server/sonar-web/src/main/js/apps/background-tasks/components/TaskCancelButton.js b/server/sonar-web/src/main/js/apps/background-tasks/views/ScannerContextView.js similarity index 58% rename from server/sonar-web/src/main/js/apps/background-tasks/components/TaskCancelButton.js rename to server/sonar-web/src/main/js/apps/background-tasks/views/ScannerContextView.js index 4255f9f9ab8..21da975c6bb 100644 --- a/server/sonar-web/src/main/js/apps/background-tasks/components/TaskCancelButton.js +++ b/server/sonar-web/src/main/js/apps/background-tasks/views/ScannerContextView.js @@ -17,23 +17,31 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import React from 'react'; -import { translate } from '../../../helpers/l10n'; +import Modal from '../../../components/common/modals'; +import Template from './ScannerContextView.hbs'; +import { getTask } from '../../../api/ce'; -const TaskCancelButton = ({ task, onCancelTask }) => { - function handleClick (e) { - e.preventDefault(); - onCancelTask(task); - } +export default Modal.extend({ + template: Template, + className: 'modal modal-large', + + initialize () { + this.scannerContext = null; + this.loadScannerContext(); + }, - return ( - - ); -}; + loadScannerContext() { + getTask(this.options.task.id, ['scannerContext']).then(task => { + this.scannerContext = task.scannerContext; + this.render(); + }); + }, + + serializeData() { + return { + task: this.options.task, + scannerContext: this.scannerContext + }; + } +}); -export default TaskCancelButton; diff --git a/sonar-core/src/main/resources/org/sonar/l10n/core.properties b/sonar-core/src/main/resources/org/sonar/l10n/core.properties index c8ffe407419..d68b0ad98d7 100644 --- a/sonar-core/src/main/resources/org/sonar/l10n/core.properties +++ b/sonar-core/src/main/resources/org/sonar/l10n/core.properties @@ -2974,6 +2974,8 @@ background_tasks.table.duration=Duration background_tasks.logs=Logs background_tasks.cancel_task=Cancel Task background_tasks.cancel_all_tasks=Cancel All Pending Tasks +background_tasks.scanner_context=Scanner Context +background_tasks.show_scanner_context=Show Scanner Context background_tasks.pending=pending background_tasks.failures=still failing background_tasks.in_progress_duration=Duration of the current task in progress. -- 2.39.5