]> source.dussan.org Git - sonarqube.git/commitdiff
BaseDao testing for DAO v.2
authorStephane Gamard <stephane.gamard@sonarsource.com>
Thu, 11 Sep 2014 13:01:08 +0000 (15:01 +0200)
committerStephane Gamard <stephane.gamard@sonarsource.com>
Thu, 11 Sep 2014 17:14:40 +0000 (19:14 +0200)
server/sonar-server/src/test/java/org/sonar/server/db/BaseDaoTest.java
server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDao.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDto.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeMapper.java [new file with mode: 0644]
server/sonar-server/src/test/resources/org/sonar/server/db/BaseDaoTest/schema.sql [new file with mode: 0644]
server/sonar-server/src/test/resources/org/sonar/server/db/fake/FakeMapper.xml [new file with mode: 0644]

index faa5f05035f290cad0a6a28b301a0963664bd30a..0d9820371fc689351ad15485ae12f04e90ee4ae7 100644 (file)
  */
 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
diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDao.java b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDao.java
new file mode 100644 (file)
index 0000000..cdf16ef
--- /dev/null
@@ -0,0 +1,23 @@
+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);
+  }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDto.java b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeDto.java
new file mode 100644 (file)
index 0000000..80a69bd
--- /dev/null
@@ -0,0 +1,28 @@
+package org.sonar.server.db.fake;
+
+import org.sonar.core.persistence.Dto;
+
+public class FakeDto extends Dto<String> {
+
+  private long id;
+  private String key;
+
+  @Override
+  public String getKey() {
+    return key;
+  }
+
+  public long getId() {
+    return id;
+  }
+
+  public FakeDto setId(long id) {
+    this.id = id;
+    return this;
+  }
+
+  public FakeDto setKey(String key) {
+    this.key = key;
+    return this;
+  }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeMapper.java b/server/sonar-server/src/test/java/org/sonar/server/db/fake/FakeMapper.java
new file mode 100644 (file)
index 0000000..c32ca8e
--- /dev/null
@@ -0,0 +1,15 @@
+package org.sonar.server.db.fake;
+
+import org.apache.ibatis.annotations.Param;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+public interface FakeMapper {
+
+  void insert(FakeDto dto);
+
+  FakeDto selectByKey(@Param("key") String key);
+
+  List<FakeDto> selectAfterDate(@Param("date") Timestamp date);
+}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/db/BaseDaoTest/schema.sql b/server/sonar-server/src/test/resources/org/sonar/server/db/BaseDaoTest/schema.sql
new file mode 100644 (file)
index 0000000..bf7df35
--- /dev/null
@@ -0,0 +1,6 @@
+CREATE TABLE "FAKE" (
+  "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1),
+  "KEE" VARCHAR(200) NOT NULL,
+  "CREATED_AT" TIMESTAMP,
+  "UPDATED_AT" TIMESTAMP
+);
\ No newline at end of file
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/db/fake/FakeMapper.xml b/server/sonar-server/src/test/resources/org/sonar/server/db/fake/FakeMapper.xml
new file mode 100644 (file)
index 0000000..dc3aa0a
--- /dev/null
@@ -0,0 +1,31 @@
+<?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 &gt;= #{date}
+  </select>
+
+</mapper>