// Copyright 2010 Google Inc. All Rights Reseved.
//
// 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 com.google.testing.testify.risk.frontend.server.service.impl;
import com.google.common.collect.Lists;
import com.google.testing.testify.risk.frontend.model.Project;
import com.google.testing.testify.risk.frontend.server.service.ProjectService;
import com.google.testing.testify.risk.frontend.server.service.UserService;
import com.google.testing.testify.risk.frontend.server.service.impl.ProjectServiceImpl;
import com.google.testing.testify.risk.frontend.shared.rpc.UserRpc.ProjectAccess;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;
/**
* Tests for ProjectServiceImpl.
*
* @author jimr@google.com (Jim Reardon)
*/
public class ProjectServiceImplTest extends TestCase {
// Common mocks.
private final PersistenceManagerFactory pmf =
EasyMock.createMock(PersistenceManagerFactory.class);
private final PersistenceManager pm = EasyMock.createMock(PersistenceManager.class);
private final UserService userService = EasyMock.createMock(UserService.class);
private ProjectService service;
@Override
public void setUp() {
// Typical calls.
pmf.getPersistenceManager();
EasyMock.expectLastCall().andReturn(pm);
service = new ProjectServiceImpl(pmf, userService);
}
public void testQueryOnlyReturnsViewProjects() {
List<Project> projects = Lists.newArrayList(
newProject("yes 1", 1),
newProject("no 1", 2),
newProject("yes 2", 3),
newProject("yes 3", 4),
newProject("no 2", 5));
// Query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, projects);
for (Project p : projects) {
boolean result = p.getName().startsWith("yes");
EasyMock.expect(userService.hasViewAccess(p)).andReturn(result);
if (result) {
EasyMock.expect(pm.detachCopy(p)).andReturn(p);
EasyMock.expect(userService.getAccessLevel(p)).andReturn(ProjectAccess.EDIT_ACCESS);
}
}
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.query("");
assertEquals(actual.size(), 3);
assertEquals(actual.get(0).getName(), "yes 1");
assertEquals(actual.get(1).getName(), "yes 2");
assertEquals(actual.get(2).getName(), "yes 3");
EasyMock.verify(pmf, pm, userService, query);
}
public void testQueryUserProjects_notLoggedIn() {
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(false);
// Override the setUp actions. Those are used in almost all cases, just not this one.
EasyMock.reset(pmf);
EasyMock.replay(userService, pmf, pm);
List<Project> actual = service.queryUserProjects();
assertEquals(actual.size(), 0);
EasyMock.verify(userService, pmf, pm);
}
public void testQueryUserProjects_empty() {
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
// DB query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, Lists.<Project>newArrayList());
// Getting starred query.
expectGetStarred(Lists.<Long>newArrayList());
// Actual call.
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.queryUserProjects();
assertEquals(actual.size(), 0);
EasyMock.verify(pmf, pm, userService, query);
}
public void testQueryProjects_noAccess() {
List<Project> projects = Lists.newArrayList(
newProject("no1 access", 1),
newProject("view access", 2),
newProject("no2 access", 3),
newProject("no3 access", 4),
newProject("view2 access", 5));
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
// DB query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, projects);
EasyMock.expect(userService.getAccessLevel(projects.get(0))).andReturn(ProjectAccess.NO_ACCESS);
EasyMock.expect(userService.getAccessLevel(projects.get(1))).andReturn(
ProjectAccess.VIEW_ACCESS);
EasyMock.expect(userService.getAccessLevel(projects.get(2))).andReturn(
ProjectAccess.NO_ACCESS);
EasyMock.expect(userService.getAccessLevel(projects.get(3))).andReturn(
ProjectAccess.NO_ACCESS);
EasyMock.expect(userService.getAccessLevel(projects.get(4))).andReturn(
ProjectAccess.VIEW_ACCESS);
// Getting starred query.
expectGetStarred(Lists.<Long>newArrayList());
// Actual call.
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.queryUserProjects();
assertEquals(actual.size(), 0);
EasyMock.verify(pmf, pm, userService, query);
}
public void testQueryProjects_noStarred() {
List<Project> projects = Lists.newArrayList(
newProject("no access", 1),
newProject("view access", 2),
newProject("explicit view access", 3),
newProject("edit access", 4),
newProject("owner access", 5));
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
// DB query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, projects);
expectProjectCheck(projects.get(0), ProjectAccess.NO_ACCESS, false);
expectProjectCheck(projects.get(1), ProjectAccess.VIEW_ACCESS, false);
expectProjectCheck(projects.get(2), ProjectAccess.EXPLICIT_VIEW_ACCESS, true);
expectProjectCheck(projects.get(3), ProjectAccess.EDIT_ACCESS, true);
expectProjectCheck(projects.get(4), ProjectAccess.OWNER_ACCESS, true);
// Getting starred query.
expectGetStarred(Lists.<Long>newArrayList());
// Actual call.
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.queryUserProjects();
assertEquals(actual.size(), 3);
assertEquals(actual.get(0).getProjectId().longValue(), 3);
assertEquals(actual.get(1).getProjectId().longValue(), 4);
assertEquals(actual.get(2).getProjectId().longValue(), 5);
EasyMock.verify(pmf, pm, userService, query);
}
private void expectProjectCheck(Project p, ProjectAccess access, boolean willReturn) {
EasyMock.expect(userService.getAccessLevel(p)).andReturn(access);
if (willReturn) {
EasyMock.expect(pm.detachCopy(p)).andReturn(p);
EasyMock.expect(userService.getAccessLevel(p)).andReturn(access);
}
}
public void testQueryProjects_starredWithAccess() {
List<Project> projects = Lists.newArrayList(
newProject("no access", 1),
newProject("view access", 2),
newProject("explicit view access", 3),
newProject("edit access", 4),
newProject("owner access", 5));
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
// DB query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, projects);
expectProjectCheck(projects.get(0), ProjectAccess.NO_ACCESS, false);
expectProjectCheck(projects.get(1), ProjectAccess.VIEW_ACCESS, true);
expectProjectCheck(projects.get(2), ProjectAccess.EXPLICIT_VIEW_ACCESS, true);
expectProjectCheck(projects.get(3), ProjectAccess.EDIT_ACCESS, true);
expectProjectCheck(projects.get(4), ProjectAccess.OWNER_ACCESS, true);
// Getting starred query.
expectGetStarred(Lists.newArrayList(2L));
// Actual call.
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.queryUserProjects();
assertEquals(actual.size(), 4);
assertEquals(actual.get(0).getProjectId().longValue(), 2);
assertEquals(actual.get(1).getProjectId().longValue(), 3);
assertEquals(actual.get(2).getProjectId().longValue(), 4);
assertEquals(actual.get(3).getProjectId().longValue(), 5);
EasyMock.verify(pmf, pm, userService, query);
}
public void testQueryProjects_starredWithoutAccess() {
List<Project> projects = Lists.newArrayList(
newProject("no access", 1),
newProject("view access", 2),
newProject("explicit view access", 3),
newProject("edit access", 4),
newProject("owner access", 5));
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
// DB query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, projects);
expectProjectCheck(projects.get(0), ProjectAccess.NO_ACCESS, false);
expectProjectCheck(projects.get(1), ProjectAccess.VIEW_ACCESS, false);
expectProjectCheck(projects.get(2), ProjectAccess.EXPLICIT_VIEW_ACCESS, true);
expectProjectCheck(projects.get(3), ProjectAccess.EDIT_ACCESS, true);
expectProjectCheck(projects.get(4), ProjectAccess.OWNER_ACCESS, true);
// Getting starred query.
expectGetStarred(Lists.newArrayList(1L));
// Actual call.
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.queryUserProjects();
assertEquals(actual.size(), 3);
assertEquals(actual.get(0).getProjectId().longValue(), 3);
assertEquals(actual.get(1).getProjectId().longValue(), 4);
assertEquals(actual.get(2).getProjectId().longValue(), 5);
EasyMock.verify(pmf, pm, userService, query);
}
public void testQueryProjectsEdit_some() {
List<Project> projects = Lists.newArrayList(
newProject("no1 access", 1),
newProject("view access", 2),
newProject("edit access", 3),
newProject("no2 access", 4),
newProject("explicit view access", 5),
newProject("owner access", 6));
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
// DB query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, projects);
expectProjectCheck(projects.get(0), ProjectAccess.NO_ACCESS, false);
expectProjectCheck(projects.get(1), ProjectAccess.VIEW_ACCESS, true);
expectProjectCheck(projects.get(2), ProjectAccess.EDIT_ACCESS, true);
expectProjectCheck(projects.get(3), ProjectAccess.NO_ACCESS, false);
expectProjectCheck(projects.get(4), ProjectAccess.EXPLICIT_VIEW_ACCESS, true);
expectProjectCheck(projects.get(5), ProjectAccess.OWNER_ACCESS, true);
// Getting starred query.
expectGetStarred(Lists.newArrayList(1L, 2L));
// Checking edit access.
EasyMock.expect(userService.hasEditAccess(projects.get(1))).andReturn(false);
EasyMock.expect(userService.hasEditAccess(projects.get(2))).andReturn(true);
EasyMock.expect(userService.hasEditAccess(projects.get(4))).andReturn(false);
EasyMock.expect(userService.hasEditAccess(projects.get(5))).andReturn(true);
EasyMock.expect(userService.getAccessLevel(projects.get(2))).andReturn(null);
EasyMock.expect(userService.getAccessLevel(projects.get(5))).andReturn(null);
// Actual call.
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.queryProjectsUserHasEditAccessTo();
assertEquals(actual.size(), 2);
assertEquals(actual.get(0).getProjectId().longValue(), 3L);
assertEquals(actual.get(1).getProjectId().longValue(), 6L);
EasyMock.verify(pmf, pm, userService, query);
}
public void testQueryProjectsEdit_none() {
List<Project> projects = Lists.newArrayList(
newProject("no1 access", 1),
newProject("view access", 2),
newProject("no2 access", 3),
newProject("explicit view access", 4),
newProject("view2 access", 5));
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
userService.isUserLoggedIn();
EasyMock.expectLastCall().andReturn(true);
// DB query.
Query query = expectQuery(Project.class);
expectOrdering(query, "projectId asc");
expectExecute(query, projects);
expectProjectCheck(projects.get(0), ProjectAccess.NO_ACCESS, false);
expectProjectCheck(projects.get(1), ProjectAccess.VIEW_ACCESS, true);
expectProjectCheck(projects.get(2), ProjectAccess.NO_ACCESS, false);
expectProjectCheck(projects.get(3), ProjectAccess.EXPLICIT_VIEW_ACCESS, true);
expectProjectCheck(projects.get(4), ProjectAccess.VIEW_ACCESS, false);
// Getting starred query.
expectGetStarred(Lists.newArrayList(1L, 2L));
// Checking edit access.
EasyMock.expect(userService.hasEditAccess(projects.get(1))).andReturn(false);
EasyMock.expect(userService.hasEditAccess(projects.get(3))).andReturn(false);
// Actual call.
EasyMock.replay(pmf, pm, userService, query);
List<Project> actual = service.queryProjectsUserHasEditAccessTo();
assertEquals(actual.size(), 0);
EasyMock.verify(pmf, pm, userService, query);
}
public void testGetProjectById_withAccess() {
long id = 123L;
Project project = new Project();
project.setProjectId(123);
project.setName("Hello There 123");
EasyMock.expect(pm.getObjectById(Project.class, id)).andReturn(project);
EasyMock.expect(userService.hasViewAccess(project)).andReturn(true);
pm.close();
EasyMock.expectLastCall();
EasyMock.expect(pm.detachCopy(project)).andReturn(project);
EasyMock.expect(userService.getAccessLevel(project)).andReturn(null);
EasyMock.replay(userService, pmf, pm);
Project actual = service.getProjectById(id);
EasyMock.verify(userService, pmf, pm);
assertEquals(actual.getProjectId().longValue(), id);
assertEquals(actual.getName(), "Hello There 123");
}
public void testGetProjectById_withoutAccess() {
long id = 123L;
Project project = new Project();
project.setProjectId(123);
project.setName("Hello There 123");
EasyMock.expect(pm.getObjectById(Project.class, id)).andReturn(project);
EasyMock.expect(userService.hasViewAccess(project)).andReturn(false);
pm.close();
EasyMock.expectLastCall();
EasyMock.replay(userService, pmf, pm);
Project actual = service.getProjectById(id);
EasyMock.verify(userService, pmf, pm);
assertEquals(actual, null);
}
public void testGetProjectById_nx() {
EasyMock.expect(pm.getObjectById(Project.class, 123L)).andReturn(null);
pm.close();
EasyMock.expectLastCall();
EasyMock.replay(userService, pmf, pm);
Project actual = service.getProjectById(123L);
EasyMock.verify(userService, pmf, pm);
assertEquals(actual, null);
}
public void testGetProjectByName_access() {
Project project = new Project();
project.setProjectId(123);
project.setName("Hello There 123");
List<Project> projects = Lists.newArrayList(project);
Query query = expectQuery(Project.class);
query.declareParameters("String projectNameParam");
EasyMock.expectLastCall();
query.setFilter("name == projectNameParam");
EasyMock.expectLastCall();
expectExecute(query, projects, "Hello There 123");
EasyMock.expect(userService.hasViewAccess(project)).andReturn(true);
EasyMock.expect(pm.detachCopy(project)).andReturn(project);
EasyMock.expect(userService.getAccessLevel(project)).andReturn(null);
EasyMock.replay(userService, pmf, pm, query);
Project actual = service.getProjectByName("Hello There 123");
EasyMock.verify(userService, pmf, pm, query);
assertEquals(actual.getName(), "Hello There 123");
assertEquals(actual.getProjectId().longValue(), 123L);
}
public void testGetProjectByName_noAccess() {
Project project = new Project();
project.setProjectId(123);
project.setName("Hello There 123");
List<Project> projects = Lists.newArrayList(project);
Query query = expectQuery(Project.class);
query.declareParameters("String projectNameParam");
EasyMock.expectLastCall();
query.setFilter("name == projectNameParam");
EasyMock.expectLastCall();
expectExecute(query, projects, "Hello There 123");
EasyMock.expect(userService.hasViewAccess(project)).andReturn(false);
EasyMock.replay(userService, pmf, pm, query);
Project actual = service.getProjectByName("Hello There 123");
EasyMock.verify(userService, pmf, pm, query);
assertEquals(actual, null);
}
public void testGetProjectByName_multipleOneWithAccess() {
Project project = new Project();
project.setProjectId(123);
project.setName("Has a Dupe");
Project project2 = new Project();
project2.setProjectId(124);
project2.setName("Has a Dupe");
List<Project> projects = Lists.newArrayList(project, project2);
Query query = expectQuery(Project.class);
query.declareParameters("String projectNameParam");
EasyMock.expectLastCall();
query.setFilter("name == projectNameParam");
EasyMock.expectLastCall();
expectExecute(query, projects, "Has a Dupe");
EasyMock.expect(userService.hasViewAccess(project)).andReturn(false);
EasyMock.expect(userService.hasViewAccess(project2)).andReturn(true);
EasyMock.expect(pm.detachCopy(project2)).andReturn(project2);
EasyMock.expect(userService.getAccessLevel(project2)).andReturn(null);
EasyMock.replay(userService, pmf, pm, query);
Project actual = service.getProjectByName("Has a Dupe");
EasyMock.verify(userService, pmf, pm, query);
assertEquals(actual.getName(), "Has a Dupe");
assertEquals(actual.getProjectId().longValue(), 124L);
}
public void testGetProjectByName_nx() {
List<Project> projects = Lists.newArrayList();
Query query = expectQuery(Project.class);
query.declareParameters("String projectNameParam");
EasyMock.expectLastCall();
query.setFilter("name == projectNameParam");
EasyMock.expectLastCall();
expectExecute(query, projects, "Hello There 123");
EasyMock.replay(userService, pmf, pm, query);
Project actual = service.getProjectByName("Hello There 123");
EasyMock.verify(userService, pmf, pm, query);
assertEquals(actual, null);
}
private void expectGetStarred(List<Long> result) {
userService.getStarredProjects();
EasyMock.expectLastCall().andReturn(result);
}
private void expectExecute(Query query, Object result) {
query.execute();
EasyMock.expectLastCall().andReturn(result);
pm.close();
EasyMock.expectLastCall();
}
private void expectExecute(Query query, Object result, String param) {
query.execute(param);
EasyMock.expectLastCall().andReturn(result);
pm.close();
EasyMock.expectLastCall();
}
@SuppressWarnings("unchecked")
private Query expectQuery(@SuppressWarnings("rawtypes") Class clazz) {
Query query = EasyMock.createMock(Query.class);
EasyMock.expect(pm.newQuery(clazz)).andReturn(query);
return query;
}
private void expectOrdering(Query query, String order) {
query.setOrdering(order);
EasyMock.expectLastCall();
}
private Project newProject(String name, long id) {
Project p = new Project();
p.setName(name);
p.setProjectId(id);
return p;
}
}