diff options
Diffstat (limited to 'its/plugin')
6 files changed, 507 insertions, 1 deletions
diff --git a/its/plugin/projects/external-report-project/report.json b/its/plugin/projects/external-report-project/report.json new file mode 100644 index 0000000..2681dac --- /dev/null +++ b/its/plugin/projects/external-report-project/report.json @@ -0,0 +1,55 @@ +[ + { + "source": "src/file1.css", + "deprecations": [], + "invalidOptionWarnings": [], + "parseErrors": [], + "errored": true, + "warnings": [ + { + "line": 111, + "column": 1, + "rule": "no-missing-end-of-source-newline", + "severity": "error", + "text": "Unexpected missing end-of-source newline (no-missing-end-of-source-newline)" + }, + { + "line": 81, + "column": 1, + "rule": "rule-empty-line-before", + "severity": "error", + "text": "Expected empty line before rule (rule-empty-line-before)" + }, + { + "line": 55, + "column": 20, + "rule": "selector-pseudo-element-colon-notation", + "severity": "error", + "text": "Expected double colon pseudo-element notation (selector-pseudo-element-colon-notation)" + } + ] + }, + { + "source": "src/file2.css", + "deprecations": [], + "invalidOptionWarnings": [], + "parseErrors": [], + "errored": true, + "warnings": [ + { + "line": 58, + "column": 28, + "rule": "block-no-empty", + "severity": "error", + "text": "Unexpected empty block (block-no-empty)" + }, + { + "line": 114, + "column": 1, + "rule": "no-missing-end-of-source-newline", + "severity": "error", + "text": "Unexpected missing end-of-source newline (no-missing-end-of-source-newline)" + } + ] + } +] diff --git a/its/plugin/projects/external-report-project/src/file1.css b/its/plugin/projects/external-report-project/src/file1.css new file mode 100644 index 0000000..329fa57 --- /dev/null +++ b/its/plugin/projects/external-report-project/src/file1.css @@ -0,0 +1,111 @@ +.navbar-search { + position: relative; + padding: calc((var(--globalNavHeight) - var(--globalNavContentHeight)) / 2) 0; +} + +.navbar-search .search-box, +.navbar-search .search-box-input { + width: 26vw; + max-width: 310px; + min-width: 260px; + height: var(--globalNavContentHeight); +} + +.navbar-search .search-box-input { + border-color: #fff; +} + +.navbar-search .search-box-note { + line-height: calc(var(--globalNavContentHeight) - 2px); +} + +.navbar-search .search-box-magnifier, +.navbar-search .search-box-clear { + top: calc((var(--globalNavContentHeight) - 16px) / 2); +} + +.navbar-search-input { + vertical-align: middle; + width: 310px; + margin-top: 3px; + margin-bottom: 3px; + padding-left: 26px !important; +} + +.navbar-search-input-hint { + position: absolute; + top: 1px; + right: 27px; + line-height: var(--controlHeight); + font-size: var(--smallFontSize); + color: var(--secondFontColor); +} + +.navbar-search-icon { + position: relative; + z-index: var(--aboveNormalZIndex); + vertical-align: middle; + width: 16px; + margin-left: 4px; + margin-right: -20px; + background-color: #fff; + color: var(--secondFontColor); +} + +.navbar-search-icon:before { + font-size: var(--mediumFontSize); +} + +.navbar-search-item-link { + display: flex !important; +} + +.navbar-search-item-match { + flex-grow: 5; + overflow: hidden; + text-overflow: ellipsis; +} + +.navbar-search-item-right { + flex-grow: 1; + padding-left: 10px; + text-align: right; +} + +.navbar-search-item-icons { + position: relative; + flex-shrink: 0; + width: 16px; + height: 16px; +} +.navbar-search-item-icons > * { + position: absolute; + z-index: 5; + top: 0; + left: 0; +} + +.navbar-search-item-icons > .icon-outline, +.navbar-search-item-icons > .icon-clock { + z-index: 6; + top: -4px; + left: -5px; +} + +.navbar-search-no-results { + margin-top: 4px; + padding: 5px 10px; +} + +.global-navbar-search-dropdown { + top: 100% !important; + max-height: 80vh; + width: 440px; + padding: 0 !important; + overflow-y: auto; + overflow-x: hidden; +} + +.global-navbar-search-dropdown .dropdown-bottom-hint { + margin-bottom: 0; +}
\ No newline at end of file diff --git a/its/plugin/projects/external-report-project/src/file2.css b/its/plugin/projects/external-report-project/src/file2.css new file mode 100644 index 0000000..ff1d2e5 --- /dev/null +++ b/its/plugin/projects/external-report-project/src/file2.css @@ -0,0 +1,114 @@ +.date-input-control { + position: relative; + display: inline-block; + cursor: pointer; +} + +.date-input-control-input { + width: 130px; + padding-left: var(--controlHeight) !important; + cursor: pointer; +} + +.date-input-control-input.is-filled { + padding-right: 16px !important; +} + +.date-input-control-icon { + position: absolute; + top: 4px; + left: 4px; +} + +.date-input-control-icon path { + fill: var(--gray80); + transition: fill 0.3s ease; +} + +.date-input-control-input:focus + .date-input-control-icon path { + fill: var(--blue); +} + +.date-input-control-reset { + position: absolute; + top: 4px; + right: 4px; + border: none; +} + +.date-input-calendar { + position: absolute; + z-index: var(--dropdownMenuZIndex); + top: 100%; + left: 0; + border: 1px solid var(--barBorderColor); + background-color: #fff; + box-shadow: var(--defaultShadow); +} + +.date-input-calendar-nav { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: var(--gridSize); + padding-left: var(--gridSize); + padding-right: var(--gridSize); +} + +.date-input-calender-month { +} + +.date-input-calender-month-select { + width: 70px; +} + +.button.boolean-toggle { + display: inline-block; + vertical-align: middle; + width: 48px; + height: var(--controlHeight); + padding: 1px; + border: 1px solid var(--gray80); + border-radius: var(--controlHeight); + box-sizing: border-box; + background-color: #fff; + cursor: pointer; + transition: all 0.3s ease; +} + +.button.boolean-toggle:hover { + background-color: #fff; +} + +.button.boolean-toggle:focus { + border-color: var(--blue); + background-color: #f6f6f6; +} + +.boolean-toggle-handle { + width: 20px; + height: 20px; + border: 1px solid var(--gray80); + border-radius: 22px; + box-sizing: border-box; + background-color: #f6f6f6; + transition: transform 0.3s cubic-bezier(0.87, -0.41, 0.19, 1.44), border 0.3s ease; +} + +.button.boolean-toggle-on { + border-color: var(--darkBlue); + background-color: var(--darkBlue); +} + +.button.boolean-toggle-on:hover { + background-color: var(--darkBlue); +} + +.button.boolean-toggle-on:focus { + background-color: var(--darkBlue); +} + +.button.boolean-toggle-on .boolean-toggle-handle { + border-color: #f6f6f6; + transform: translateX(var(--controlHeight)); +}
\ No newline at end of file diff --git a/its/plugin/projects/external-report-project/stylelintconfig.json b/its/plugin/projects/external-report-project/stylelintconfig.json new file mode 100644 index 0000000..4a0997a --- /dev/null +++ b/its/plugin/projects/external-report-project/stylelintconfig.json @@ -0,0 +1,162 @@ +{ + "rules": { + "at-rule-no-unknown": true, + "block-no-empty": true, + "color-no-invalid-hex": true, + "comment-no-empty": true, + "declaration-block-no-duplicate-properties": [ + true, + { + "ignore": [ + "consecutive-duplicates-with-different-values" + ] + } + ], + "declaration-block-no-shorthand-property-overrides": true, + "font-family-no-duplicate-names": true, + "font-family-no-missing-generic-family-keyword": true, + "function-calc-no-unspaced-operator": true, + "function-linear-gradient-no-nonstandard-direction": true, + "keyframe-declaration-no-important": true, + "media-feature-name-no-unknown": true, + "no-descending-specificity": true, + "no-duplicate-at-import-rules": true, + "no-duplicate-selectors": true, + "no-empty-source": true, + "no-extra-semicolons": true, + "no-invalid-double-slash-comments": true, + "property-no-unknown": true, + "selector-pseudo-class-no-unknown": true, + "selector-pseudo-element-no-unknown": true, + "selector-type-no-unknown": true, + "string-no-newline": true, + "unit-no-unknown": true, + "at-rule-empty-line-before": [ + "always", + { + "except": [ + "blockless-after-same-name-blockless", + "first-nested" + ], + "ignore": [ + "after-comment" + ] + } + ], + "at-rule-name-case": "lower", + "at-rule-name-space-after": "always-single-line", + "at-rule-semicolon-newline-after": "always", + "block-closing-brace-empty-line-before": "never", + "block-closing-brace-newline-after": "always", + "block-closing-brace-newline-before": "always-multi-line", + "block-closing-brace-space-before": "always-single-line", + "block-opening-brace-newline-after": "always-multi-line", + "block-opening-brace-space-after": "always-single-line", + "block-opening-brace-space-before": "always", + "color-hex-case": "lower", + "color-hex-length": "short", + "comment-empty-line-before": [ + "always", + { + "except": [ + "first-nested" + ], + "ignore": [ + "stylelint-commands" + ] + } + ], + "comment-whitespace-inside": "always", + "custom-property-empty-line-before": [ + "always", + { + "except": [ + "after-custom-property", + "first-nested" + ], + "ignore": [ + "after-comment", + "inside-single-line-block" + ] + } + ], + "declaration-bang-space-after": "never", + "declaration-bang-space-before": "always", + "declaration-block-semicolon-newline-after": "always-multi-line", + "declaration-block-semicolon-space-after": "always-single-line", + "declaration-block-semicolon-space-before": "never", + "declaration-block-single-line-max-declarations": 1, + "declaration-block-trailing-semicolon": "always", + "declaration-colon-newline-after": "always-multi-line", + "declaration-colon-space-after": "always-single-line", + "declaration-colon-space-before": "never", + "declaration-empty-line-before": [ + "always", + { + "except": [ + "after-declaration", + "first-nested" + ], + "ignore": [ + "after-comment", + "inside-single-line-block" + ] + } + ], + "function-comma-newline-after": "always-multi-line", + "function-comma-space-after": "always-single-line", + "function-comma-space-before": "never", + "function-max-empty-lines": 0, + "function-name-case": "lower", + "function-parentheses-newline-inside": "always-multi-line", + "function-parentheses-space-inside": "never-single-line", + "function-whitespace-after": "always", + "indentation": 2, + "length-zero-no-unit": true, + "max-empty-lines": 1, + "media-feature-colon-space-after": "always", + "media-feature-colon-space-before": "never", + "media-feature-name-case": "lower", + "media-feature-parentheses-space-inside": "never", + "media-feature-range-operator-space-after": "always", + "media-feature-range-operator-space-before": "always", + "media-query-list-comma-newline-after": "always-multi-line", + "media-query-list-comma-space-after": "always-single-line", + "media-query-list-comma-space-before": "never", + "no-eol-whitespace": true, + "no-missing-end-of-source-newline": true, + "number-leading-zero": "always", + "number-no-trailing-zeros": true, + "property-case": "lower", + "rule-empty-line-before": [ + "always-multi-line", + { + "except": [ + "first-nested" + ], + "ignore": [ + "after-comment" + ] + } + ], + "selector-attribute-brackets-space-inside": "never", + "selector-attribute-operator-space-after": "never", + "selector-attribute-operator-space-before": "never", + "selector-combinator-space-after": "always", + "selector-combinator-space-before": "always", + "selector-descendant-combinator-no-non-space": true, + "selector-list-comma-newline-after": "always", + "selector-list-comma-space-before": "never", + "selector-max-empty-lines": 0, + "selector-pseudo-class-case": "lower", + "selector-pseudo-class-parentheses-space-inside": "never", + "selector-pseudo-element-case": "lower", + "selector-pseudo-element-colon-notation": "double", + "selector-type-case": "lower", + "unit-case": "lower", + "value-list-comma-newline-after": "always-multi-line", + "value-list-comma-space-after": "always-single-line", + "value-list-comma-space-before": "never", + "value-list-max-empty-lines": 0 + } +} diff --git a/its/plugin/src/test/java/org/sonar/css/its/StylelintReportTest.java b/its/plugin/src/test/java/org/sonar/css/its/StylelintReportTest.java new file mode 100644 index 0000000..b10f7a4 --- /dev/null +++ b/its/plugin/src/test/java/org/sonar/css/its/StylelintReportTest.java @@ -0,0 +1,62 @@ +/* + * SonarCSS + * Copyright (C) 2018-2018 SonarSource SA + * mailto:info 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 org.sonar.css.its; + +import com.sonar.orchestrator.Orchestrator; +import java.util.Collections; +import java.util.List; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.sonarqube.ws.Issues.Issue; +import org.sonarqube.ws.client.issues.SearchRequest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.css.its.Tests.newWsClient; + +public class StylelintReportTest { + + private static String PROJECT_KEY = "external-report-project"; + + @ClassRule + public static Orchestrator orchestrator = Tests.ORCHESTRATOR; + + @BeforeClass + public static void prepare() { + orchestrator.executeBuild(Tests.createScanner(PROJECT_KEY).setProperty("sonar.css.stylelint.reportPaths", "report.json")); + } + + @Test + public void test() { + if (orchestrator.getServer().version().isGreaterThanOrEquals(7, 2)) { + SearchRequest request = new SearchRequest(); + request.setComponentKeys(Collections.singletonList(PROJECT_KEY)); + List<Issue> issuesList = newWsClient().issues().search(request).getIssuesList(); + + assertThat(issuesList).extracting("line").containsExactlyInAnyOrder(111, 81, 55, 58, 114); + assertThat(issuesList).extracting("rule").containsExactlyInAnyOrder( + "external_stylelint:no-missing-end-of-source-newline", + "external_stylelint:no-missing-end-of-source-newline", + "external_stylelint:rule-empty-line-before", + "external_stylelint:selector-pseudo-element-colon-notation", + "external_stylelint:block-no-empty"); + } + } +} diff --git a/its/plugin/src/test/java/org/sonar/css/its/Tests.java b/its/plugin/src/test/java/org/sonar/css/its/Tests.java index 31b2f78..d94a633 100644 --- a/its/plugin/src/test/java/org/sonar/css/its/Tests.java +++ b/its/plugin/src/test/java/org/sonar/css/its/Tests.java @@ -29,6 +29,7 @@ import java.util.List; import org.junit.ClassRule; import org.junit.runner.RunWith; import org.junit.runners.Suite; +import org.sonar.css.plugin.StylelintReport; import org.sonarqube.ws.Measures.ComponentWsResponse; import org.sonarqube.ws.Measures.Measure; import org.sonarqube.ws.client.HttpConnector; @@ -39,7 +40,8 @@ import org.sonarqube.ws.client.measures.ComponentRequest; @RunWith(Suite.class) @Suite.SuiteClasses({ MetricsTest.class, - IssuesTest.class + IssuesTest.class, + StylelintReportTest.class }) public class Tests { |
