/*
* Copyright 2012 Kazumune Katagiri. (http://d.hatena.ne.jp/nemuzuka)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package jp.co.nemuzuka.dao;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import jp.co.nemuzuka.common.TodoStatus;
import jp.co.nemuzuka.core.entity.GlobalTransaction;
import jp.co.nemuzuka.core.entity.TransactionEntity;
import jp.co.nemuzuka.model.MemberModel;
import jp.co.nemuzuka.model.TodoModel;
import jp.co.nemuzuka.service.MemberService;
import jp.co.nemuzuka.service.impl.MemberServiceImpl;
import jp.co.nemuzuka.tester.AppEngineTestCase4HRD;
import jp.co.nemuzuka.utils.ConvertUtils;
import jp.co.nemuzuka.utils.DateTimeUtils;
import org.junit.Test;
import org.slim3.datastore.Datastore;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;
/**
* TodoDaoのテストクラス.
* @author kazumune
*/
public class TodoDaoTest extends AppEngineTestCase4HRD {
TodoDao todoDao = TodoDao.getInstance();
MemberDao memberDao = MemberDao.getInstance();
MemberService memberService = MemberServiceImpl.getInstance();
List<Key> todoKeyList = new ArrayList<Key>();
/**
* getListのテスト.
* @throws Exception 例外
*/
@Test
public void testGetList() throws Exception {
createTestData();
SimpleDateFormat sdf = DateTimeUtils.createSdf("yyyyMMdd");
//メールアドレスが違うので取得できない
TodoDao.Param param = new TodoDao.Param();
String memberKeyString = memberService.getKeyString("hoge3@hige.hage");
param.targetMemberKeyString = memberKeyString;
List<TodoModel> actualList = todoDao.getList(param);
assertThat(actualList.size(), is(0));
//取得可能(検索条件未設定)
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(6));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(0)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(1)));
assertThat(actualList.get(2).getKey(), is(todoKeyList.get(2)));
assertThat(actualList.get(3).getKey(), is(todoKeyList.get(3)));
assertThat(actualList.get(4).getKey(), is(todoKeyList.get(4)));
assertThat(actualList.get(5).getKey(), is(todoKeyList.get(5)));
//limit指定
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.limit = 3;
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(3));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(0)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(1)));
assertThat(actualList.get(2).getKey(), is(todoKeyList.get(2)));
//件名指定
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.title = "Like用件名";
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(2));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(0)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(2)));
//タグ名指定
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.tag = "名";
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(1));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(1)));
//期限From指定
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.fromPeriod = ConvertUtils.toDate("20120106", sdf);
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(1));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(2)));
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.fromPeriod = ConvertUtils.toDate("20120105", sdf);
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(3));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(2)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(4)));
assertThat(actualList.get(2).getKey(), is(todoKeyList.get(5)));
//期限To設定
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.toPeriod = ConvertUtils.toDate("20120105", sdf);
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(2));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(4)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(5)));
//期間From~To設定
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.fromPeriod = ConvertUtils.toDate("20120106", sdf);
param.toPeriod = ConvertUtils.toDate("20120106", sdf);
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(1));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(2)));
//ステータスの設定
String[] status = new String[]{
TodoStatus.finish.getCode(),
TodoStatus.doing.getCode()};
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.status = status;
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(3));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(3)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(4)));
assertThat(actualList.get(2).getKey(), is(todoKeyList.get(5)));
//未完了を選択された場合
status = new String[]{TodoStatus.NO_FINISH};
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.status = status;
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(4));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(0)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(1)));
assertThat(actualList.get(2).getKey(), is(todoKeyList.get(2)));
assertThat(actualList.get(3).getKey(), is(todoKeyList.get(5)));
//存在しないステータスコードを指定された
status = new String[]{"4989"};
param = new TodoDao.Param();
memberKeyString = memberService.getKeyString("hoge@hige.hage");
param.targetMemberKeyString = memberKeyString;
param.status = status;
actualList = todoDao.getList(param);
assertThat(actualList.size(), is(6));
}
/**
* getDashbordListのテスト.
* @throws Exception 例外
*/
@Test
public void testGetDashbordList() throws Exception {
createTestData();
String memberKeyString = memberService.getKeyString("hoge2@hige.hage");
List<TodoModel> actualList = todoDao.getDashbordList(20, memberKeyString);
assertThat(actualList.size(), is(3));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(6)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(8)));
assertThat(actualList.get(2).getKey(), is(todoKeyList.get(7)));
//期限ありのものだけで取得件数を満たした場合
memberKeyString = memberService.getKeyString("hoge2@hige.hage");
actualList = todoDao.getDashbordList(2, memberKeyString);
assertThat(actualList.size(), is(2));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(6)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(8)));
//期限ありのもの+期限なしのもので取得件数を満たした場合
memberKeyString = memberService.getKeyString("hoge2@hige.hage");
actualList = todoDao.getDashbordList(3, memberKeyString);
assertThat(actualList.size(), is(3));
assertThat(actualList.get(0).getKey(), is(todoKeyList.get(6)));
assertThat(actualList.get(1).getKey(), is(todoKeyList.get(8)));
assertThat(actualList.get(2).getKey(), is(todoKeyList.get(7)));
//該当レコードが存在しない場合
memberKeyString = memberService.getKeyString("hoge3@hige.hage");
actualList = todoDao.getDashbordList(4, memberKeyString);
assertThat(actualList.size(), is(0));
}
/**
* テストデータ作成.
* @throws Exception 例外
*/
private void createTestData() throws Exception {
TodoModel model = null;
SimpleDateFormat sdf = DateTimeUtils.createSdf("yyyyMMdd");
for(int i = 0; i < 10; i++) {
model = new TodoModel();
String targetEmail;
if(0 <= i && i <= 5) {
targetEmail = "hoge@hige.hage";
} else {
targetEmail = "hoge2@hige.hage";
}
TodoStatus status = null;
if(0 <= i && i <= 2) {
status = TodoStatus.nothing;
} else if(5 <= i && i <= 8) {
status = TodoStatus.doing;
} else {
status = TodoStatus.finish;
}
Date period = null;
if(4 <= i && i <= 6) {
period = sdf.parse("20120105");
} else if(i == 2 || (8 <= i && i <= 9)) {
period = sdf.parse("20120106");
}
model.setStatus(status);
Key memberKey = Datastore.createKey(MemberModel.class, targetEmail);
model.setCreateMemberKey(memberKey);
if(i == 0 || i == 2) {
model.setTitle("Like用件名" + i);
} else {
model.setTitle("件名1" + i);
}
if(i == 0) {
model.setTag("タグ名");
} else if(i == 1) {
model.setTag("名");
} else {
model.setTag(",さる名");
}
model.setContent(new Text("詳細" + i));
model.setPeriod(period);
todoDao.put(model);
todoKeyList.add(model.getKey());
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
}
MemberModel memberModel = new MemberModel();
memberModel.createKey("hoge@hige.hage");
memberDao.put(memberModel);
memberModel = new MemberModel();
memberModel.createKey("hoge2@hige.hage");
memberDao.put(memberModel);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
return;
}
/* (非 Javadoc)
* @see org.slim3.tester.AppEngineTestCase#setUp()
*/
@Override
public void setUp() throws Exception {
super.setUp();
TransactionEntity transactionEntity = new TransactionEntity();
GlobalTransaction.transaction.set(transactionEntity);
}
}