]> source.dussan.org Git - sonarqube.git/commitdiff
fix line permalink in source viewer
authorStas Vilchik <vilchiks@gmail.com>
Fri, 9 Dec 2016 14:13:04 +0000 (15:13 +0100)
committerStas Vilchik <vilchiks@gmail.com>
Fri, 9 Dec 2016 15:19:11 +0000 (16:19 +0100)
it/it-tests/src/test/java/it/Category4Suite.java
it/it-tests/src/test/java/it/ui/SourceViewerTest.java [new file with mode: 0644]
server/sonar-web/src/main/js/apps/component/components/App.js
server/sonar-web/src/main/js/components/source-viewer/SourceViewer.js

index d74b81a147c3f8b7be19853540221ea8b1b83cc7..e9726fc0d1234ebe28d21078ee0333df941c6dac 100644 (file)
@@ -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 (file)
index 0000000..3d200d0
--- /dev/null
@@ -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")));
+  }
+}
index 139838f734203c70acbc185497c28e7a7e1e31d8..05058cdc79310f820f118ab202f79b7c8c073ec6 100644 (file)
@@ -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>
     );
   }
index 024d7501b5bb665ca02c83616dd56401ef93a804..69f1c96959160eb629819ea92c100a8437a3ee9f 100644 (file)
@@ -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 () {