From e49917e68f5a9733b1582fe217c42302649bfb47 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Mon, 3 Oct 2016 18:32:18 +0200 Subject: [PATCH] SONAR-8134 create default organization in DbTester --- .../computation/PurgeCeActivitiesTest.java | 10 +- .../DefaultOrganizationProviderImplTest.java | 2 +- .../DefaultOrganizationProviderRule.java | 44 +---- .../organization/ws/CreateActionTest.java | 2 +- .../organization/ws/DeleteActionTest.java | 168 ------------------ .../organization/ws/SearchActionTest.java | 2 +- .../organization/ws/UpdateActionTest.java | 2 +- .../src/test/java/org/sonar/db/DbTester.java | 52 ++++-- .../db/organization/OrganizationDaoTest.java | 2 +- .../db/organization/OrganizationTesting.java | 54 ++++++ 10 files changed, 113 insertions(+), 225 deletions(-) delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java create mode 100644 sonar-db/src/test/java/org/sonar/db/organization/OrganizationTesting.java diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/PurgeCeActivitiesTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/PurgeCeActivitiesTest.java index e6d9f24da32..bf53963de59 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/PurgeCeActivitiesTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/PurgeCeActivitiesTest.java @@ -22,7 +22,7 @@ package org.sonar.server.computation; import org.junit.Rule; import org.junit.Test; import org.sonar.api.platform.Server; -import org.sonar.api.utils.internal.TestSystem2; +import org.sonar.api.utils.System2; import org.sonar.db.DbTester; import org.sonar.db.ce.CeActivityDto; import org.sonar.db.ce.CeQueueDto; @@ -31,10 +31,12 @@ import org.sonar.server.computation.queue.PurgeCeActivities; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; public class PurgeCeActivitiesTest { - private TestSystem2 system2 = new TestSystem2(); + private System2 system2 = spy(System2.INSTANCE); @Rule public DbTester dbTester = DbTester.create(system2); @@ -45,7 +47,7 @@ public class PurgeCeActivitiesTest { public void delete_older_than_6_months() throws Exception { insertWithDate("VERY_OLD", 1_000_000_000_000L); insertWithDate("RECENT", 1_500_000_000_000L); - system2.setNow(1_500_000_000_100L); + when(system2.now()).thenReturn(1_500_000_000_100L); underTest.onServerStart(mock(Server.class)); @@ -60,7 +62,7 @@ public class PurgeCeActivitiesTest { CeActivityDto dto = new CeActivityDto(queueDto); dto.setStatus(CeActivityDto.Status.SUCCESS); - system2.setNow(date); + when(system2.now()).thenReturn(date); dbTester.getDbClient().ceActivityDao().insert(dbTester.getSession(), dto); dbTester.getSession().commit(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderImplTest.java index ff71285c89b..97c9b83391a 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderImplTest.java @@ -44,7 +44,7 @@ public class DefaultOrganizationProviderImplTest { private System2 system2 = mock(System2.class); @Rule - public DbTester dbTester = DbTester.create(system2); + public DbTester dbTester = DbTester.create(system2).setDisableDefaultOrganization(true); @Rule public ExpectedException expectedException = ExpectedException.none(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderRule.java b/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderRule.java index 7f07855140a..4af517decb1 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderRule.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/DefaultOrganizationProviderRule.java @@ -19,52 +19,24 @@ */ package org.sonar.server.organization; -import com.google.common.base.Preconditions; import org.junit.rules.ExternalResource; -import org.sonar.core.util.UuidFactoryImpl; +import org.sonar.db.DbTester; public class DefaultOrganizationProviderRule extends ExternalResource implements DefaultOrganizationProvider { - private DefaultOrganization defaultOrganization; - private DefaultOrganizationProviderRule(DefaultOrganization defaultOrganization) { - this.defaultOrganization = defaultOrganization; - } + private final DbTester dbTester; - /** - *

- * This method is meant to be statically imported. - *

- */ - public static DefaultOrganizationProviderRule someDefaultOrganization() { - String uuid = UuidFactoryImpl.INSTANCE.create(); - return new DefaultOrganizationProviderRule(DefaultOrganization.newBuilder() - .setUuid(uuid) - .setName("Default organization " + uuid) - .setKey(uuid + "_key") - .setCreatedAt(uuid.hashCode()) - .setUpdatedAt(uuid.hashCode()) - .build()); + private DefaultOrganizationProviderRule(DbTester dbTester) { + this.dbTester = dbTester; } - /** - *

- * This method is meant to be statically imported. - *

- */ - public static DefaultOrganizationProviderRule defaultOrganizationWithName(String name) { - String uuid = UuidFactoryImpl.INSTANCE.create(); - return new DefaultOrganizationProviderRule(DefaultOrganization.newBuilder() - .setUuid(uuid) - .setName(name) - .setKey(uuid + "_key") - .setCreatedAt(uuid.hashCode()) - .setUpdatedAt(uuid.hashCode()) - .build()); + public static DefaultOrganizationProviderRule create(DbTester dbTester) { + return new DefaultOrganizationProviderRule(dbTester); } + @Override public DefaultOrganization get() { - Preconditions.checkState(defaultOrganization != null, "No default organization is set"); - return defaultOrganization; + return new DefaultOrganizationProviderImpl(dbTester.getDbClient()).get(); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java index 3b6a0045567..d29369ad2ee 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java @@ -60,7 +60,7 @@ public class CreateActionTest { @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule - public DbTester dbTester = DbTester.create(system2); + public DbTester dbTester = DbTester.create(system2).setDisableDefaultOrganization(true); @Rule public ExpectedException expectedException = ExpectedException.none(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java deleted file mode 100644 index 6162641bdfc..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.organization.ws; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.server.ws.WebService; -import org.sonar.api.utils.System2; -import org.sonar.core.permission.GlobalPermissions; -import org.sonar.db.DbTester; -import org.sonar.db.organization.OrganizationDto; -import org.sonar.server.exceptions.ForbiddenException; -import org.sonar.server.organization.DefaultOrganizationProviderRule; -import org.sonar.server.tester.UserSessionRule; -import org.sonar.server.ws.TestRequest; -import org.sonar.server.ws.WsActionTester; -import org.sonarqube.ws.MediaTypes; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.server.organization.DefaultOrganizationProviderRule.someDefaultOrganization; -import static org.sonar.server.organization.ws.OrganizationsWsTestSupport.setParam; - -public class DeleteActionTest { - private static final String SOME_KEY = "key"; - private static final int HTTP_CODE_NO_CONTENT = 204; - private static final String ORGANIZATIONS_TABLE = "organizations"; - - @Rule - public UserSessionRule userSession = UserSessionRule.standalone(); - @Rule - public DbTester dbTester = DbTester.create(System2.INSTANCE); - @Rule - public ExpectedException expectedException = ExpectedException.none(); - @Rule - public DefaultOrganizationProviderRule defaultOrganizationProvider = someDefaultOrganization(); - - private DeleteAction underTest = new DeleteAction(userSession, dbTester.getDbClient(), defaultOrganizationProvider); - private WsActionTester wsTester = new WsActionTester(underTest); - - @Test - public void verify_define() { - WebService.Action action = wsTester.getDef(); - assertThat(action.key()).isEqualTo("delete"); - assertThat(action.isPost()).isTrue(); - assertThat(action.description()).isEqualTo("Delete an organization.
" + - "Require 'Administer System' permission."); - assertThat(action.isInternal()).isTrue(); - assertThat(action.since()).isEqualTo("6.2"); - assertThat(action.handler()).isEqualTo(underTest); - assertThat(action.params()).hasSize(1); - assertThat(action.responseExample()).isNull(); - - assertThat(action.param("key")) - .matches(param -> param.isRequired()) - .matches(param -> "foo-company".equals(param.exampleValue())) - .matches(param -> "Organization key".equals(param.description())); - } - - @Test - public void request_fails_if_user_does_not_have_SYSTEM_ADMIN_permission() { - expectInsufficientPrivilegesFE(); - - executeRequest(SOME_KEY); - } - - @Test - public void request_fails_if_user_does_not_have_SYSTEM_ADMIN_permission_when_key_is_specified() { - expectInsufficientPrivilegesFE(); - - executeRequest(SOME_KEY); - } - - @Test - public void request_fails_if_key_is_missing() { - giveUserSystemAdminPermission(); - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("The 'key' parameter is missing"); - - executeRequest(null); - } - - @Test - public void request_does_not_fail_if_table_is_empty() { - giveUserSystemAdminPermission(); - - assertThat(executeRequest("another key")).isEqualTo(HTTP_CODE_NO_CONTENT); - } - - @Test - public void request_does_not_fail_if_row_with_specified_key_does_not_exist() { - giveUserSystemAdminPermission(); - insertOrganization(SOME_KEY); - - assertThat(executeRequest("another key")).isEqualTo(HTTP_CODE_NO_CONTENT); - assertThat(dbTester.countRowsOfTable(ORGANIZATIONS_TABLE)).isEqualTo(1); - } - - @Test - public void request_succeeds_and_delete_row_with_specified_existing_key() { - giveUserSystemAdminPermission(); - insertOrganization(SOME_KEY); - insertOrganization("other key"); - - assertThat(executeRequest(SOME_KEY)).isEqualTo(HTTP_CODE_NO_CONTENT); - assertThat(dbTester.countRowsOfTable(ORGANIZATIONS_TABLE)).isEqualTo(1); - } - - @Test - public void request_fails_when_attempting_to_delete_Default_Organization() { - giveUserSystemAdminPermission(); - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Default Organization can't be deleted"); - - executeRequest(defaultOrganizationProvider.get().getKey()); - } - - private OrganizationDto insertOrganization(String key) { - OrganizationDto dto = new OrganizationDto() - .setUuid(key + "_uuid") - .setKey(key) - .setName(key + "_name") - .setDescription(key + "_description") - .setUrl(key + "_url") - .setAvatarUrl(key + "_avatar_url") - .setCreatedAt((long) key.hashCode()) - .setUpdatedAt((long) key.hashCode()); - dbTester.getDbClient().organizationDao().insert(dbTester.getSession(), dto); - dbTester.commit(); - return dto; - } - - private void giveUserSystemAdminPermission() { - userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN); - } - - private void expectInsufficientPrivilegesFE() { - expectedException.expect(ForbiddenException.class); - expectedException.expectMessage("Insufficient privileges"); - } - - private int executeRequest(String key) { - TestRequest request = wsTester.newRequest() - .setMediaType(MediaTypes.PROTOBUF); - setParam(request, "key", key); - return request.execute().getStatus(); - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java index aa00075daa4..be36067a7b3 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java @@ -61,7 +61,7 @@ public class SearchActionTest { private System2 system2 = mock(System2.class); @Rule - public DbTester dbTester = DbTester.create(system2); + public DbTester dbTester = DbTester.create(system2).setDisableDefaultOrganization(true); @Rule public ExpectedException expectedException = ExpectedException.none(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/UpdateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/UpdateActionTest.java index 6282cbd88d0..c479ffa1070 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/organization/ws/UpdateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/organization/ws/UpdateActionTest.java @@ -50,7 +50,7 @@ public class UpdateActionTest { private System2 system2 = mock(System2.class); @Rule - public DbTester dbTester = DbTester.create(system2); + public DbTester dbTester = DbTester.create(system2).setDisableDefaultOrganization(true); @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule diff --git a/sonar-db/src/test/java/org/sonar/db/DbTester.java b/sonar-db/src/test/java/org/sonar/db/DbTester.java index e937b9398a2..e861d64d77b 100644 --- a/sonar-db/src/test/java/org/sonar/db/DbTester.java +++ b/sonar-db/src/test/java/org/sonar/db/DbTester.java @@ -20,6 +20,7 @@ package org.sonar.db; import com.google.common.base.Joiner; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -64,6 +65,8 @@ import org.picocontainer.containers.TransientPicoContainer; import org.sonar.api.utils.System2; import org.sonar.api.utils.log.Loggers; import org.sonar.core.util.SequenceUuidFactory; +import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.organization.OrganizationTesting; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.Lists.newArrayList; @@ -84,10 +87,13 @@ public class DbTester extends ExternalResource { private final TestDb db; private DbClient client; private DbSession session = null; + private boolean disableDefaultOrganization = false; + private boolean started = false; private DbTester(System2 system2, @Nullable String schemaPath) { this.system2 = system2; this.db = TestDb.create(schemaPath); + initDbClient(); } public static DbTester create(System2 system2) { @@ -97,13 +103,45 @@ public class DbTester extends ExternalResource { public static DbTester createForSchema(System2 system2, Class testClass, String filename) { String path = StringUtils.replaceChars(testClass.getCanonicalName(), '.', '/'); String schemaPath = path + "/" + filename; - return new DbTester(system2, schemaPath); + return new DbTester(system2, schemaPath).setDisableDefaultOrganization(true); + } + + private void initDbClient() { + TransientPicoContainer ioc = new TransientPicoContainer(); + ioc.addComponent(db.getMyBatis()); + ioc.addComponent(system2); + ioc.addComponent(new SequenceUuidFactory()); + for (Class daoClass : DaoModule.classes()) { + ioc.addComponent(daoClass); + } + List daos = ioc.getComponents(Dao.class); + client = new DbClient(db.getDatabase(), db.getMyBatis(), daos.toArray(new Dao[daos.size()])); + } + + public DbTester setDisableDefaultOrganization(boolean b) { + Preconditions.checkState(!started, "DbTester is already started"); + this.disableDefaultOrganization = b; + return this; } @Override protected void before() throws Throwable { db.start(); db.truncateTables(); + initDbClient(); + if (!disableDefaultOrganization) { + insertDefaultOrganization(); + } + started = true; + } + + private void insertDefaultOrganization() { + OrganizationDto org = OrganizationTesting.newOrganizationDto(); + try (DbSession dbSession = db.getMyBatis().openSession(false)) { + client.organizationDao().insert(dbSession, org); + client.internalPropertiesDao().save(dbSession, "organization.default", org.getUuid()); + dbSession.commit(); + } } @Override @@ -112,6 +150,7 @@ public class DbTester extends ExternalResource { MyBatis.closeQuietly(session); } db.stop(); + started = false; } public DbSession getSession() { @@ -126,17 +165,6 @@ public class DbTester extends ExternalResource { } public DbClient getDbClient() { - if (client == null) { - TransientPicoContainer ioc = new TransientPicoContainer(); - ioc.addComponent(db.getMyBatis()); - ioc.addComponent(system2); - ioc.addComponent(new SequenceUuidFactory()); - for (Class daoClass : DaoModule.classes()) { - ioc.addComponent(daoClass); - } - List daos = ioc.getComponents(Dao.class); - client = new DbClient(db.getDatabase(), db.getMyBatis(), daos.toArray(new Dao[daos.size()])); - } return client; } diff --git a/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java b/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java index 4d54c043810..d348bd4183f 100644 --- a/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java @@ -54,7 +54,7 @@ public class OrganizationDaoTest { private System2 system2 = mock(System2.class); @Rule - public final DbTester dbTester = DbTester.create(system2); + public final DbTester dbTester = DbTester.create(system2).setDisableDefaultOrganization(true); @Rule public ExpectedException expectedException = ExpectedException.none(); diff --git a/sonar-db/src/test/java/org/sonar/db/organization/OrganizationTesting.java b/sonar-db/src/test/java/org/sonar/db/organization/OrganizationTesting.java new file mode 100644 index 00000000000..d3776e7462a --- /dev/null +++ b/sonar-db/src/test/java/org/sonar/db/organization/OrganizationTesting.java @@ -0,0 +1,54 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.organization; + +import org.sonar.db.DbSession; +import org.sonar.db.DbTester; + +import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; + +public class OrganizationTesting { + + private OrganizationTesting() { + // only statics + } + + /** + * Insert an {@link OrganizationDto} and commit the session + */ + public static void insert(DbTester dbTester, OrganizationDto dto) { + DbSession dbSession = dbTester.getSession(); + dbTester.getDbClient().organizationDao().insert(dbSession, dto); + dbSession.commit(); + } + + /** + * Creates a new {@link OrganizationDto} with randomly generated field values. + */ + public static OrganizationDto newOrganizationDto() { + return new OrganizationDto() + .setKey(randomAlphanumeric(32)) + .setUuid(randomAlphanumeric(40)) + .setName(randomAlphanumeric(64)) + .setDescription(randomAlphanumeric(256)) + .setAvatarUrl(randomAlphanumeric(256)) + .setUrl(randomAlphanumeric(256)); + } +} -- 2.39.5