Просмотр исходного кода

SONAR-8429 add organization parameter to api/ce/submit

remove hardcode to default organization from ComponentService
tags/6.3-RC1
Sébastien Lesaint 7 лет назад
Родитель
Сommit
c63bba3832
17 измененных файлов: 407 добавлений и 134 удалений
  1. 19
    6
      server/sonar-server/src/main/java/org/sonar/server/ce/ws/SubmitAction.java
  2. 2
    6
      server/sonar-server/src/main/java/org/sonar/server/component/ComponentService.java
  3. 17
    3
      server/sonar-server/src/main/java/org/sonar/server/component/DefaultRubyComponentService.java
  4. 64
    25
      server/sonar-server/src/main/java/org/sonar/server/component/NewComponent.java
  5. 35
    7
      server/sonar-server/src/main/java/org/sonar/server/computation/queue/ReportSubmitter.java
  6. 2
    1
      server/sonar-server/src/test/java/org/sonar/server/ce/ws/CeWsTest.java
  7. 10
    6
      server/sonar-server/src/test/java/org/sonar/server/ce/ws/SubmitActionTest.java
  8. 73
    15
      server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceTest.java
  9. 1
    5
      server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java
  10. 5
    2
      server/sonar-server/src/test/java/org/sonar/server/component/DefaultRubyComponentServiceTest.java
  11. 59
    20
      server/sonar-server/src/test/java/org/sonar/server/component/NewComponentTest.java
  12. 1
    1
      server/sonar-server/src/test/java/org/sonar/server/component/ws/BulkUpdateKeyActionTest.java
  13. 51
    20
      server/sonar-server/src/test/java/org/sonar/server/computation/queue/ReportSubmitterTest.java
  14. 57
    13
      server/sonar-server/src/test/java/org/sonar/server/organization/TestDefaultOrganizationProvider.java
  15. 1
    3
      server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/AddProjectActionTest.java
  16. 9
    0
      sonar-db/src/test/java/org/sonar/db/component/ComponentDbTester.java
  17. 1
    1
      sonar-plugin-api/src/main/java/org/sonar/api/server/ws/Request.java

+ 19
- 6
server/sonar-server/src/main/java/org/sonar/server/ce/ws/SubmitAction.java Просмотреть файл

@@ -27,20 +27,24 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.ce.queue.CeTask;
import org.sonar.server.computation.queue.ReportSubmitter;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.ws.WsUtils;
import org.sonarqube.ws.WsCe;

