]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8120 createdAt and updateAt handled in OrganizationDao
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 26 Sep 2016 12:00:21 +0000 (14:00 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 26 Sep 2016 14:30:54 +0000 (16:30 +0200)
server/sonar-server/src/main/java/org/sonar/server/organization/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/organization/ws/UpdateAction.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/SearchActionTest.java
server/sonar-server/src/test/java/org/sonar/server/organization/ws/UpdateActionTest.java
sonar-db/src/main/java/org/sonar/db/organization/OrganizationDao.java
sonar-db/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java

index 8938e99d3664a1f746db071f70edb36c63441f88..21dc754915fb4ca4068dc9a0453f183da3b728dd 100644 (file)
@@ -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) {
index fbe3b14ea1d58b386329bc69b5ad25ee8be6b310..e44c6bec71992a1dab9d339be9d937f6fc2e9462 100644 (file)
@@ -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();
 
index 557a5c62180520a246f99f22421b1e46419267b2..ce88d53ba46a737df616882cf23fb4ca0dd8cf04 100644 (file)
@@ -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
index 9a9191ab8282ffa7c356088dda45b77deeb8139e..7f0e33c1defdb7f473aa9431c56c736b8f60623a 100644 (file)
@@ -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")
index dceb0c8976d9ad3c9957516cf201a6d6c744f6dd..8ad59eb20bba01a1ada3fca27ef76019188b2ff3 100644 (file)
@@ -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;
index 0d7214b1e2c98763bdf2a38611c97e1e47784525..8dc50dca9a96b1e95c03e6f8c4fb948dc029bc87 100644 (file)
@@ -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);
   }
 
index d38ae3e1bb124c5d19ab3b37636865204c4596cc..4d54c043810dc15cf62e9c538977a2f313bb87d9 100644 (file)
@@ -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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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());
   }
 }