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;
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;
}
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();
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) {
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;
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
dto.setName(name)
.setDescription(description)
.setUrl(url)
- .setAvatarUrl(avatar)
- .setUpdatedAt(system2.now());
+ .setAvatarUrl(avatar);
dbClient.organizationDao().update(dbSession, dto);
dbSession.commit();
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
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 {
.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();
@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);
@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();
@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")
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
}
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;
import java.util.List;
import java.util.Optional;
+import org.sonar.api.utils.System2;
import org.sonar.db.Dao;
import org.sonar.db.DbSession;
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);
}
public int update(DbSession dbSession, OrganizationDto organization) {
checkDto(organization);
+ organization.setUpdatedAt(system2.now());
return getMapper(dbSession).update(organization);
}
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();
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);
@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();
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
@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")
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")
.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();
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
.setName(organizationDto.getName())
.setDescription(organizationDto.getDescription())
.setUrl(organizationDto.getUrl())
- .setAvatarUrl(organizationDto.getAvatarUrl())
- .setCreatedAt(organizationDto.getCreatedAt())
- .setUpdatedAt(organizationDto.getUpdatedAt());
+ .setAvatarUrl(organizationDto.getAvatarUrl());
}
}