Package com.google.testing.testify.risk.frontend.server.service.impl

Source Code of com.google.testing.testify.risk.frontend.server.service.impl.ProjectServiceImplTest

// 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;
  }
}
TOP

Related Classes of com.google.testing.testify.risk.frontend.server.service.impl.ProjectServiceImplTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.