From: Sébastien Lesaint Date: Mon, 26 Sep 2016 12:00:21 +0000 (+0200) Subject: SONAR-8120 createdAt and updateAt handled in OrganizationDao X-Git-Tag: 6.2-RC1~591 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b83e79b71152df288ecfc3976d3ad138a133aeea;p=sonarqube.git SONAR-8120 createdAt and updateAt handled in OrganizationDao --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java index 8938e99d366..21dc754915f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java @@ -24,7 +24,6 @@ import javax.annotation.Nullable; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; -import org.sonar.api.utils.System2; import org.sonar.core.permission.GlobalPermissions; import org.sonar.core.util.UuidFactory; import org.sonar.db.DbClient; @@ -50,14 +49,12 @@ public class CreateAction implements OrganizationsAction { private final UserSession userSession; private final DbClient dbClient; private final UuidFactory uuidFactory; - private final System2 system2; private final OrganizationsWsSupport wsSupport; - public CreateAction(UserSession userSession, DbClient dbClient, UuidFactory uuidFactory, System2 system2, OrganizationsWsSupport wsSupport) { + public CreateAction(UserSession userSession, DbClient dbClient, UuidFactory uuidFactory, OrganizationsWsSupport wsSupport) { this.userSession = userSession; this.dbClient = dbClient; this.uuidFactory = uuidFactory; - this.system2 = system2; this.wsSupport = wsSupport; } @@ -96,7 +93,7 @@ public class CreateAction implements OrganizationsAction { try (DbSession dbSession = dbClient.openSession(false)) { checkKeyIsNotUsed(dbSession, key, requestKey, name); - OrganizationDto dto = createOrganizationDto(request, name, key, system2.now()); + OrganizationDto dto = createOrganizationDto(request, name, key); dbClient.organizationDao().insert(dbSession, dto); dbSession.commit(); @@ -132,16 +129,14 @@ public class CreateAction implements OrganizationsAction { return dbClient.organizationDao().selectByKey(dbSession, key).isPresent(); } - private OrganizationDto createOrganizationDto(Request request, String name, String key, long now) { + private OrganizationDto createOrganizationDto(Request request, String name, String key) { return new OrganizationDto() .setUuid(uuidFactory.create()) .setName(name) .setKey(key) .setDescription(request.param(PARAM_DESCRIPTION)) .setUrl(request.param(PARAM_URL)) - .setAvatarUrl(request.param(PARAM_AVATAR_URL)) - .setCreatedAt(now) - .setUpdatedAt(now); + .setAvatarUrl(request.param(PARAM_AVATAR_URL)); } private void writeResponse(Request request, Response response, OrganizationDto dto) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateAction.java b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateAction.java index fbe3b14ea1d..e44c6bec719 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateAction.java @@ -24,7 +24,6 @@ import javax.annotation.Nullable; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; -import org.sonar.api.utils.System2; import org.sonar.core.permission.GlobalPermissions; import org.sonar.db.DbClient; import org.sonar.db.DbSession; @@ -45,13 +44,11 @@ public class UpdateAction implements OrganizationsAction { private final UserSession userSession; private final OrganizationsWsSupport wsSupport; private final DbClient dbClient; - private final System2 system2; - public UpdateAction(UserSession userSession, OrganizationsWsSupport wsSupport, DbClient dbClient, System2 system2) { + public UpdateAction(UserSession userSession, OrganizationsWsSupport wsSupport, DbClient dbClient) { this.userSession = userSession; this.wsSupport = wsSupport; this.dbClient = dbClient; - this.system2 = system2; } @Override @@ -97,8 +94,7 @@ public class UpdateAction implements OrganizationsAction { dto.setName(name) .setDescription(description) .setUrl(url) - .setAvatarUrl(avatar) - .setUpdatedAt(system2.now()); + .setAvatarUrl(avatar); dbClient.organizationDao().update(dbSession, dto); dbSession.commit(); 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 557a5c62180..ce88d53ba46 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 @@ -52,16 +52,17 @@ public class CreateActionTest { private static final String SOME_UUID = "uuid"; private static final long SOME_DATE = 1_200_000L; + private System2 system2 = mock(System2.class); + @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule - public DbTester dbTester = DbTester.create(System2.INSTANCE); + public DbTester dbTester = DbTester.create(system2); @Rule public ExpectedException expectedException = ExpectedException.none(); private UuidFactory uuidFactory = mock(UuidFactory.class); - private System2 system2 = mock(System2.class); - private CreateAction underTest = new CreateAction(userSession, dbTester.getDbClient(), uuidFactory, system2, new OrganizationsWsSupport()); + private CreateAction underTest = new CreateAction(userSession, dbTester.getDbClient(), uuidFactory, new OrganizationsWsSupport()); private WsActionTester wsTester = new WsActionTester(underTest); @Test 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 9a9191ab828..7f0e33c1def 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 @@ -42,6 +42,8 @@ import org.sonarqube.ws.Organizations; import static java.lang.String.valueOf; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static org.sonar.test.JsonAssert.assertJson; public class SearchActionTest { @@ -54,9 +56,13 @@ public class SearchActionTest { .setAvatarUrl("the avatar url") .setCreatedAt(1_999_000L) .setUpdatedAt(1_888_000L); + public static final long SOME_DATE = 1_999_999L; + + + private System2 system2 = mock(System2.class); @Rule - public DbTester dbTester = DbTester.create(System2.INSTANCE); + public DbTester dbTester = DbTester.create(system2); @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -86,24 +92,21 @@ public class SearchActionTest { @Test public void verify_response_example() throws URISyntaxException, IOException { + when(system2.now()).thenReturn(SOME_DATE, SOME_DATE + 1000); insertOrganization(new OrganizationDto() .setUuid(Uuids.UUID_EXAMPLE_02) .setKey("bar-company") .setName("Bar Company") .setDescription("The Bar company produces quality software too.") .setUrl("https://www.bar.com") - .setAvatarUrl("https://www.bar.com/logo.png") - .setCreatedAt(1_999_000L) - .setUpdatedAt(1_888_000L)); + .setAvatarUrl("https://www.bar.com/logo.png")); insertOrganization(new OrganizationDto() .setUuid(Uuids.UUID_EXAMPLE_01) .setKey("foo-company") .setName("Foo Company") .setDescription("The Foo company produces quality software.") .setUrl("https://www.foo.com") - .setAvatarUrl("https://www.foo.com/foo.png") - .setCreatedAt(1_999_000L) - .setUpdatedAt(1_888_000L)); + .setAvatarUrl("https://www.foo.com/foo.png")); String response = executeJsonRequest(null, null); @@ -122,6 +125,7 @@ public class SearchActionTest { @Test public void request_returns_empty_on_table_with_single_row_when_not_requesting_the_first_page() { + when(system2.now()).thenReturn(SOME_DATE); insertOrganization(ORGANIZATION_DTO); assertThat(executeRequest(2, null)).isEmpty(); @@ -133,12 +137,12 @@ public class SearchActionTest { @Test public void request_returns_rows_ordered_by_createdAt_descending_applying_requested_paging() { - long time = 1_999_999L; - insertOrganization(ORGANIZATION_DTO.setUuid("uuid3").setKey("key-3").setCreatedAt(time)); - insertOrganization(ORGANIZATION_DTO.setUuid("uuid1").setKey("key-1").setCreatedAt(time + 1_000)); - insertOrganization(ORGANIZATION_DTO.setUuid("uuid2").setKey("key-2").setCreatedAt(time + 2_000)); - insertOrganization(ORGANIZATION_DTO.setUuid("uuid5").setKey("key-5").setCreatedAt(time + 3_000)); - insertOrganization(ORGANIZATION_DTO.setUuid("uuid4").setKey("key-4").setCreatedAt(time + 5_000)); + when(system2.now()).thenReturn(SOME_DATE, SOME_DATE + 1_000, SOME_DATE + 2_000, SOME_DATE + 3_000, SOME_DATE + 5_000); + insertOrganization(ORGANIZATION_DTO.setUuid("uuid3").setKey("key-3")); + insertOrganization(ORGANIZATION_DTO.setUuid("uuid1").setKey("key-1")); + insertOrganization(ORGANIZATION_DTO.setUuid("uuid2").setKey("key-2")); + insertOrganization(ORGANIZATION_DTO.setUuid("uuid5").setKey("key-5")); + insertOrganization(ORGANIZATION_DTO.setUuid("uuid4").setKey("key-4")); assertThat(executeRequest(1, 1)) .extracting("id", "key") 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 dceb0c8976d..8ad59eb20bb 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 @@ -49,15 +49,16 @@ public class UpdateActionTest { private static final String SOME_KEY = "key"; private static final long SOME_DATE = 1_200_000L; + private System2 system2 = mock(System2.class); + @Rule - public DbTester dbTester = DbTester.create(System2.INSTANCE); + public DbTester dbTester = DbTester.create(system2); @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @Rule public ExpectedException expectedException = ExpectedException.none(); - private System2 system2 = mock(System2.class); - private UpdateAction underTest = new UpdateAction(userSession, new OrganizationsWsSupport(), dbTester.getDbClient(), system2); + private UpdateAction underTest = new UpdateAction(userSession, new OrganizationsWsSupport(), dbTester.getDbClient()); private WsActionTester wsTester = new WsActionTester(underTest); @Test @@ -390,15 +391,14 @@ public class UpdateActionTest { } private OrganizationDto insertOrganization(String uuid) { + when(system2.now()).thenReturn((long) uuid.hashCode()); OrganizationDto dto = new OrganizationDto() .setUuid(uuid) .setKey(uuid + "_key") .setName(uuid + "_name") .setDescription(uuid + "_description") .setUrl(uuid + "_url") - .setAvatarUrl(uuid + "_avatar_url") - .setCreatedAt((long) uuid.hashCode()) - .setUpdatedAt((long) uuid.hashCode()); + .setAvatarUrl(uuid + "_avatar_url"); dbTester.getDbClient().organizationDao().insert(dbTester.getSession(), dto); dbTester.commit(); return dto; diff --git a/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java b/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java index 0d7214b1e2c..8dc50dca9a9 100644 --- a/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java +++ b/sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java @@ -21,6 +21,7 @@ package org.sonar.db.organization; import java.util.List; import java.util.Optional; +import org.sonar.api.utils.System2; import org.sonar.db.Dao; import org.sonar.db.DbSession; @@ -28,8 +29,17 @@ import static java.util.Objects.requireNonNull; public class OrganizationDao implements Dao { + private final System2 system2; + + public OrganizationDao(System2 system2) { + this.system2 = system2; + } + public void insert(DbSession dbSession, OrganizationDto organization) { checkDto(organization); + long now = system2.now(); + organization.setCreatedAt(now); + organization.setUpdatedAt(now); getMapper(dbSession).insert(organization); } @@ -49,6 +59,7 @@ public class OrganizationDao implements Dao { public int update(DbSession dbSession, OrganizationDto organization) { checkDto(organization); + organization.setUpdatedAt(system2.now()); return getMapper(dbSession).update(organization); } 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 d38ae3e1bb1..4d54c043810 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 @@ -35,20 +35,26 @@ import org.sonar.db.DbTester; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class OrganizationDaoTest { + private static final long SOME_DATE = 1_200_999L; + private static final long DATE_1 = 1_999_000L; + private static final long DATE_2 = 8_999_999L; + private static final long DATE_3 = 3_999_000L; private static final OrganizationDto ORGANIZATION_DTO = new OrganizationDto() .setUuid("a uuid") .setKey("the_key") .setName("the name") .setDescription("the description") .setUrl("the url") - .setAvatarUrl("the avatar url") - .setCreatedAt(1_999_000L) - .setUpdatedAt(1_888_000L); + .setAvatarUrl("the avatar url"); + + private System2 system2 = mock(System2.class); @Rule - public final DbTester dbTester = DbTester.create(System2.INSTANCE); + public final DbTester dbTester = DbTester.create(system2); @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -64,6 +70,18 @@ public class OrganizationDaoTest { underTest.insert(dbSession, null); } + @Test + public void insert_populates_createdAt_and_updateAt_with_same_date_from_System2() { + when(system2.now()).thenReturn(DATE_1, DATE_1 + 1_000_000L); + insertOrganization(copyOf(ORGANIZATION_DTO) + .setCreatedAt(1_000L) + .setUpdatedAt(6_000L)); + + Map row = selectSingleRow(); + assertThat(row.get("createdAt")).isEqualTo(DATE_1); + assertThat(row.get("updatedAt")).isEqualTo(DATE_1); + } + @Test public void insert_persists_properties_of_OrganizationDto() { insertOrganization(ORGANIZATION_DTO); @@ -81,6 +99,7 @@ public class OrganizationDaoTest { @Test public void description_url_and_avatarUrl_are_optional() { + when(system2.now()).thenReturn(SOME_DATE); insertOrganization(copyOf(ORGANIZATION_DTO).setDescription(null).setUrl(null).setAvatarUrl(null)); Map row = selectSingleRow(); @@ -90,8 +109,8 @@ public class OrganizationDaoTest { assertThat(row.get("description")).isNull(); assertThat(row.get("url")).isNull(); assertThat(row.get("avatarUrl")).isNull(); - assertThat(row.get("createdAt")).isEqualTo(ORGANIZATION_DTO.getCreatedAt()); - assertThat(row.get("updatedAt")).isEqualTo(ORGANIZATION_DTO.getUpdatedAt()); + assertThat(row.get("createdAt")).isEqualTo(SOME_DATE); + assertThat(row.get("updatedAt")).isEqualTo(SOME_DATE); } @Test @@ -196,11 +215,12 @@ public class OrganizationDaoTest { @Test public void selectByQuery_returns_rows_ordered_by_createdAt_descending_applying_requested_paging() { long time = 1_999_999L; - insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid3").setKey("key-3").setCreatedAt(time)); - insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid1").setKey("key-1").setCreatedAt(time + 1_000)); - insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid2").setKey("key-2").setCreatedAt(time + 2_000)); - insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid5").setKey("key-5").setCreatedAt(time + 3_000)); - insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid4").setKey("key-4").setCreatedAt(time + 5_000)); + when(system2.now()).thenReturn(time, time + 1_000, time + 2_000, time + 3_000, time + 5_000); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid3").setKey("key-3")); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid1").setKey("key-1")); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid2").setKey("key-2")); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid5").setKey("key-5")); + insertOrganization(copyOf(ORGANIZATION_DTO).setUuid("uuid4").setKey("key-4")); assertThat(underTest.selectByQuery(dbSession, 0, 1)) .extracting("uuid", "key") @@ -263,10 +283,27 @@ public class OrganizationDaoTest { assertThat(row.get("updatedAt")).isEqualTo(ORGANIZATION_DTO.getUpdatedAt()); } + @Test + public void update_populates_updatedAt_with_date_from_System2() { + when(system2.now()).thenReturn(DATE_1); + insertOrganization(ORGANIZATION_DTO); + + when(system2.now()).thenReturn(DATE_2); + underTest.update(dbSession, copyOf(ORGANIZATION_DTO) + .setUpdatedAt(2_000L)); + dbSession.commit(); + + Map row = selectSingleRow(); + assertThat(row.get("createdAt")).isEqualTo(DATE_1); + assertThat(row.get("updatedAt")).isEqualTo(DATE_2); + } + @Test public void update_does_not_update_key_nor_createdAt() { + when(system2.now()).thenReturn(DATE_1); insertOrganization(ORGANIZATION_DTO); + when(system2.now()).thenReturn(DATE_3); underTest.update(dbSession, new OrganizationDto() .setUuid(ORGANIZATION_DTO.getUuid()) .setKey("new key") @@ -274,8 +311,8 @@ public class OrganizationDaoTest { .setDescription("new description") .setUrl("new url") .setAvatarUrl("new avatar url") - .setCreatedAt(2_999_000L) - .setUpdatedAt(3_999_000L)); + .setCreatedAt(2_000L) + .setUpdatedAt(3_000L)); dbSession.commit(); Map row = selectSingleRow(); @@ -285,8 +322,8 @@ public class OrganizationDaoTest { assertThat(row.get("description")).isEqualTo("new description"); assertThat(row.get("url")).isEqualTo("new url"); assertThat(row.get("avatarUrl")).isEqualTo("new avatar url"); - assertThat(row.get("createdAt")).isEqualTo(ORGANIZATION_DTO.getCreatedAt()); - assertThat(row.get("updatedAt")).isEqualTo(3_999_000L); + assertThat(row.get("createdAt")).isEqualTo(DATE_1); + assertThat(row.get("updatedAt")).isEqualTo(DATE_3); } @Test @@ -409,8 +446,6 @@ public class OrganizationDaoTest { .setName(organizationDto.getName()) .setDescription(organizationDto.getDescription()) .setUrl(organizationDto.getUrl()) - .setAvatarUrl(organizationDto.getAvatarUrl()) - .setCreatedAt(organizationDto.getCreatedAt()) - .setUpdatedAt(organizationDto.getUpdatedAt()); + .setAvatarUrl(organizationDto.getAvatarUrl()); } }