package gaej2011.service;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import gaej2011.model.Memo;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import org.slim3.datastore.Datastore;
import org.slim3.memcache.Memcache;
import org.slim3.tester.AppEngineTestCase;
import org.slim3.tester.TestEnvironment;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.taskqueue.TaskQueuePb.TaskQueueAddRequest;
import com.google.apphosting.api.ApiProxy;
public class MemoServiceTest extends AppEngineTestCase {
@Test
public void 特定の議事録にメモを追加できる() {
// test@example.com というユーザがログイン中、という状態を作っておく。
TestEnvironment environment =
(TestEnvironment) ApiProxy.getCurrentEnvironment();
environment.setEmail("test@example.com");
Key minutesKey = MinutesService.put(" テスト用議事録1");
int before = tester.count(Memo.class);
Key key = MemoService.put(minutesKey, " メモ1");
int after = tester.count(Memo.class);
assertThat("Memo が一件増える", after, is(before + 1));
Memo memo = Datastore.get(Memo.class, key);
assertThat(memo, is(notNullValue()));
assertThat(" 議事録への参照が設定される", memo.getMinutes(), is(minutesKey));
assertThat("memo が設定される", memo.getMemo(), is(" メモ1"));
assertThat("createdAt が設定される", memo.getCreatedAt(), is(notNullValue()));
assertThat("author が設定される", memo.getAuthor(), is(notNullValue()));
}
@Test
public void 議事録ごとに議事録に追加されたメモを古い順に一覧表示できる() {
Key minutesKey = MinutesService.put(" テスト用議事録1");
Calendar calendar = Calendar.getInstance();
for (int i = 0; i < 5; i++) { // 5 件保存しておく
Memo memo = new Memo();
memo.setMinutes(minutesKey);
memo.setMemo(" メモ" + i);
memo.setCreatedAt(calendar.getTime());
Datastore.put(memo);
calendar.add(Calendar.HOUR_OF_DAY, 1); // 1 時間進める
}
int count = 0;
Date before = null;
List<Memo> list = MemoService.list(minutesKey);
for (Memo memo : list) {
Date createdAt = memo.getCreatedAt();
if (before != null) {
assertThat(
" 古いものから取得できている",
createdAt.compareTo(before) > 0,
is(true));
}
before = createdAt;
count++;
}
assertThat(" 全てのエンティティが取得できている", count, is(5));
}
@Test
public void 議事録のメモの一覧を取得する際にキャッシュを利用する() {
Key minutesKey = MinutesService.put(" テスト用議事録1");
long before = Memcache.statistics().getHitCount();
MemoService.list(minutesKey);
long after1 = Memcache.statistics().getHitCount();
assertThat(" 一回目はキャッシュが効かない", after1, is(before));
MemoService.list(minutesKey);
long after2 = Memcache.statistics().getHitCount();
assertThat(" 二回目はキャッシュが効く", after2, is(before + 1));
}
@Test
public void 議事録のメモ追加後にキャッシュが削除される() {
Key minutesKey = MinutesService.put(" テスト用議事録1");
Memcache.put(minutesKey, "dummy");
assertThat(Memcache.contains(minutesKey), is(true));
MemoService.put(minutesKey, " メモ1");
assertThat(Memcache.contains(minutesKey), is(false));
}
@Test
public void 議事録のメモ追加後にメモ件数を加算するタスクと形態素解析用のタスクが追加される() {
Key minutesKey = MinutesService.put(" テスト用議事録1");
int before = tester.tasks.size();
Key memoKey = MemoService.put(minutesKey, " メモ1");
int after = tester.tasks.size();
assertThat(" タスクが二件増える", after, is(before + 2));
TaskQueueAddRequest task;
task = tester.tasks.get(0);
assertThat(
" メモ件数を加算するタスクのURL",
task.getUrl(),
is("/tq/IncrementMemoCount"));
assertThat(" メモ件数を加算するタスクのパラメータ", task.getBody(), is("minutesKey="
+ Datastore.keyToString(minutesKey)));
task = tester.tasks.get(1);
assertThat(" 形態素解析するタスクのURL", task.getUrl(), is("/tq/Yahoo"));
assertThat(" 形態素解析するタスクのパラメータ", task.getBody(), is("memoKey="
+ Datastore.keyToString(memoKey)));
assertThat(" 形態素解析するタスクのqueue 名", task.getQueueName(), is("parse"));
}
}