/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*
* $Id: InfoGlueTestCase.java,v 1.9 2006/09/06 14:37:39 mattias Exp $
*/
package org.infoglue.cms.util;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import junit.framework.TestCase;
import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService;
import org.infoglue.cms.controllers.kernel.impl.simple.LanguageController;
import org.infoglue.cms.controllers.kernel.impl.simple.RepositoryController;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeController;
import org.infoglue.cms.entities.management.RepositoryVO;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.security.InfoGlueRole;
/**
* The base class of all InfoGlue tests cases will setup the things that need to be setup
* in order to fake out certain services and facilities that may not be running in the
* environment that they expect.
*
* Things like this FakeServletContext can generally be gotten rid of with a few key
* refactorings of the system to not rely on being run as a web app, etc.
*
* @author Frank Febbraro (frank@phase2technology.com)
*/
public abstract class InfoGlueTestCase extends TestCase
{
private static final InfoGluePrincipal adminPrincipal = new InfoGluePrincipal("test-admin", "first", "last", "email", createRole("administrators"), new ArrayList(), true, null);
private static final InfoGluePrincipal cmsUserPrincipal = new InfoGluePrincipal("test-user", "first", "last", "email", createRole("cmsUser"), new ArrayList(), false, null);
private static final InfoGluePrincipal anonPrincipal = new InfoGluePrincipal(CmsPropertyHandler.getAnonymousUser(), "first", "last", "email", createRole("anonymous"), new ArrayList(), false, null);
private static boolean initialized = false;
protected void setUp() throws Exception
{
initializeInfoGlue();
}
/**
* For testing we dont care about the nofitications that take place,
* especially notifications to remote servers and such that will fail under
* a normal slimmed down test environment.
* We can test the Notifiers individually, so lets make our lives easier now.
*/
public static void initializeInfoGlue() throws SystemException
{
if (initialized)
return;
FakeServletContext.getContext().init();
CastorDatabaseService.getJDO().setCallbackInterceptor(null);
initialized = true;
}
/**
* Changes from todays date the supplied unit by the provided amount
* @param unit A value from Calendar
* @param amount the amount to change the unit, can be positive or negative
* @return The newly modified date
*/
protected Date changeDate(int unit, int amount)
{
return changeDate(new Date(), unit, amount);
}
/**
* Changes from the given date the supplied unit by the provided amount
* @param current The date to change
* @param unit A value from Calendar
* @param amount the amount to change the unit, can be positive or negative
* @return THe newly modified date
*/
protected Date changeDate(Date current, int unit, int amount)
{
Calendar calendar = Calendar.getInstance();
calendar.setTime(current);
calendar.add(unit, amount);
return calendar.getTime();
}
/**
* Creates a role with the given name to use for testing
* @param name the name of the role
* @return a list containing only the desired role.
*/
protected static List createRole(String name)
{
return Collections.singletonList(new InfoGlueRole(name, "test description", null));
}
/**
* Returns the administrator principal
* @return an InfoGluePrincipal representing an administrator
*/
public static InfoGluePrincipal getAdminPrincipal()
{
return adminPrincipal;
}
/**
* Returns the cmsUser principal
* @return an InfoGluePrincipal representing a cmsUser
*/
public static InfoGluePrincipal getCmsUserPrincipal()
{
return cmsUserPrincipal;
}
/**
* Returns the anonymous principal
* @return an InfoGluePrincipal representing an anonymous user
*/
public static InfoGluePrincipal getAnonPrincipal()
{
return anonPrincipal;
}
/**
* Returns a Repository Id to use for testing. It will get the first Repository
* and return it's id, or 1 if there is an error finding any repositories.
* @return An Integer Repository Id
*/
public static Integer getRepoId()
{
try
{
RepositoryVO repo = RepositoryController.getController().getFirstRepositoryVO();
return repo.getId();
}
catch (SystemException e)
{
e.printStackTrace();
return new Integer(1);
}
}
/**
* Returns a Language Id. It will use the master language for the first repository,
* or 1 if there is some kind of error.
* @return An Integer Language Id, or 1 is there is some sort of error
*/
public static Integer getLanguageId()
{
return getLanguageId(getRepoId());
}
/**
* Returns a Language Id for the given Repository. It will use the master language for
* the given repository, or 1 if there is some kind of error.
* @param repoId The id of the Repository to get the Master Language.
* @return An Integer Language Id, or 1 is there is some sort of error
*/
public static Integer getLanguageId(Integer repoId)
{
try
{
return LanguageController.getController().getMasterLanguage(repoId).getId();
}
catch (Exception e)
{
e.printStackTrace();
return new Integer(1);
}
}
/**
* Returns a SiteNode id. It will use the first repository, or return 1
* if there is some kind of error.
* @return An Integer SiteNode Id, or 1 is there is some sort of error
*/
public static Integer getSiteNodeId()
{
return getSiteNodeId(getRepoId());
}
/**
* Returns a SiteNode id for the given Repository. It will use the root site node for
* the given repository, or 1 if there is some kind of error.
* @param repoId The id of the Repository to get the Master Language.
* @return An Integer SiteNode Id, or 1 is there is some sort of error
*/
public static Integer getSiteNodeId(Integer repoId)
{
try
{
return SiteNodeController.getController().getRootSiteNodeVO(repoId).getId();
}
catch (Exception e)
{
e.printStackTrace();
return new Integer(1);
}
}
}