]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7177 expand the root directory
authorStas Vilchik <vilchiks@gmail.com>
Thu, 7 Jan 2016 10:48:04 +0000 (11:48 +0100)
committerStas Vilchik <vilchiks@gmail.com>
Thu, 7 Jan 2016 10:48:04 +0000 (11:48 +0100)
it/it-projects/shared/xoo-sample-with-root-dir/Hello.xoo [new file with mode: 0644]
it/it-projects/shared/xoo-sample-with-root-dir/sonar-project.properties [new file with mode: 0644]
it/it-projects/shared/xoo-sample-with-root-dir/src/main/xoo/sample/Sample.xoo [new file with mode: 0644]
it/it-projects/shared/xoo-sample-with-root-dir/src/main/xoo/sample/Sample.xoo.measures [new file with mode: 0644]
it/it-tests/src/test/java/it/projectServices/ProjectCodeTest.java
it/it-tests/src/test/resources/projectServices/ProjectCodeTest/code_page_should_expand_root_dir.html [new file with mode: 0644]
server/sonar-web/src/main/js/apps/code/actions/index.js
server/sonar-web/src/main/js/apps/code/reducers/index.js
server/sonar-web/tests/apps/code/store-test.js

diff --git a/it/it-projects/shared/xoo-sample-with-root-dir/Hello.xoo b/it/it-projects/shared/xoo-sample-with-root-dir/Hello.xoo
new file mode 100644 (file)
index 0000000..b83c3af
--- /dev/null
@@ -0,0 +1,12 @@
+package com.sonar.it.samples.modules.b1;
+
+public class HelloB1 {
+       private int i;
+       private HelloB1() {
+               
+       }
+       
+       public void hello() {
+               System.out.println("hello" + " world");
+       }
+}
\ No newline at end of file
diff --git a/it/it-projects/shared/xoo-sample-with-root-dir/sonar-project.properties b/it/it-projects/shared/xoo-sample-with-root-dir/sonar-project.properties
new file mode 100644 (file)
index 0000000..35fbcff
--- /dev/null
@@ -0,0 +1,5 @@
+sonar.projectKey=sample-with-root-dir
+sonar.projectName=Sample With Root Dir
+sonar.projectVersion=1.0-SNAPSHOT
+sonar.sources=.
+sonar.language=xoo
diff --git a/it/it-projects/shared/xoo-sample-with-root-dir/src/main/xoo/sample/Sample.xoo b/it/it-projects/shared/xoo-sample-with-root-dir/src/main/xoo/sample/Sample.xoo
new file mode 100644 (file)
index 0000000..41871e1
--- /dev/null
@@ -0,0 +1,16 @@
+package sample;
+
+public class Sample {
+       
+       public Sample(int i) {
+               int j = i++;
+       }
+       
+       private String myMethod() {
+               if (foo == bar) {
+                       return "hello";
+               } else {
+                       throw new IllegalStateException();
+               }
+       }
+}
diff --git a/it/it-projects/shared/xoo-sample-with-root-dir/src/main/xoo/sample/Sample.xoo.measures b/it/it-projects/shared/xoo-sample-with-root-dir/src/main/xoo/sample/Sample.xoo.measures
new file mode 100644 (file)
index 0000000..3f73ea8
--- /dev/null
@@ -0,0 +1,11 @@
+ncloc:13
+#Used by dashboard/widgets tests
+complexity:3
+complexity_in_classes:3
+classes:1
+comment_lines:3
+public_api:5
+public_undocumented_api:2
+duplicated_files:1
+duplicated_blocks:2
+duplicated_lines:3
index c29d3278164951f5a01357bcf87499cc6df7589b..875894fd67a2684d06e17c66894920d6d61504d6 100644 (file)
@@ -44,6 +44,16 @@ public class ProjectCodeTest {
     new SeleneseTest(selenese).runOn(orchestrator);
   }
 
