/* * 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.List; 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.core.entity.UserInfo; import jp.co.nemuzuka.dao.MemberDao; import jp.co.nemuzuka.dao.ProjectDao; import jp.co.nemuzuka.dao.ProjectMemberDao; import jp.co.nemuzuka.entity.ProjectModelEx; import jp.co.nemuzuka.model.MemberModel; import jp.co.nemuzuka.model.ProjectMemberModel; import jp.co.nemuzuka.model.ProjectModel; import jp.co.nemuzuka.service.ProjectService; 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; /** * ProjectServiceImplのテストクラス(その2). * @author kazumune */ public class ProjectServiceImpl2Test extends AppEngineTestCase4HRD { ProjectServiceImpl service = ProjectServiceImpl.getInstance(); ProjectDao projectDao = ProjectDao.getInstance(); MemberDao memberDao = MemberDao.getInstance(); ProjectMemberDao projectMemberDao = ProjectMemberDao.getInstance(); //テスト用データ List<Key> projectKeyList; List<Key> memberKeyList; /** * getUserProjectListのテスト. * @throws Exception */ @Test public void testGetUserProjectListOnlyMail() throws Exception { createInitData(); //GAE管理者であっても、所属するプロジェクトのみ List<ProjectModelEx> actualList = service.getUserProjectList("mail0@gmail.com"); assertThat(actualList.size(), is(2)); assertThat(actualList.get(0).getModel().getProjectName(), is("project_name_0")); assertThat(actualList.get(1).getModel().getProjectName(), is("project_name_1")); //存在しないユーザからのアクセス actualList = service.getUserProjectList("noRegist@gmail.com"); assertThat(actualList.size(), is(0)); //参加プロジェクトが1件も存在しない場合 actualList = service.getUserProjectList("mail3@gmail.com"); assertThat(actualList.size(), is(0)); } /** * getUserProjectListのテスト. */ @Test public void testGetUserProjectList() { createInitData(); //存在しないユーザからのアクセス(ありえない筈) ProjectService.TargetProjectResult actual = service.getUserProjectList("noRegist@gmail.com", false); assertThat(actual.admin, is(false)); assertThat(actual.projectList.size(), is(0)); //GAE管理者でなくシステム管理者の場合 actual = service.getUserProjectList("mail0@gmail.com", false); assertThat(actual.admin, is(true)); assertThat(actual.projectList.size(), is(4)); assertThat(actual.projectList.get(0).getLabel(), is("--プロジェクトを選択--")); assertThat(actual.projectList.get(1).getLabel(), is("project_name_0")); assertThat(actual.projectList.get(2).getLabel(), is("project_name_1")); assertThat(actual.projectList.get(3).getLabel(), is("project_name_2")); //GAE管理者でなくシステム管理者でもない場合 actual = service.getUserProjectList("mail1@gmail.com", false); assertThat(actual.admin, is(false)); assertThat(actual.projectList.size(), is(2)); assertThat(actual.projectList.get(0).getLabel(), is("--プロジェクトを選択--")); assertThat(actual.projectList.get(1).getLabel(), is("project_name_2")); //GAE管理者でありシステム管理者でない場合 //全てのプロジェクトが選択可能 actual = service.getUserProjectList("mail1@gmail.com", true); assertThat(actual.projectList.size(), is(4)); assertThat(actual.projectList.get(0).getLabel(), is("--プロジェクトを選択--")); assertThat(actual.projectList.get(1).getLabel(), is("project_name_0")); assertThat(actual.projectList.get(2).getLabel(), is("project_name_1")); assertThat(actual.projectList.get(3).getLabel(), is("project_name_2")); } /** * setUserInfoのテスト. */ @Test public void testSetUserInfo() { createInitData(); UserInfo userInfo = new UserInfo(); userInfo.systemManager = false; //一般ユーザの場合 String selectedProject = Datastore.keyToString(projectKeyList.get(1)); service.setUserInfo(selectedProject, "mail2@gmail.com", userInfo); assertThat(userInfo.selectedProject, is(selectedProject)); assertThat(userInfo.projectManager, is(false)); assertThat(userInfo.projectMember, is(true)); assertThat(userInfo.projectAuthority, is(ProjectAuthority.type3)); GlobalTransaction.transaction.get().commit(); GlobalTransaction.transaction.get().begin(); //プロジェクト管理者の場合 userInfo = new UserInfo(); userInfo.systemManager = false; selectedProject = Datastore.keyToString(projectKeyList.get(2)); service.setUserInfo(selectedProject, "mail1@gmail.com", userInfo); assertThat(userInfo.selectedProject, is(selectedProject)); assertThat(userInfo.projectManager, is(true)); assertThat(userInfo.projectMember, is(true)); assertThat(userInfo.projectAuthority, is(ProjectAuthority.type1)); GlobalTransaction.transaction.get().commit(); GlobalTransaction.transaction.get().begin(); //GAE管理者でメンバーでない場合 userInfo = new UserInfo(); userInfo.systemManager = true; selectedProject = Datastore.keyToString(projectKeyList.get(2)); service.setUserInfo(selectedProject, "mail3@gmail.com", userInfo); assertThat(userInfo.selectedProject, is(selectedProject)); assertThat(userInfo.projectManager, is(true)); assertThat(userInfo.projectMember, is(false)); assertThat(userInfo.projectAuthority, is(nullValue())); GlobalTransaction.transaction.get().commit(); GlobalTransaction.transaction.get().begin(); //存在しないメンバーの場合 userInfo = new UserInfo(); userInfo.systemManager = false; selectedProject = Datastore.keyToString(projectKeyList.get(2)); service.setUserInfo(selectedProject, "no_mail@gmail.com", userInfo); assertThat(userInfo.selectedProject, is(selectedProject)); assertThat(userInfo.projectManager, is(false)); assertThat(userInfo.projectMember, is(false)); assertThat(userInfo.projectAuthority, is(nullValue())); GlobalTransaction.transaction.get().commit(); GlobalTransaction.transaction.get().begin(); //GAE、システム管理者で、プロジェクト管理者でない場合 userInfo = new UserInfo(); userInfo.systemManager = true; selectedProject = Datastore.keyToString(projectKeyList.get(1)); service.setUserInfo(selectedProject, "mail0@gmail.com", userInfo); assertThat(userInfo.selectedProject, is(selectedProject)); assertThat(userInfo.projectManager, is(true)); assertThat(userInfo.projectMember, is(true)); assertThat(userInfo.projectAuthority, is(ProjectAuthority.type2)); GlobalTransaction.transaction.get().commit(); GlobalTransaction.transaction.get().begin(); } /** * 事前データ作成. * ユーザを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); } /** * ProjectMemberModel登録. * @param model 登録対象Model */ private void putProjectMemberModel(ProjectMemberModel model) { projectMemberDao.put(model); GlobalTransaction.transaction.get().commit(); GlobalTransaction.transaction.get().begin(); } /* (非 Javadoc) * @see org.slim3.tester.AppEngineTestCase#setUp() */ @Override public void setUp() throws Exception { super.setUp(); TransactionEntity transactionEntity = new TransactionEntity(); GlobalTransaction.transaction.set(transactionEntity); } }