/*
* 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.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import jp.co.nemuzuka.common.Authority;
import jp.co.nemuzuka.common.ProjectAuthority;
import jp.co.nemuzuka.core.entity.GlobalTransaction;
import jp.co.nemuzuka.core.entity.TransactionEntity;
import jp.co.nemuzuka.dao.MemberDao;
import jp.co.nemuzuka.dao.ProjectDao;
import jp.co.nemuzuka.dao.ProjectMemberDao;
import jp.co.nemuzuka.entity.ProjectMemberModelEx;
import jp.co.nemuzuka.form.ProjectMemberForm;
import jp.co.nemuzuka.model.MemberModel;
import jp.co.nemuzuka.model.ProjectMemberModel;
import jp.co.nemuzuka.model.ProjectModel;
import jp.co.nemuzuka.tester.AppEngineTestCase4HRD;
import org.junit.Test;
import org.slim3.datastore.Datastore;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;
/**
* ProjectMemberServiceImplのテストクラス.
* @author k-katagiri
*/
public class ProjectMemberServiceImplTest extends AppEngineTestCase4HRD {
ProjectMemberServiceImpl service = ProjectMemberServiceImpl.getInstance();
MemberDao memberDao = MemberDao.getInstance();
ProjectDao projectDao = ProjectDao.getInstance();
ProjectMemberDao projectMemberDao = ProjectMemberDao.getInstance();
//テスト用データ
List<Key> projectKeyList;
List<Key> memberKeyList;
/**
* getProjectMemberModelListのテスト.
*/
@Test
public void testGetProjectMemberModelList() {
createInitData();
assertThat(memberDao.getAllList().size(), is(4));
assertThat(projectDao.getAllList().size(), is(3));
assertThat(projectMemberDao.getAllList().size(), is(4));
checkProject0();
checkProject1();
checkProject2();
checkProject2Only();
}
/**
* プロジェクト2用の登録状況を参照します。
* プロジェクトメンバーとして登録されているメンバーのみ取得します。
*/
private void checkProject2Only() {
//プロジェクト2用の状況
String selectedProject = Datastore.keyToString(projectKeyList.get(2));
List<ProjectMemberModelEx> actualList = service.getProjectMemberOnlyModelList(selectedProject);
assertThat(actualList.size(), is(1));
ProjectMemberModelEx actual = actualList.get(0);
assertThat(actual.projectMember, is(true));
assertThat(actual.authorityCode, is(ProjectAuthority.type1.getCode()));
assertThat(actual.member.getMail(), is(""));
}
/**
* プロジェクト2用の登録状況を参照します。
*/
private void checkProject2() {
//プロジェクト2用の状況
String selectedProject = Datastore.keyToString(projectKeyList.get(2));
List<ProjectMemberModelEx> actualList = service.getProjectMemberModelList(selectedProject);
assertThat(actualList.size(), is(4));
ProjectMemberModelEx actual = actualList.get(0);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(1);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(2);
assertThat(actual.projectMember, is(true));
assertThat(actual.authorityCode, is(ProjectAuthority.type1.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(3);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
}
/**
* プロジェクト1用の登録状況を参照します。
*/
private void checkProject1() {
//プロジェクト1用の状況
String selectedProject = Datastore.keyToString(projectKeyList.get(1));
List<ProjectMemberModelEx> actualList = service.getProjectMemberModelList(selectedProject);
assertThat(actualList.size(), is(4));
ProjectMemberModelEx actual = actualList.get(0);
assertThat(actual.projectMember, is(true));
assertThat(actual.authorityCode, is(ProjectAuthority.type2.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(1);
assertThat(actual.projectMember, is(true));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(2);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(3);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
}
/**
* プロジェクト0用の登録状況を参照します。
*/
private void checkProject0() {
//プロジェクト0用の状況
String selectedProject = Datastore.keyToString(projectKeyList.get(0));
List<ProjectMemberModelEx> actualList = service.getProjectMemberModelList(selectedProject);
assertThat(actualList.size(), is(4));
ProjectMemberModelEx actual = actualList.get(0);
assertThat(actual.projectMember, is(true));
assertThat(actual.authorityCode, is(ProjectAuthority.type1.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(1);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(2);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
actual = actualList.get(3);
assertThat(actual.projectMember, is(false));
assertThat(actual.authorityCode, is(ProjectAuthority.type3.getCode()));
assertThat(actual.member.getMail(), is(""));
}
/**
* updateProjectMemberのテスト.
*/
@Test
public void testUpdateProjectMember() {
createInitData2();
Set<String> memberKeySet = new LinkedHashSet<String>();
memberKeySet.add(Datastore.keyToString(memberKeyList.get(0)));
memberKeySet.add(Datastore.keyToString(memberKeyList.get(2)));
memberKeySet.add(Datastore.keyToString(memberKeyList.get(5)));
memberKeySet.add(Datastore.keyToString(memberKeyList.get(6)));
String[] memberKeys = memberKeySet.toArray(new String[0]);
Set<String> authorityCodeSet = new LinkedHashSet<String>();
authorityCodeSet.add(ProjectAuthority.type1.getCode());
authorityCodeSet.add(ProjectAuthority.type3.getCode());
authorityCodeSet.add("不正なコード");
authorityCodeSet.add(ProjectAuthority.type2.getCode());
String[] authorityCodes = authorityCodeSet.toArray(new String[0]);
ProjectMemberForm form = new ProjectMemberForm();
form.memberKeyArray = memberKeys;
form.authorityCodeArray = authorityCodes;
String projectKeyString = Datastore.keyToString(projectKeyList.get(0));
service.updateProjectMember(projectKeyString, form);
}
/* (non-Javadoc)
* @see jp.co.nemuzuka.tester.AppEngineTestCase4HRD#setUp()
*/
@Override
public void setUp() throws Exception {
super.setUp();
TransactionEntity transactionEntity = new TransactionEntity();
GlobalTransaction.transaction.set(transactionEntity);
}
/**
* 事前データ作成.
* ユーザを4人作成します。
* プロジェクトを3つ作成します。
* 0番目のユーザ(ユーザ0と記述)の参加プロジェクトは、
* プロジェクト0:管理者
* プロジェクト1:開発者
* ユーザ1の参加プロジェクトは、
* プロジェクト2:管理者
* ユーザ2の参加プロジェクトは、
* プロジェクト1:報告者
* ユーザ3の参加プロジェクトは
* 無し
* というデータを作成します。
*/
private void createInitData() {
memberKeyList = new ArrayList<Key>();
for(int i = 0; i < 4; i++) {
MemberModel model = new MemberModel();
model.createKey("mail" + i + "@gmail.com");
model.setName("name" + i);
Authority authority = null;
if(i == 0 || i == 2) {
authority = Authority.admin;
} else {
authority = Authority.normal;
}
model.setAuthority(authority);
memberDao.put(model);
memberKeyList.add(model.getKey());
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
}
projectKeyList = new ArrayList<Key>();
for(int i = 0; i < 3; i++) {
ProjectModel model = new ProjectModel();
model.setProjectId("id_" + i);
model.setProjectName("project_name_" + i);
model.setProjectSummary(new Text("summary_" + i));
projectDao.put(model);
projectKeyList.add(model.getKey());
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
}
//プロジェクトとメンバーを紐付ける
//0番目のユーザに合致する情報
Key targetMemberKey = memberKeyList.get(0);
ProjectMemberModel model = new ProjectMemberModel();
model.createKey(projectKeyList.get(0), targetMemberKey);
model.setProjectAuthority(ProjectAuthority.type1);
putProjectMemberModel(model);
model = new ProjectMemberModel();
model.createKey(projectKeyList.get(1), targetMemberKey);
model.setProjectAuthority(ProjectAuthority.type2);
putProjectMemberModel(model);
//1番目のユーザに合致する情報
targetMemberKey = memberKeyList.get(1);
model = new ProjectMemberModel();
model.createKey(projectKeyList.get(2), targetMemberKey);
model.setProjectAuthority(ProjectAuthority.type1);
putProjectMemberModel(model);
//2番目のユーザに合致する情報
targetMemberKey = memberKeyList.get(2);
model = new ProjectMemberModel();
model.createKey(projectKeyList.get(1), targetMemberKey);
model.setProjectAuthority(ProjectAuthority.type3);
putProjectMemberModel(model);
}
/**
* 事前データ作成.
* メンバーを10人作成します。
* プロジェクトを3つ作成します。
* 全てのプロジェクトにおいて、作成したメンバーが開発者として参加するものとして
* データを登録します。
*/
private void createInitData2() {
memberKeyList = new ArrayList<Key>();
for(int i = 0; i < 10; i++) {
MemberModel model = new MemberModel();
model.createKey("mail" + i + "@gmail.com");
model.setName("name" + i);
Authority authority = null;
if(i == 0 || i == 2) {
authority = Authority.admin;
} else {
authority = Authority.normal;
}
model.setAuthority(authority);
memberDao.put(model);
memberKeyList.add(model.getKey());
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
}
projectKeyList = new ArrayList<Key>();
for(int i = 0; i < 3; i++) {
ProjectModel model = new ProjectModel();
model.setProjectId("id_" + i);
model.setProjectName("project_name_" + i);
model.setProjectSummary(new Text("summary_" + i));
projectDao.put(model);
projectKeyList.add(model.getKey());
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
}
for(Key memberKey : memberKeyList) {
for(Key projectKey : projectKeyList) {
ProjectMemberModel model = new ProjectMemberModel();
model.createKey(projectKey, memberKey);
model.setProjectAuthority(ProjectAuthority.type2);
putProjectMemberModel(model);
}
}
}
/**
* ProjectMemberModel登録.
* @param model 登録対象Model
*/
private void putProjectMemberModel(ProjectMemberModel model) {
projectMemberDao.put(model);
GlobalTransaction.transaction.get().commit();
GlobalTransaction.transaction.get().begin();
}
}