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)