public class SubmitAction implements CeWsAction {

public static final String PARAM_PROJECT_KEY = "projectKey";
public static final String PARAM_PROJECT_BRANCH = "projectBranch";
public static final String PARAM_PROJECT_NAME = "projectName";
public static final String PARAM_REPORT_DATA = "report";
private static final String PARAM_ORGANIZATION_KEY = "organization";
private static final String PARAM_PROJECT_KEY = "projectKey";
private static final String PARAM_PROJECT_BRANCH = "projectBranch";
private static final String PARAM_PROJECT_NAME = "projectName";
private static final String PARAM_REPORT_DATA = "report";

private final ReportSubmitter reportSubmitter;
private final DefaultOrganizationProvider defaultOrganizationProvider;

public SubmitAction(ReportSubmitter reportSubmitter) {
public SubmitAction(ReportSubmitter reportSubmitter, DefaultOrganizationProvider defaultOrganizationProvider) {
this.reportSubmitter = reportSubmitter;
this.defaultOrganizationProvider = defaultOrganizationProvider;
}

@Override
@@ -54,6 +58,12 @@ public class SubmitAction implements CeWsAction {
.setHandler(this)
.setResponseExample(getClass().getResource("submit-example.json"));

action.createParam(PARAM_ORGANIZATION_KEY)
.setDescription("Key of the organization the project belongs to")
.setExampleValue("my-org")
.setSince("6.3")
.setInternal(true);

action
.createParam(PARAM_PROJECT_KEY)
.setRequired(true)
@@ -79,13 +89,16 @@ public class SubmitAction implements CeWsAction {

@Override
public void handle(Request wsRequest, Response wsResponse) throws Exception {
String organizationKey = wsRequest.getParam(PARAM_ORGANIZATION_KEY)
.emptyAsNull()
.or(defaultOrganizationProvider.get()::getKey);
String projectKey = wsRequest.mandatoryParam(PARAM_PROJECT_KEY);
String projectBranch = wsRequest.param(PARAM_PROJECT_BRANCH);
String projectName = StringUtils.defaultIfBlank(wsRequest.param(PARAM_PROJECT_NAME), projectKey);

CeTask task;
try (InputStream report = new BufferedInputStream(wsRequest.paramAsInputStream(PARAM_REPORT_DATA))) {
task = reportSubmitter.submit(projectKey, projectBranch, projectName, report);
task = reportSubmitter.submit(organizationKey, projectKey, projectBranch, projectName, report);
}

WsCe.SubmitResponse submitResponse = WsCe.SubmitResponse.newBuilder()

+ 2
- 6
server/sonar-server/src/main/java/org/sonar/server/component/ComponentService.java Просмотреть файл

@@ -45,7 +45,6 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.server.component.es.ProjectMeasuresIndexer;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.user.UserSession;

import static com.google.common.collect.Lists.newArrayList;
@@ -63,18 +62,15 @@ public class ComponentService {
private final System2 system2;
private final ComponentFinder componentFinder;
private final ProjectMeasuresIndexer projectMeasuresIndexer;
private final DefaultOrganizationProvider defaultOrganizationProvider;

public ComponentService(DbClient dbClient, I18n i18n, UserSession userSession, System2 system2,
ComponentFinder componentFinder, ProjectMeasuresIndexer projectMeasuresIndexer,
DefaultOrganizationProvider defaultOrganizationProvider) {
ComponentFinder componentFinder, ProjectMeasuresIndexer projectMeasuresIndexer) {
this.dbClient = dbClient;
this.i18n = i18n;
this.userSession = userSession;
this.system2 = system2;
this.componentFinder = componentFinder;
this.projectMeasuresIndexer = projectMeasuresIndexer;
this.defaultOrganizationProvider = defaultOrganizationProvider;
}

public ComponentDto getByKey(String key) {
@@ -162,7 +158,7 @@ public class ComponentService {

String uuid = Uuids.create();
ComponentDto component = new ComponentDto()
.setOrganizationUuid(defaultOrganizationProvider.get().getUuid())
.setOrganizationUuid(newComponent.getOrganizationUuid())
.setUuid(uuid)
.setUuidPath(ComponentDto.UUID_PATH_OF_ROOT)
.setRootUuid(uuid)

+ 17
- 3
server/sonar-server/src/main/java/org/sonar/server/component/DefaultRubyComponentService.java Просмотреть файл

@@ -33,9 +33,12 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ResourceDao;
import org.sonar.db.component.ResourceDto;
import org.sonar.server.favorite.FavoriteUpdater;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.permission.PermissionTemplateService;
import org.sonar.server.util.RubyUtils;

import static org.sonar.server.component.NewComponent.newComponentBuilder;

public class DefaultRubyComponentService implements RubyComponentService {

private final DbClient dbClient;
@@ -43,14 +46,17 @@ public class DefaultRubyComponentService implements RubyComponentService {
private final ComponentService componentService;
private final PermissionTemplateService permissionTemplateService;
private final FavoriteUpdater favoriteUpdater;
private final DefaultOrganizationProvider defaultOrganizationProvider;

public DefaultRubyComponentService(DbClient dbClient, ResourceDao resourceDao, ComponentService componentService, PermissionTemplateService permissionTemplateService,
FavoriteUpdater favoriteUpdater) {
public DefaultRubyComponentService(DbClient dbClient, ResourceDao resourceDao, ComponentService componentService,
PermissionTemplateService permissionTemplateService, FavoriteUpdater favoriteUpdater,
DefaultOrganizationProvider defaultOrganizationProvider) {
this.dbClient = dbClient;
this.resourceDao = resourceDao;
this.componentService = componentService;
this.permissionTemplateService = permissionTemplateService;
this.favoriteUpdater = favoriteUpdater;
this.defaultOrganizationProvider = defaultOrganizationProvider;
}

@Override
@@ -84,7 +90,15 @@ public class DefaultRubyComponentService implements RubyComponentService {
}

public long createComponent(DbSession dbSession, String key, @Nullable String branch, String name, @Nullable String qualifier) {
ComponentDto provisionedComponent = componentService.create(dbSession, NewComponent.create(key, name).setQualifier(qualifier).setBranch(branch));
ComponentDto provisionedComponent = componentService.create(
dbSession,
newComponentBuilder()
.setOrganizationUuid(defaultOrganizationProvider.get().getUuid())
.setKey(key)
.setName(name)
.setQualifier(qualifier)
.setBranch(branch)
.build());
permissionTemplateService.applyDefaultPermissionTemplate(dbSession, provisionedComponent.getKey());
if (Qualifiers.PROJECT.equals(provisionedComponent.qualifier())
&& permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, provisionedComponent)) {

+ 64
- 25
server/sonar-server/src/main/java/org/sonar/server/component/NewComponent.java Просмотреть файл

@@ -20,24 +20,36 @@
package org.sonar.server.component;

import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import org.sonar.api.resources.Qualifiers;

import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
import static org.sonar.db.component.ComponentValidator.checkComponentKey;
import static org.sonar.db.component.ComponentValidator.checkComponentName;
import static org.sonar.db.component.ComponentValidator.checkComponentQualifier;

@Immutable
public class NewComponent {
private final String organizationUuid;
private final String key;
private final String branch;
private final String qualifier;
private final String name;

private String key;
private String branch;
private String qualifier;
private String name;
private NewComponent(NewComponent.Builder builder) {
this.organizationUuid = builder.organizationUuid;
this.key = builder.key;
this.branch = builder.branch;
this.qualifier = builder.qualifier == null ? Qualifiers.PROJECT : checkComponentQualifier(builder.qualifier);
this.name = builder.name;
}

public static Builder newComponentBuilder() {
return new Builder();
}

public NewComponent(String key, String name) {
this.key = key;
this.name = name;
public String getOrganizationUuid() {
return organizationUuid;
}

public String key() {
@@ -53,25 +65,52 @@ public class NewComponent {
return branch;
}

public NewComponent setBranch(@Nullable String branch) {
this.branch = branch;
return this;
}

public String qualifier() {
return qualifier != null ? qualifier : Qualifiers.PROJECT;
return qualifier;
}

public NewComponent setQualifier(@Nullable String qualifier) {
this.qualifier = qualifier == null ? null : checkComponentQualifier(qualifier);
return this;
}
public static class Builder {
private String organizationUuid;
private String key;
private String branch;
private String qualifier;
private String name;

private Builder() {
// use static factory method newComponentBuilder()
}

public static NewComponent create(String key, String name) {
checkArgument(key!=null, "Key can't be null");
checkComponentKey(key);
checkArgument(name!=null, "Name can't be null");
checkComponentName(name);
return new NewComponent(key, name);
public Builder setOrganizationUuid(String organizationUuid) {
this.organizationUuid = organizationUuid;
return this;
}

public Builder setKey(String key) {
this.key = key;
return this;
}

public Builder setBranch(String branch) {
this.branch = branch;
return this;
}

public Builder setQualifier(String qualifier) {
this.qualifier = qualifier;
return this;
}

public Builder setName(String name) {
this.name = name;
return this;
}

public NewComponent build() {
requireNonNull(organizationUuid, "organization uuid can't be null");
checkComponentKey(requireNonNull(key, "key can't be null"));
checkComponentName(requireNonNull(name, "name can't be null"));
return new NewComponent(this);
}
}

}

+ 35
- 7
server/sonar-server/src/main/java/org/sonar/server/computation/queue/ReportSubmitter.java Просмотреть файл

@@ -33,13 +33,18 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.ce.CeTaskTypes;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.server.component.ComponentService;
import org.sonar.server.favorite.FavoriteUpdater;
import org.sonar.server.component.NewComponent;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.favorite.FavoriteUpdater;
import org.sonar.server.permission.PermissionTemplateService;
import org.sonar.server.user.UserSession;

import static com.google.common.base.Preconditions.checkArgument;
import static java.lang.String.format;
import static org.sonar.core.permission.GlobalPermissions.SCAN_EXECUTION;
import static org.sonar.server.component.NewComponent.newComponentBuilder;
import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;

@ServerSide
@@ -62,17 +67,36 @@ public class ReportSubmitter {
this.favoriteUpdater = favoriteUpdater;
}

public CeTask submit(String projectKey, @Nullable String projectBranch, @Nullable String projectName, InputStream reportInput) {
/**
* @throws NotFoundException if the organization with the specified key does not exist
* @throws IllegalArgumentException if the organization with the specified key is not the organization of the specified project (when it already exists in DB)
*/
public CeTask submit(String organizationKey, String projectKey, @Nullable String projectBranch, @Nullable String projectName, InputStream reportInput) {
try (DbSession dbSession = dbClient.openSession(false)) {
String effectiveProjectKey = ComponentKeys.createKey(projectKey, projectBranch);
OrganizationDto organizationDto = getOrganizationDtoOrFail(dbSession, organizationKey);
Optional<ComponentDto> opt = dbClient.componentDao().selectByKey(dbSession, effectiveProjectKey);
ComponentDto project = opt.or(() -> createProject(dbSession, projectKey, projectBranch, projectName));
ensureOrganizationIsConsistent(opt, organizationDto);
ComponentDto project = opt.or(() -> createProject(dbSession, organizationDto.getUuid(), projectKey, projectBranch, projectName));
userSession.checkComponentUuidPermission(SCAN_EXECUTION, project.uuid());
return submitReport(dbSession, reportInput, project);
}
}

private ComponentDto createProject(DbSession dbSession, String projectKey, @Nullable String projectBranch, @Nullable String projectName) {
private OrganizationDto getOrganizationDtoOrFail(DbSession dbSession, String organizationKey) {
return dbClient.organizationDao().selectByKey(dbSession, organizationKey)
.orElseThrow(() -> new NotFoundException(format("Organization with key '%s' does not exist", organizationKey)));
}

private void ensureOrganizationIsConsistent(Optional<ComponentDto> project, OrganizationDto organizationDto) {
if (project.isPresent()) {
checkArgument(project.get().getOrganizationUuid().equals(organizationDto.getUuid()),
"Organization of component with key '%s' does not match specified organization '%s'",
project.get().key(), organizationDto.getKey());
}
}

private ComponentDto createProject(DbSession dbSession, String organizationUuid, String projectKey, @Nullable String projectBranch, @Nullable String projectName) {
Integer userId = userSession.getUserId();
Long projectCreatorUserId = userId == null ? null : userId.longValue();

@@ -82,9 +106,13 @@ public class ReportSubmitter {
throw insufficientPrivilegesException();
}

NewComponent newProject = new NewComponent(projectKey, StringUtils.defaultIfBlank(projectName, projectKey));
newProject.setBranch(projectBranch);
newProject.setQualifier(Qualifiers.PROJECT);
NewComponent newProject = newComponentBuilder()
.setOrganizationUuid(organizationUuid)
.setKey(projectKey)
.setName(StringUtils.defaultIfBlank(projectName, projectKey))
.setBranch(projectBranch)
.setQualifier(Qualifiers.PROJECT)
.build();
// "provisioning" permission is check in ComponentService
ComponentDto project = componentService.create(dbSession, newProject);
if (permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(dbSession, project)) {

+ 2
- 1
server/sonar-server/src/test/java/org/sonar/server/ce/ws/CeWsTest.java Просмотреть файл

@@ -23,6 +23,7 @@ import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.api.server.ws.WebService;
import org.sonar.server.computation.queue.ReportSubmitter;
import org.sonar.server.organization.DefaultOrganizationProvider;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
@@ -31,7 +32,7 @@ public class CeWsTest {

@Test
public void define() throws Exception {
CeWsAction wsAction = new SubmitAction(mock(ReportSubmitter.class));
CeWsAction wsAction = new SubmitAction(mock(ReportSubmitter.class), mock(DefaultOrganizationProvider.class));

CeWs ws = new CeWs(wsAction);
WebService.Context context = mock(WebService.Context.class, Mockito.RETURNS_DEEP_STUBS);

+ 10
- 6
server/sonar-server/src/test/java/org/sonar/server/ce/ws/SubmitActionTest.java Просмотреть файл

@@ -26,6 +26,8 @@ import org.sonar.ce.queue.CeTask;
import org.sonar.core.util.Protobuf;
import org.sonar.db.ce.CeTaskTypes;
import org.sonar.server.computation.queue.ReportSubmitter;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.ws.TestResponse;
import org.sonar.server.ws.WsActionTester;
import org.sonar.test.JsonAssert;
@@ -48,13 +50,15 @@ public class SubmitActionTest {
.setComponentUuid("PROJECT_1").setSubmitterLogin("robert")
.build();

private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.fromUuid("org1");
private String organizationKey = defaultOrganizationProvider.get().getKey();
private ReportSubmitter reportSubmitter = mock(ReportSubmitter.class);
private SubmitAction underTest = new SubmitAction(reportSubmitter);
private SubmitAction underTest = new SubmitAction(reportSubmitter, defaultOrganizationProvider);
private WsActionTester tester = new WsActionTester(underTest);

@Test
public void submit_task_to_the_queue_and_ask_for_immediate_processing() {
when(reportSubmitter.submit(eq("my_project"), Matchers.isNull(String.class), eq("My Project"), any(InputStream.class)))
when(reportSubmitter.submit(eq(organizationKey), eq("my_project"), Matchers.isNull(String.class), eq("My Project"), any(InputStream.class)))
.thenReturn(A_CE_TASK);

TestResponse wsResponse = tester.newRequest()
@@ -65,7 +69,7 @@ public class SubmitActionTest {
.setMethod("POST")
.execute();

verify(reportSubmitter).submit(eq("my_project"), Matchers.isNull(String.class), eq("My Project"), any(InputStream.class));
verify(reportSubmitter).submit(eq(organizationKey), eq("my_project"), Matchers.isNull(String.class), eq("My Project"), any(InputStream.class));

WsCe.SubmitResponse submitResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.SubmitResponse.PARSER);
assertThat(submitResponse.getTaskId()).isEqualTo("TASK_1");
@@ -74,7 +78,7 @@ public class SubmitActionTest {

@Test
public void test_example_json_response() {
when(reportSubmitter.submit(eq("my_project"), Matchers.isNull(String.class), eq("My Project"), any(InputStream.class)))
when(reportSubmitter.submit(eq(organizationKey), eq("my_project"), Matchers.isNull(String.class), eq("My Project"), any(InputStream.class)))
.thenReturn(A_CE_TASK);

TestResponse wsResponse = tester.newRequest()
@@ -93,7 +97,7 @@ public class SubmitActionTest {
*/
@Test
public void project_name_is_optional() {
when(reportSubmitter.submit(eq("my_project"), Matchers.isNull(String.class), eq("my_project"), any(InputStream.class)))
when(reportSubmitter.submit(eq(organizationKey), eq("my_project"), Matchers.isNull(String.class), eq("my_project"), any(InputStream.class)))
.thenReturn(A_CE_TASK);

tester.newRequest()
@@ -103,7 +107,7 @@ public class SubmitActionTest {
.setMethod("POST")
.execute();

verify(reportSubmitter).submit(eq("my_project"), Matchers.isNull(String.class), eq("my_project"), any(InputStream.class));
verify(reportSubmitter).submit(eq(organizationKey), eq("my_project"), Matchers.isNull(String.class), eq("my_project"), any(InputStream.class));

}
}

+ 73
- 15
server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceTest.java Просмотреть файл

@@ -43,8 +43,6 @@ import org.sonar.server.es.EsTester;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.i18n.I18nRule;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.tester.UserSessionRule;

import static com.google.common.collect.Lists.newArrayList;
@@ -60,11 +58,14 @@ import static org.sonar.core.permission.GlobalPermissions.PROVISIONING;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newModuleDto;
import static org.sonar.db.component.ComponentTesting.newProjectDto;
import static org.sonar.server.component.NewComponent.newComponentBuilder;
import static org.sonar.server.component.es.ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES;
import static org.sonar.server.component.es.ProjectMeasuresIndexDefinition.TYPE_PROJECT_MEASURES;

public class ComponentServiceTest {

private static final String ORGANIZATION_UUID = "org 1A";

private System2 system2 = System2.INSTANCE;

@Rule
@@ -81,7 +82,6 @@ public class ComponentServiceTest {
private DbSession dbSession = dbTester.getSession();
private I18nRule i18n = new I18nRule();
private ProjectMeasuresIndexer projectMeasuresIndexer = new ProjectMeasuresIndexer(system2, dbClient, es.client());
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester);

private ComponentService underTest;

@@ -89,8 +89,7 @@ public class ComponentServiceTest {
public void setUp() {
i18n.put("qualifier.TRK", "Project");

underTest = new ComponentService(dbClient, i18n, userSession, system2, new ComponentFinder(dbClient),
projectMeasuresIndexer, defaultOrganizationProvider);
underTest = new ComponentService(dbClient, i18n, userSession, system2, new ComponentFinder(dbClient), projectMeasuresIndexer);
}

@Test
@@ -123,9 +122,17 @@ public class ComponentServiceTest {
public void create_project() {
userSession.login("john").setGlobalPermissions(PROVISIONING);

String key = underTest.create(dbSession, NewComponent.create("struts", "Struts project")).getKey();
String key = underTest.create(
dbSession,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey("struts")
.setName("Struts project")
.build())
.getKey();

ComponentDto project = underTest.getNullableByKey(key);
assertThat(project.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
assertThat(project.key()).isEqualTo("struts");
assertThat(project.deprecatedKey()).isEqualTo("struts");
assertThat(project.uuid()).isNotNull();
@@ -145,9 +152,18 @@ public class ComponentServiceTest {
public void create_new_project_with_branch() {
userSession.login("john").setGlobalPermissions(PROVISIONING);

String key = underTest.create(dbSession, NewComponent.create("struts", "Struts project").setBranch("origin/branch")).getKey();
String key = underTest.create(
dbSession,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey("struts")
.setName("Struts project")
.setBranch("origin/branch")
.build())
.getKey();

ComponentDto project = underTest.getNullableByKey(key);
assertThat(project.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
assertThat(project.key()).isEqualTo("struts:origin/branch");
assertThat(project.deprecatedKey()).isEqualTo("struts:origin/branch");
}
@@ -156,9 +172,18 @@ public class ComponentServiceTest {
public void create_view() {
userSession.login("john").setGlobalPermissions(PROVISIONING);

String key = underTest.create(dbSession, NewComponent.create("all-project", "All Projects").setQualifier(Qualifiers.VIEW)).getKey();
String key = underTest.create(
dbSession,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey("all-project")
.setName("All Projects")
.setQualifier(Qualifiers.VIEW)
.build())
.getKey();

ComponentDto project = underTest.getNullableByKey(key);
assertThat(project.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
assertThat(project.key()).isEqualTo("all-project");
assertThat(project.deprecatedKey()).isEqualTo("all-project");
assertThat(project.uuid()).isNotNull();
@@ -179,10 +204,19 @@ public class ComponentServiceTest {
// No permission should be required to create a developer
userSession.anonymous();

String key = underTest.createDeveloper(dbTester.getSession(), NewComponent.create("DEV:jon.name@mail.com", "John").setQualifier("DEV")).getKey();
String key = underTest.createDeveloper(
dbSession,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey("DEV:jon.name@mail.com")
.setName("John")
.setQualifier("DEV")
.build())
.getKey();
dbTester.getSession().commit();

ComponentDto dev = underTest.getNullableByKey(key);
assertThat(dev.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
assertThat(dev.key()).isEqualTo("DEV:jon.name@mail.com");
assertThat(dev.deprecatedKey()).isEqualTo("DEV:jon.name@mail.com");
assertThat(dev.uuid()).isNotNull();
@@ -204,7 +238,13 @@ public class ComponentServiceTest {
expectedException.expect(BadRequestException.class);
expectedException.expectMessage("Malformed key for Project: struts?parent. Allowed characters are alphanumeric, '-', '_', '.' and ':', with at least one non-digit.");

underTest.create(dbSession, NewComponent.create("struts?parent", "Struts project"));
underTest.create(
dbSession,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey("struts?parent")
.setName("Struts project")
.build());
}

@Test
@@ -214,7 +254,14 @@ public class ComponentServiceTest {

userSession.login("john").setGlobalPermissions(PROVISIONING);

underTest.create(dbSession, NewComponent.create("struts", "Struts project").setBranch("origin?branch"));
underTest.create(
dbSession,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey("struts")
.setName("Struts project")
.setBranch("origin?branch")
.build());
}

@Test
@@ -227,7 +274,13 @@ public class ComponentServiceTest {
dbClient.componentDao().insert(dbSession, project);
dbSession.commit();

underTest.create(dbSession, NewComponent.create("struts", "Struts project"));
underTest.create(
dbSession,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey("struts")
.setName("Struts project")
.build());
}

@Test
@@ -256,9 +309,14 @@ public class ComponentServiceTest {
ComponentTesting.newProjectDto().setId(2L).setKey(projectKey),
ComponentTesting.newProjectDto().setId(3L).setKey(projectKey)));

underTest = new ComponentService(dbClient, i18n, userSession, System2.INSTANCE, new ComponentFinder(dbClient), projectMeasuresIndexer,
defaultOrganizationProvider);
underTest.create(session, NewComponent.create(projectKey, projectKey));
underTest = new ComponentService(dbClient, i18n, userSession, System2.INSTANCE, new ComponentFinder(dbClient), projectMeasuresIndexer);
underTest.create(
session,
newComponentBuilder()
.setOrganizationUuid(ORGANIZATION_UUID)
.setKey(projectKey)
.setName(projectKey)
.build());

verify(componentDao).delete(session, 2L);
verify(componentDao).delete(session, 3L);

+ 1
- 5
server/sonar-server/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java Просмотреть файл

@@ -41,7 +41,6 @@ import org.sonar.server.es.EsTester;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.i18n.I18nRule;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.tester.UserSessionRule;

import static org.assertj.core.api.Assertions.assertThat;
@@ -76,14 +75,11 @@ public class ComponentServiceUpdateKeyTest {

private ProjectMeasuresIndexer projectMeasuresIndexer = new ProjectMeasuresIndexer(system2, dbClient, es.client());

private ComponentService underTest;
private ComponentService underTest = new ComponentService(dbClient, i18n, userSession, system2, new ComponentFinder(dbClient), projectMeasuresIndexer);

@Before
public void setUp() {
i18n.put("qualifier.TRK", "Project");

underTest = new ComponentService(dbClient, i18n, userSession, system2, new ComponentFinder(dbClient), projectMeasuresIndexer,
TestDefaultOrganizationProvider.from(db));
}

@Test

+ 5
- 2
server/sonar-server/src/test/java/org/sonar/server/component/DefaultRubyComponentServiceTest.java Просмотреть файл

@@ -39,6 +39,7 @@ import org.sonar.server.es.EsTester;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.favorite.FavoriteUpdater;
import org.sonar.server.i18n.I18nRule;
import org.sonar.server.organization.DefaultOrganizationProvider;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.permission.PermissionTemplateService;
import org.sonar.server.tester.UserSessionRule;
@@ -71,13 +72,15 @@ public class DefaultRubyComponentServiceTest {

private ResourceDao resourceDao = dbClient.resourceDao();
private ComponentService componentService = new ComponentService(dbClient, i18n, userSession, system2, new ComponentFinder(dbClient),
new ProjectMeasuresIndexer(system2, dbClient, es.client()), TestDefaultOrganizationProvider.from(db));
new ProjectMeasuresIndexer(system2, dbClient, es.client()));
private PermissionTemplateService permissionTemplateService = mock(PermissionTemplateService.class);
private FavoriteUpdater favoriteUpdater = mock(FavoriteUpdater.class);
private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);

private ComponentDbTester componentDb = new ComponentDbTester(db);

private DefaultRubyComponentService underTest = new DefaultRubyComponentService(dbClient, resourceDao, componentService, permissionTemplateService, favoriteUpdater);
private DefaultRubyComponentService underTest = new DefaultRubyComponentService(dbClient, resourceDao, componentService,
permissionTemplateService, favoriteUpdater, defaultOrganizationProvider);

@Test
public void find_by_key() {

+ 59
- 20
server/sonar-server/src/test/java/org/sonar/server/component/NewComponentTest.java Просмотреть файл

@@ -22,50 +22,89 @@ package org.sonar.server.component;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.resources.Qualifiers;

import static com.google.common.base.Strings.repeat;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.sonar.server.component.NewComponent.newComponentBuilder;

public class NewComponentTest {
private static final String ORGANIZATION_UUID = "org1";
private static final String KEY = "key";
private static final String NAME = "name";

@Rule
public ExpectedException expectedException = ExpectedException.none();

private NewComponent.Builder underTest = newComponentBuilder();

@Test
public void build_throws_NPE_if_organizationUuid_is_null() {
expectBuildException(NullPointerException.class, "organization uuid can't be null");
}

@Test
public void build_throws_NPE_when_key_is_null() {
underTest.setOrganizationUuid(ORGANIZATION_UUID);

expectBuildException(NullPointerException.class, "key can't be null");
}

@Test
public void fail_when_key_is_null() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Key can't be null");
public void build_throws_IAE_when_key_is_longer_than_400_characters() {
underTest.setOrganizationUuid(ORGANIZATION_UUID)
.setKey(repeat("a", 400 + 1));

NewComponent.create(null, "name");
expectBuildException(
IllegalArgumentException.class,
"Component key length (401) is longer than the maximum authorized (400)");
}

@Test
public void fail_when_key_is_longer_than_400_characters() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Component key length (401) is longer than the maximum authorized (400)");
public void build_fails_with_NPE_when_name_is_null() {
underTest.setOrganizationUuid(ORGANIZATION_UUID)
.setKey(KEY);

NewComponent.create(repeat("a", 400 + 1), "name");
expectBuildException(NullPointerException.class, "name can't be null");
}

@Test
public void fail_when_name_is_null() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Name can't be null");
public void build_fails_with_IAE_when_name_is_longer_than_2000_characters() {
underTest.setOrganizationUuid(ORGANIZATION_UUID)
.setKey(KEY)
.setName(repeat("a", 2001));

NewComponent.create("key", null);
expectBuildException(
IllegalArgumentException.class,
"Component name length (2001) is longer than the maximum authorized (2000)");
}

@Test
public void fail_when_name_is_longer_than_2000_characters() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Component name length (2001) is longer than the maximum authorized (2000)");
public void build_fails_with_IAE_when_qualifier_is_longer_than_10_characters() {
underTest.setOrganizationUuid(ORGANIZATION_UUID)
.setKey(KEY)
.setName(NAME)
.setQualifier(repeat("a", 10 + 1));

NewComponent.create("key", repeat("a", 2001));
expectBuildException(
IllegalArgumentException.class,
"Component qualifier length (11) is longer than the maximum authorized (10)");
}

@Test
public void fail_when_qualifier_is_longer_than_10_characters() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Component qualifier length (11) is longer than the maximum authorized (10)");
public void getQualifier_returns_PROJECT_when_no_set_in_builder() {
NewComponent newComponent = underTest.setOrganizationUuid(ORGANIZATION_UUID)
.setKey(KEY)
.setName(NAME)
.build();

assertThat(newComponent.qualifier()).isEqualTo(Qualifiers.PROJECT);
}

private void expectBuildException(Class<? extends Exception> expectedExceptionType, String expectedMessage) {
expectedException.expect(expectedExceptionType);
expectedException.expectMessage(expectedMessage);

NewComponent.create("key", "name").setQualifier(repeat("a", 10 + 1));
underTest.build();
}
}

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/component/ws/BulkUpdateKeyActionTest.java Просмотреть файл

@@ -88,7 +88,7 @@ public class BulkUpdateKeyActionTest {
private ComponentFinder componentFinder = new ComponentFinder(dbClient);

private WsActionTester ws = new WsActionTester(
new BulkUpdateKeyAction(dbClient, componentFinder, new ComponentService(dbClient, null, null, null, null, new ProjectMeasuresIndexer(system2, dbClient, es.client()), null), userSession));
new BulkUpdateKeyAction(dbClient, componentFinder, new ComponentService(dbClient, null, null, null, null, new ProjectMeasuresIndexer(system2, dbClient, es.client())), userSession));

@Before
public void setUp() {

+ 51
- 20
server/sonar-server/src/test/java/org/sonar/server/computation/queue/ReportSubmitterTest.java Просмотреть файл

@@ -22,6 +22,7 @@ package org.sonar.server.computation.queue;
import org.apache.commons.io.IOUtils;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -35,7 +36,9 @@ import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeTaskTypes;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.server.component.ComponentService;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.favorite.FavoriteUpdater;
import org.sonar.server.component.NewComponent;
import org.sonar.server.exceptions.ForbiddenException;
@@ -64,13 +67,12 @@ public class ReportSubmitterTest {

@Rule
public ExpectedException thrown = ExpectedException.none();

@Rule
public UserSessionRule userSession = UserSessionRule.standalone();

@Rule
public DbTester db = DbTester.create(System2.INSTANCE);

private String defaultOrganizationKey;
private CeQueue queue = mock(CeQueueImpl.class);
private ComponentService componentService = mock(ComponentService.class);
private PermissionTemplateService permissionTemplateService = mock(PermissionTemplateService.class);
@@ -78,14 +80,37 @@ public class ReportSubmitterTest {

private ReportSubmitter underTest = new ReportSubmitter(queue, userSession, componentService, permissionTemplateService, db.getDbClient(), favoriteUpdater);

@Before
public void setUp() throws Exception {
defaultOrganizationKey = db.getDefaultOrganization().getKey();
}

@Test
public void submit_fails_with_NotFoundException_if_organization_with_specified_key_does_not_exist() {
thrown.expect(NotFoundException.class);
thrown.expectMessage("Organization with key 'fop' does not exist");

underTest.submit("fop", PROJECT_KEY, null, null, null /*method will fail before parameter is used*/);
}

@Test
public void submit_fails_with_organizationKey_does_not_match_organization_of_specified_component() {
userSession.setGlobalPermissions(SCAN_EXECUTION);
OrganizationDto organization = db.organizations().insert();
ComponentDto project = db.components().insertProject(organization);
mockSuccessfulPrepareSubmitCall();

underTest.submit(organization.getKey(), project.getKey(), null, project.name(), IOUtils.toInputStream("{binary}"));
}

@Test
public void submit_a_report_on_existing_project() {
userSession.setGlobalPermissions(SCAN_EXECUTION);
ComponentDto project = db.components().insertProject();
ComponentDto project = db.components().insertProject(db.getDefaultOrganization());

when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
mockSuccessfulPrepareSubmitCall();

underTest.submit(project.getKey(), null, project.name(), IOUtils.toInputStream("{binary}"));
underTest.submit(defaultOrganizationKey, project.getKey(), null, project.name(), IOUtils.toInputStream("{binary}"));

verifyReportIsPersisted(TASK_UUID);
verifyZeroInteractions(permissionTemplateService);
@@ -106,16 +131,17 @@ public class ReportSubmitterTest {

@Test
public void provision_project_if_does_not_exist() throws Exception {
OrganizationDto organization = db.organizations().insert();
userSession.setGlobalPermissions(SCAN_EXECUTION, PROVISIONING);

when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
mockSuccessfulPrepareSubmitCall();
ComponentDto createdProject = new ComponentDto().setId(23L).setUuid(PROJECT_UUID).setKey(PROJECT_KEY);
when(componentService.create(any(DbSession.class), any(NewComponent.class))).thenReturn(createdProject);
when(permissionTemplateService.wouldUserHavePermissionWithDefaultTemplate(any(DbSession.class), anyLong(), eq(SCAN_EXECUTION), anyString(), eq(PROJECT_KEY), eq(Qualifiers.PROJECT)))
.thenReturn(true);
when(permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(any(DbSession.class), any(ComponentDto.class))).thenReturn(true);

underTest.submit(PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));
underTest.submit(organization.getKey(), PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));

verifyReportIsPersisted(TASK_UUID);
verify(permissionTemplateService).applyDefault(any(DbSession.class), eq(createdProject), anyLong());
@@ -138,14 +164,14 @@ public class ReportSubmitterTest {
public void no_favorite_when_no_project_creator_permission_on_permission_template() {
userSession.setGlobalPermissions(SCAN_EXECUTION, PROVISIONING);

when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
mockSuccessfulPrepareSubmitCall();
ComponentDto createdProject = new ComponentDto().setId(23L).setUuid(PROJECT_UUID).setKey(PROJECT_KEY);
when(componentService.create(any(DbSession.class), any(NewComponent.class))).thenReturn(createdProject);
when(permissionTemplateService.wouldUserHavePermissionWithDefaultTemplate(any(DbSession.class), anyLong(), eq(SCAN_EXECUTION), anyString(), eq(PROJECT_KEY), eq(Qualifiers.PROJECT)))
.thenReturn(true);
when(permissionTemplateService.hasDefaultTemplateWithPermissionOnProjectCreator(any(DbSession.class), any(ComponentDto.class))).thenReturn(false);

underTest.submit(PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));
underTest.submit(defaultOrganizationKey, PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));

verifyZeroInteractions(favoriteUpdater);
}
@@ -154,36 +180,37 @@ public class ReportSubmitterTest {
public void submit_a_report_on_new_project_with_global_scan_permission() {
userSession.setGlobalPermissions(SCAN_EXECUTION, PROVISIONING);

when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
mockSuccessfulPrepareSubmitCall();
when(componentService.create(any(DbSession.class), any(NewComponent.class))).thenReturn(new ComponentDto().setId(23L).setUuid(PROJECT_UUID).setKey(PROJECT_KEY));
when(permissionTemplateService.wouldUserHavePermissionWithDefaultTemplate(any(DbSession.class), anyLong(), eq(SCAN_EXECUTION), anyString(), eq(PROJECT_KEY), eq(Qualifiers.PROJECT)))
.thenReturn(true);

underTest.submit(PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));
underTest.submit(defaultOrganizationKey, PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));

verify(queue).submit(any(CeTaskSubmit.class));
}

@Test
public void submit_a_report_on_existing_project_with_global_scan_permission() {
ComponentDto project = db.components().insertProject();
userSession.setGlobalPermissions(SCAN_EXECUTION);

when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
ComponentDto project = db.components().insertProject(db.getDefaultOrganization());

underTest.submit(project.getKey(), null, project.name(), IOUtils.toInputStream("{binary}"));
mockSuccessfulPrepareSubmitCall();

underTest.submit(defaultOrganizationKey, project.getKey(), null, project.name(), IOUtils.toInputStream("{binary}"));

verify(queue).submit(any(CeTaskSubmit.class));
}

@Test
public void submit_a_report_on_existing_project_with_project_scan_permission() {
ComponentDto project = db.components().insertProject();
ComponentDto project = db.components().insertProject(db.getDefaultOrganization());
userSession.addProjectUuidPermissions(SCAN_EXECUTION, project.uuid());

when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
mockSuccessfulPrepareSubmitCall();

underTest.submit(project.getKey(), null, project.name(), IOUtils.toInputStream("{binary}"));
underTest.submit(defaultOrganizationKey, project.getKey(), null, project.name(), IOUtils.toInputStream("{binary}"));

verify(queue).submit(any(CeTaskSubmit.class));
}
@@ -193,22 +220,26 @@ public class ReportSubmitterTest {
userSession.setGlobalPermissions(GlobalPermissions.QUALITY_GATE_ADMIN);

thrown.expect(ForbiddenException.class);
underTest.submit(PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));
underTest.submit(defaultOrganizationKey, PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));
}

@Test
public void fail_with_forbidden_exception_on_new_project_when_only_project_scan_permission() {
userSession.addProjectUuidPermissions(SCAN_EXECUTION, PROJECT_UUID);

when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
mockSuccessfulPrepareSubmitCall();
when(componentService.create(any(DbSession.class), any(NewComponent.class))).thenReturn(new ComponentDto().setUuid(PROJECT_UUID).setKey(PROJECT_KEY));

thrown.expect(ForbiddenException.class);
underTest.submit(PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));
underTest.submit(defaultOrganizationKey, PROJECT_KEY, null, PROJECT_NAME, IOUtils.toInputStream("{binary}"));
}

private void verifyReportIsPersisted(String taskUuid) {
assertThat(db.selectFirst("select task_uuid from ce_task_input where task_uuid='" + taskUuid + "'")).isNotNull();
}

private void mockSuccessfulPrepareSubmitCall() {
when(queue.prepareSubmit()).thenReturn(new CeTaskSubmit.Builder(TASK_UUID));
}

}

+ 57
- 13
server/sonar-server/src/test/java/org/sonar/server/organization/TestDefaultOrganizationProvider.java Просмотреть файл

@@ -19,33 +19,77 @@
*/
package org.sonar.server.organization;

import java.util.Date;
import org.sonar.db.DbTester;
import org.sonar.db.organization.OrganizationDto;

public class TestDefaultOrganizationProvider implements DefaultOrganizationProvider {

private final DbTester dbTester;
private final DefaultOrganizationProvider delegate;

private TestDefaultOrganizationProvider(DbTester dbTester) {
this.dbTester = dbTester;
private TestDefaultOrganizationProvider(DefaultOrganizationProvider delegate) {
this.delegate = delegate;
}

public static TestDefaultOrganizationProvider from(DbTester dbTester) {
return new TestDefaultOrganizationProvider(dbTester);
return new TestDefaultOrganizationProvider(new DbTesterDefaultOrganizationProvider(dbTester));
}

public static TestDefaultOrganizationProvider fromUuid(String uuid) {
long createdAt = new Date().getTime();
return new TestDefaultOrganizationProvider(
new ImmutableDefaultOrganizationProvider(
DefaultOrganization.newBuilder()
.setUuid(uuid)
.setKey("key_" + uuid)
.setName("name_" + uuid)
.setCreatedAt(createdAt)
.setUpdatedAt(createdAt)
.build()));
}

@Override
public DefaultOrganization get() {
return toDefaultOrganization(dbTester.getDefaultOrganization());
return delegate.get();
}

private static DefaultOrganization toDefaultOrganization(OrganizationDto organizationDto) {
return DefaultOrganization.newBuilder()
.setUuid(organizationDto.getUuid())
.setKey(organizationDto.getKey())
.setName(organizationDto.getName())
.setCreatedAt(organizationDto.getCreatedAt())
.setUpdatedAt(organizationDto.getUpdatedAt())
.build();
private static final class ImmutableDefaultOrganizationProvider implements DefaultOrganizationProvider {
private final DefaultOrganization defaultOrganization;

private ImmutableDefaultOrganizationProvider(DefaultOrganization defaultOrganization) {
this.defaultOrganization = defaultOrganization;
}

@Override
public DefaultOrganization get() {
return defaultOrganization;
}
}

private static final class DbTesterDefaultOrganizationProvider implements DefaultOrganizationProvider {
private final DbTester dbTester;
private DefaultOrganization defaultOrganization = null;

private DbTesterDefaultOrganizationProvider(DbTester dbTester) {
this.dbTester = dbTester;
}

@Override
public DefaultOrganization get() {
if (defaultOrganization == null) {
defaultOrganization = toDefaultOrganization(dbTester.getDefaultOrganization());
}
return defaultOrganization;
}

private static DefaultOrganization toDefaultOrganization(OrganizationDto organizationDto) {
return DefaultOrganization.newBuilder()
.setUuid(organizationDto.getUuid())
.setKey(organizationDto.getKey())
.setName(organizationDto.getName())
.setCreatedAt(organizationDto.getCreatedAt())
.setUpdatedAt(organizationDto.getUpdatedAt())
.build();
}
}
}

+ 1
- 3
server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/AddProjectActionTest.java Просмотреть файл

@@ -39,7 +39,6 @@ import org.sonar.server.component.es.ProjectMeasuresIndexDefinition;
import org.sonar.server.component.es.ProjectMeasuresIndexer;
import org.sonar.server.es.EsTester;
import org.sonar.server.language.LanguageTesting;
import org.sonar.server.organization.TestDefaultOrganizationProvider;
import org.sonar.server.qualityprofile.QProfileLookup;
import org.sonar.server.qualityprofile.QProfileName;
import org.sonar.server.qualityprofile.QProfileProjectOperations;
@@ -80,8 +79,7 @@ public class AddProjectActionTest {

private WsActionTester ws = new WsActionTester(new AddProjectAction(projectAssociationParameters,
qProfileProjectOperations, new ProjectAssociationFinder(new QProfileLookup(dbClient),
new ComponentService(dbClient, null, userSession, null, new ComponentFinder(dbClient), new ProjectMeasuresIndexer(system2, dbClient, es.client()),
TestDefaultOrganizationProvider.from(dbTester))),
new ComponentService(dbClient, null, userSession, null, new ComponentFinder(dbClient), new ProjectMeasuresIndexer(system2, dbClient, es.client()))),
userSession));

@Before

+ 9
- 0
sonar-db/src/test/java/org/sonar/db/component/ComponentDbTester.java Просмотреть файл

@@ -24,6 +24,7 @@ import org.sonar.api.resources.Qualifiers;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.organization.OrganizationDto;

import static java.util.Arrays.asList;
import static org.sonar.db.component.ComponentTesting.newProjectDto;
@@ -78,6 +79,14 @@ public class ComponentDbTester {
return project;
}

public ComponentDto insertProject(OrganizationDto organizationDto) {
ComponentDto project = newProjectDto().setOrganizationUuid(organizationDto.getUuid());
dbClient.componentDao().insert(dbSession, project);
db.commit();

return project;
}

public void insertComponents(ComponentDto... components) {
dbClient.componentDao().insert(dbSession, asList(components));
db.commit();

+ 1
- 1
sonar-plugin-api/src/main/java/org/sonar/api/server/ws/Request.java Просмотреть файл

@@ -445,7 +445,7 @@ public abstract class Request {
/**
* Extends {@link Param} with convenience methods specific to the type {@link String}.
*/
interface StringParam extends Param<String> {
public interface StringParam extends Param<String> {
/**
* Returns a {@link StringParam} object which methods {@link #getValue()} and {@link #or(Supplier)} will
* return {@code null} rather than an empty String when the param is present and its value is an empty String.

Загрузка…
Отмена
Сохранить