/*
* 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.service.impl;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.Date;
import java.util.List;
import jp.co.nemuzuka.core.entity.GlobalTransaction;
import jp.co.nemuzuka.core.entity.TransactionEntity;
import jp.co.nemuzuka.dao.MilestoneDao;
import jp.co.nemuzuka.dao.ProjectDao;
import jp.co.nemuzuka.entity.MilestoneModelEx;
import jp.co.nemuzuka.form.MilestoneForm;
import jp.co.nemuzuka.model.MilestoneModel;
import jp.co.nemuzuka.model.ProjectModel;
import jp.co.nemuzuka.tester.AppEngineTestCase4HRD;
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;
/**
* MilestoneServiceImplのテストクラス.
* @author kazumune
*/
public class MilestoneServiceImplTest extends AppEngineTestCase4HRD {
MilestoneServiceImpl service = MilestoneServiceImpl.getInstance();
MilestoneDao milestoneDao = MilestoneDao.getInstance();
ProjectDao projectDao = ProjectDao.getInstance();
List<Key> milestoneKeyList;
Key projectKey;
/**
* getのテスト.
* @throws Exception 例外
*/
@Test
public void testGet() throws Exception {
createTestData();
//該当データが存在する場合
String keyString = Datastore.keyToString(milestoneKeyList.get(0));
MilestoneForm actual = service.get(keyString);
assertThat(actual.getKeyToString(), is(keyString));
assertThat(actual.getMilestoneName(), is("マイルストン_0"));
assertThat(actual.getStartDate(), is("20120401"));
assertThat(actual.getEndDate(), is("20120430"));
assertThat(actual.getVersionNo(), is("1"));
//新規の場合
actual = service.get("");
assertThat(actual.getKeyToString(), is(nullValue()));
assertThat(actual.getMilestoneName(), is(nullValue()));
assertThat(actual.getStartDate(), is(nullValue()));
assertThat(actual.getEndDate(), is(nullValue()));
assertThat(actual.getVersionNo(), is(nullValue()));
//データを削除する
milestoneDao.delete(milestoneKeyList.get(2));
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
//keyを指定したが存在しない場合
keyString = Datastore.keyToString(milestoneKeyList.get(2));
actual = service.get(keyString);
assertThat(actual.getKeyToString(), is(nullValue()));
assertThat(actual.getMilestoneName(), is(nullValue()));
assertThat(actual.getStartDate(), is(nullValue()));
assertThat(actual.getEndDate(), is(nullValue()));
assertThat(actual.getVersionNo(), is(nullValue()));
}
/**
* putのテスト.
* @throws Exception 例外
*/
@Test
public void testPut() throws Exception {
createTestData();
SimpleDateFormat sdf = DateTimeUtils.createSdf("yyyyMMdd");
String projectKeyToString = Datastore.keyToString(projectKey);
//
//新規
//
MilestoneForm form = new MilestoneForm();
form.milestoneName = "追加マイルストン";
form.startDate = "20120501";
form.endDate = "20120502";
service.put(form, projectKeyToString);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
//1件追加されていること
List<MilestoneModelEx> allList = service.getAllList(projectKeyToString);
assertThat(allList.size(), is(4));
MilestoneModelEx actual = allList.get(3);
assertThat(actual.model.getMilestoneName(), is("追加マイルストン"));
assertThat(actual.model.getStartDate().getTime(), is(sdf.parse("20120501").getTime()));
assertThat(actual.model.getEndDate().getTime(), is(sdf.parse("20120502").getTime()));
assertThat(actual.model.getSortNum(), is(Long.MAX_VALUE));
assertThat(actual.model.getVersion(), is(1L));
assertThat(actual.getStartDate(), is("20120501"));
assertThat(actual.getEndDate(), is("20120502"));
//
//更新
//
String keyString = Datastore.keyToString(milestoneKeyList.get(0));
form = service.get(keyString);
form.setMilestoneName("変更後マイルストン");
form.startDate = "";
form.endDate = "";
service.put(form, projectKeyToString);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
allList = service.getAllList(projectKeyToString);
actual = allList.get(0);
assertThat(actual.model.getMilestoneName(), is("変更後マイルストン"));
assertThat(actual.model.getStartDate(), is(nullValue()));
assertThat(actual.model.getEndDate(), is(nullValue()));
assertThat(actual.model.getSortNum(), is(Long.MAX_VALUE));
assertThat(actual.model.getVersion(), is(2L));
assertThat(actual.getStartDate(), is(""));
assertThat(actual.getEndDate(), is(""));
//
//該当レコードが存在しない
//
keyString = Datastore.keyToString(milestoneKeyList.get(1));
form = service.get(keyString);
form.setMilestoneName("バージョン不正");
form.setVersionNo("-1");
try {
service.put(form, projectKeyToString);
fail();
} catch (ConcurrentModificationException e) {}
}
/**
* deleteのテスト.
* @throws Exception 例外
*/
@Test
public void testDelete() throws Exception {
createTestData();
String projectKeyToString = Datastore.keyToString(projectKey);
String keyString = Datastore.keyToString(milestoneKeyList.get(0));
MilestoneForm form = service.get(keyString);
service.delete(form, projectKeyToString);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
form = service.get(keyString);
assertThat(form.keyToString, is(nullValue()));
//
//バージョン違い
//
keyString = Datastore.keyToString(milestoneKeyList.get(1));
form = service.get(keyString);
form.versionNo = "-1";
try {
service.delete(form, projectKeyToString);
fail();
} catch (ConcurrentModificationException e) {}
}
/**
* updateSortNumのテスト.
* @throws Exception 例外
*/
@Test
public void testUpdateSortNum() throws Exception {
createTestData();
String projectKeyToString = Datastore.keyToString(projectKey);
String[] sortedKeyToString = new String[]{
Datastore.keyToString(milestoneKeyList.get(0)),
Datastore.keyToString(milestoneKeyList.get(2)),
Datastore.keyToString(milestoneKeyList.get(1))
};
service.updateSortNum(sortedKeyToString, projectKeyToString);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
//順番が変わっていること
List<MilestoneModelEx> allList = service.getAllList(projectKeyToString);
assertThat(allList.size(), is(3));
assertThat(allList.get(0).model.getKey(), is(milestoneKeyList.get(0)));
assertThat(allList.get(1).model.getKey(), is(milestoneKeyList.get(2)));
assertThat(allList.get(2).model.getKey(), is(milestoneKeyList.get(1)));
//
//サイズ0の配列を渡されてもエラーにならないこと
//
service.updateSortNum(new String[0], projectKeyToString);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
//削除された状態で呼び出してもエラーにならないこと
MilestoneForm form = service.get(Datastore.keyToString(milestoneKeyList.get(0)));
service.delete(form, projectKeyToString);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
sortedKeyToString = new String[]{
Datastore.keyToString(milestoneKeyList.get(0)),
Datastore.keyToString(milestoneKeyList.get(2)),
Datastore.keyToString(milestoneKeyList.get(1))
};
service.updateSortNum(sortedKeyToString, projectKeyToString);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
//順番が変わっていること
allList = service.getAllList(projectKeyToString);
assertThat(allList.size(), is(2));
assertThat(allList.get(0).model.getKey(), is(milestoneKeyList.get(2)));
assertThat(allList.get(1).model.getKey(), is(milestoneKeyList.get(1)));
}
/**
* テストデータ作成.
* プロジェクト1件
* マイルストーン3件を作成します。
* @throws ParseException 例外
*/
private void createTestData() throws ParseException {
ProjectModel model = new ProjectModel();
model.setProjectId("test_project");
model.setProjectName("テストプロジェクト");
model.setProjectSummary(new Text("テスト用プロジェクトですってば"));
projectDao.put(model);
projectKey = model.getKey();
milestoneKeyList = new ArrayList<Key>();
SimpleDateFormat sdf = DateTimeUtils.createSdf("yyyyMMdd");
for(int i = 0; i < 3; i++) {
MilestoneModel milestoneModel = new MilestoneModel();
milestoneModel.setMilestoneName("マイルストン_" + i);
Date startDate = null;
if(i == 0 || i == 2) {
startDate = sdf.parse("20120401");
}
milestoneModel.setStartDate(startDate);
Date endDate = null;
if(i == 0 || i == 1) {
endDate = sdf.parse("20120430");
}
milestoneModel.setEndDate(endDate);
milestoneModel.setProjectKey(projectKey);
milestoneModel.setSortNum(Long.MAX_VALUE);
milestoneDao.put(milestoneModel);
milestoneKeyList.add(milestoneModel.getKey());
}
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);
}
}