diff --git a/CHANGELOG.md b/CHANGELOG.md index f9b85ba..d4c927d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.2.1-beta-2] - 2026-05-28 + +### Added + +- Add OpenAPI language support without YAML and JSON conflicts. + ## [1.2.1-beta-1] - 2024-05-22 ### Security diff --git a/its/pom.xml b/its/pom.xml index cb9e214..3e60f51 100644 --- a/its/pom.xml +++ b/its/pom.xml @@ -5,7 +5,7 @@ org.apiaddicts.apitools.dosonarapi dosonarapi - 1.2.1-beta-1 + 1.2.1-beta-2 ../pom.xml 4.0.0 diff --git a/openapi-checks/pom.xml b/openapi-checks/pom.xml index 4244f0b..6ee409c 100644 --- a/openapi-checks/pom.xml +++ b/openapi-checks/pom.xml @@ -5,7 +5,7 @@ org.apiaddicts.apitools.dosonarapi dosonarapi - 1.2.1-beta-1 + 1.2.1-beta-2 ../pom.xml diff --git a/openapi-checks/src/main/java/org/apiaddicts/apitools/dosonarapi/checks/CheckList.java b/openapi-checks/src/main/java/org/apiaddicts/apitools/dosonarapi/checks/CheckList.java index 2933c5f..f2346ac 100644 --- a/openapi-checks/src/main/java/org/apiaddicts/apitools/dosonarapi/checks/CheckList.java +++ b/openapi-checks/src/main/java/org/apiaddicts/apitools/dosonarapi/checks/CheckList.java @@ -25,8 +25,10 @@ public final class CheckList { public static final String YAML_REPOSITORY_KEY = "openapi-yaml"; public static final String JSON_REPOSITORY_KEY = "openapi-json"; + public static final String OPENAPI_REPOSITORY_KEY = "openapi"; public static final String YAML_LANGUAGE = "yaml"; public static final String JSON_LANGUAGE = "json"; + public static final String OPENAPI_LANGUAGE = "openapi"; private CheckList() { } diff --git a/openapi-front-end/pom.xml b/openapi-front-end/pom.xml index cc4b3ba..00c742d 100644 --- a/openapi-front-end/pom.xml +++ b/openapi-front-end/pom.xml @@ -5,7 +5,7 @@ org.apiaddicts.apitools.dosonarapi dosonarapi - 1.2.1-beta-1 + 1.2.1-beta-2 ../pom.xml diff --git a/openapi-test-tools/pom.xml b/openapi-test-tools/pom.xml index 02cb4d1..13ab239 100644 --- a/openapi-test-tools/pom.xml +++ b/openapi-test-tools/pom.xml @@ -5,7 +5,7 @@ org.apiaddicts.apitools.dosonarapi dosonarapi - 1.2.1-beta-1 + 1.2.1-beta-2 ../pom.xml diff --git a/pom.xml b/pom.xml index 61dfb4c..619c838 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.apiaddicts.apitools.dosonarapi dosonarapi - 1.2.1-beta-1 + 1.2.1-beta-2 pom SonarOpenAPI diff --git a/sonar-openapi-plugin/pom.xml b/sonar-openapi-plugin/pom.xml index b9fbc86..d9a7e05 100644 --- a/sonar-openapi-plugin/pom.xml +++ b/sonar-openapi-plugin/pom.xml @@ -5,7 +5,7 @@ org.apiaddicts.apitools.dosonarapi dosonarapi - 1.2.1-beta-1 + 1.2.1-beta-2 ../pom.xml diff --git a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApi.java b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApi.java index 83dca61..92d51b8 100644 --- a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApi.java +++ b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApi.java @@ -19,10 +19,19 @@ */ package org.apiaddicts.apitools.dosonarapi.plugin; -public final class OpenApi { +import org.sonar.api.resources.AbstractLanguage; + +public class OpenApi extends AbstractLanguage { public static final String KEY = "openapi"; + private static final String NAME = "OpenAPI"; - private OpenApi() {} + public OpenApi() { + super(KEY, NAME); + } + @Override + public String[] getFileSuffixes() { + return new String[0]; + } } diff --git a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecks.java b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecks.java index ae2c35e..3bc6329 100644 --- a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecks.java +++ b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecks.java @@ -57,15 +57,15 @@ public OpenApiChecks addChecks(String repositoryKey, Iterable> checkCla public OpenApiChecks addCustomChecks(@Nullable OpenApiCustomRuleRepository[] customRuleRepositories) { if (customRuleRepositories != null) { - for (OpenApiCustomRuleRepository ruleRepository : customRuleRepositories) { - if (!ruleRepository.repositoryKey().equals(CheckList.YAML_REPOSITORY_KEY) && - !ruleRepository.repositoryKey().equals(CheckList.JSON_REPOSITORY_KEY)) { - addChecks(ruleRepository.repositoryKey(), new ArrayList<>(ruleRepository.checkClasses())); + String key = ruleRepository.repositoryKey(); + if (!key.equals(CheckList.YAML_REPOSITORY_KEY) && + !key.equals(CheckList.JSON_REPOSITORY_KEY) && + !key.equals(CheckList.OPENAPI_REPOSITORY_KEY)) { + addChecks(key, new ArrayList<>(ruleRepository.checkClasses())); } } } - return this; } @@ -75,7 +75,8 @@ public OpenApiChecks addCustomYamlChecks(@Nullable OpenApiCustomRuleRepository[] String key = ruleRepository.repositoryKey(); if (!key.equals(CheckList.YAML_REPOSITORY_KEY) && !key.equals(CheckList.JSON_REPOSITORY_KEY) && - !key.endsWith("-json")) { + !key.equals(CheckList.OPENAPI_REPOSITORY_KEY) && + key.endsWith("-yaml")) { addChecks(key, new ArrayList<>(ruleRepository.checkClasses())); } } @@ -89,6 +90,7 @@ public OpenApiChecks addCustomJsonChecks(@Nullable OpenApiCustomRuleRepository[] String key = ruleRepository.repositoryKey(); if (!key.equals(CheckList.YAML_REPOSITORY_KEY) && !key.equals(CheckList.JSON_REPOSITORY_KEY) && + !key.equals(CheckList.OPENAPI_REPOSITORY_KEY) && key.endsWith("-json")) { addChecks(key, new ArrayList<>(ruleRepository.checkClasses())); } @@ -97,6 +99,22 @@ public OpenApiChecks addCustomJsonChecks(@Nullable OpenApiCustomRuleRepository[] return this; } + public OpenApiChecks addCustomOpenApiChecks(@Nullable OpenApiCustomRuleRepository[] customRuleRepositories) { + if (customRuleRepositories != null) { + for (OpenApiCustomRuleRepository ruleRepository : customRuleRepositories) { + String key = ruleRepository.repositoryKey(); + if (!key.equals(CheckList.YAML_REPOSITORY_KEY) && + !key.equals(CheckList.JSON_REPOSITORY_KEY) && + !key.equals(CheckList.OPENAPI_REPOSITORY_KEY) && + !key.endsWith("-yaml") && + !key.endsWith("-json")) { + addChecks(key, new ArrayList<>(ruleRepository.checkClasses())); + } + } + } + return this; + } + public List all() { List allVisitors = new ArrayList<>(); diff --git a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPlugin.java b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPlugin.java index 07f3b38..0940201 100644 --- a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPlugin.java +++ b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPlugin.java @@ -27,6 +27,8 @@ public class OpenApiPlugin implements Plugin { @Override public void define(Context context) { context.addExtensions( + OpenApi.class, + OpenApiProfileDefinition.class, OpenApiScannerSensor.class, OpenApiRulesDefinition.class, OpenApiMetrics.class); diff --git a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiProfileDefinition.java b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiProfileDefinition.java new file mode 100644 index 0000000..d272652 --- /dev/null +++ b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiProfileDefinition.java @@ -0,0 +1,40 @@ +/* + * doSonarAPI: SonarQube OpenAPI Plugin + * Copyright (C) 2021-2022 Apiaddicts + * contacta AT apiaddicts DOT org + * + * 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.apiaddicts.apitools.dosonarapi.plugin; + +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.utils.AnnotationUtils; +import org.sonar.check.Rule; +import org.apiaddicts.apitools.dosonarapi.checks.CheckList; + +public class OpenApiProfileDefinition implements BuiltInQualityProfilesDefinition { + + public static final String SONAR_WAY_PROFILE = "Sonar way"; + + @Override + public void define(Context context) { + NewBuiltInQualityProfile profile = context.createBuiltInQualityProfile(SONAR_WAY_PROFILE, CheckList.OPENAPI_LANGUAGE); + for (Class check : CheckList.getChecks()) { + Rule annotation = AnnotationUtils.getAnnotation(check, Rule.class); + profile.activateRule(CheckList.OPENAPI_REPOSITORY_KEY, annotation.key()); + } + profile.done(); + } +} diff --git a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinition.java b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinition.java index 4794f9a..e21f1e2 100644 --- a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinition.java +++ b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinition.java @@ -41,6 +41,7 @@ private static RuleMetadataLoader getRuleMetadataLoader() { public void define(Context context) { createRepository(context, repositoryKey(), CheckList.YAML_LANGUAGE); createRepository(context, CheckList.JSON_REPOSITORY_KEY, CheckList.JSON_LANGUAGE); + createRepository(context, CheckList.OPENAPI_REPOSITORY_KEY, CheckList.OPENAPI_LANGUAGE); } private void createRepository(Context context, String key, String language) { diff --git a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensor.java b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensor.java index fd47dbe..8c6f469 100644 --- a/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensor.java +++ b/sonar-openapi-plugin/src/main/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensor.java @@ -40,6 +40,7 @@ public class OpenApiScannerSensor implements Sensor { private static final Logger LOGGER = Loggers.get(OpenApiScannerSensor.class); private final OpenApiChecks yamlChecks; private final OpenApiChecks jsonChecks; + private final OpenApiChecks openapiChecks; private FileLinesContextFactory fileLinesContextFactory; private final NoSonarFilter noSonarFilter; @@ -54,6 +55,9 @@ public OpenApiScannerSensor(CheckFactory checkFactory, FileLinesContextFactory f this.jsonChecks = OpenApiChecks.createOpenApiCheck(checkFactory) .addChecks(CheckList.JSON_REPOSITORY_KEY, CheckList.getChecks()) .addCustomJsonChecks(customRuleRepositories); + this.openapiChecks = OpenApiChecks.createOpenApiCheck(checkFactory) + .addChecks(CheckList.OPENAPI_REPOSITORY_KEY, CheckList.getChecks()) + .addCustomOpenApiChecks(customRuleRepositories); this.fileLinesContextFactory = fileLinesContextFactory; this.noSonarFilter = noSonarFilter; } @@ -62,7 +66,7 @@ public OpenApiScannerSensor(CheckFactory checkFactory, FileLinesContextFactory f public void describe(SensorDescriptor descriptor) { descriptor.name("OpenAPI Scanner Sensor") .onlyOnFileType(InputFile.Type.MAIN) - .onlyOnLanguages(CheckList.YAML_LANGUAGE, CheckList.JSON_LANGUAGE); + .onlyOnLanguages(CheckList.YAML_LANGUAGE, CheckList.JSON_LANGUAGE, CheckList.OPENAPI_LANGUAGE); } @Override @@ -82,6 +86,11 @@ public void scanFiles(SensorContext context, FilePredicates p) { p.and(p.hasType(InputFile.Type.MAIN), p.hasLanguage(CheckList.JSON_LANGUAGE)) ).forEach(jsonFiles::add); + List openapiFiles = new ArrayList<>(); + context.fileSystem().inputFiles( + p.and(p.hasType(InputFile.Type.MAIN), p.hasLanguage(CheckList.OPENAPI_LANGUAGE)) + ).forEach(openapiFiles::add); + if (!yamlFiles.isEmpty()) { LOGGER.info("OpenAPI Scanner called for yaml files: {}.", yamlFiles); new OpenApiAnalyzer(context, yamlChecks, fileLinesContextFactory, noSonarFilter, Collections.unmodifiableList(yamlFiles)).scanFiles(); @@ -90,5 +99,9 @@ public void scanFiles(SensorContext context, FilePredicates p) { LOGGER.info("OpenAPI Scanner called for json files: {}.", jsonFiles); new OpenApiAnalyzer(context, jsonChecks, fileLinesContextFactory, noSonarFilter, Collections.unmodifiableList(jsonFiles)).scanFiles(); } + if (!openapiFiles.isEmpty()) { + LOGGER.info("OpenAPI Scanner called for openapi files: {}.", openapiFiles); + new OpenApiAnalyzer(context, openapiChecks, fileLinesContextFactory, noSonarFilter, Collections.unmodifiableList(openapiFiles)).scanFiles(); + } } } diff --git a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecksTest.java b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecksTest.java index 5b059e0..802e32d 100644 --- a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecksTest.java +++ b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiChecksTest.java @@ -144,4 +144,53 @@ public void ruleKeyFor_returns_null_when_not_found() { OpenApiChecks checks = OpenApiChecks.createOpenApiCheck(factory); assertThat(checks.ruleKeyFor(new org.apiaddicts.apitools.dosonarapi.checks.PathMaskeradingCheck())).isNull(); } + + @Test + public void addCustomOpenApiChecks_adds_repo_without_suffix() { + CheckFactory factory = factoryWithRule("my-custom", "PathMaskerading"); + OpenApiChecks checks = OpenApiChecks.createOpenApiCheck(factory) + .addCustomOpenApiChecks(new OpenApiCustomRuleRepository[]{repoWithKey("my-custom")}); + assertThat(checks.all()).isNotEmpty(); + } + + @Test + public void addCustomOpenApiChecks_skips_yaml_repo() { + CheckFactory factory = factoryWithRule("my-custom-yaml", "PathMaskerading"); + OpenApiChecks checks = OpenApiChecks.createOpenApiCheck(factory) + .addCustomOpenApiChecks(new OpenApiCustomRuleRepository[]{repoWithKey("my-custom-yaml")}); + assertThat(checks.all()).isEmpty(); + } + + @Test + public void addCustomOpenApiChecks_skips_json_repo() { + CheckFactory factory = factoryWithRule("my-custom-json", "PathMaskerading"); + OpenApiChecks checks = OpenApiChecks.createOpenApiCheck(factory) + .addCustomOpenApiChecks(new OpenApiCustomRuleRepository[]{repoWithKey("my-custom-json")}); + assertThat(checks.all()).isEmpty(); + } + + @Test + public void addCustomOpenApiChecks_skips_base_openapi_repo() { + CheckFactory factory = factoryWithRule(CheckList.OPENAPI_REPOSITORY_KEY, "PathMaskerading"); + OpenApiChecks checks = OpenApiChecks.createOpenApiCheck(factory) + .addCustomOpenApiChecks(new OpenApiCustomRuleRepository[]{repoWithKey(CheckList.OPENAPI_REPOSITORY_KEY)}); + assertThat(checks.all()).isEmpty(); + } + + @Test + public void addCustomOpenApiChecks_handles_null() { + ActiveRules rules = new ActiveRulesBuilder().build(); + CheckFactory factory = new CheckFactory(rules); + OpenApiChecks checks = OpenApiChecks.createOpenApiCheck(factory) + .addCustomOpenApiChecks(null); + assertThat(checks.all()).isEmpty(); + } + + @Test + public void addCustomYamlChecks_requires_yaml_suffix() { + CheckFactory factory = factoryWithRule("my-custom", "PathMaskerading"); + OpenApiChecks checks = OpenApiChecks.createOpenApiCheck(factory) + .addCustomYamlChecks(new OpenApiCustomRuleRepository[]{repoWithKey("my-custom")}); + assertThat(checks.all()).isEmpty(); + } } diff --git a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPluginTest.java b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPluginTest.java index bc68fe8..5b2b1b7 100644 --- a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPluginTest.java +++ b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiPluginTest.java @@ -36,6 +36,11 @@ public void defines_expected_extensions() { new OpenApiPlugin().define(context); assertThat(context.getExtensions()) - .contains(OpenApiScannerSensor.class, OpenApiRulesDefinition.class, OpenApiMetrics.class); + .contains( + OpenApi.class, + OpenApiProfileDefinition.class, + OpenApiScannerSensor.class, + OpenApiRulesDefinition.class, + OpenApiMetrics.class); } } diff --git a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiProfileDefinitionTest.java b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiProfileDefinitionTest.java new file mode 100644 index 0000000..72acf11 --- /dev/null +++ b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiProfileDefinitionTest.java @@ -0,0 +1,69 @@ +/* + * doSonarAPI: SonarQube OpenAPI Plugin + * Copyright (C) 2021-2022 Apiaddicts + * contacta AT apiaddicts DOT org + * + * 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.apiaddicts.apitools.dosonarapi.plugin; + +import org.junit.Test; +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition; +import org.sonar.api.server.profile.BuiltInQualityProfilesDefinition.BuiltInQualityProfile; +import org.apiaddicts.apitools.dosonarapi.checks.CheckList; + +import static org.assertj.core.api.Assertions.assertThat; + +public class OpenApiProfileDefinitionTest { + + @Test + public void defines_sonar_way_profile_for_openapi_language() { + OpenApiProfileDefinition definition = new OpenApiProfileDefinition(); + BuiltInQualityProfilesDefinition.Context context = new BuiltInQualityProfilesDefinition.Context(); + + definition.define(context); + + BuiltInQualityProfile profile = context.profile(CheckList.OPENAPI_LANGUAGE, OpenApiProfileDefinition.SONAR_WAY_PROFILE); + assertThat(profile).isNotNull(); + assertThat(profile.language()).isEqualTo(CheckList.OPENAPI_LANGUAGE); + assertThat(profile.name()).isEqualTo(OpenApiProfileDefinition.SONAR_WAY_PROFILE); + assertThat(profile.rules()).hasSize(CheckList.getChecks().size()); + } + + @Test + public void profile_rules_belong_to_openapi_repository() { + OpenApiProfileDefinition definition = new OpenApiProfileDefinition(); + BuiltInQualityProfilesDefinition.Context context = new BuiltInQualityProfilesDefinition.Context(); + + definition.define(context); + + BuiltInQualityProfile profile = context.profile(CheckList.OPENAPI_LANGUAGE, OpenApiProfileDefinition.SONAR_WAY_PROFILE); + assertThat(profile.rules()).isNotEmpty(); + assertThat(profile.rules()) + .allMatch(r -> r.repoKey().equals(CheckList.OPENAPI_REPOSITORY_KEY)); + } + + @Test + public void only_openapi_language_profile_is_created() { + OpenApiProfileDefinition definition = new OpenApiProfileDefinition(); + BuiltInQualityProfilesDefinition.Context context = new BuiltInQualityProfilesDefinition.Context(); + + definition.define(context); + + assertThat(context.profile(CheckList.YAML_LANGUAGE, OpenApiProfileDefinition.SONAR_WAY_PROFILE)).isNull(); + assertThat(context.profile(CheckList.JSON_LANGUAGE, OpenApiProfileDefinition.SONAR_WAY_PROFILE)).isNull(); + assertThat(context.profile(CheckList.OPENAPI_LANGUAGE, OpenApiProfileDefinition.SONAR_WAY_PROFILE)).isNotNull(); + } +} diff --git a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinitionTest.java b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinitionTest.java index 817814b..3d10f76 100644 --- a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinitionTest.java +++ b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiRulesDefinitionTest.java @@ -28,7 +28,7 @@ public class OpenApiRulesDefinitionTest { @Test - public void defines_yaml_and_json_repositories() { + public void defines_yaml_json_and_openapi_repositories() { OpenApiRulesDefinition definition = new OpenApiRulesDefinition(); RulesDefinition.Context context = new RulesDefinition.Context(); @@ -43,6 +43,11 @@ public void defines_yaml_and_json_repositories() { assertThat(jsonRepo).isNotNull(); assertThat(jsonRepo.language()).isEqualTo(CheckList.JSON_LANGUAGE); assertThat(jsonRepo.rules()).hasSizeGreaterThanOrEqualTo(1); + + RulesDefinition.Repository openapiRepo = context.repository(CheckList.OPENAPI_REPOSITORY_KEY); + assertThat(openapiRepo).isNotNull(); + assertThat(openapiRepo.language()).isEqualTo(CheckList.OPENAPI_LANGUAGE); + assertThat(openapiRepo.rules()).hasSizeGreaterThanOrEqualTo(1); } @Test @@ -58,13 +63,15 @@ public void check_classes_returns_all_checks() { } @Test - public void yaml_and_json_repos_have_same_rules() { + public void all_repos_have_same_rules() { OpenApiRulesDefinition definition = new OpenApiRulesDefinition(); RulesDefinition.Context context = new RulesDefinition.Context(); definition.define(context); RulesDefinition.Repository yamlRepo = context.repository(CheckList.YAML_REPOSITORY_KEY); RulesDefinition.Repository jsonRepo = context.repository(CheckList.JSON_REPOSITORY_KEY); + RulesDefinition.Repository openapiRepo = context.repository(CheckList.OPENAPI_REPOSITORY_KEY); assertThat(yamlRepo.rules()).hasSameSizeAs(jsonRepo.rules()); + assertThat(yamlRepo.rules()).hasSameSizeAs(openapiRepo.rules()); } } diff --git a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensorTest.java b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensorTest.java index 2d6b20b..8e87685 100644 --- a/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensorTest.java +++ b/sonar-openapi-plugin/src/test/java/org/apiaddicts/apitools/dosonarapi/plugin/OpenApiScannerSensorTest.java @@ -77,7 +77,7 @@ public void sensor_descriptor() { sensor().describe(descriptor); assertThat(descriptor.name()).isEqualTo("OpenAPI Scanner Sensor"); - assertThat(descriptor.languages()).containsOnly("yaml", "json"); + assertThat(descriptor.languages()).containsOnly("yaml", "json", "openapi"); assertThat(descriptor.type()).isEqualTo(InputFile.Type.MAIN); } @@ -144,6 +144,22 @@ public void test_yaml_rules_do_not_fire_on_json_files() { assertThat(context.allIssues()).isEmpty(); } + @Test + public void test_openapi_language_scan() { + activeRules = (new ActiveRulesBuilder()) + .create(RuleKey.of(CheckList.OPENAPI_REPOSITORY_KEY, "PathMaskerading")) + .activate() + .build(); + + inputFile("file1.yaml", CheckList.OPENAPI_LANGUAGE); + sensor().execute(context); + + assertThat(context.allIssues()).hasSize(1); + Issue issue = Iterables.get(context.allIssues(), 0); + assertThat(issue.ruleKey().repository()).isEqualTo(CheckList.OPENAPI_REPOSITORY_KEY); + assertThat(context.allAnalysisErrors()).isEmpty(); + } + @Test public void parse_error() { inputFile("parse-error.yaml"); @@ -253,6 +269,10 @@ private OpenApiScannerSensor sensor() { private InputFile inputFile(String name) { String language = name.endsWith(".json") ? CheckList.JSON_LANGUAGE : CheckList.YAML_LANGUAGE; + return inputFile(name, language); + } + + private InputFile inputFile(String name, String language) { DefaultInputFile inputFile = TestInputFileBuilder.create("moduleKey", name) .setModuleBaseDir(baseDir) .setCharset(StandardCharsets.UTF_8)