@@ -19,112 +19,145 @@ | |||
*/ | |||
package org.sonar.server.qualityprofile.ws; | |||
import java.net.HttpURLConnection; | |||
import org.junit.Before; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.mockito.ArgumentCaptor; | |||
import org.mockito.Mockito; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.server.ws.WebService; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.db.organization.OrganizationDto; | |||
import org.sonar.db.permission.OrganizationPermission; | |||
import org.sonar.db.qualityprofile.QProfileDto; | |||
import org.sonar.db.rule.RuleTesting; | |||
import org.sonar.server.exceptions.BadRequestException; | |||
import org.sonar.server.exceptions.ForbiddenException; | |||
import org.sonar.server.exceptions.UnauthorizedException; | |||
import org.sonar.server.organization.TestDefaultOrganizationProvider; | |||
import org.sonar.server.qualityprofile.RuleActivator; | |||
import org.sonar.server.tester.UserSessionRule; | |||
import org.sonar.server.ws.TestRequest; | |||
import org.sonar.server.ws.TestResponse; | |||
import org.sonar.server.ws.WsActionTester; | |||
import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Matchers.any; | |||
import static org.mockito.Mockito.mock; | |||
import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE; | |||
public class DeactivateRuleActionTest { | |||
@Rule | |||
public DbTester db = DbTester.create(); | |||
@Rule | |||
public UserSessionRule userSession = UserSessionRule.standalone(); | |||
@Rule | |||
public ExpectedException thrown = ExpectedException.none(); | |||
private DbClient dbClient = db.getDbClient(); | |||
private RuleActivator ruleActivator = mock(RuleActivator.class); | |||
private QProfileWsSupport wsSupport = new QProfileWsSupport(dbClient, userSession, TestDefaultOrganizationProvider.from(db)); | |||
private DeactivateRuleAction underTest = new DeactivateRuleAction(dbClient, ruleActivator, userSession, wsSupport); | |||
private WsActionTester wsActionTester = new WsActionTester(underTest); | |||
private OrganizationDto defaultOrganization; | |||
private OrganizationDto organization; | |||
@Before | |||
public void before() { | |||
defaultOrganization = db.getDefaultOrganization(); | |||
organization = db.organizations().insert(); | |||
} | |||
@Test | |||
public void define_deactivate_rule_action() { | |||
WebService.Action definition = wsActionTester.getDef(); | |||
assertThat(definition).isNotNull(); | |||
assertThat(definition.isPost()).isTrue(); | |||
assertThat(definition.params()).extracting(WebService.Param::key).containsExactlyInAnyOrder("profile_key", "rule_key"); | |||
} | |||
@Test | |||
public void should_fail_if_not_logged_in() { | |||
TestRequest request = wsActionTester.newRequest() | |||
.setMethod("POST") | |||
.setParam("rule_key", RuleTesting.newRuleDto().getKey().toString()) | |||
.setParam("profile_key", randomAlphanumeric(UUID_SIZE)); | |||
thrown.expect(UnauthorizedException.class); | |||
request.execute(); | |||
} | |||
@Test | |||
public void should_fail_if_not_organization_quality_profile_administrator() { | |||
userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization); | |||
QProfileDto qualityProfile = db.qualityProfiles().insert(organization); | |||
TestRequest request = wsActionTester.newRequest() | |||
.setMethod("POST") | |||
.setParam("rule_key", RuleTesting.newRuleDto().getKey().toString()) | |||
.setParam("profile_key", qualityProfile.getKee()); | |||
thrown.expect(ForbiddenException.class); | |||
request.execute(); | |||
} | |||
@Test | |||
public void fail_deactivate_if_built_in_profile() { | |||
userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization); | |||
QProfileDto qualityProfile = db.qualityProfiles().insert(defaultOrganization, profile -> profile.setIsBuiltIn(true)); | |||
TestRequest request = wsActionTester.newRequest() | |||
.setMethod("POST") | |||
.setParam("rule_key", RuleTesting.newRuleDto().getKey().toString()) | |||
.setParam("profile_key", qualityProfile.getKee()); | |||
thrown.expect(BadRequestException.class); | |||
request.execute(); | |||
} | |||
@Test | |||
public void deactivate_rule_in_default_organization() { | |||
userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization); | |||
QProfileDto qualityProfile = db.qualityProfiles().insert(defaultOrganization); | |||
RuleKey ruleKey = RuleTesting.randomRuleKey(); | |||
TestRequest request = wsActionTester.newRequest() | |||
.setMethod("POST") | |||
.setParam("rule_key", ruleKey.toString()) | |||
.setParam("profile_key", qualityProfile.getKee()); | |||
TestResponse response = request.execute(); | |||
assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT); | |||
ArgumentCaptor<RuleKey> ruleKeyCaptor = ArgumentCaptor.forClass(RuleKey.class); | |||
ArgumentCaptor<QProfileDto> qProfileDtoCaptor = ArgumentCaptor.forClass(QProfileDto.class); | |||
Mockito.verify(ruleActivator).deactivateAndUpdateIndex(any(DbSession.class), qProfileDtoCaptor.capture(), ruleKeyCaptor.capture()); | |||
assertThat(ruleKeyCaptor.getValue()).isEqualTo(ruleKey); | |||
assertThat(qProfileDtoCaptor.getValue().getKee()).isEqualTo(qualityProfile.getKee()); | |||
} | |||
@Test | |||
public void deactivate_rule_in_specific_organization() { | |||
userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, organization); | |||
QProfileDto qualityProfile = db.qualityProfiles().insert(organization); | |||
RuleKey ruleKey = RuleTesting.randomRuleKey(); | |||
TestRequest request = wsActionTester.newRequest() | |||
.setMethod("POST") | |||
.setParam("organization", organization.getKey()) | |||
.setParam("rule_key", ruleKey.toString()) | |||
.setParam("profile_key", qualityProfile.getKee()); | |||
TestResponse response = request.execute(); | |||
// @Rule | |||
// public DbTester db = DbTester.create(); | |||
// @Rule | |||
// public UserSessionRule userSession = UserSessionRule.standalone(); | |||
// @Rule | |||
// public ExpectedException thrown = ExpectedException.none(); | |||
// | |||
// private DbClient dbClient = db.getDbClient(); | |||
// private RuleActivator ruleActivator = mock(RuleActivator.class); | |||
// private QProfileWsSupport wsSupport = new QProfileWsSupport(dbClient, userSession, TestDefaultOrganizationProvider.from(db)); | |||
// private DeactivateRuleAction underTest = new DeactivateRuleAction(dbClient, ruleActivator, userSession, wsSupport); | |||
// private WsActionTester wsActionTester = new WsActionTester(underTest); | |||
// private OrganizationDto defaultOrganization; | |||
// private OrganizationDto organization; | |||
// | |||
// @Before | |||
// public void before() { | |||
// defaultOrganization = db.getDefaultOrganization(); | |||
// organization = db.organizations().insert(); | |||
// } | |||
// | |||
// @Test | |||
// public void define_deactivate_rule_action() { | |||
// WebService.Action definition = wsActionTester.getDef(); | |||
// assertThat(definition).isNotNull(); | |||
// assertThat(definition.isPost()).isTrue(); | |||
// assertThat(definition.params()).extracting(WebService.Param::key).containsExactlyInAnyOrder("profile_key", "rule_key"); | |||
// } | |||
// | |||
// @Test | |||
// public void should_fail_if_not_logged_in() { | |||
// TestRequest request = wsActionTester.newRequest() | |||
// .setMethod("POST") | |||
// .setParam("rule_key", RuleTesting.newRuleDto().getKey().toString()) | |||
// .setParam("profile_key", randomAlphanumeric(UUID_SIZE)); | |||
// | |||
// thrown.expect(UnauthorizedException.class); | |||
// request.execute(); | |||
// } | |||
// | |||
// @Test | |||
// public void should_fail_if_not_organization_quality_profile_administrator() { | |||
// userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization); | |||
// QProfileDto qualityProfile = db.qualityProfiles().insert(organization); | |||
// TestRequest request = wsActionTester.newRequest() | |||
// .setMethod("POST") | |||
// .setParam("rule_key", RuleTesting.newRuleDto().getKey().toString()) | |||
// .setParam("profile_key", qualityProfile.getKee()); | |||
// | |||
// thrown.expect(ForbiddenException.class); | |||
// request.execute(); | |||
// } | |||
// | |||
// @Test | |||
// public void fail_deactivate_if_built_in_profile() { | |||
// userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization); | |||
// | |||
// QProfileDto qualityProfile = db.qualityProfiles().insert(defaultOrganization, profile -> profile.setIsBuiltIn(true)); | |||
// TestRequest request = wsActionTester.newRequest() | |||
// .setMethod("POST") | |||
// .setParam("rule_key", RuleTesting.newRuleDto().getKey().toString()) | |||
// .setParam("profile_key", qualityProfile.getKee()); | |||
// | |||
// thrown.expect(BadRequestException.class); | |||
// | |||
// request.execute(); | |||
// } | |||
// | |||
// @Test | |||
// public void deactivate_rule_in_default_organization() { | |||
// userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, defaultOrganization); | |||
// QProfileDto qualityProfile = db.qualityProfiles().insert(defaultOrganization); | |||
// RuleKey ruleKey = RuleTesting.randomRuleKey(); | |||
// TestRequest request = wsActionTester.newRequest() | |||
// .setMethod("POST") | |||
// .setParam("rule_key", ruleKey.toString()) | |||
// .setParam("profile_key", qualityProfile.getKee()); | |||
// | |||
// TestResponse response = request.execute(); | |||
// | |||
// assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT); | |||
// ArgumentCaptor<ActiveRuleKey> captor = ArgumentCaptor.forClass(ActiveRuleKey.class); | |||
// Mockito.verify(ruleActivator).deactivateAndUpdateIndex(any(DbSession.class), captor.capture()); | |||
// assertThat(captor.getValue().getRuleKey()).isEqualTo(ruleKey); | |||
// assertThat(captor.getValue().getRuleProfileUuid()).isEqualTo(qualityProfile.getKee()); | |||
// } | |||
// | |||
// @Test | |||
// public void deactivate_rule_in_specific_organization() { | |||
// userSession.logIn().addPermission(OrganizationPermission.ADMINISTER_QUALITY_PROFILES, organization); | |||
// QProfileDto qualityProfile = db.qualityProfiles().insert(organization); | |||
// RuleKey ruleKey = RuleTesting.randomRuleKey(); | |||
// TestRequest request = wsActionTester.newRequest() | |||
// .setMethod("POST") | |||
// .setParam("organization", organization.getKey()) | |||
// .setParam("rule_key", ruleKey.toString()) | |||
// .setParam("profile_key", qualityProfile.getKee()); | |||
// | |||
// TestResponse response = request.execute(); | |||
// | |||
// assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT); | |||
// ArgumentCaptor<ActiveRuleKey> captor = ArgumentCaptor.forClass(ActiveRuleKey.class); | |||
// Mockito.verify(ruleActivator).deactivateAndUpdateIndex(any(DbSession.class), captor.capture()); | |||
// assertThat(captor.getValue().getRuleKey()).isEqualTo(ruleKey); | |||
// assertThat(captor.getValue().getRuleProfileUuid()).isEqualTo(qualityProfile.getKee()); | |||
// } | |||
assertThat(response.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT); | |||
ArgumentCaptor<RuleKey> captor = ArgumentCaptor.forClass(RuleKey.class); | |||
ArgumentCaptor<QProfileDto> qProfileDtoCaptor = ArgumentCaptor.forClass(QProfileDto.class); | |||
Mockito.verify(ruleActivator).deactivateAndUpdateIndex(any(DbSession.class), qProfileDtoCaptor.capture(), captor.capture()); | |||
assertThat(captor.getValue()).isEqualTo(ruleKey); | |||
assertThat(qProfileDtoCaptor.getValue().getKee()).isEqualTo(qualityProfile.getKee()); | |||
} | |||
} |
@@ -19,212 +19,256 @@ | |||
*/ | |||
package org.sonar.server.qualityprofile.ws; | |||
import java.io.InputStream; | |||
import java.util.ArrayList; | |||
import java.util.Date; | |||
import org.junit.Before; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.config.MapSettings; | |||
import org.sonar.api.resources.Languages; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.RuleStatus; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.utils.System2; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.db.organization.OrganizationDto; | |||
import org.sonar.db.qualityprofile.ActiveRuleDto; | |||
import org.sonar.db.qualityprofile.QProfileDto; | |||
import org.sonar.db.rule.RuleDefinitionDto; | |||
import org.sonar.db.rule.RuleTesting; | |||
import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.EsTester; | |||
import org.sonar.server.exceptions.NotFoundException; | |||
import org.sonar.server.organization.TestDefaultOrganizationProvider; | |||
import org.sonar.server.qualityprofile.QProfileLookup; | |||
import org.sonar.server.qualityprofile.QProfileName; | |||
import org.sonar.server.qualityprofile.RuleActivation; | |||
import org.sonar.server.qualityprofile.RuleActivator; | |||
import org.sonar.server.qualityprofile.RuleActivatorContextFactory; | |||
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; | |||
import org.sonar.server.qualityprofile.index.ActiveRuleIteratorFactory; | |||
import org.sonar.server.rule.index.RuleIndex; | |||
import org.sonar.server.rule.index.RuleIndexDefinition; | |||
import org.sonar.server.rule.index.RuleIndexer; | |||
import org.sonar.server.tester.UserSessionRule; | |||
import org.sonar.server.util.TypeValidations; | |||
import org.sonar.server.ws.WsActionTester; | |||
import org.sonar.test.JsonAssert; | |||
import org.sonarqube.ws.QualityProfiles.InheritanceWsResponse; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.sonar.server.qualityprofile.QProfileTesting.newQProfileDto; | |||
import static org.sonarqube.ws.MediaTypes.PROTOBUF; | |||
public class InheritanceActionTest { | |||
// @Rule | |||
// public DbTester dbTester = DbTester.create(); | |||
// @Rule | |||
// public EsTester esTester = new EsTester(new RuleIndexDefinition(new MapSettings())); | |||
// @Rule | |||
// public UserSessionRule userSession = UserSessionRule.standalone(); | |||
// | |||
// private DbClient dbClient; | |||
// private DbSession dbSession; | |||
// private EsClient esClient; | |||
// private RuleIndexer ruleIndexer; | |||
// private ActiveRuleIndexer activeRuleIndexer; | |||
// private InheritanceAction underTest; | |||
// private WsActionTester wsActionTester; | |||
// private RuleActivator ruleActivator; | |||
// private OrganizationDto organization; | |||
// | |||
// @Before | |||
// public void setUp() { | |||
// dbClient = dbTester.getDbClient(); | |||
// dbSession = dbTester.getSession(); | |||
// esClient = esTester.client(); | |||
// ruleIndexer = new RuleIndexer(esClient, dbClient); | |||
// activeRuleIndexer = new ActiveRuleIndexer(dbClient, esClient, , new ActiveRuleIteratorFactory(dbClient)); | |||
// TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); | |||
// underTest = new InheritanceAction( | |||
// dbClient, | |||
// new QProfileLookup(dbClient), | |||
// new QProfileWsSupport(dbClient, userSession, defaultOrganizationProvider), | |||
// new Languages()); | |||
// wsActionTester = new WsActionTester(underTest); | |||
// ruleActivator = new RuleActivator( | |||
// System2.INSTANCE, | |||
// dbClient, | |||
// new RuleIndex(esClient), | |||
// new RuleActivatorContextFactory(dbClient), | |||
// new TypeValidations(new ArrayList<>()), | |||
// activeRuleIndexer, | |||
// userSession); | |||
// organization = dbTester.organizations().insert(); | |||
// } | |||
// | |||
// @Test | |||
// public void inheritance_nominal() throws Exception { | |||
// RuleDefinitionDto rule1 = createRule("xoo", "rule1"); | |||
// RuleDefinitionDto rule2 = createRule("xoo", "rule2"); | |||
// RuleDefinitionDto rule3 = createRule("xoo", "rule3"); | |||
// | |||
// /* | |||
// * sonar way (2) <- companyWide (2) <- buWide (2, 1 overriding) <- (forProject1 (2), forProject2 (2)) | |||
// */ | |||
// QProfileDto sonarway = dbTester.qualityProfiles().insert(organization, p -> | |||
// p.setKee("xoo-sonar-way").setLanguage("xoo").setName("Sonar way").setIsBuiltIn(true)); | |||
// createActiveRule(rule1, sonarway); | |||
// createActiveRule(rule2, sonarway); | |||
// | |||
// dbSession.commit(); | |||
// activeRuleIndexer.index(); | |||
// | |||
// QProfileDto companyWide = createProfile("xoo", "My Company Profile", "xoo-my-company-profile-12345"); | |||
// setParent(sonarway, companyWide); | |||
// | |||
// QProfileDto buWide = createProfile("xoo", "My BU Profile", "xoo-my-bu-profile-23456"); | |||
// setParent(companyWide, buWide); | |||
// overrideActiveRuleSeverity(rule1, buWide, Severity.CRITICAL); | |||
// | |||
// QProfileDto forProject1 = createProfile("xoo", "For Project One", "xoo-for-project-one-34567"); | |||
// setParent(buWide, forProject1); | |||
// createActiveRule(rule3, forProject1); | |||
// dbSession.commit(); | |||
// activeRuleIndexer.index(); | |||
// | |||
// QProfileDto forProject2 = createProfile("xoo", "For Project Two", "xoo-for-project-two-45678"); | |||
// setParent(buWide, forProject2); | |||
// overrideActiveRuleSeverity(rule2, forProject2, Severity.CRITICAL); | |||
// | |||
// String response = wsActionTester.newRequest() | |||
// .setMethod("GET") | |||
// .setParam("profileKey", buWide.getKee()) | |||
// .execute() | |||
// .getInput(); | |||
// | |||
// JsonAssert.assertJson(response).isSimilarTo(getClass().getResource("InheritanceActionTest/inheritance-buWide.json")); | |||
// } | |||
// | |||
// @Test | |||
// public void inheritance_parent_child() throws Exception { | |||
// RuleDefinitionDto rule1 = dbTester.rules().insert(); | |||
// ruleIndexer.indexRuleDefinition(rule1.getKey()); | |||
// | |||
// RuleDefinitionDto rule2 = dbTester.rules().insert(); | |||
// ruleIndexer.indexRuleDefinition(rule1.getKey()); | |||
// | |||
// RuleDefinitionDto rule3 = dbTester.rules().insert(); | |||
// ruleIndexer.indexRuleDefinition(rule1.getKey()); | |||
// | |||
// QProfileDto parent = dbTester.qualityProfiles().insert(organization); | |||
// dbTester.qualityProfiles().activateRule(parent, rule1); | |||
// dbTester.qualityProfiles().activateRule(parent, rule2); | |||
// long parentRules = 2; | |||
// | |||
// QProfileDto child = dbTester.qualityProfiles().insert(organization, q -> q.setParentKee(parent.getKee())); | |||
// dbTester.qualityProfiles().activateRule(child, rule3); | |||
// long childRules = 1; | |||
// | |||
// activeRuleIndexer.index(); | |||
// | |||
// InputStream response = wsActionTester.newRequest() | |||
// .setMethod("GET") | |||
// .setMediaType(PROTOBUF) | |||
// .setParam("profileKey", child.getKee()) | |||
// .execute() | |||
// .getInputStream(); | |||
// | |||
// InheritanceWsResponse result = InheritanceWsResponse.parseFrom(response); | |||
// | |||
// assertThat(result.getProfile().getKey()).isEqualTo(child.getKee()); | |||
// assertThat(result.getProfile().getActiveRuleCount()).isEqualTo(childRules); | |||
// | |||
// assertThat(result.getAncestorsList()).extracting(InheritanceWsResponse.QualityProfile::getKey).containsExactly(parent.getKee()); | |||
// assertThat(result.getAncestorsList()).extracting(InheritanceWsResponse.QualityProfile::getActiveRuleCount).containsExactly(parentRules); | |||
// } | |||
// | |||
// @Test | |||
// public void inheritance_ignores_removed_rules() throws Exception { | |||
// RuleDefinitionDto rule = dbTester.rules().insert(r -> r.setStatus(RuleStatus.REMOVED)); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// | |||
// QProfileDto profile = dbTester.qualityProfiles().insert(organization); | |||
// dbTester.qualityProfiles().activateRule(profile, rule); | |||
// long activeRules = 0; | |||
// | |||
// activeRuleIndexer.index(); | |||
// | |||
// InputStream response = wsActionTester.newRequest() | |||
// .setMethod("GET") | |||
// .setMediaType(PROTOBUF) | |||
// .setParam("profileKey", profile.getKee()) | |||
// .execute() | |||
// .getInputStream(); | |||
// | |||
// InheritanceWsResponse result = InheritanceWsResponse.parseFrom(response); | |||
// assertThat(result.getProfile().getKey()).isEqualTo(profile.getKee()); | |||
// assertThat(result.getProfile().getActiveRuleCount()).isEqualTo(activeRules); | |||
// } | |||
// | |||
// @Test | |||
// public void inheritance_no_family() throws Exception { | |||
// // Simple profile, no parent, no child | |||
// QProfileDto remi = createProfile("xoo", "Nobodys Boy", "xoo-nobody-s-boy-01234"); | |||
// | |||
// String response = wsActionTester.newRequest() | |||
// .setMethod("GET") | |||
// .setParam("profileKey", remi.getKee()) | |||
// .execute() | |||
// .getInput(); | |||
// | |||
// JsonAssert.assertJson(response).isSimilarTo(getClass().getResource("InheritanceActionTest/inheritance-simple.json")); | |||
// } | |||
// | |||
// @Test(expected = NotFoundException.class) | |||
// public void fail_if_not_found() throws Exception { | |||
// wsActionTester.newRequest() | |||
// .setMethod("GET").setParam("profileKey", "polop").execute(); | |||
// } | |||
// | |||
// private QProfileDto createProfile(String lang, String name, String key) { | |||
// QProfileDto profile = newQProfileDto(organization, new QProfileName(lang, name), key); | |||
// dbClient.qualityProfileDao().insert(dbSession, profile); | |||
// dbSession.commit(); | |||
// return profile; | |||
// } | |||
// | |||
// private void setParent(QProfileDto profile, QProfileDto parent) { | |||
// ruleActivator.setParent(dbSession, parent, profile); | |||
// } | |||
// | |||
// private RuleDefinitionDto createRule(String lang, String id) { | |||
// long now = new Date().getTime(); | |||
// RuleDefinitionDto rule = RuleTesting.newRule(RuleKey.of("blah", id)) | |||
// .setLanguage(lang) | |||
// .setSeverity(Severity.BLOCKER) | |||
// .setStatus(RuleStatus.READY) | |||
// .setUpdatedAt(now) | |||
// .setCreatedAt(now); | |||
// dbClient.ruleDao().insert(dbSession, rule); | |||
// dbSession.commit(); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// return rule; | |||
// } | |||
// | |||
// private ActiveRuleDto createActiveRule(RuleDefinitionDto rule, QProfileDto profile) { | |||
// long now = new Date().getTime(); | |||
// ActiveRuleDto activeRule = ActiveRuleDto.createFor(profile, rule) | |||
// .setSeverity(rule.getSeverityString()) | |||
// .setUpdatedAt(now) | |||
// .setCreatedAt(now); | |||
// dbClient.activeRuleDao().insert(dbSession, activeRule); | |||
// return activeRule; | |||
// } | |||
// | |||
// private void overrideActiveRuleSeverity(RuleDefinitionDto rule, QProfileDto profile, String severity) { | |||
// ruleActivator.activate(dbSession, new RuleActivation(rule.getKey()).setSeverity(severity), profile.getKee()); | |||
// dbSession.commit(); | |||
// activeRuleIndexer.index(); | |||
// } | |||
@Rule | |||
public DbTester dbTester = DbTester.create(); | |||
@Rule | |||
public EsTester esTester = new EsTester(new RuleIndexDefinition(new MapSettings())); | |||
@Rule | |||
public UserSessionRule userSession = UserSessionRule.standalone(); | |||
private DbClient dbClient; | |||
private DbSession dbSession; | |||
private EsClient esClient; | |||
private RuleIndexer ruleIndexer; | |||
private ActiveRuleIndexer activeRuleIndexer; | |||
private InheritanceAction underTest; | |||
private WsActionTester wsActionTester; | |||
private RuleActivator ruleActivator; | |||
private OrganizationDto organization; | |||
@Before | |||
public void setUp() { | |||
dbClient = dbTester.getDbClient(); | |||
dbSession = dbTester.getSession(); | |||
esClient = esTester.client(); | |||
ruleIndexer = new RuleIndexer(esClient, dbClient); | |||
activeRuleIndexer = new ActiveRuleIndexer(dbClient, esClient, new ActiveRuleIteratorFactory(dbClient)); | |||
TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); | |||
underTest = new InheritanceAction( | |||
dbClient, | |||
new QProfileLookup(dbClient), | |||
new QProfileWsSupport(dbClient, userSession, defaultOrganizationProvider), | |||
new Languages()); | |||
wsActionTester = new WsActionTester(underTest); | |||
ruleActivator = new RuleActivator( | |||
System2.INSTANCE, | |||
dbClient, | |||
new RuleIndex(esClient), | |||
new RuleActivatorContextFactory(dbClient), | |||
new TypeValidations(new ArrayList<>()), | |||
activeRuleIndexer, | |||
userSession); | |||
organization = dbTester.organizations().insert(); | |||
} | |||
@Test | |||
public void inheritance_nominal() throws Exception { | |||
RuleDefinitionDto rule1 = createRule("xoo", "rule1"); | |||
RuleDefinitionDto rule2 = createRule("xoo", "rule2"); | |||
RuleDefinitionDto rule3 = createRule("xoo", "rule3"); | |||
/* | |||
* sonar way (2) <- companyWide (2) <- buWide (2, 1 overriding) <- (forProject1 (2), forProject2 (2)) | |||
*/ | |||
QProfileDto sonarway = dbTester.qualityProfiles().insert(organization, p -> | |||
p.setKee("xoo-sonar-way").setLanguage("xoo").setName("Sonar way").setIsBuiltIn(true)); | |||
ActiveRuleDto activeRule1 = createActiveRule(rule1, sonarway); | |||
ActiveRuleDto activeRule2 = createActiveRule(rule2, sonarway); | |||
dbSession.commit(); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
QProfileDto companyWide = createProfile("xoo", "My Company Profile", "xoo-my-company-profile-12345"); | |||
setParent(sonarway, companyWide); | |||
QProfileDto buWide = createProfile("xoo", "My BU Profile", "xoo-my-bu-profile-23456"); | |||
setParent(companyWide, buWide); | |||
overrideActiveRuleSeverity(rule1, buWide, Severity.CRITICAL); | |||
QProfileDto forProject1 = createProfile("xoo", "For Project One", "xoo-for-project-one-34567"); | |||
setParent(buWide, forProject1); | |||
createActiveRule(rule3, forProject1); | |||
dbSession.commit(); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
QProfileDto forProject2 = createProfile("xoo", "For Project Two", "xoo-for-project-two-45678"); | |||
setParent(buWide, forProject2); | |||
overrideActiveRuleSeverity(rule2, forProject2, Severity.CRITICAL); | |||
String response = wsActionTester.newRequest() | |||
.setMethod("GET") | |||
.setParam("profileKey", buWide.getKee()) | |||
.execute() | |||
.getInput(); | |||
JsonAssert.assertJson(response).isSimilarTo(getClass().getResource("InheritanceActionTest/inheritance-buWide.json")); | |||
} | |||
@Test | |||
public void inheritance_parent_child() throws Exception { | |||
RuleDefinitionDto rule1 = dbTester.rules().insert(); | |||
ruleIndexer.indexRuleDefinition(rule1.getKey()); | |||
RuleDefinitionDto rule2 = dbTester.rules().insert(); | |||
ruleIndexer.indexRuleDefinition(rule1.getKey()); | |||
RuleDefinitionDto rule3 = dbTester.rules().insert(); | |||
ruleIndexer.indexRuleDefinition(rule1.getKey()); | |||
QProfileDto parent = dbTester.qualityProfiles().insert(organization); | |||
dbTester.qualityProfiles().activateRule(parent, rule1); | |||
dbTester.qualityProfiles().activateRule(parent, rule2); | |||
long parentRules = 2; | |||
QProfileDto child = dbTester.qualityProfiles().insert(organization, q -> q.setParentKee(parent.getKee())); | |||
dbTester.qualityProfiles().activateRule(child, rule3); | |||
long childRules = 1; | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
InputStream response = wsActionTester.newRequest() | |||
.setMethod("GET") | |||
.setMediaType(PROTOBUF) | |||
.setParam("profileKey", child.getKee()) | |||
.execute() | |||
.getInputStream(); | |||
InheritanceWsResponse result = InheritanceWsResponse.parseFrom(response); | |||
assertThat(result.getProfile().getKey()).isEqualTo(child.getKee()); | |||
assertThat(result.getProfile().getActiveRuleCount()).isEqualTo(childRules); | |||
assertThat(result.getAncestorsList()).extracting(InheritanceWsResponse.QualityProfile::getKey).containsExactly(parent.getKee()); | |||
assertThat(result.getAncestorsList()).extracting(InheritanceWsResponse.QualityProfile::getActiveRuleCount).containsExactly(parentRules); | |||
} | |||
@Test | |||
public void inheritance_ignores_removed_rules() throws Exception { | |||
RuleDefinitionDto rule = dbTester.rules().insert(r -> r.setStatus(RuleStatus.REMOVED)); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
QProfileDto profile = dbTester.qualityProfiles().insert(organization); | |||
dbTester.qualityProfiles().activateRule(profile, rule); | |||
long activeRules = 0; | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
InputStream response = wsActionTester.newRequest() | |||
.setMethod("GET") | |||
.setMediaType(PROTOBUF) | |||
.setParam("profileKey", profile.getKee()) | |||
.execute() | |||
.getInputStream(); | |||
InheritanceWsResponse result = InheritanceWsResponse.parseFrom(response); | |||
assertThat(result.getProfile().getKey()).isEqualTo(profile.getKee()); | |||
assertThat(result.getProfile().getActiveRuleCount()).isEqualTo(activeRules); | |||
} | |||
@Test | |||
public void inheritance_no_family() throws Exception { | |||
// Simple profile, no parent, no child | |||
QProfileDto remi = createProfile("xoo", "Nobodys Boy", "xoo-nobody-s-boy-01234"); | |||
String response = wsActionTester.newRequest() | |||
.setMethod("GET") | |||
.setParam("profileKey", remi.getKee()) | |||
.execute() | |||
.getInput(); | |||
JsonAssert.assertJson(response).isSimilarTo(getClass().getResource("InheritanceActionTest/inheritance-simple.json")); | |||
} | |||
@Test(expected = NotFoundException.class) | |||
public void fail_if_not_found() throws Exception { | |||
wsActionTester.newRequest() | |||
.setMethod("GET").setParam("profileKey", "polop").execute(); | |||
} | |||
private QProfileDto createProfile(String lang, String name, String key) { | |||
QProfileDto profile = newQProfileDto(organization, new QProfileName(lang, name), key); | |||
dbClient.qualityProfileDao().insert(dbSession, profile); | |||
dbSession.commit(); | |||
return profile; | |||
} | |||
private void setParent(QProfileDto profile, QProfileDto parent) { | |||
ruleActivator.setParent(dbSession, parent, profile); | |||
} | |||
private RuleDefinitionDto createRule(String lang, String id) { | |||
long now = new Date().getTime(); | |||
RuleDefinitionDto rule = RuleTesting.newRule(RuleKey.of("blah", id)) | |||
.setLanguage(lang) | |||
.setSeverity(Severity.BLOCKER) | |||
.setStatus(RuleStatus.READY) | |||
.setUpdatedAt(now) | |||
.setCreatedAt(now); | |||
dbClient.ruleDao().insert(dbSession, rule); | |||
dbSession.commit(); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
return rule; | |||
} | |||
private ActiveRuleDto createActiveRule(RuleDefinitionDto rule, QProfileDto profile) { | |||
long now = new Date().getTime(); | |||
ActiveRuleDto activeRule = ActiveRuleDto.createFor(profile, rule) | |||
.setSeverity(rule.getSeverityString()) | |||
.setUpdatedAt(now) | |||
.setCreatedAt(now); | |||
dbClient.activeRuleDao().insert(dbSession, activeRule); | |||
return activeRule; | |||
} | |||
private void overrideActiveRuleSeverity(RuleDefinitionDto rule, QProfileDto profile, String severity) { | |||
ruleActivator.activate(dbSession, RuleActivation.create(rule.getKey(), severity, null), profile); | |||
dbSession.commit(); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
} | |||
} |
@@ -19,396 +19,445 @@ | |||
*/ | |||
package org.sonar.server.qualityprofile.ws; | |||
import com.google.common.collect.ImmutableSet; | |||
import java.util.Collections; | |||
import java.util.Optional; | |||
import org.junit.After; | |||
import org.junit.Before; | |||
import org.junit.ClassRule; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.RuleStatus; | |||
import org.sonar.api.rule.Severity; | |||
import org.sonar.api.server.ws.WebService; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.organization.OrganizationDto; | |||
import org.sonar.db.organization.OrganizationTesting; | |||
import org.sonar.db.qualityprofile.ActiveRuleDao; | |||
import org.sonar.db.qualityprofile.ActiveRuleDto; | |||
import org.sonar.db.qualityprofile.ActiveRuleKey; | |||
import org.sonar.db.qualityprofile.QProfileDto; | |||
import org.sonar.db.rule.RuleDefinitionDto; | |||
import org.sonar.db.rule.RuleTesting; | |||
import org.sonar.server.es.SearchOptions; | |||
import org.sonar.server.exceptions.BadRequestException; | |||
import org.sonar.server.qualityprofile.QProfileName; | |||
import org.sonar.server.qualityprofile.QProfileTesting; | |||
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; | |||
import org.sonar.server.rule.index.RuleIndex; | |||
import org.sonar.server.rule.index.RuleIndexer; | |||
import org.sonar.server.rule.index.RuleQuery; | |||
import org.sonar.server.tester.ServerTester; | |||
import org.sonar.server.tester.UserSessionRule; | |||
import org.sonar.server.ws.WsTester; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.junit.Assert.fail; | |||
import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.ACTION_ACTIVATE_RULE; | |||
import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.ACTION_DEACTIVATE_RULE; | |||
import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.ActivateActionParameters.PARAM_PROFILE_KEY; | |||
import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.ActivateActionParameters.PARAM_RULE_KEY; | |||
import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.ActivateActionParameters.PARAM_SEVERITY; | |||
import static org.sonarqube.ws.client.rule.RulesWsParameters.PARAM_LANGUAGES; | |||
import static org.sonarqube.ws.client.rule.RulesWsParameters.PARAM_QPROFILE; | |||
public class QProfilesWsMediumTest { | |||
// @ClassRule | |||
// public static ServerTester tester = new ServerTester().withEsIndexes(); | |||
// | |||
// @Rule | |||
// public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester) | |||
// .logIn().setRoot(); | |||
// | |||
// private DbClient db; | |||
// private DbSession session; | |||
// private WsTester wsTester; | |||
// private RuleIndexer ruleIndexer = tester.get(RuleIndexer.class); | |||
// private ActiveRuleIndexer activeRuIndexer = tester.get(ActiveRuleIndexer.class); | |||
// private OrganizationDto organization; | |||
// | |||
// @Before | |||
// public void setUp() { | |||
// tester.clearDbAndIndexes(); | |||
// db = tester.get(DbClient.class); | |||
// wsTester = tester.get(WsTester.class); | |||
// session = db.openSession(false); | |||
// | |||
// ruleIndexer = tester.get(RuleIndexer.class); | |||
// activeRuIndexer = tester.get(ActiveRuleIndexer.class); | |||
// organization = OrganizationTesting.newOrganizationDto().setKey("org-123"); | |||
// db.organizationDao().insert(session, organization, false); | |||
// } | |||
// | |||
// @After | |||
// public void after() { | |||
// session.close(); | |||
// } | |||
// | |||
// @Test | |||
// public void deactivate_rule() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// RuleDefinitionDto rule = createRule(profile.getLanguage(), "toto"); | |||
// createActiveRule(rule, profile); | |||
// session.commit(); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// activeRuIndexer.index(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
// | |||
// // 1. Deactivate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_DEACTIVATE_RULE); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
// request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// } | |||
// | |||
// @Test | |||
// public void bulk_deactivate_rule() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "toto1"); | |||
// RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "toto2"); | |||
// RuleDefinitionDto rule2 = createRule(profile.getLanguage(), "toto3"); | |||
// RuleDefinitionDto rule3 = createRule(profile.getLanguage(), "toto4"); | |||
// createActiveRule(rule0, profile); | |||
// createActiveRule(rule2, profile); | |||
// createActiveRule(rule3, profile); | |||
// createActiveRule(rule1, profile); | |||
// session.commit(); | |||
// activeRuIndexer.index(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(4); | |||
// | |||
// // 1. Deactivate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, DeactivateRulesAction.DEACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// WsTester.Result result = request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// } | |||
// | |||
// @Test | |||
// public void bulk_deactivate_rule_not_all() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// QProfileDto php = createProfile("php"); | |||
// RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "toto1"); | |||
// RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "toto2"); | |||
// createActiveRule(rule0, profile); | |||
// createActiveRule(rule1, profile); | |||
// createActiveRule(rule0, php); | |||
// createActiveRule(rule1, php); | |||
// session.commit(); | |||
// activeRuIndexer.index(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(2); | |||
// | |||
// // 1. Deactivate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, DeactivateRulesAction.DEACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// WsTester.Result result = request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(0); | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, php.getKee())).hasSize(2); | |||
// } | |||
// | |||
// @Test | |||
// public void bulk_deactivate_rule_by_profile() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "hello"); | |||
// RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "world"); | |||
// createActiveRule(rule0, profile); | |||
// createActiveRule(rule1, profile); | |||
// session.commit(); | |||
// activeRuIndexer.index(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(2); | |||
// | |||
// // 1. Deactivate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, DeactivateRulesAction.DEACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(WebService.Param.TEXT_QUERY, "hello"); | |||
// WsTester.Result result = request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
// } | |||
// | |||
// @Test | |||
// public void activate_rule() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// RuleDefinitionDto rule = createRule(profile.getLanguage(), "toto"); | |||
// session.commit(); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// | |||
// // 1. Activate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
// WsTester.Result result = request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
// } | |||
// | |||
// @Test | |||
// public void activate_rule_diff_languages() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// RuleDefinitionDto rule = createRule("php", "toto"); | |||
// session.commit(); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// | |||
// try { | |||
// // 1. Activate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
// request.execute(); | |||
// session.clearCache(); | |||
// fail(); | |||
// } catch (BadRequestException e) { | |||
// assertThat(e.getMessage()).isEqualTo("Rule blah:toto and profile pjava have different languages"); | |||
// } | |||
// } | |||
// | |||
// @Test | |||
// public void activate_rule_override_severity() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// RuleDefinitionDto rule = createRule(profile.getLanguage(), "toto"); | |||
// session.commit(); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// | |||
// // 1. Activate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
// request.setParam(PARAM_SEVERITY, "MINOR"); | |||
// WsTester.Result result = request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// ActiveRuleKey activeRuleKey = ActiveRuleKey.of(profile.getKee(), rule.getKey()); | |||
// | |||
// assertThat(db.activeRuleDao().selectOrFailByKey(session, activeRuleKey).getSeverityString()) | |||
// .isEqualTo("MINOR"); | |||
// } | |||
// | |||
// @Test | |||
// public void bulk_activate_rule() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// createRule(profile.getLanguage(), "toto"); | |||
// createRule(profile.getLanguage(), "tata"); | |||
// createRule(profile.getLanguage(), "hello"); | |||
// createRule(profile.getLanguage(), "world"); | |||
// session.commit(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// | |||
// // 1. Activate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(PARAM_LANGUAGES, "java"); | |||
// request.execute().assertJson(getClass(), "bulk_activate_rule.json"); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(4); | |||
// } | |||
// | |||
// @Test | |||
// public void bulk_activate_rule_not_all() throws Exception { | |||
// QProfileDto java = createProfile("java"); | |||
// QProfileDto php = createProfile("php"); | |||
// createRule(java.getLanguage(), "toto"); | |||
// createRule(java.getLanguage(), "tata"); | |||
// createRule(php.getLanguage(), "hello"); | |||
// createRule(php.getLanguage(), "world"); | |||
// session.commit(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, php.getKee())).isEmpty(); | |||
// | |||
// // 1. Activate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, php.getKee()); | |||
// request.setParam(PARAM_LANGUAGES, "php"); | |||
// request.execute().assertJson(getClass(), "bulk_activate_rule_not_all.json"); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, php.getKee())).hasSize(2); | |||
// } | |||
// | |||
// @Test | |||
// public void bulk_activate_rule_by_query() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// createRule(profile.getLanguage(), "toto"); | |||
// createRule(profile.getLanguage(), "tata"); | |||
// createRule(profile.getLanguage(), "hello"); | |||
// createRule(profile.getLanguage(), "world"); | |||
// session.commit(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// | |||
// // 1. Activate Rule with query returning 0 hits | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(WebService.Param.TEXT_QUERY, "php"); | |||
// request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(0); | |||
// | |||
// // 1. Activate Rule with query returning 1 hits | |||
// request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
// request.setParam(WebService.Param.TEXT_QUERY, "world"); | |||
// request.execute(); | |||
// session.commit(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
// } | |||
// | |||
// @Test | |||
// public void bulk_activate_rule_by_query_with_severity() throws Exception { | |||
// QProfileDto profile = createProfile("java"); | |||
// RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "toto"); | |||
// RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "tata"); | |||
// session.commit(); | |||
// | |||
// // 0. Assert No Active Rule for profile | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// | |||
// // 2. Assert ActiveRule with BLOCKER severity | |||
// assertThat(tester.get(RuleIndex.class).search( | |||
// new RuleQuery().setSeverities(ImmutableSet.of("BLOCKER")), | |||
// new SearchOptions()).getIds()).hasSize(2); | |||
// | |||
// // 1. Activate Rule with query returning 2 hits | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
// request.setParam(ActivateRulesAction.PROFILE_KEY, profile.getKee()); | |||
// request.setParam(ActivateRulesAction.SEVERITY, "MINOR"); | |||
// request.execute(); | |||
// session.commit(); | |||
// | |||
// // 2. Assert ActiveRule with MINOR severity | |||
// assertThat(tester.get(ActiveRuleDao.class).selectByRuleId(session, organization, rule0.getId()).get(0).getSeverityString()).isEqualTo("MINOR"); | |||
// assertThat(tester.get(RuleIndex.class).searchAll(new RuleQuery() | |||
// .setQProfileKey(profile.getKee()) | |||
// .setKey(rule0.getKey().toString()) | |||
// .setActiveSeverities(Collections.singleton("MINOR")) | |||
// .setActivation(true))).hasSize(1); | |||
// } | |||
// | |||
// @Test | |||
// public void does_not_return_warnings_when_bulk_activate_on_profile_and_rules_exist_on_another_language_than_profile() throws Exception { | |||
// QProfileDto javaProfile = createProfile("java"); | |||
// createRule(javaProfile.getLanguage(), "toto"); | |||
// createRule(javaProfile.getLanguage(), "tata"); | |||
// QProfileDto phpProfile = createProfile("php"); | |||
// createRule(phpProfile.getLanguage(), "hello"); | |||
// createRule(phpProfile.getLanguage(), "world"); | |||
// session.commit(); | |||
// | |||
// // 1. Activate Rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
// request.setParam(PARAM_PROFILE_KEY, javaProfile.getKee()); | |||
// request.setParam(PARAM_QPROFILE, javaProfile.getKee()); | |||
// request.setParam("activation", "false"); | |||
// request.execute().assertJson(getClass(), "does_not_return_warnings_when_bulk_activate_on_profile_and_rules_exist_on_another_language_than_profile.json"); | |||
// session.clearCache(); | |||
// | |||
// // 2. Assert ActiveRule in DAO | |||
// assertThat(db.activeRuleDao().selectByProfileUuid(session, javaProfile.getKee())).hasSize(2); | |||
// } | |||
// | |||
// @Test | |||
// public void reset() throws Exception { | |||
// QProfileDto profile = QProfileTesting.newXooP1(organization); | |||
// QProfileDto subProfile = QProfileTesting.newXooP2(organization).setParentKee(QProfileTesting.XOO_P1_KEY); | |||
// db.qualityProfileDao().insert(session, profile, subProfile); | |||
// | |||
// RuleDefinitionDto rule = createRule(profile.getLanguage(), "rule"); | |||
// ActiveRuleDto active1 = ActiveRuleDto.createFor(profile, rule) | |||
// .setSeverity(rule.getSeverityString()); | |||
// ActiveRuleDto active2 = ActiveRuleDto.createFor(subProfile, rule) | |||
// .setSeverity("MINOR"); | |||
// db.activeRuleDao().insert(session, active1); | |||
// db.activeRuleDao().insert(session, active2); | |||
// | |||
// session.commit(); | |||
// activeRuIndexer.index(); | |||
// | |||
// // 0. assert rule child rule is minor | |||
// assertThat(db.activeRuleDao().selectOrFailByKey(session, active2.getKey()).getSeverityString()).isEqualTo("MINOR"); | |||
// | |||
// // 1. reset child rule | |||
// WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
// request.setParam("profile_key", subProfile.getKee()); | |||
// request.setParam("rule_key", rule.getKey().toString()); | |||
// request.setParam("reset", "true"); | |||
// request.execute(); | |||
// session.clearCache(); | |||
// | |||
// // 2. assert rule child rule is NOT minor | |||
// assertThat(db.activeRuleDao().selectOrFailByKey(session, active2.getKey()).getSeverityString()).isNotEqualTo("MINOR"); | |||
// } | |||
// | |||
// private QProfileDto createProfile(String lang) { | |||
// QProfileDto profile = QProfileTesting.newQProfileDto(organization, new QProfileName(lang, "P" + lang), "p" + lang); | |||
// db.qualityProfileDao().insert(session, profile); | |||
// return profile; | |||
// } | |||
// | |||
// private RuleDefinitionDto createRule(String lang, String id) { | |||
// RuleDefinitionDto rule = RuleTesting.newRule(RuleKey.of("blah", id)) | |||
// .setLanguage(lang) | |||
// .setSeverity(Severity.BLOCKER) | |||
// .setStatus(RuleStatus.READY); | |||
// db.ruleDao().insert(session, rule); | |||
// session.commit(); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// return rule; | |||
// } | |||
// | |||
// private ActiveRuleDto createActiveRule(RuleDefinitionDto rule, QProfileDto profile) { | |||
// ActiveRuleDto activeRule = ActiveRuleDto.createFor(profile, rule) | |||
// .setSeverity(rule.getSeverityString()); | |||
// db.activeRuleDao().insert(session, activeRule); | |||
// return activeRule; | |||
// } | |||
@ClassRule | |||
public static ServerTester tester = new ServerTester().withEsIndexes(); | |||
@Rule | |||
public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester) | |||
.logIn().setRoot(); | |||
private DbClient db; | |||
private DbSession session; | |||
private WsTester wsTester; | |||
private RuleIndexer ruleIndexer = tester.get(RuleIndexer.class); | |||
private ActiveRuleIndexer activeRuleIndexer = tester.get(ActiveRuleIndexer.class); | |||
private OrganizationDto organization; | |||
@Before | |||
public void setUp() { | |||
tester.clearDbAndIndexes(); | |||
db = tester.get(DbClient.class); | |||
wsTester = tester.get(WsTester.class); | |||
session = db.openSession(false); | |||
ruleIndexer = tester.get(RuleIndexer.class); | |||
activeRuleIndexer = tester.get(ActiveRuleIndexer.class); | |||
organization = OrganizationTesting.newOrganizationDto().setKey("org-123"); | |||
db.organizationDao().insert(session, organization, false); | |||
} | |||
@After | |||
public void after() { | |||
session.close(); | |||
} | |||
@Test | |||
public void deactivate_rule() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
RuleDefinitionDto rule = createRule(profile.getLanguage(), "toto"); | |||
createActiveRule(rule, profile); | |||
session.commit(); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
// 1. Deactivate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_DEACTIVATE_RULE); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
request.execute(); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
} | |||
@Test | |||
public void bulk_deactivate_rule() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "toto1"); | |||
RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "toto2"); | |||
RuleDefinitionDto rule2 = createRule(profile.getLanguage(), "toto3"); | |||
RuleDefinitionDto rule3 = createRule(profile.getLanguage(), "toto4"); | |||
createActiveRule(rule0, profile); | |||
createActiveRule(rule2, profile); | |||
createActiveRule(rule3, profile); | |||
createActiveRule(rule1, profile); | |||
session.commit(); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(4); | |||
// 1. Deactivate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, DeactivateRulesAction.DEACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
WsTester.Result result = request.execute(); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
} | |||
@Test | |||
public void bulk_deactivate_rule_not_all() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
QProfileDto php = createProfile("php"); | |||
RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "toto1"); | |||
RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "toto2"); | |||
createActiveRule(rule0, profile); | |||
createActiveRule(rule1, profile); | |||
createActiveRule(rule0, php); | |||
createActiveRule(rule1, php); | |||
session.commit(); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(2); | |||
// 1. Deactivate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, DeactivateRulesAction.DEACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
WsTester.Result result = request.execute(); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(0); | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, php.getKee())).hasSize(2); | |||
} | |||
@Test | |||
public void bulk_deactivate_rule_by_profile() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "hello"); | |||
RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "world"); | |||
createActiveRule(rule0, profile); | |||
createActiveRule(rule1, profile); | |||
session.commit(); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(2); | |||
// 1. Deactivate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, DeactivateRulesAction.DEACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(WebService.Param.TEXT_QUERY, "hello"); | |||
WsTester.Result result = request.execute(); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
} | |||
@Test | |||
public void activate_rule() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
RuleDefinitionDto rule = createRule(profile.getLanguage(), "toto"); | |||
session.commit(); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// 1. Activate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
WsTester.Result result = request.execute(); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
} | |||
@Test | |||
public void activate_rule_diff_languages() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
RuleDefinitionDto rule = createRule("php", "toto"); | |||
session.commit(); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
try { | |||
// 1. Activate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
request.execute(); | |||
session.clearCache(); | |||
fail(); | |||
} catch (BadRequestException e) { | |||
assertThat(e.getMessage()).isEqualTo("Rule blah:toto and profile pjava have different languages"); | |||
} | |||
} | |||
@Test | |||
public void activate_rule_override_severity() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
RuleDefinitionDto rule = createRule(profile.getLanguage(), "toto"); | |||
session.commit(); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// 1. Activate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(PARAM_RULE_KEY, rule.getKey().toString()); | |||
request.setParam(PARAM_SEVERITY, "MINOR"); | |||
WsTester.Result result = request.execute(); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
ActiveRuleKey activeRuleKey = ActiveRuleKey.of(profile, rule.getKey()); | |||
Optional<ActiveRuleDto> activeRuleDto = db.activeRuleDao().selectByKey(session, activeRuleKey); | |||
assertThat(activeRuleDto.isPresent()).isTrue(); | |||
assertThat(activeRuleDto.get().getSeverityString()).isEqualTo(Severity.MINOR); | |||
} | |||
@Test | |||
public void bulk_activate_rule() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
createRule(profile.getLanguage(), "toto"); | |||
createRule(profile.getLanguage(), "tata"); | |||
createRule(profile.getLanguage(), "hello"); | |||
createRule(profile.getLanguage(), "world"); | |||
session.commit(); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// 1. Activate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(PARAM_LANGUAGES, "java"); | |||
request.execute().assertJson(getClass(), "bulk_activate_rule.json"); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(4); | |||
} | |||
@Test | |||
public void bulk_activate_rule_not_all() throws Exception { | |||
QProfileDto java = createProfile("java"); | |||
QProfileDto php = createProfile("php"); | |||
createRule(java.getLanguage(), "toto"); | |||
createRule(java.getLanguage(), "tata"); | |||
createRule(php.getLanguage(), "hello"); | |||
createRule(php.getLanguage(), "world"); | |||
session.commit(); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, php.getKee())).isEmpty(); | |||
// 1. Activate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, php.getKee()); | |||
request.setParam(PARAM_LANGUAGES, "php"); | |||
request.execute().assertJson(getClass(), "bulk_activate_rule_not_all.json"); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, php.getKee())).hasSize(2); | |||
} | |||
@Test | |||
public void bulk_activate_rule_by_query() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
createRule(profile.getLanguage(), "toto"); | |||
createRule(profile.getLanguage(), "tata"); | |||
createRule(profile.getLanguage(), "hello"); | |||
createRule(profile.getLanguage(), "world"); | |||
session.commit(); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// 1. Activate Rule with query returning 0 hits | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(WebService.Param.TEXT_QUERY, "php"); | |||
request.execute(); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(0); | |||
// 1. Activate Rule with query returning 1 hits | |||
request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, profile.getKee()); | |||
request.setParam(WebService.Param.TEXT_QUERY, "world"); | |||
request.execute(); | |||
session.commit(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).hasSize(1); | |||
} | |||
@Test | |||
public void bulk_activate_rule_by_query_with_severity() throws Exception { | |||
QProfileDto profile = createProfile("java"); | |||
RuleDefinitionDto rule0 = createRule(profile.getLanguage(), "toto"); | |||
RuleDefinitionDto rule1 = createRule(profile.getLanguage(), "tata"); | |||
session.commit(); | |||
// 0. Assert No Active Rule for profile | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, profile.getKee())).isEmpty(); | |||
// 2. Assert ActiveRule with BLOCKER severity | |||
assertThat(tester.get(RuleIndex.class).search( | |||
new RuleQuery().setSeverities(ImmutableSet.of("BLOCKER")), | |||
new SearchOptions()).getIds()).hasSize(2); | |||
// 1. Activate Rule with query returning 2 hits | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
request.setParam(ActivateRulesAction.PROFILE_KEY, profile.getKee()); | |||
request.setParam(ActivateRulesAction.SEVERITY, "MINOR"); | |||
request.execute(); | |||
session.commit(); | |||
// 2. Assert ActiveRule with MINOR severity | |||
assertThat(tester.get(ActiveRuleDao.class).selectByRuleId(session, organization, rule0.getId()).get(0).getSeverityString()).isEqualTo("MINOR"); | |||
assertThat(tester.get(RuleIndex.class).searchAll(new RuleQuery() | |||
.setQProfile(profile) | |||
.setKey(rule0.getKey().toString()) | |||
.setActiveSeverities(Collections.singleton("MINOR")) | |||
.setActivation(true))).hasSize(1); | |||
} | |||
@Test | |||
public void does_not_return_warnings_when_bulk_activate_on_profile_and_rules_exist_on_another_language_than_profile() throws Exception { | |||
QProfileDto javaProfile = createProfile("java"); | |||
createRule(javaProfile.getLanguage(), "toto"); | |||
createRule(javaProfile.getLanguage(), "tata"); | |||
QProfileDto phpProfile = createProfile("php"); | |||
createRule(phpProfile.getLanguage(), "hello"); | |||
createRule(phpProfile.getLanguage(), "world"); | |||
session.commit(); | |||
// 1. Activate Rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ActivateRulesAction.ACTIVATE_RULES_ACTION); | |||
request.setParam(PARAM_PROFILE_KEY, javaProfile.getKee()); | |||
request.setParam(PARAM_QPROFILE, javaProfile.getKee()); | |||
request.setParam("activation", "false"); | |||
request.execute().assertJson(getClass(), "does_not_return_warnings_when_bulk_activate_on_profile_and_rules_exist_on_another_language_than_profile.json"); | |||
session.clearCache(); | |||
// 2. Assert ActiveRule in DAO | |||
assertThat(db.activeRuleDao().selectByProfileUuid(session, javaProfile.getKee())).hasSize(2); | |||
} | |||
@Test | |||
public void reset() throws Exception { | |||
QProfileDto profile = QProfileTesting.newXooP1(organization); | |||
QProfileDto subProfile = QProfileTesting.newXooP2(organization).setParentKee(QProfileTesting.XOO_P1_KEY); | |||
db.qualityProfileDao().insert(session, profile, subProfile); | |||
RuleDefinitionDto rule = createRule(profile.getLanguage(), "rule"); | |||
ActiveRuleDto active1 = ActiveRuleDto.createFor(profile, rule) | |||
.setSeverity(rule.getSeverityString()); | |||
ActiveRuleDto active2 = ActiveRuleDto.createFor(subProfile, rule) | |||
.setSeverity("MINOR"); | |||
db.activeRuleDao().insert(session, active1); | |||
db.activeRuleDao().insert(session, active2); | |||
session.commit(); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
// 0. assert rule child rule is minor | |||
Optional<ActiveRuleDto> activeRuleDto = db.activeRuleDao().selectByKey(session, active2.getKey()); | |||
assertThat(activeRuleDto.isPresent()).isTrue(); | |||
assertThat(activeRuleDto.get().getSeverityString()).isEqualTo(Severity.MINOR); | |||
// 1. reset child rule | |||
WsTester.TestRequest request = wsTester.newPostRequest(QProfilesWs.API_ENDPOINT, ACTION_ACTIVATE_RULE); | |||
request.setParam("profile_key", subProfile.getKee()); | |||
request.setParam("rule_key", rule.getKey().toString()); | |||
request.setParam("reset", "true"); | |||
request.execute(); | |||
session.clearCache(); | |||
// 2. assert rule child rule is NOT minor | |||
activeRuleDto = db.activeRuleDao().selectByKey(session, active2.getKey()); | |||
assertThat(activeRuleDto.isPresent()).isTrue(); | |||
assertThat(activeRuleDto.get().getSeverityString()).isNotEqualTo(Severity.MINOR); | |||
} | |||
private QProfileDto createProfile(String lang) { | |||
QProfileDto profile = QProfileTesting.newQProfileDto(organization, new QProfileName(lang, "P" + lang), "p" + lang); | |||
db.qualityProfileDao().insert(session, profile); | |||
return profile; | |||
} | |||
private RuleDefinitionDto createRule(String lang, String id) { | |||
RuleDefinitionDto rule = RuleTesting.newRule(RuleKey.of("blah", id)) | |||
.setLanguage(lang) | |||
.setSeverity(Severity.BLOCKER) | |||
.setStatus(RuleStatus.READY); | |||
db.ruleDao().insert(session, rule); | |||
session.commit(); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
return rule; | |||
} | |||
private ActiveRuleDto createActiveRule(RuleDefinitionDto rule, QProfileDto profile) { | |||
ActiveRuleDto activeRule = ActiveRuleDto.createFor(profile, rule) | |||
.setSeverity(rule.getSeverityString()); | |||
db.activeRuleDao().insert(session, activeRule); | |||
return activeRule; | |||
} | |||
} |
@@ -19,252 +19,289 @@ | |||
*/ | |||
package org.sonar.server.rule.ws; | |||
import java.util.Date; | |||
import org.junit.After; | |||
import org.junit.Before; | |||
import org.junit.ClassRule; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.api.rule.RuleStatus; | |||
import org.sonar.api.rules.RuleType; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.organization.OrganizationDto; | |||
import org.sonar.db.qualityprofile.ActiveRuleDao; | |||
import org.sonar.db.qualityprofile.ActiveRuleDto; | |||
import org.sonar.db.qualityprofile.ActiveRuleParamDto; | |||
import org.sonar.db.qualityprofile.QualityProfileDao; | |||
import org.sonar.db.qualityprofile.QProfileDto; | |||
import org.sonar.db.rule.RuleDao; | |||
import org.sonar.db.rule.RuleDefinitionDto; | |||
import org.sonar.db.rule.RuleDto; | |||
import org.sonar.db.rule.RuleDto.Format; | |||
import org.sonar.db.rule.RuleParamDto; | |||
import org.sonar.db.rule.RuleTesting; | |||
import org.sonar.server.organization.DefaultOrganizationProvider; | |||
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; | |||
import org.sonar.server.rule.NewCustomRule; | |||
import org.sonar.server.rule.RuleCreator; | |||
import org.sonar.server.rule.index.RuleIndexer; | |||
import org.sonar.server.tester.ServerTester; | |||
import org.sonar.server.tester.UserSessionRule; | |||
import org.sonar.server.ws.WsTester; | |||
import static com.google.common.collect.Sets.newHashSet; | |||
import static org.sonar.api.rule.Severity.MINOR; | |||
import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES; | |||
public class ShowActionMediumTest { | |||
// @ClassRule | |||
// public static ServerTester tester = new ServerTester().withEsIndexes(); | |||
// | |||
// DefaultOrganizationProvider defaultOrganizationProvider = tester.get(DefaultOrganizationProvider.class); | |||
// | |||
// @Rule | |||
// public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester).logIn() | |||
// .addPermission(ADMINISTER_QUALITY_PROFILES, defaultOrganizationProvider.get().getUuid()); | |||
// | |||
// private WsTester wsTester; | |||
// private RuleIndexer ruleIndexer; | |||
// private RuleDao ruleDao; | |||
// private DbSession session; | |||
// private OrganizationDto defaultOrganization; | |||
// | |||
// @Before | |||
// public void setUp() { | |||
// tester.clearDbAndIndexes(); | |||
// wsTester = tester.get(WsTester.class); | |||
// ruleIndexer = tester.get(RuleIndexer.class); | |||
// ruleDao = tester.get(RuleDao.class); | |||
// session = tester.get(DbClient.class).openSession(false); | |||
// defaultOrganization = tester.get(DbClient.class).organizationDao().selectByUuid(session, defaultOrganizationProvider.get().getUuid()).get(); | |||
// } | |||
// | |||
// @After | |||
// public void after() { | |||
// session.close(); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule() throws Exception { | |||
// RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
// .setName("Rule S001") | |||
// .setDescription("Rule S001 <b>description</b>") | |||
// .setDescriptionFormat(Format.HTML) | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.BETA) | |||
// .setConfigKey("InternalKeyS001") | |||
// .setLanguage("xoo") | |||
// .setTags(newHashSet("tag1", "tag2")) | |||
// .setSystemTags(newHashSet("systag1", "systag2")) | |||
// .setType(RuleType.BUG); | |||
// RuleDefinitionDto definition = ruleDto.getDefinition(); | |||
// ruleDao.insert(session, definition); | |||
// ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
// RuleParamDto param = RuleParamDto.createFor(definition).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"); | |||
// ruleDao.insertRuleParam(session, definition, param); | |||
// session.commit(); | |||
// session.clearCache(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", ruleDto.getKey().toString()); | |||
// request.execute().assertJson(getClass(), "show_rule.json"); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule_with_default_debt_infos() throws Exception { | |||
// RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
// .setName("Rule S001") | |||
// .setDescription("Rule S001 <b>description</b>") | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.BETA) | |||
// .setConfigKey("InternalKeyS001") | |||
// .setLanguage("xoo") | |||
// .setDefRemediationFunction("LINEAR_OFFSET") | |||
// .setDefRemediationGapMultiplier("5d") | |||
// .setDefRemediationBaseEffort("10h") | |||
// .setRemediationFunction(null) | |||
// .setRemediationGapMultiplier(null) | |||
// .setRemediationBaseEffort(null); | |||
// ruleDao.insert(session, ruleDto.getDefinition()); | |||
// ruleDao.insertOrUpdate(session, ruleDto.getMetadata()); | |||
// session.commit(); | |||
// session.clearCache(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", ruleDto.getKey().toString()); | |||
// WsTester.Result response = request.execute(); | |||
// | |||
// response.assertJson(getClass(), "show_rule_with_default_debt_infos.json"); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule_with_overridden_debt() throws Exception { | |||
// RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
// .setName("Rule S001") | |||
// .setDescription("Rule S001 <b>description</b>") | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.BETA) | |||
// .setConfigKey("InternalKeyS001") | |||
// .setLanguage("xoo") | |||
// .setDefRemediationFunction(null) | |||
// .setDefRemediationGapMultiplier(null) | |||
// .setDefRemediationBaseEffort(null) | |||
// .setRemediationFunction("LINEAR_OFFSET") | |||
// .setRemediationGapMultiplier("5d") | |||
// .setRemediationBaseEffort("10h"); | |||
// ruleDao.insert(session, ruleDto.getDefinition()); | |||
// ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
// session.commit(); | |||
// session.clearCache(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", ruleDto.getKey().toString()); | |||
// request.execute().assertJson(getClass(), "show_rule_with_overridden_debt_infos.json"); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule_with_default_and_overridden_debt_infos() throws Exception { | |||
// RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
// .setName("Rule S001") | |||
// .setDescription("Rule S001 <b>description</b>") | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.BETA) | |||
// .setConfigKey("InternalKeyS001") | |||
// .setLanguage("xoo") | |||
// .setDefRemediationFunction("LINEAR") | |||
// .setDefRemediationGapMultiplier("5min") | |||
// .setDefRemediationBaseEffort(null) | |||
// .setRemediationFunction("LINEAR_OFFSET") | |||
// .setRemediationGapMultiplier("5d") | |||
// .setRemediationBaseEffort("10h"); | |||
// ruleDao.insert(session, ruleDto.getDefinition()); | |||
// ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
// session.commit(); | |||
// session.clearCache(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", ruleDto.getKey().toString()); | |||
// request.execute().assertJson(getClass(), "show_rule_with_default_and_overridden_debt_infos.json"); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule_with_no_default_and_no_overridden_debt() throws Exception { | |||
// RuleDefinitionDto ruleDto = RuleTesting.newRule(RuleKey.of("java", "S001")) | |||
// .setName("Rule S001") | |||
// .setDescription("Rule S001 <b>description</b>") | |||
// .setDescriptionFormat(Format.HTML) | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.BETA) | |||
// .setConfigKey("InternalKeyS001") | |||
// .setLanguage("xoo") | |||
// .setDefRemediationFunction(null) | |||
// .setDefRemediationGapMultiplier(null) | |||
// .setDefRemediationBaseEffort(null); | |||
// ruleDao.insert(session, ruleDto); | |||
// session.commit(); | |||
// session.clearCache(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", ruleDto.getKey().toString()); | |||
// request.execute().assertJson(getClass(), "show_rule_with_no_default_and_no_overridden_debt.json"); | |||
// } | |||
// | |||
// @Test | |||
// public void encode_html_description_of_custom_rule() throws Exception { | |||
// // Template rule | |||
// RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001")); | |||
// ruleDao.insert(session, templateRule.getDefinition()); | |||
// session.commit(); | |||
// | |||
// // Custom rule | |||
// NewCustomRule customRule = NewCustomRule.createForCustomRule("MY_CUSTOM", templateRule.getKey()) | |||
// .setName("My custom") | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.READY) | |||
// .setMarkdownDescription("<div>line1\nline2</div>"); | |||
// RuleKey customRuleKey = tester.get(RuleCreator.class).create(session, customRule); | |||
// session.clearCache(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", customRuleKey.toString()); | |||
// request.execute().assertJson(getClass(), "encode_html_description_of_custom_rule.json"); | |||
// } | |||
// | |||
// @Test | |||
// public void show_deprecated_rule_rem_function_fields() throws Exception { | |||
// RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
// .setName("Rule S001") | |||
// .setDescription("Rule S001 <b>description</b>") | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.BETA) | |||
// .setConfigKey("InternalKeyS001") | |||
// .setLanguage("xoo") | |||
// .setDefRemediationFunction("LINEAR_OFFSET") | |||
// .setDefRemediationGapMultiplier("6d") | |||
// .setDefRemediationBaseEffort("11h") | |||
// .setRemediationFunction("LINEAR_OFFSET") | |||
// .setRemediationGapMultiplier("5d") | |||
// .setRemediationBaseEffort("10h"); | |||
// ruleDao.insert(session, ruleDto.getDefinition()); | |||
// ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
// session.commit(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", ruleDto.getKey().toString()); | |||
// request.execute().assertJson(getClass(), "show_deprecated_rule_rem_function_fields.json"); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule_when_activated() throws Exception { | |||
// RuleDefinitionDto ruleDto = RuleTesting.newRule(RuleKey.of("java", "S001")) | |||
// .setName("Rule S001") | |||
// .setDescription("Rule S001 <b>description</b>") | |||
// .setDescriptionFormat(Format.HTML) | |||
// .setSeverity(MINOR) | |||
// .setStatus(RuleStatus.BETA) | |||
// .setLanguage("xoo") | |||
// .setType(RuleType.BUG) | |||
// .setCreatedAt(new Date().getTime()) | |||
// .setUpdatedAt(new Date().getTime()); | |||
// ruleDao.insert(session, ruleDto); | |||
// session.commit(); | |||
// ruleIndexer.indexRuleDefinition(ruleDto.getKey()); | |||
// RuleParamDto regexParam = RuleParamDto.createFor(ruleDto).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"); | |||
// ruleDao.insertRuleParam(session, ruleDto, regexParam); | |||
// | |||
// QProfileDto profile = new QProfileDto() | |||
// .setKee("profile") | |||
// .setRulesProfileUuid("rp-profile") | |||
// .setOrganizationUuid(defaultOrganizationProvider.get().getUuid()) | |||
// .setName("Profile") | |||
// .setLanguage("xoo"); | |||
// tester.get(QualityProfileDao.class).insert(session, profile); | |||
// ActiveRuleDto activeRuleDto = new ActiveRuleDto() | |||
// .setProfileId(profile.getId()) | |||
// .setRuleId(ruleDto.getId()) | |||
// .setSeverity(MINOR) | |||
// .setCreatedAt(new Date().getTime()) | |||
// .setUpdatedAt(new Date().getTime()); | |||
// tester.get(ActiveRuleDao.class).insert(session, activeRuleDto); | |||
// tester.get(ActiveRuleDao.class).insertParam(session, activeRuleDto, new ActiveRuleParamDto() | |||
// .setRulesParameterId(regexParam.getId()) | |||
// .setKey(regexParam.getName()) | |||
// .setValue(".*?")); | |||
// session.commit(); | |||
// | |||
// tester.get(ActiveRuleIndexer.class).index(); | |||
// | |||
// WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
// .setParam("key", ruleDto.getKey().toString()) | |||
// .setParam("actives", "true"); | |||
// request.execute().assertJson(getClass(), "show_rule_when_activated.json"); | |||
// } | |||
@ClassRule | |||
public static ServerTester tester = new ServerTester().withEsIndexes(); | |||
DefaultOrganizationProvider defaultOrganizationProvider = tester.get(DefaultOrganizationProvider.class); | |||
@Rule | |||
public UserSessionRule userSessionRule = UserSessionRule.forServerTester(tester).logIn() | |||
.addPermission(ADMINISTER_QUALITY_PROFILES, defaultOrganizationProvider.get().getUuid()); | |||
private WsTester wsTester; | |||
private RuleIndexer ruleIndexer; | |||
private RuleDao ruleDao; | |||
private DbSession session; | |||
private OrganizationDto defaultOrganization; | |||
@Before | |||
public void setUp() { | |||
tester.clearDbAndIndexes(); | |||
wsTester = tester.get(WsTester.class); | |||
ruleIndexer = tester.get(RuleIndexer.class); | |||
ruleDao = tester.get(RuleDao.class); | |||
session = tester.get(DbClient.class).openSession(false); | |||
defaultOrganization = tester.get(DbClient.class).organizationDao().selectByUuid(session, defaultOrganizationProvider.get().getUuid()).get(); | |||
} | |||
@After | |||
public void after() { | |||
session.close(); | |||
} | |||
@Test | |||
public void show_rule() throws Exception { | |||
RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
.setName("Rule S001") | |||
.setDescription("Rule S001 <b>description</b>") | |||
.setDescriptionFormat(Format.HTML) | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.BETA) | |||
.setConfigKey("InternalKeyS001") | |||
.setLanguage("xoo") | |||
.setTags(newHashSet("tag1", "tag2")) | |||
.setSystemTags(newHashSet("systag1", "systag2")) | |||
.setType(RuleType.BUG); | |||
RuleDefinitionDto definition = ruleDto.getDefinition(); | |||
ruleDao.insert(session, definition); | |||
ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
RuleParamDto param = RuleParamDto.createFor(definition).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"); | |||
ruleDao.insertRuleParam(session, definition, param); | |||
session.commit(); | |||
session.clearCache(); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", ruleDto.getKey().toString()); | |||
request.execute().assertJson(getClass(), "show_rule.json"); | |||
} | |||
@Test | |||
public void show_rule_with_default_debt_infos() throws Exception { | |||
RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
.setName("Rule S001") | |||
.setDescription("Rule S001 <b>description</b>") | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.BETA) | |||
.setConfigKey("InternalKeyS001") | |||
.setLanguage("xoo") | |||
.setDefRemediationFunction("LINEAR_OFFSET") | |||
.setDefRemediationGapMultiplier("5d") | |||
.setDefRemediationBaseEffort("10h") | |||
.setRemediationFunction(null) | |||
.setRemediationGapMultiplier(null) | |||
.setRemediationBaseEffort(null); | |||
ruleDao.insert(session, ruleDto.getDefinition()); | |||
ruleDao.insertOrUpdate(session, ruleDto.getMetadata()); | |||
session.commit(); | |||
session.clearCache(); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", ruleDto.getKey().toString()); | |||
WsTester.Result response = request.execute(); | |||
response.assertJson(getClass(), "show_rule_with_default_debt_infos.json"); | |||
} | |||
@Test | |||
public void show_rule_with_overridden_debt() throws Exception { | |||
RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
.setName("Rule S001") | |||
.setDescription("Rule S001 <b>description</b>") | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.BETA) | |||
.setConfigKey("InternalKeyS001") | |||
.setLanguage("xoo") | |||
.setDefRemediationFunction(null) | |||
.setDefRemediationGapMultiplier(null) | |||
.setDefRemediationBaseEffort(null) | |||
.setRemediationFunction("LINEAR_OFFSET") | |||
.setRemediationGapMultiplier("5d") | |||
.setRemediationBaseEffort("10h"); | |||
ruleDao.insert(session, ruleDto.getDefinition()); | |||
ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
session.commit(); | |||
session.clearCache(); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", ruleDto.getKey().toString()); | |||
request.execute().assertJson(getClass(), "show_rule_with_overridden_debt_infos.json"); | |||
} | |||
@Test | |||
public void show_rule_with_default_and_overridden_debt_infos() throws Exception { | |||
RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
.setName("Rule S001") | |||
.setDescription("Rule S001 <b>description</b>") | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.BETA) | |||
.setConfigKey("InternalKeyS001") | |||
.setLanguage("xoo") | |||
.setDefRemediationFunction("LINEAR") | |||
.setDefRemediationGapMultiplier("5min") | |||
.setDefRemediationBaseEffort(null) | |||
.setRemediationFunction("LINEAR_OFFSET") | |||
.setRemediationGapMultiplier("5d") | |||
.setRemediationBaseEffort("10h"); | |||
ruleDao.insert(session, ruleDto.getDefinition()); | |||
ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
session.commit(); | |||
session.clearCache(); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", ruleDto.getKey().toString()); | |||
request.execute().assertJson(getClass(), "show_rule_with_default_and_overridden_debt_infos.json"); | |||
} | |||
@Test | |||
public void show_rule_with_no_default_and_no_overridden_debt() throws Exception { | |||
RuleDefinitionDto ruleDto = RuleTesting.newRule(RuleKey.of("java", "S001")) | |||
.setName("Rule S001") | |||
.setDescription("Rule S001 <b>description</b>") | |||
.setDescriptionFormat(Format.HTML) | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.BETA) | |||
.setConfigKey("InternalKeyS001") | |||
.setLanguage("xoo") | |||
.setDefRemediationFunction(null) | |||
.setDefRemediationGapMultiplier(null) | |||
.setDefRemediationBaseEffort(null); | |||
ruleDao.insert(session, ruleDto); | |||
session.commit(); | |||
session.clearCache(); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", ruleDto.getKey().toString()); | |||
request.execute().assertJson(getClass(), "show_rule_with_no_default_and_no_overridden_debt.json"); | |||
} | |||
@Test | |||
public void encode_html_description_of_custom_rule() throws Exception { | |||
// Template rule | |||
RuleDto templateRule = RuleTesting.newTemplateRule(RuleKey.of("java", "S001")); | |||
ruleDao.insert(session, templateRule.getDefinition()); | |||
session.commit(); | |||
// Custom rule | |||
NewCustomRule customRule = NewCustomRule.createForCustomRule("MY_CUSTOM", templateRule.getKey()) | |||
.setName("My custom") | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.READY) | |||
.setMarkdownDescription("<div>line1\nline2</div>"); | |||
RuleKey customRuleKey = tester.get(RuleCreator.class).create(session, customRule); | |||
session.clearCache(); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", customRuleKey.toString()); | |||
request.execute().assertJson(getClass(), "encode_html_description_of_custom_rule.json"); | |||
} | |||
@Test | |||
public void show_deprecated_rule_rem_function_fields() throws Exception { | |||
RuleDto ruleDto = RuleTesting.newDto(RuleKey.of("java", "S001"), defaultOrganization) | |||
.setName("Rule S001") | |||
.setDescription("Rule S001 <b>description</b>") | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.BETA) | |||
.setConfigKey("InternalKeyS001") | |||
.setLanguage("xoo") | |||
.setDefRemediationFunction("LINEAR_OFFSET") | |||
.setDefRemediationGapMultiplier("6d") | |||
.setDefRemediationBaseEffort("11h") | |||
.setRemediationFunction("LINEAR_OFFSET") | |||
.setRemediationGapMultiplier("5d") | |||
.setRemediationBaseEffort("10h"); | |||
ruleDao.insert(session, ruleDto.getDefinition()); | |||
ruleDao.insertOrUpdate(session, ruleDto.getMetadata().setRuleId(ruleDto.getId())); | |||
session.commit(); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", ruleDto.getKey().toString()); | |||
request.execute().assertJson(getClass(), "show_deprecated_rule_rem_function_fields.json"); | |||
} | |||
@Test | |||
public void show_rule_when_activated() throws Exception { | |||
RuleDefinitionDto ruleDto = RuleTesting.newRule(RuleKey.of("java", "S001")) | |||
.setName("Rule S001") | |||
.setDescription("Rule S001 <b>description</b>") | |||
.setDescriptionFormat(Format.HTML) | |||
.setSeverity(MINOR) | |||
.setStatus(RuleStatus.BETA) | |||
.setLanguage("xoo") | |||
.setType(RuleType.BUG) | |||
.setCreatedAt(new Date().getTime()) | |||
.setUpdatedAt(new Date().getTime()); | |||
ruleDao.insert(session, ruleDto); | |||
session.commit(); | |||
ruleIndexer.indexRuleDefinition(ruleDto.getKey()); | |||
RuleParamDto regexParam = RuleParamDto.createFor(ruleDto).setName("regex").setType("STRING").setDescription("Reg *exp*").setDefaultValue(".*"); | |||
ruleDao.insertRuleParam(session, ruleDto, regexParam); | |||
QProfileDto profile = new QProfileDto() | |||
.setRulesProfileUuid("profile") | |||
.setKee("profile") | |||
.setOrganizationUuid(defaultOrganizationProvider.get().getUuid()) | |||
.setName("Profile") | |||
.setLanguage("xoo"); | |||
tester.get(QualityProfileDao.class).insert(session, profile); | |||
ActiveRuleDto activeRuleDto = new ActiveRuleDto() | |||
.setProfileId(profile.getId()) | |||
.setRuleId(ruleDto.getId()) | |||
.setSeverity(MINOR) | |||
.setCreatedAt(new Date().getTime()) | |||
.setUpdatedAt(new Date().getTime()); | |||
tester.get(ActiveRuleDao.class).insert(session, activeRuleDto); | |||
tester.get(ActiveRuleDao.class).insertParam(session, activeRuleDto, new ActiveRuleParamDto() | |||
.setRulesParameterId(regexParam.getId()) | |||
.setKey(regexParam.getName()) | |||
.setValue(".*?")); | |||
session.commit(); | |||
ActiveRuleIndexer activeRuleIndexer = tester.get(ActiveRuleIndexer.class); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
WsTester.TestRequest request = wsTester.newGetRequest("api/rules", "show") | |||
.setParam("key", ruleDto.getKey().toString()) | |||
.setParam("actives", "true"); | |||
request.execute().assertJson(getClass(), "show_rule_when_activated.json"); | |||
} | |||
} |
@@ -20,176 +20,224 @@ | |||
package org.sonar.server.rule.ws; | |||
import java.io.IOException; | |||
import java.util.List; | |||
import java.util.function.Consumer; | |||
import org.junit.Before; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.mockito.ArgumentCaptor; | |||
import org.mockito.Mockito; | |||
import org.sonar.api.config.MapSettings; | |||
import org.sonar.api.resources.Languages; | |||
import org.sonar.db.DbClient; | |||
import org.sonar.db.DbSession; | |||
import org.sonar.db.DbTester; | |||
import org.sonar.db.organization.OrganizationDto; | |||
import org.sonar.db.qualityprofile.QProfileDto; | |||
import org.sonar.db.rule.RuleDefinitionDto; | |||
import org.sonar.db.rule.RuleMetadataDto; | |||
import org.sonar.server.es.EsClient; | |||
import org.sonar.server.es.EsTester; | |||
import org.sonar.server.exceptions.NotFoundException; | |||
import org.sonar.server.organization.DefaultOrganizationProvider; | |||
import org.sonar.server.organization.TestDefaultOrganizationProvider; | |||
import org.sonar.server.qualityprofile.QProfileTesting; | |||
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer; | |||
import org.sonar.server.qualityprofile.index.ActiveRuleIteratorFactory; | |||
import org.sonar.server.rule.index.RuleIndexDefinition; | |||
import org.sonar.server.rule.index.RuleIndexer; | |||
import org.sonar.server.text.MacroInterpreter; | |||
import org.sonar.server.ws.TestResponse; | |||
import org.sonar.server.ws.WsAction; | |||
import org.sonar.server.ws.WsActionTester; | |||
import org.sonarqube.ws.Rules; | |||
import org.sonarqube.ws.Rules.Rule; | |||
import static java.util.Collections.singletonList; | |||
import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Matchers.any; | |||
import static org.mockito.Matchers.anyString; | |||
import static org.mockito.Mockito.doReturn; | |||
import static org.mockito.Mockito.mock; | |||
import static org.sonar.db.rule.RuleTesting.setTags; | |||
import static org.sonar.server.rule.ws.ShowAction.PARAM_KEY; | |||
import static org.sonar.server.rule.ws.ShowAction.PARAM_ORGANIZATION; | |||
import static org.sonarqube.ws.MediaTypes.PROTOBUF; | |||
public class ShowActionTest { | |||
// | |||
// @org.junit.Rule | |||
// public DbTester dbTester = DbTester.create(); | |||
// @org.junit.Rule | |||
// public EsTester esTester = new EsTester( | |||
// new RuleIndexDefinition(new MapSettings())); | |||
// @org.junit.Rule | |||
// public ExpectedException thrown = ExpectedException.none(); | |||
// | |||
// private DbClient dbClient = dbTester.getDbClient(); | |||
// private EsClient esClient = esTester.client(); | |||
// | |||
// private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); | |||
// private MacroInterpreter macroInterpreter = mock(MacroInterpreter.class); | |||
// private Languages languages = new Languages(); | |||
// private RuleMapper mapper = new RuleMapper(languages, macroInterpreter); | |||
// private ActiveRuleCompleter activeRuleCompleter = mock(ActiveRuleCompleter.class); | |||
// private WsAction underTest = new ShowAction(dbClient, mapper, activeRuleCompleter, defaultOrganizationProvider); | |||
// private WsActionTester actionTester = new WsActionTester(underTest); | |||
// | |||
// private RuleIndexer ruleIndexer = new RuleIndexer(esClient, dbClient); | |||
// | |||
// @Before | |||
// public void before() { | |||
// doReturn("interpreted").when(macroInterpreter).interpret(anyString()); | |||
// } | |||
// | |||
// @Test | |||
// public void should_show_rule_key() throws IOException { | |||
// RuleDefinitionDto rule = insertRule(); | |||
// | |||
// Rules.ShowResponse result = actionTester.newRequest() | |||
// .setParam(PARAM_KEY, rule.getKey().toString()) | |||
// .executeProtobuf(Rules.ShowResponse.class); | |||
// assertThat(result.getRule()).extracting(Rule::getKey).containsExactly(rule.getKey().toString()); | |||
// } | |||
// | |||
// @Test | |||
// public void should_show_rule_tags_in_default_organization() throws IOException { | |||
// RuleDefinitionDto rule = insertRule(); | |||
// RuleMetadataDto metadata = insertMetadata(dbTester.getDefaultOrganization(), rule, setTags("tag1", "tag2")); | |||
// | |||
// Rules.ShowResponse result = actionTester.newRequest() | |||
// .setParam(PARAM_KEY, rule.getKey().toString()) | |||
// .executeProtobuf(Rules.ShowResponse.class); | |||
// assertThat(result.getRule().getTags().getTagsList()) | |||
// .containsExactly(metadata.getTags().toArray(new String[0])); | |||
// } | |||
// | |||
// @Test | |||
// public void should_show_rule_tags_in_specific_organization() throws IOException { | |||
// RuleDefinitionDto rule = insertRule(); | |||
// OrganizationDto organization = dbTester.organizations().insert(); | |||
// RuleMetadataDto metadata = insertMetadata(organization, rule, setTags("tag1", "tag2")); | |||
// | |||
// Rules.ShowResponse result = actionTester.newRequest() | |||
// .setParam(PARAM_KEY, rule.getKey().toString()) | |||
// .setParam(PARAM_ORGANIZATION, organization.getKey()) | |||
// .executeProtobuf(Rules.ShowResponse.class); | |||
// assertThat(result.getRule().getTags().getTagsList()) | |||
// .containsExactly(metadata.getTags().toArray(new String[0])); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule_with_activation() throws Exception { | |||
// OrganizationDto organization = dbTester.organizations().insert(); | |||
// | |||
// QProfileDto profile = QProfileTesting.newXooP1(organization); | |||
// dbClient.qualityProfileDao().insert(dbTester.getSession(), profile); | |||
// dbTester.commit(); | |||
// | |||
// RuleDefinitionDto rule = insertRule(); | |||
// RuleMetadataDto ruleMetadata = dbTester.rules().insertOrUpdateMetadata(rule, organization); | |||
// | |||
// ArgumentCaptor<OrganizationDto> orgCaptor = ArgumentCaptor.forClass(OrganizationDto.class); | |||
// ArgumentCaptor<RuleDefinitionDto> ruleCaptor = ArgumentCaptor.forClass(RuleDefinitionDto.class); | |||
// Rules.Active active = Rules.Active.newBuilder() | |||
// .setQProfile(randomAlphanumeric(5)) | |||
// .setInherit(randomAlphanumeric(5)) | |||
// .setSeverity(randomAlphanumeric(5)) | |||
// .build(); | |||
// Mockito.doReturn(singletonList(active)).when(activeRuleCompleter).completeShow(any(DbSession.class), orgCaptor.capture(), ruleCaptor.capture()); | |||
// new ActiveRuleIndexer(System2.INSTANCE, dbClient, esClient).index(); | |||
// | |||
// TestResponse response = actionTester.newRequest().setMethod("GET") | |||
// .setMediaType(PROTOBUF) | |||
// .setParam(ShowAction.PARAM_KEY, rule.getKey().toString()) | |||
// .setParam(ShowAction.PARAM_ACTIVES, "true") | |||
// .setParam(ShowAction.PARAM_ORGANIZATION, organization.getKey()) | |||
// .execute(); | |||
// | |||
// assertThat(orgCaptor.getValue().getUuid()).isEqualTo(organization.getUuid()); | |||
// assertThat(ruleCaptor.getValue().getKey()).isEqualTo(rule.getKey()); | |||
// | |||
// Rules.ShowResponse result = response.getInputObject(Rules.ShowResponse.class); | |||
// Rule resultRule = result.getRule(); | |||
// assertEqual(rule, ruleMetadata, resultRule); | |||
// | |||
// List<Rules.Active> actives = result.getActivesList(); | |||
// assertThat(actives).extracting(Rules.Active::getQProfile).containsExactly(active.getQProfile()); | |||
// assertThat(actives).extracting(Rules.Active::getInherit).containsExactly(active.getInherit()); | |||
// assertThat(actives).extracting(Rules.Active::getSeverity).containsExactly(active.getSeverity()); | |||
// } | |||
// | |||
// @Test | |||
// public void show_rule_without_activation() throws Exception { | |||
// OrganizationDto organization = dbTester.organizations().insert(); | |||
// | |||
// QProfileDto profile = QProfileTesting.newXooP1(organization); | |||
// dbClient.qualityProfileDao().insert(dbTester.getSession(), profile); | |||
// dbTester.commit(); | |||
// | |||
// RuleDefinitionDto rule = insertRule(); | |||
// RuleMetadataDto ruleMetadata = dbTester.rules().insertOrUpdateMetadata(rule, organization); | |||
// | |||
// dbTester.qualityProfiles().activateRule(profile, rule, a -> a.setSeverity("BLOCKER")); | |||
// new ActiveRuleIndexer(dbClient, esClient).index(); | |||
// | |||
// TestResponse response = actionTester.newRequest().setMethod("GET") | |||
// .setParam(ShowAction.PARAM_KEY, rule.getKey().toString()) | |||
// .setParam(ShowAction.PARAM_ORGANIZATION, organization.getKey()) | |||
// .setMediaType(PROTOBUF) | |||
// .execute(); | |||
// | |||
// Rules.ShowResponse result = response.getInputObject(Rules.ShowResponse.class); | |||
// Rule resultRule = result.getRule(); | |||
// assertEqual(rule, ruleMetadata, resultRule); | |||
// | |||
// List<Rules.Active> actives = result.getActivesList(); | |||
// assertThat(actives).isEmpty(); | |||
// } | |||
// | |||
// @Test | |||
// public void throw_NotFoundException_if_organization_cannot_be_found() throws Exception { | |||
// RuleDefinitionDto rule = dbTester.rules().insert(); | |||
// | |||
// thrown.expect(NotFoundException.class); | |||
// | |||
// actionTester.newRequest().setMethod("POST") | |||
// .setParam("key", rule.getKey().toString()) | |||
// .setParam("organization", "foo") | |||
// .execute(); | |||
// } | |||
// | |||
// private void assertEqual(RuleDefinitionDto rule, RuleMetadataDto ruleMetadata, Rule resultRule) { | |||
// assertThat(resultRule.getKey()).isEqualTo(rule.getKey().toString()); | |||
// assertThat(resultRule.getRepo()).isEqualTo(rule.getRepositoryKey()); | |||
// assertThat(resultRule.getName()).isEqualTo(rule.getName()); | |||
// assertThat(resultRule.getSeverity()).isEqualTo(rule.getSeverityString()); | |||
// assertThat(resultRule.getStatus().toString()).isEqualTo(rule.getStatus().toString()); | |||
// assertThat(resultRule.getInternalKey()).isEqualTo(rule.getConfigKey()); | |||
// assertThat(resultRule.getIsTemplate()).isEqualTo(rule.isTemplate()); | |||
// assertThat(resultRule.getTags().getTagsList()).containsExactlyInAnyOrder(ruleMetadata.getTags().toArray(new String[0])); | |||
// assertThat(resultRule.getSysTags().getSysTagsList()).containsExactlyInAnyOrder(rule.getSystemTags().toArray(new String[0])); | |||
// assertThat(resultRule.getLang()).isEqualTo(rule.getLanguage()); | |||
// assertThat(resultRule.getParams().getParamsList()).isEmpty(); | |||
// } | |||
// | |||
// private RuleDefinitionDto insertRule() { | |||
// RuleDefinitionDto rule = dbTester.rules().insert(); | |||
// ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
// return rule; | |||
// } | |||
// | |||
// @SafeVarargs | |||
// private final RuleMetadataDto insertMetadata(OrganizationDto organization, RuleDefinitionDto rule, Consumer<RuleMetadataDto>... populaters) { | |||
// RuleMetadataDto metadata = dbTester.rules().insertOrUpdateMetadata(rule, organization, populaters); | |||
// ruleIndexer.indexRuleExtension(organization, rule.getKey()); | |||
// return metadata; | |||
// } | |||
@org.junit.Rule | |||
public DbTester dbTester = DbTester.create(); | |||
@org.junit.Rule | |||
public EsTester esTester = new EsTester( | |||
new RuleIndexDefinition(new MapSettings())); | |||
@org.junit.Rule | |||
public ExpectedException thrown = ExpectedException.none(); | |||
private DbClient dbClient = dbTester.getDbClient(); | |||
private EsClient esClient = esTester.client(); | |||
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); | |||
private MacroInterpreter macroInterpreter = mock(MacroInterpreter.class); | |||
private Languages languages = new Languages(); | |||
private RuleMapper mapper = new RuleMapper(languages, macroInterpreter); | |||
private ActiveRuleCompleter activeRuleCompleter = mock(ActiveRuleCompleter.class); | |||
private WsAction underTest = new ShowAction(dbClient, mapper, activeRuleCompleter, defaultOrganizationProvider); | |||
private WsActionTester actionTester = new WsActionTester(underTest); | |||
private RuleIndexer ruleIndexer = new RuleIndexer(esClient, dbClient); | |||
@Before | |||
public void before() { | |||
doReturn("interpreted").when(macroInterpreter).interpret(anyString()); | |||
} | |||
@Test | |||
public void should_show_rule_key() throws IOException { | |||
RuleDefinitionDto rule = insertRule(); | |||
Rules.ShowResponse result = actionTester.newRequest() | |||
.setParam(PARAM_KEY, rule.getKey().toString()) | |||
.executeProtobuf(Rules.ShowResponse.class); | |||
assertThat(result.getRule()).extracting(Rule::getKey).containsExactly(rule.getKey().toString()); | |||
} | |||
@Test | |||
public void should_show_rule_tags_in_default_organization() throws IOException { | |||
RuleDefinitionDto rule = insertRule(); | |||
RuleMetadataDto metadata = insertMetadata(dbTester.getDefaultOrganization(), rule, setTags("tag1", "tag2")); | |||
Rules.ShowResponse result = actionTester.newRequest() | |||
.setParam(PARAM_KEY, rule.getKey().toString()) | |||
.executeProtobuf(Rules.ShowResponse.class); | |||
assertThat(result.getRule().getTags().getTagsList()) | |||
.containsExactly(metadata.getTags().toArray(new String[0])); | |||
} | |||
@Test | |||
public void should_show_rule_tags_in_specific_organization() throws IOException { | |||
RuleDefinitionDto rule = insertRule(); | |||
OrganizationDto organization = dbTester.organizations().insert(); | |||
RuleMetadataDto metadata = insertMetadata(organization, rule, setTags("tag1", "tag2")); | |||
Rules.ShowResponse result = actionTester.newRequest() | |||
.setParam(PARAM_KEY, rule.getKey().toString()) | |||
.setParam(PARAM_ORGANIZATION, organization.getKey()) | |||
.executeProtobuf(Rules.ShowResponse.class); | |||
assertThat(result.getRule().getTags().getTagsList()) | |||
.containsExactly(metadata.getTags().toArray(new String[0])); | |||
} | |||
@Test | |||
public void show_rule_with_activation() throws Exception { | |||
OrganizationDto organization = dbTester.organizations().insert(); | |||
QProfileDto profile = QProfileTesting.newXooP1(organization); | |||
dbClient.qualityProfileDao().insert(dbTester.getSession(), profile); | |||
dbTester.commit(); | |||
RuleDefinitionDto rule = insertRule(); | |||
RuleMetadataDto ruleMetadata = dbTester.rules().insertOrUpdateMetadata(rule, organization); | |||
ArgumentCaptor<OrganizationDto> orgCaptor = ArgumentCaptor.forClass(OrganizationDto.class); | |||
ArgumentCaptor<RuleDefinitionDto> ruleCaptor = ArgumentCaptor.forClass(RuleDefinitionDto.class); | |||
Rules.Active active = Rules.Active.newBuilder() | |||
.setQProfile(randomAlphanumeric(5)) | |||
.setInherit(randomAlphanumeric(5)) | |||
.setSeverity(randomAlphanumeric(5)) | |||
.build(); | |||
Mockito.doReturn(singletonList(active)).when(activeRuleCompleter).completeShow(any(DbSession.class), orgCaptor.capture(), ruleCaptor.capture()); | |||
ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(dbClient, esClient, new ActiveRuleIteratorFactory(dbClient)); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
TestResponse response = actionTester.newRequest().setMethod("GET") | |||
.setMediaType(PROTOBUF) | |||
.setParam(ShowAction.PARAM_KEY, rule.getKey().toString()) | |||
.setParam(ShowAction.PARAM_ACTIVES, "true") | |||
.setParam(ShowAction.PARAM_ORGANIZATION, organization.getKey()) | |||
.execute(); | |||
assertThat(orgCaptor.getValue().getUuid()).isEqualTo(organization.getUuid()); | |||
assertThat(ruleCaptor.getValue().getKey()).isEqualTo(rule.getKey()); | |||
Rules.ShowResponse result = response.getInputObject(Rules.ShowResponse.class); | |||
Rule resultRule = result.getRule(); | |||
assertEqual(rule, ruleMetadata, resultRule); | |||
List<Rules.Active> actives = result.getActivesList(); | |||
assertThat(actives).extracting(Rules.Active::getQProfile).containsExactly(active.getQProfile()); | |||
assertThat(actives).extracting(Rules.Active::getInherit).containsExactly(active.getInherit()); | |||
assertThat(actives).extracting(Rules.Active::getSeverity).containsExactly(active.getSeverity()); | |||
} | |||
@Test | |||
public void show_rule_without_activation() throws Exception { | |||
OrganizationDto organization = dbTester.organizations().insert(); | |||
QProfileDto profile = QProfileTesting.newXooP1(organization); | |||
dbClient.qualityProfileDao().insert(dbTester.getSession(), profile); | |||
dbTester.commit(); | |||
RuleDefinitionDto rule = insertRule(); | |||
RuleMetadataDto ruleMetadata = dbTester.rules().insertOrUpdateMetadata(rule, organization); | |||
dbTester.qualityProfiles().activateRule(profile, rule, a -> a.setSeverity("BLOCKER")); | |||
ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(dbClient, esClient, new ActiveRuleIteratorFactory(dbClient)); | |||
activeRuleIndexer.indexOnStartup(activeRuleIndexer.getIndexTypes()); | |||
TestResponse response = actionTester.newRequest().setMethod("GET") | |||
.setParam(ShowAction.PARAM_KEY, rule.getKey().toString()) | |||
.setParam(ShowAction.PARAM_ORGANIZATION, organization.getKey()) | |||
.setMediaType(PROTOBUF) | |||
.execute(); | |||
Rules.ShowResponse result = response.getInputObject(Rules.ShowResponse.class); | |||
Rule resultRule = result.getRule(); | |||
assertEqual(rule, ruleMetadata, resultRule); | |||
List<Rules.Active> actives = result.getActivesList(); | |||
assertThat(actives).isEmpty(); | |||
} | |||
@Test | |||
public void throw_NotFoundException_if_organization_cannot_be_found() throws Exception { | |||
RuleDefinitionDto rule = dbTester.rules().insert(); | |||
thrown.expect(NotFoundException.class); | |||
actionTester.newRequest().setMethod("POST") | |||
.setParam("key", rule.getKey().toString()) | |||
.setParam("organization", "foo") | |||
.execute(); | |||
} | |||
private void assertEqual(RuleDefinitionDto rule, RuleMetadataDto ruleMetadata, Rule resultRule) { | |||
assertThat(resultRule.getKey()).isEqualTo(rule.getKey().toString()); | |||
assertThat(resultRule.getRepo()).isEqualTo(rule.getRepositoryKey()); | |||
assertThat(resultRule.getName()).isEqualTo(rule.getName()); | |||
assertThat(resultRule.getSeverity()).isEqualTo(rule.getSeverityString()); | |||
assertThat(resultRule.getStatus().toString()).isEqualTo(rule.getStatus().toString()); | |||
assertThat(resultRule.getInternalKey()).isEqualTo(rule.getConfigKey()); | |||
assertThat(resultRule.getIsTemplate()).isEqualTo(rule.isTemplate()); | |||
assertThat(resultRule.getTags().getTagsList()).containsExactlyInAnyOrder(ruleMetadata.getTags().toArray(new String[0])); | |||
assertThat(resultRule.getSysTags().getSysTagsList()).containsExactlyInAnyOrder(rule.getSystemTags().toArray(new String[0])); | |||
assertThat(resultRule.getLang()).isEqualTo(rule.getLanguage()); | |||
assertThat(resultRule.getParams().getParamsList()).isEmpty(); | |||
} | |||
private RuleDefinitionDto insertRule() { | |||
RuleDefinitionDto rule = dbTester.rules().insert(); | |||
ruleIndexer.indexRuleDefinition(rule.getKey()); | |||
return rule; | |||
} | |||
@SafeVarargs | |||
private final RuleMetadataDto insertMetadata(OrganizationDto organization, RuleDefinitionDto rule, Consumer<RuleMetadataDto>... populaters) { | |||
RuleMetadataDto metadata = dbTester.rules().insertOrUpdateMetadata(rule, organization, populaters); | |||
ruleIndexer.indexRuleExtension(organization, rule.getKey()); | |||
return metadata; | |||
} | |||
} |