/*
* Copyright (c) 2009-2010 Lockheed Martin Corporation
*
* 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 org.eurekastreams.server.persistence;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eurekastreams.commons.hibernate.QueryOptimizer;
import org.eurekastreams.server.domain.DomainGroup;
import org.eurekastreams.server.domain.Organization;
import org.eurekastreams.server.domain.PagedSet;
import org.eurekastreams.server.domain.Person;
import org.eurekastreams.server.domain.TabGroup;
import org.eurekastreams.server.domain.strategies.OrganizationHierarchyTraverser;
import org.eurekastreams.server.persistence.strategies.DescendantOrganizationStrategy;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
/**
* This class is responsible for testing the JPA Implementation of the Person Mapper interface. The tests contained in
* here ensure proper interaction with the database.
*/
public class OrganizationMapperTest extends DomainEntityMapperTest
{
/**
* system under test.
*/
@Autowired
private OrganizationMapper jpaOrganizationMapper;
/**
* Autowired QueryOptimizer.
*/
@Autowired
private QueryOptimizer queryOptimizer;
/**
* PersonMapper.
*/
@Autowired
private PersonMapper jpaPersonMapper;
/**
* DomainGroup mapper.
*/
@Autowired
private DomainGroupMapper jpaGroupMapper;
/**
* Tab group mapper for setup.
*/
@Autowired
private TabGroupMapper jpaTabGroupMapper;
/**
* Org id.
*/
private Long orgId = 5L;
/**
* Dataset short org name.
*/
private String shortName = "TstOrgName"; // from dataset.xml
/**
* Get a new organization to add to a parent.
*
* @param rand
* number to use to add on to the end of string values to get around constraints
* @return a new organization ready to be added to a parent
*/
private Organization getNewOrganization(final String rand)
{
final long tabGroupId = 4231L;
TabGroup tabGroup = jpaTabGroupMapper.findById(tabGroupId);
Person ford = jpaPersonMapper.findByAccountId("fordp");
Organization o = new Organization("sldfj: " + rand, "asdlkfj" + rand);
o.setDescription("Foooo " + rand);
o.setUrl("http://www.foo.com/" + rand);
o.setDescription("mission: " + rand);
o.addCoordinator(ford);
return o;
}
/**
* Test the domain entity name of the mapper - used for parent class generic operations.
*/
@Test
public void testGetDomainEntityName()
{
assertEquals("Domain entity name should be 'Organization'", "Organization", jpaOrganizationMapper
.getDomainEntityName());
}
/**
* Test the queryOptimizer getter.
*/
@Test
public void testGetQueryOptimizer()
{
OrganizationMapper mapper = new OrganizationMapper(queryOptimizer);
assertSame(queryOptimizer, mapper.getQueryOptimizer());
}
/**
* Test FindByName.
*/
@Test
public void testFindByShortName()
{
long expectedId = 5L; // from dataset.
assertEquals(expectedId, jpaOrganizationMapper.findByShortName(shortName).getId());
assertNull("Object should not have been found, expected null", jpaOrganizationMapper
.findByShortName("blahWhatever"));
}
/**
* Test FindById.
*/
@Test
public void testFindById()
{
long expectedId = 5L; // from dataset.
assertEquals(expectedId, jpaOrganizationMapper.findById(expectedId).getId());
}
/**
* Test add/remove coordinators.
*/
@Test
public void testOrganizationCoordinators()
{
Organization sut = jpaOrganizationMapper.findById(orgId);
assertEquals(2, sut.getCoordinators().size());
Set<Person> set = new HashSet<Person>();
set.add(jpaPersonMapper.findByAccountId("mrburns"));
set.add(jpaPersonMapper.findByAccountId("smithers"));
set.add(jpaPersonMapper.findByAccountId("csagan"));
sut.setCoordinators(set);
getEntityManager().flush();
getEntityManager().clear();
sut = jpaOrganizationMapper.findById(orgId);
assertEquals(3, sut.getCoordinators().size());
sut.removeCoordinator(jpaPersonMapper.findByAccountId("mrburns"));
getEntityManager().flush();
getEntityManager().clear();
sut = jpaOrganizationMapper.findById(orgId);
assertEquals(2, sut.getCoordinators().size());
sut.addCoordinator(jpaPersonMapper.findByAccountId("mrburns"));
getEntityManager().flush();
getEntityManager().clear();
sut = jpaOrganizationMapper.findById(orgId);
assertEquals(3, sut.getCoordinators().size());
}
/**
* Test parentOrgId formula field.
*/
@Test
public void testParentOrgId()
{
Organization sut = jpaOrganizationMapper.findById(6L);
assertEquals(new Long(5L), sut.getParentOrgId());
}
/**
* Test add/remove coordinators.
*/
@Test
public void testOrganizationLeaders()
{
Organization sut = jpaOrganizationMapper.findById(orgId);
assertEquals(2, sut.getLeaders().size());
Set<Person> set = new HashSet<Person>();
set.add(jpaPersonMapper.findByAccountId("mrburns"));
set.add(jpaPersonMapper.findByAccountId("smithers"));
set.add(jpaPersonMapper.findByAccountId("csagan"));
sut.setLeaders(set);
getEntityManager().flush();
getEntityManager().clear();
sut = jpaOrganizationMapper.findById(orgId);
assertEquals(3, sut.getLeaders().size());
sut.removeLeader(jpaPersonMapper.findByAccountId("mrburns"));
getEntityManager().flush();
getEntityManager().clear();
sut = jpaOrganizationMapper.findById(orgId);
assertEquals(2, sut.getLeaders().size());
sut.addLeader(jpaPersonMapper.findByAccountId("mrburns"));
getEntityManager().flush();
getEntityManager().clear();
sut = jpaOrganizationMapper.findById(orgId);
assertEquals(3, sut.getLeaders().size());
}
/**
* Test the GetChildOrganizations query on mapper.
*/
@Test
public void testGetDescendantOrganizations()
{
// Organization with itself as parent (top of tree) and two children
// defined in
// dataset.xml.
List<Organization> results = jpaOrganizationMapper.getDescendantOrganizations(5L);
assertEquals(2, results.size());
// add a new org to org #6
Organization o1 = getNewOrganization("a");
o1.setParentOrganization(jpaOrganizationMapper.findById(6L));
jpaOrganizationMapper.insert(o1);
// check again
results = jpaOrganizationMapper.getDescendantOrganizations(5L);
assertEquals(3, results.size());
}
/**
* Test the GetChildOrganizations query on mapper.
*/
@Test
public void testGetRootOrganization()
{
// Organization with itself as parent (top of tree) and two children
// defined in
// dataset.xml.
Organization results = jpaOrganizationMapper.getRootOrganization();
assertNotNull(results);
assertEquals("tstorgname", results.getShortName()); // from
assertSame(results, jpaOrganizationMapper.getRootOrganization());
}
/**
* Get the child organization count.
*/
@Test
public void testChildOrganizationCount()
{
assertEquals(2, jpaOrganizationMapper.getEntityManager().createQuery(
"select size(o.childOrganizations) from Organization o WHERE id=:id").setParameter("id", 5L)
.getSingleResult());
}
/**
* Test hashcode.
*/
@Test
public void testHashCode()
{
assertNotNull(jpaOrganizationMapper.findById(5L).hashCode());
}
/**
* Test some of the different ways to get paged results, each page not filled.
*/
@Test
public void testPagedResultsPartiallyFilledPage()
{
final int from = 0;
final int to = 9;
runSeveralPagedResults(from, to);
}
/**
* Test some of the different ways to get paged results, each page filled.
*/
@Test
public void testPagedResultsFilledPage()
{
final int from = 0;
final int to = 1;
runSeveralPagedResults(from, to);
}
/**
* Execute several fetches for PagedResults with the input from/to indexes.
*
* @param from
* the starting index
* @param to
* the ending index
*/
private void runSeveralPagedResults(final int from, final int to)
{
// getPagedResults - no count query
PagedSet<Organization> results = jpaOrganizationMapper.getPagedResults(from, to,
"from Organization where parentOrganization.id=5 and id <> 5", new HashMap<String, Object>());
assertEquals(2, results.getPagedSet().size());
assertEquals(2, results.getTotal());
// getPagedResults - with count query
results = jpaOrganizationMapper.getPagedResults(from, to,
"from Organization where parentOrganization.id=5 and id <> 5",
"select size(childOrganizations) from Organization where id=5", new HashMap<String, Object>());
assertEquals(2, results.getPagedSet().size());
assertEquals(2, results.getTotal());
// getTypedPagedResults - no count query
String queryString = "from Organization where parentOrganization.id=:parentOrganizationId "
+ "and id <> :parentOrganizationId";
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("parentOrganizationId", 5L);
PagedSet<Organization> modelViewResults = jpaOrganizationMapper.getTypedPagedResults(from, to, queryString,
parameters);
assertEquals(2, modelViewResults.getPagedSet().size());
assertEquals(2, modelViewResults.getTotal());
// getTypedPagedResults - with count query
String countQueryString = "select count(*) from Organization "
+ "where parentOrganization.id=:parentOrganizationId " + "and id <> :parentOrganizationId";
modelViewResults = jpaOrganizationMapper.getTypedPagedResults(from, to, queryString, countQueryString,
parameters);
assertEquals(2, modelViewResults.getPagedSet().size());
assertEquals(2, modelViewResults.getTotal());
}
/**
* Test getPagedResults when zero are found, and no count query is given.
*/
@Test
public void testPagedResultsNoCountQueryZeroResults()
{
String queryString = "from Organization where "
+ "parentOrganization.id=:parentOrganizationId and id <> :parentOrganizationId";
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("parentOrganizationId", 0L);
PagedSet<Organization> results = jpaOrganizationMapper.getPagedResults(0, 9, queryString, parameters);
assertEquals(0, results.getTotal());
assertEquals(0, results.getPagedSet().size());
}
/**
* Test getPagedResults when zero are found, and a count query is given.
*/
@Test
public void testPagedResultsWithCountQueryZeroResults()
{
String queryString = "from Organization where "
+ "parentOrganization.id=:parentOrganizationId and id <> :parentOrganizationId";
String countQueryString = "select count(*) from Organization "
+ "where parentOrganization.id=:parentOrganizationId and id <> :parentOrganizationId";
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("parentOrganizationId", 0L);
PagedSet<Organization> results = jpaOrganizationMapper.getPagedResults(0, 9, queryString, countQueryString,
parameters);
assertEquals(0, results.getTotal());
assertEquals(0, results.getPagedSet().size());
}
/**
* Test getPagedResults with invalid to/from throws IllegalArgumentException.
*/
@Test(expected = IllegalArgumentException.class)
public void testPagedResultsWithoutCountInvalidRange()
{
String queryString = "from Organization where "
+ "parentOrganization.id=:parentOrganizationId and id <> :parentOrganizationId";
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("parentOrganizationId", 5L);
jpaOrganizationMapper.getPagedResults(5, 4, queryString, parameters);
}
/**
* Test getPagedResults with invalid to/from throws IllegalArgumentException.
*/
@Test(expected = IllegalArgumentException.class)
public void testPagedResultsWithCountInvalidRange()
{
String queryString = "from Organization where "
+ "parentOrganization.id=:parentOrganizationId and id <> :parentOrganizationId";
String countQueryString = "select count(*) from Organization "
+ "where parentOrganization.id=:parentOrganizationId and id <> :parentOrganizationId";
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("parentOrganizationId", 5L);
jpaOrganizationMapper.getPagedResults(5, 4, queryString, countQueryString, parameters);
}
/**
* Test deleting an organization.
*
* @throws Exception
* on error
*/
public void testDelete() throws Exception
{
jpaOrganizationMapper.delete(8L);
// TODO: make assertions - right now this does nothing
}
/**
* Test setting a parent organization.
*/
@Test
public void testSetParentOrganization()
{
OrganizationMapper m = jpaOrganizationMapper;
// add two new orgs to org #6
Organization o1 = getNewOrganization("a");
o1.setParentOrganization(jpaOrganizationMapper.findById(6L));
jpaOrganizationMapper.insert(o1);
Organization o2 = getNewOrganization("b");
o2.setParentOrganization(jpaOrganizationMapper.findById(6L));
jpaOrganizationMapper.insert(o2);
// add a new org to the new org #1 above
Organization o3 = getNewOrganization("c");
o3.setParentOrganization(o1);
jpaOrganizationMapper.insert(o3);
// update the stats
jpaOrganizationMapper.updateOrganizationStatistics(new OrganizationHierarchyTraverser(o1));
// test all the org counts
assertEquals(2, m.findById(5L).getChildOrganizationCount());
assertEquals(2, m.findById(6L).getChildOrganizationCount());
assertEquals(0, m.findById(7L).getChildOrganizationCount());
assertEquals(1, m.findById(o1.getId()).getChildOrganizationCount());
assertEquals(0, m.findById(o2.getId()).getChildOrganizationCount());
assertEquals(0, m.findById(o3.getId()).getChildOrganizationCount());
// add a new org to the new org #7 above
Organization o4 = getNewOrganization("d");
o4.setParentOrganization(jpaOrganizationMapper.findById(7L));
jpaOrganizationMapper.insert(o4);
// update the stats
jpaOrganizationMapper.updateOrganizationStatistics(new OrganizationHierarchyTraverser(m.findById(7L)));
assertEquals(2, m.findById(5L).getChildOrganizationCount());
assertEquals(2, m.findById(6L).getChildOrganizationCount());
assertEquals(1, m.findById(7L).getChildOrganizationCount());
assertEquals(1, m.findById(o1.getId()).getChildOrganizationCount());
assertEquals(0, m.findById(o2.getId()).getChildOrganizationCount());
assertEquals(0, m.findById(o3.getId()).getChildOrganizationCount());
assertEquals(0, m.findById(o4.getId()).getChildOrganizationCount());
}
/**
* Test an organization's descendant employee count update.
*/
@Test
public void testDescendantEmployeeCount()
{
Organization org5 = jpaOrganizationMapper.findById(5L);
Organization org6 = jpaOrganizationMapper.findById(6L);
Organization org7 = jpaOrganizationMapper.findById(7L);
// orgs 7 & 6 are siblings - call them together
jpaOrganizationMapper.updateOrganizationStatistics(new OrganizationHierarchyTraverser(org6));
jpaOrganizationMapper.updateOrganizationStatistics(new OrganizationHierarchyTraverser(org7));
assertEquals(5, org5.getDescendantEmployeeCount());
assertEquals(1, org6.getDescendantEmployeeCount());
assertEquals(3, org7.getDescendantEmployeeCount());
// now add a new person to org #6 and make sure it bubbles up
Person p = new Person("foobar", "Foo", "b", "Bar", "fooby");
p.setEmail("Foo.Bar@foobar.com");
p.setParentOrganization(org6);
jpaPersonMapper.insert(p);
jpaOrganizationMapper.updateOrganizationStatistics(new OrganizationHierarchyTraverser(org6));
assertEquals(6, org5.getDescendantEmployeeCount());
assertEquals(2, org6.getDescendantEmployeeCount());
assertEquals(3, org7.getDescendantEmployeeCount());
}
/**
* Test an organization's descendant group count update.
*/
@Test
public void testDescendantGroupCount()
{
final long tabGroupId = 4231L;
TabGroup tabGroup = jpaTabGroupMapper.findById(tabGroupId);
Set<Person> coordinators = new HashSet<Person>();
coordinators.add(jpaPersonMapper.findByAccountId("fordp"));
Organization org5 = jpaOrganizationMapper.findById(5L);
Organization org6 = jpaOrganizationMapper.findById(6L);
Organization org7 = jpaOrganizationMapper.findById(7L);
Person ford = jpaPersonMapper.findByAccountId("fordp");
// traverse 6 & 7 - the two leaf orgs
OrganizationHierarchyTraverser orgTraverser = new OrganizationHierarchyTraverser();
orgTraverser.traverseHierarchy(org6);
orgTraverser.traverseHierarchy(org7);
jpaOrganizationMapper.updateOrganizationStatistics(orgTraverser);
// test dataset.xml setup:
assertEquals(5, org5.getDescendantGroupCount());
assertEquals(2, org6.getDescendantGroupCount());
assertEquals(2, org7.getDescendantGroupCount());
// add a group to org 5 and org 6
DomainGroup group1 = new DomainGroup("Foo1", "Bar1", ford);
group1.setParentOrganization(org5);
group1.setDescription("sdflsdj");
group1.setCoordinators(coordinators);
jpaGroupMapper.insert(group1);
DomainGroup group2 = new DomainGroup("Foo2", "Bar2", ford);
group2.setParentOrganization(org6);
group2.setDescription("sdflksdl");
group2.setCoordinators(coordinators);
jpaGroupMapper.insert(group2);
// org 6 is a child of 5, so updating it will update 5
jpaOrganizationMapper.updateOrganizationStatistics(new OrganizationHierarchyTraverser(org6));
// test changes:
assertEquals(7, org5.getDescendantGroupCount());
assertEquals(3, org6.getDescendantGroupCount());
assertEquals(2, org7.getDescendantGroupCount());
}
/**
* Test that calling getDescendantOrgStrategy() when not set throws NullPointerException.
*/
@Test(expected = NullPointerException.class)
public void testGetDescendantOrgStrategyWhenNotSet()
{
OrganizationMapper orgMapper = new OrganizationMapper(queryOptimizer);
orgMapper.getDescendantOrgStrategy();
}
/**
* Test that calling getDescendantOrgStrategy() when set.
*/
@Test
public void testGetDescendantOrgStrategyWhenSet()
{
OrganizationMapper orgMapper = new OrganizationMapper(queryOptimizer);
DescendantOrganizationStrategy strategy = new DescendantOrganizationStrategy();
orgMapper.setDescendantOrgStrategy(strategy);
assertSame(strategy, orgMapper.getDescendantOrgStrategy());
}
}