/* * Weblounge: Web Content Management System * Copyright (c) 2003 - 2011 The Weblounge Team * http://entwinemedia.com/weblounge * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package ch.entwine.weblounge.common.impl.site; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import ch.entwine.weblounge.common.Times; import ch.entwine.weblounge.common.content.Renderer; import ch.entwine.weblounge.common.content.image.ImageStyle; import ch.entwine.weblounge.common.content.page.PageTemplate; import ch.entwine.weblounge.common.impl.content.page.PageTemplateImpl; import ch.entwine.weblounge.common.impl.language.LanguageImpl; import ch.entwine.weblounge.common.impl.security.PasswordImpl; import ch.entwine.weblounge.common.impl.security.SiteAdminImpl; import ch.entwine.weblounge.common.language.Language; import ch.entwine.weblounge.common.security.DigestType; import ch.entwine.weblounge.common.security.Password; import ch.entwine.weblounge.common.security.Security; import ch.entwine.weblounge.common.site.Environment; import ch.entwine.weblounge.common.site.Site; import ch.entwine.weblounge.common.site.SiteURL; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Set; /** * Test case for {@link SiteImpl}. */ public class SiteImplTest { /** The site instance under test */ protected Site site = null; /** Site identifier */ protected final String identifier = "dev"; /** Sets the site enabled state */ protected final boolean enabled = true; /** Site description */ protected final String name = "Main site"; /** Site administrator */ protected SiteAdminImpl administrator = null; /** Site administrator login */ protected final String administratorLogin = "blogadmin"; /** Site administrator name */ protected final String administratorName = "Web Office"; /** Site administrator email */ protected final String administratorEmail = "weboffice@nowhere.com"; /** Site administrator password */ protected final String administratorPassword = "secret"; /** Default page template */ protected PageTemplate defaultTemplate = null; /** Default template id */ protected final String defaultTemplateId = "default"; /** Default template recheck time */ protected final long defaultTemplateRecheckTime = Times.MS_PER_DAY + 10 * Times.MS_PER_MIN; /** Default template valid time */ protected final long defaultTemplateValidTime = Times.MS_PER_WEEK + Times.MS_PER_DAY + Times.MS_PER_HOUR + Times.MS_PER_MIN;; /** Default template url */ protected final String defaultTemplateUrl = "file://template/default.jsp"; /** Default template stage */ protected final String defaultTemplateStage = "boxes"; /** Default template English name */ protected final String defaultTemplateName = "Default template"; /** Mobile page template */ protected PageTemplate mobileTemplate = null; /** Mobile template id */ protected final String mobileTemplateId = "mobile"; /** Mobile template url */ protected final String mobileTemplateUrl = "file://template/mobile.jsp"; /** Mobile template class name */ protected final String mobileTemplateClass = "ch.entwine.weblounge.common.impl.site.JSPTemplate"; /** Mobile template German name */ protected final String mobileTemplateNameGerman = "Mobile"; /** Mobile template English name */ protected final String mobileTemplateName = "Mobile"; /** The site hostnames */ protected List<String> hostnames = new ArrayList<String>(); /** Default hostname */ protected SiteURL defaultURL = null; /** Default hostname */ protected SiteURL fallbackURL = null; /** Default hostname */ protected SiteURL localhost = null; /** Portrait image style */ protected ImageStyle portraitImageStyle = null; /** High resolution image style */ protected ImageStyle highresImageStyle = null; /** The English language */ protected static final Language ENGLISH = new LanguageImpl(new Locale("en")); /** The German language */ protected static final Language GERMAN = new LanguageImpl(new Locale("de")); /** The admin role */ protected String adminRole = "my-admin"; /** The publisher role */ protected String publisherRole = "my-publisher"; /** The editor role */ protected String editorRole = "my-editor"; /** The guest role */ protected String guestRole = "my-guest"; /** Path to the security configuration */ protected final String securityConfigPath = "file://security.xml"; /** The security configuration */ protected URL securityConfig = null; /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { setupPrerequisites(); site = new SiteImpl(); site.setIdentifier(identifier); site.setAutoStart(enabled); site.setName(name); site.setAdministrator(administrator); site.setDefaultTemplate(defaultTemplate); site.addTemplate(mobileTemplate); site.setDefaultLanguage(GERMAN); site.addLanguage(ENGLISH); site.addHostname(defaultURL); site.addHostname(fallbackURL); site.addHostname(localhost); site.addLocalRole(Security.SITE_ADMIN_ROLE, adminRole); site.addLocalRole(Security.PUBLISHER_ROLE, publisherRole); site.addLocalRole(Security.EDITOR_ROLE, editorRole); site.addLocalRole(Security.GUEST_ROLE, guestRole); site.setSecurity(new URL(securityConfigPath)); } /** * Sets up preliminary data structures. * * @throws Exception */ protected void setupPrerequisites() throws Exception { // Urls defaultURL = new SiteURLImpl(new URL("http://www.weblounge.org"), true); fallbackURL = new SiteURLImpl(new URL("http://*.nowhere.com"), Environment.Staging); localhost = new SiteURLImpl(new URL("http://localhost:8080"), Environment.Development); // Administrator administrator = new SiteAdminImpl(administratorLogin); administrator.setName(administratorName); administrator.setEmail(administratorEmail); administrator.addPrivateCredentials(new PasswordImpl(administratorPassword, DigestType.plain)); // Default template defaultTemplate = new PageTemplateImpl(defaultTemplateId, new URL(defaultTemplateUrl)); defaultTemplate.setClientRevalidationTime(defaultTemplateRecheckTime); defaultTemplate.setCacheExpirationTime(defaultTemplateValidTime); defaultTemplate.setComposeable(true); defaultTemplate.setStage(defaultTemplateStage); defaultTemplate.setName(defaultTemplateName); // Mobile template mobileTemplate = new PageTemplateImpl(mobileTemplateId, new URL(mobileTemplateUrl)); mobileTemplate.setComposeable(true); mobileTemplate.setName(mobileTemplateName); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#setIdentifier(java.lang.String)} * . */ @Test public void testSetIdentifier() { site.setIdentifier("1ab_2ABC3-.0"); site.setIdentifier("1"); site.setIdentifier("a"); try { site.setIdentifier("Test id with spaces and,strange/characters"); fail("Site accepted identifier with spaces in it"); } catch (IllegalArgumentException e) { // This is expected } try { site.setIdentifier(".abc"); fail("Site accepted identifier starting with a special character"); } catch (IllegalArgumentException e) { // This is expected } try { site.setIdentifier(""); fail("Site accepted an empty identifier"); } catch (IllegalArgumentException e) { // This is expected } } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getIdentifier()}. */ @Test public void testGetIdentifier() { assertEquals(identifier, site.getIdentifier()); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#isStartedAutomatically()} * . */ @Test public void testIsStartedAutomatically() { assertEquals(enabled, site.isStartedAutomatically()); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getAdministrator()} . */ @Test public void testGetAdministrator() { assertEquals(administrator, site.getAdministrator()); assertEquals(administratorName, site.getAdministrator().getName()); assertEquals(administratorEmail, site.getAdministrator().getEmail()); assertEquals(administratorLogin, site.getAdministrator().getLogin()); assertTrue(site.getAdministrator().canLogin()); Set<Object> passwords = site.getAdministrator().getPrivateCredentials(Password.class); for (Object o : passwords) { Password password = (Password)o; assertEquals(administratorPassword, password.getPassword()); } } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getName(ch.entwine.weblounge.common.language.Language)} * . */ @Test public void testGetName() { assertEquals(name, site.getName()); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#addTemplate(ch.entwine.weblounge.common.content.page.PageTemplate)} * . */ @Test public void testAddTemplate() throws Exception { site.addTemplate(defaultTemplate); assertEquals(2, site.getTemplates().length); site.addTemplate(new PageTemplateImpl("test", new URL(defaultTemplateUrl))); assertEquals(3, site.getTemplates().length); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#removeTemplate(ch.entwine.weblounge.common.content.page.PageTemplate)} * . */ @Test public void testRemoveTemplate() { site.removeTemplate(defaultTemplate); assertEquals(1, site.getTemplates().length); assertTrue(site.getDefaultTemplate() == null); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getTemplate(java.lang.String)} * . */ @Test public void testGetTemplate() throws Exception { PageTemplate d = site.getTemplate(defaultTemplateId); assertNotNull(d); assertEquals(defaultTemplateId, d.getIdentifier()); assertEquals(new URL(defaultTemplateUrl), d.getRenderer()); assertEquals(defaultTemplateRecheckTime, d.getClientRevalidationTime()); assertEquals(defaultTemplateValidTime, d.getCacheExpirationTime()); assertEquals(defaultTemplateStage, d.getStage()); assertEquals(defaultTemplateName, d.getName()); PageTemplate m = site.getTemplate(mobileTemplateId); assertNotNull(m); assertEquals(mobileTemplateId, m.getIdentifier()); assertEquals(new URL(mobileTemplateUrl), m.getRenderer()); assertEquals(Renderer.DEFAULT_RECHECK_TIME, m.getClientRevalidationTime()); assertEquals(Renderer.DEFAULT_VALID_TIME, m.getCacheExpirationTime()); assertEquals(PageTemplate.DEFAULT_STAGE, m.getStage()); assertEquals(mobileTemplateName, m.getName()); assertTrue(site.getTemplate("test") == null); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getTemplates()}. */ @Test public void testGetTemplates() { assertNotNull(site.getTemplates()); assertEquals(2, site.getTemplates().length); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getDefaultTemplate()}. */ @Test public void testGetDefaultTemplate() { assertEquals(defaultTemplate, site.getDefaultTemplate()); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#addLanguage(ch.entwine.weblounge.common.language.Language)} * . */ @Test public void testAddLanguage() { site.addLanguage(ENGLISH); assertEquals(2, site.getLanguages().length); site.addLanguage(new LanguageImpl(new Locale("fr"))); assertEquals(3, site.getLanguages().length); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#removeLanguage(ch.entwine.weblounge.common.language.Language)} * . */ @Test public void testRemoveLanguage() { site.removeLanguage(GERMAN); assertEquals(1, site.getLanguages().length); assertTrue(site.getDefaultLanguage() == null); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getLanguage(java.lang.String)} * . */ @Test public void testGetLanguage() { assertEquals(GERMAN, site.getLanguage(GERMAN.getIdentifier())); assertTrue(site.getLanguage("fr") == null); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getLanguages()}. */ @Test public void testGetLanguages() { assertEquals(2, site.getLanguages().length); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#supportsLanguage(ch.entwine.weblounge.common.language.Language)} * . */ @Test public void testSupportsLanguage() { assertTrue(site.supportsLanguage(GERMAN)); assertTrue(site.supportsLanguage(ENGLISH)); assertFalse(site.supportsLanguage(new LanguageImpl(new Locale("fr")))); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getDefaultLanguage()}. */ @Test public void testGetDefaultLanguage() { assertEquals(GERMAN, site.getDefaultLanguage()); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#removeHostname(URL)} * . */ @Test public void testRemoveURL() throws Exception { site.removeHostname(new SiteURLImpl(new URL("http://test"))); assertEquals(3, site.getHostnames().length); site.removeHostname(defaultURL); assertEquals(2, site.getHostnames().length); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getHostnames()}. */ @Test public void testGetURLs() { assertEquals(3, site.getHostnames().length); List<SiteURL> connectors = Arrays.asList(site.getHostnames()); assertTrue(connectors.contains(defaultURL)); assertTrue(connectors.contains(fallbackURL)); assertTrue(connectors.contains(localhost)); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getHostname()}. */ @Test public void testGetURL() { assertEquals(defaultURL, site.getHostname()); site.removeHostname(defaultURL); assertEquals(2, site.getHostnames().length); assertTrue(site.getHostname() == null); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getUrl()}. */ @Test public void testGetUrl() { assertEquals(defaultURL, site.getHostname()); site.removeHostname(defaultURL); site.removeHostname(fallbackURL); site.removeHostname(localhost); assertNull(site.getHostname()); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#removeLayout(java.lang.String)} * . */ @Test @Ignore public void testRemoveLayout() { fail("Not yet implemented"); // TODO } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getLayout(java.lang.String)} * . */ @Test @Ignore public void testGetLayout() { fail("Not yet implemented"); // TODO } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getLayouts()}. */ @Test @Ignore public void testGetLayouts() { assertEquals(0, site.getLayouts().length); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getLocalRole(String)} * . */ @Test public void testGetLocalRole() { assertEquals(adminRole, site.getLocalRole(Security.SITE_ADMIN_ROLE)); assertEquals(publisherRole, site.getLocalRole(Security.PUBLISHER_ROLE)); assertEquals(editorRole, site.getLocalRole(Security.EDITOR_ROLE)); assertEquals(guestRole, site.getLocalRole(Security.GUEST_ROLE)); String nonExistingRole = "test"; assertEquals(null, site.getLocalRole(nonExistingRole)); } /** * Test method for * {@link ch.entwine.weblounge.common.impl.site.SiteImpl#getSecurity()} * . */ @Test public void testGetSecurity() { assertEquals(securityConfigPath, site.getSecurity().toExternalForm()); } }