+  @Test
+  public void code_page_should_expand_root_dir() throws Exception {
+    executeBuild("shared/xoo-sample-with-root-dir", "project-for-code-root-dir", "Project For Code");
+
+    Selenese selenese = Selenese.builder().setHtmlTestsInClasspath("code_page_should_expand_root_dir",
+      "/projectServices/ProjectCodeTest/code_page_should_expand_root_dir.html"
+    ).build();
+    new SeleneseTest(selenese).runOn(orchestrator);
+  }
+
   private void executeBuild(String projectLocation, String projectKey, String projectName) {
     orchestrator.executeBuild(
       SonarRunner.create(projectDir(projectLocation))
diff --git a/it/it-tests/src/test/resources/projectServices/ProjectCodeTest/code_page_should_expand_root_dir.html b/it/it-tests/src/test/resources/projectServices/ProjectCodeTest/code_page_should_expand_root_dir.html
new file mode 100644 (file)
index 0000000..9d07783
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+  <link rel="selenium.base" href="http://localhost:49506"/>
+  <title>code_page_should_expand_root_dir</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+  <thead>
+  <tr>
+    <td rowspan="1" colspan="3">code_page_should_expand_root_dir</td>
+  </tr>
+  </thead>
+  <tbody>
+  <tr>
+       <td>open</td>
+       <td>/sonar/code?id=project-for-code-root-dir</td>
+       <td></td>
+</tr>
+<tr>
+       <td>waitForText</td>
+       <td>css=#content</td>
+       <td>*Hello.xoo*</td>
+</tr>
+</tbody>
+</table>
+</body>
+</html>
index d9edf8eca7bd24124dd95ab9d673132a97acd9de..1d3dfd7356131e5dbe3f818690ff796e2b6c84a4 100644 (file)
@@ -100,6 +100,23 @@ function getPath (componentKey) {
   return '/' + encodeURIComponent(componentKey);
 }
 
+function expandRootDir (components) {
+  const rootDir = components.find(component => component.qualifier === 'DIR' && component.name === '/');
+  if (rootDir) {
+    return getChildren(rootDir.key, METRICS_WITH_COVERAGE).then(files => {
+      return _.without([...components, ...files], rootDir);
+    });
+  } else {
+    return components;
+  }
+}
+
+function skipRootDir (breadcrumbs) {
+  return breadcrumbs.filter(component => {
+    return !(component.qualifier === 'DIR' && component.name === '/');
+  });
+}
+
 function retrieveComponentBase (componentKey, candidate) {
   return candidate ?
       Promise.resolve(candidate) :
@@ -109,13 +126,15 @@ function retrieveComponentBase (componentKey, candidate) {
 function retrieveComponentChildren (componentKey, candidate) {
   return candidate && candidate.children ?
       Promise.resolve(candidate.children) :
-      getChildren(componentKey, METRICS_WITH_COVERAGE);
+      getChildren(componentKey, METRICS_WITH_COVERAGE).then(expandRootDir);
 }
 
 function retrieveComponentBreadcrumbs (componentKey, candidate) {
   return candidate && candidate.breadcrumbs ?
       Promise.resolve(candidate.breadcrumbs) :
-      getComponentNavigation(componentKey).then(navigation => navigation.breadcrumbs);
+      getComponentNavigation(componentKey)
+          .then(navigation => navigation.breadcrumbs)
+          .then(skipRootDir);
 }
 
 function retrieveComponent (componentKey, bucket) {
index 5e381b02968b0f576d6ddc80ae533ca1d71cba3a..2c8b31a1ebbb0f7b75d2562857b20a553351d620 100644 (file)
@@ -46,6 +46,28 @@ function merge (components, candidate) {
   return [...(_.without(components, found)), newEntry];
 }
 
+function compare (a, b) {
+  if (a === b) {
+    return 0;
+  }
+  return a > b ? 1 : -1;
+}
+
+function sortChildren (children) {
+  const QUALIFIERS_ORDER = ['DIR', 'FIL', 'UTS'];
+  const temp = [...children];
+  temp.sort((a, b) => {
+    const qualifierA = QUALIFIERS_ORDER.indexOf(a.qualifier);
+    const qualifierB = QUALIFIERS_ORDER.indexOf(b.qualifier);
+    if (qualifierA !== qualifierB) {
+      return compare(qualifierA, qualifierB);
+    } else {
+      return compare(a.name, b.name);
+    }
+  });
+  return temp;
+}
+
 
 export const initialState = {
   fetching: false,
@@ -70,7 +92,7 @@ export function current (state = initialState, action) {
       return { ...state, coverageMetric, baseBreadcrumbs };
     case BROWSE:
       const baseComponent = hasSourceCode(action.component) ? null : action.component;
-      const components = hasSourceCode(action.component) ? null : _.sortBy(action.children, 'name');
+      const components = hasSourceCode(action.component) ? null : sortChildren(action.children);
       const baseBreadcrumbsLength = state.baseBreadcrumbs.length;
       const breadcrumbs = action.breadcrumbs.slice(baseBreadcrumbsLength);
       const sourceViewer = hasSourceCode(action.component) ? action.component : null;
index f0a809996f7f6795da05cdef37b2ebc63b620ffb..e8b36a58e4b4406cf63661a32feef727de7b4321 100644 (file)
@@ -72,6 +72,20 @@ describe('Code :: Store', () => {
               .to.deep.equal(componentsAfter);
         });
 
+        it('should sort components by qualifier and then by name', () => {
+          const component = {};
+          const componentsBefore = [
+            { key: 'A', name: 'A', qualifier: 'FIL' },
+            { key: 'B', name: 'B', qualifier: 'DIR' }
+          ];
+          const componentsAfter = [
+            { key: 'B', name: 'B', qualifier: 'DIR' },
+            { key: 'A', name: 'A', qualifier: 'FIL' }
+          ];
+          expect(current(initialState, browseAction(component, componentsBefore)).components)
+              .to.deep.equal(componentsAfter);
+        });
+
         it('should not be set for components with source code', () => {
           const file = { qualifier: 'FIL' };
           expect(current(initialState, browseAction(file, exampleComponents)).components)