*/
package org.sonar.server.db;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
import org.junit.Test;
-import org.sonar.core.persistence.Dto;
+import org.sonar.api.utils.System2;
import org.sonar.core.persistence.DbSession;
-import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.persistence.TestDatabase;
+import org.sonar.server.db.fake.FakeDao;
+import org.sonar.server.db.fake.FakeDto;
+import org.sonar.server.db.fake.FakeMapper;
+
+import java.util.UUID;
import static org.fest.assertions.Assertions.assertThat;
-import static org.fest.assertions.Fail.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
public class BaseDaoTest {
- DbSession dbSession = mock(DbSession.class);
+ @ClassRule
+ public static TestDatabase db = new TestDatabase().schema(BaseDaoTest.class, "schema.sql");
+
+ private static final String DTO_ALIAS = "fake";
+
+ private FakeDao dao;
+ private DbSession session;
+
+ @BeforeClass
+ public static void setupBatis() {
+ MyBatis batis = db.myBatis();
+ batis.getSessionFactory().getConfiguration().getTypeAliasRegistry().registerAlias(DTO_ALIAS, FakeDto.class);
+ batis.getSessionFactory().getConfiguration().addMapper(FakeMapper.class);
+ }
+
+
+ @Before
+ public void before() throws Exception {
+ this.session = db.myBatis().openSession(false);
+ this.dao = new FakeDao(System2.INSTANCE);
+ }
+
+ @After
+ public void after() {
+ this.session.close();
+ }
@Test
- public void getNonNullByKey() throws Exception {
- BaseDao dao = mock(BaseDao.class);
- FakeDto dto = new FakeDto("ki");
- when(dao.doGetNullableByKey(dbSession, "ki")).thenReturn(dto);
- when(dao.getByKey(any(DbSession.class), anyString())).thenCallRealMethod();
-
- assertThat(dao.getByKey(dbSession, "ki")).isSameAs(dto);
-
- try {
- dao.getByKey(dbSession, "unknown");
- fail();
- } catch (NotFoundException e) {
- assertThat(e).hasMessage("Key 'unknown' not found");
- }
+ public void has_fake_mapper() {
+ FakeMapper mapper = db.myBatis().getSessionFactory()
+ .getConfiguration().getMapper(FakeMapper.class, session);
+ assertThat(mapper).isNotNull();
}
+ @Test
+ public void can_insert_and_select_by_key() throws Exception {
+ long t0 = System.currentTimeMillis();
+
+ String key = UUID.randomUUID().toString();
+ FakeDto myDto = new FakeDto()
+ .setKey(key);
+ dao.insert(session, myDto);
+
+ session.commit();
+ assertThat(myDto.getId());
+
+ long t1 = System.currentTimeMillis();
- static class FakeDto extends Dto<String> {
- private final String key;
+ FakeDto dto = dao.getByKey(session, key);
+ assertThat(dto).isNotNull();
- public FakeDto(String key) {
- this.key = key;
- }
+ assertThat(dto.getUpdatedAt().getTime()).isGreaterThan(t0);
+ assertThat(dto.getCreatedAt().getTime()).isLessThan(t1);
- @Override
- public String getKey() {
- return key;
- }
}
-}
+}
\ No newline at end of file
--- /dev/null
+package org.sonar.server.db.fake;
+
+import org.sonar.api.utils.System2;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.db.BaseDao;
+
+public class FakeDao extends BaseDao<FakeMapper, FakeDto, String> {
+
+ public FakeDao(System2 system2) {
+ super(FakeMapper.class, system2);
+ }
+
+ @Override
+ protected FakeDto doInsert(DbSession session, FakeDto item) {
+ mapper(session).insert(item);
+ return item;
+ }
+
+ @Override
+ protected FakeDto doGetNullableByKey(DbSession session, String key) {
+ return mapper(session).selectByKey(key);
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="org.sonar.server.db.fake.FakeMapper">
+
+ <sql id="selectColumns">
+ f.id,
+ f.kee as "key",
+ f.created_at as "createdAt",
+ f.updated_at as "updatedAt"
+ </sql>
+
+ <select id="selectByKey" parameterType="String" resultType="fake">
+ select
+ <include refid="selectColumns"/>
+ from fake f WHERE f.kee=#{key}
+ </select>
+
+ <insert id="insert" parameterType="fake" keyColumn="id" useGeneratedKeys="true" keyProperty="id">
+ insert into fake (kee, created_at, updated_at)
+ values (#{key}, #{createdAt}, #{updatedAt})
+ </insert>
+
+ <select id="selectAfterDate" resultType="fake" resultSetType="FORWARD_ONLY" fetchSize="200">
+ select
+ <include refid="selectColumns"/>
+ from rules r
+ where f.updated_at IS NULL or f.updated_at >= #{date}
+ </select>
+
+</mapper>