diff options
4 files changed, 75 insertions, 3 deletions
diff --git a/it/it-tests/src/test/java/it/Category4Suite.java b/it/it-tests/src/test/java/it/Category4Suite.java index d74b81a147c..e9726fc0d12 100644 --- a/it/it-tests/src/test/java/it/Category4Suite.java +++ b/it/it-tests/src/test/java/it/Category4Suite.java @@ -35,6 +35,7 @@ import it.qualityProfile.QualityProfilesPageTest; import it.serverSystem.HttpHeadersTest; import it.serverSystem.LogsTest; import it.serverSystem.ServerSystemTest; +import it.ui.SourceViewerTest; import it.ui.UiTest; import it.uiExtension.UiExtensionsTest; import it.user.BaseIdentityProviderTest; @@ -85,6 +86,7 @@ import static util.ItUtils.xooPlugin; HttpHeadersTest.class, // ui UiTest.class, + SourceViewerTest.class, // ui extensions UiExtensionsTest.class, WsLocalCallTest.class, diff --git a/it/it-tests/src/test/java/it/ui/SourceViewerTest.java b/it/it-tests/src/test/java/it/ui/SourceViewerTest.java new file mode 100644 index 00000000000..3d200d053da --- /dev/null +++ b/it/it-tests/src/test/java/it/ui/SourceViewerTest.java @@ -0,0 +1,59 @@ +/* + * 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 it.ui; + +import com.sonar.orchestrator.Orchestrator; +import com.sonar.orchestrator.build.SonarScanner; +import it.Category4Suite; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import pageobjects.Navigation; + +import static com.codeborne.selenide.Condition.exist; +import static com.codeborne.selenide.Selenide.$; +import static util.ItUtils.projectDir; + +public class SourceViewerTest { + + @ClassRule + public static final Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR; + + @Rule + public Navigation nav = Navigation.get(ORCHESTRATOR); + + @BeforeClass + public static void beforeClass() { + ORCHESTRATOR.resetData(); + analyzeSampleProject(); + } + + @Test + public void line_permalink() { + nav.open("/component?id=sample%3Asrc%2Fmain%2Fxoo%2Fsample%2FSample.xoo&line=6"); + $(".source-line").should(exist); + $(".source-line-highlighted[data-line-number=\"6\"]").should(exist); + } + + private static void analyzeSampleProject() { + ORCHESTRATOR.executeBuild(SonarScanner.create(projectDir("shared/xoo-sample"))); + } +} diff --git a/server/sonar-web/src/main/js/apps/component/components/App.js b/server/sonar-web/src/main/js/apps/component/components/App.js index 139838f7342..05058cdc793 100644 --- a/server/sonar-web/src/main/js/apps/component/components/App.js +++ b/server/sonar-web/src/main/js/apps/component/components/App.js @@ -23,6 +23,10 @@ import SourceViewer from '../../../components/source-viewer/SourceViewer'; import { getComponentNavigation } from '../../../api/nav'; export default class App extends React.Component { + static propTypes = { + location: React.PropTypes.object.isRequired + }; + state = {}; componentDidMount () { @@ -36,9 +40,11 @@ export default class App extends React.Component { return null; } + const { line } = this.props.location.query; + return ( <div className="page"> - <SourceViewer component={{ id: this.state.component.id }}/> + <SourceViewer component={{ id: this.state.component.id }} line={line}/> </div> ); } diff --git a/server/sonar-web/src/main/js/components/source-viewer/SourceViewer.js b/server/sonar-web/src/main/js/components/source-viewer/SourceViewer.js index 024d7501b5b..69f1c969591 100644 --- a/server/sonar-web/src/main/js/components/source-viewer/SourceViewer.js +++ b/server/sonar-web/src/main/js/components/source-viewer/SourceViewer.js @@ -27,7 +27,8 @@ export default class SourceViewer extends React.Component { component: React.PropTypes.shape({ id: React.PropTypes.string.isRequired }).isRequired, - period: React.PropTypes.object + period: React.PropTypes.object, + line: React.PropTypes.oneOfType([React.PropTypes.number, React.PropTypes.string]) }; componentDidMount () { @@ -62,13 +63,17 @@ export default class SourceViewer extends React.Component { } handleLoad () { - const { period } = this.props; + const { period, line } = this.props; if (period) { const periodDate = getPeriodDate(period); const periodLabel = getPeriodLabel(period); this.sourceViewer.filterLinesByDate(periodDate, periodLabel); } + + if (line) { + this.sourceViewer.highlightLine(line); + } } render () { |