/* * (C) Copyright 2006-2007 Nuxeo SA (http://nuxeo.com/) and others. * * 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. * * Contributors: * Nuxeo - initial API and implementation * * $Id$ */ package org.nuxeo.ecm.platform.content.template.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentModelList; import org.nuxeo.ecm.core.api.security.ACL; import org.nuxeo.ecm.core.api.security.ACP; import org.nuxeo.ecm.core.test.CoreFeature; import org.nuxeo.ecm.core.test.annotations.Granularity; import org.nuxeo.ecm.core.test.annotations.RepositoryConfig; import org.nuxeo.ecm.platform.content.template.service.ContentFactoryDescriptor; import org.nuxeo.ecm.platform.content.template.service.ContentTemplateService; import org.nuxeo.ecm.platform.content.template.service.ContentTemplateServiceImpl; import org.nuxeo.ecm.platform.content.template.service.FactoryBindingDescriptor; import org.nuxeo.ecm.platform.content.template.service.NotificationDescriptor; import org.nuxeo.runtime.test.runner.Features; import org.nuxeo.runtime.test.runner.FeaturesRunner; import org.nuxeo.runtime.test.runner.LocalDeploy; @RunWith(FeaturesRunner.class) @Features(CoreFeature.class) @RepositoryConfig(cleanup = Granularity.METHOD) @LocalDeploy({ "org.nuxeo.ecm.platform.content.template.tests:test-content-template-framework.xml", "org.nuxeo.ecm.platform.content.template.tests:test-content-template-contrib.xml", "org.nuxeo.ecm.platform.content.template.tests:test-content-template-listener.xml" }) public class TestContentTemplateFactory { @Inject protected ContentTemplateService service; @Inject protected CoreSession session; @Before public void setUp() throws Exception { service.executeFactoryForType(session.getRootDocument()); } @Test public void testServiceFactoryContribs() { ContentTemplateServiceImpl serviceImpl = (ContentTemplateServiceImpl) service; assertNotNull(serviceImpl); Map<String, ContentFactoryDescriptor> factories = serviceImpl.getFactories(); assertTrue(factories.containsKey("SimpleTemplateFactory")); assertTrue(factories.containsKey("ImportFactory")); assertEquals(2, factories.size()); } @Test public void testServiceFactoryBindingContribs() { ContentTemplateServiceImpl serviceImpl = (ContentTemplateServiceImpl) service; assertNotNull(serviceImpl); Map<String, FactoryBindingDescriptor> factoryBindings = serviceImpl.getFactoryBindings(); assertEquals(4, factoryBindings.size()); assertTrue(factoryBindings.containsKey("Root")); assertTrue(factoryBindings.containsKey("Domain")); assertEquals(4, factoryBindings.get("Domain").getTemplate().size()); assertEquals("Workspaces", factoryBindings.get("Domain").getTemplate().get(0).getId()); } @Test public void testServiceFactoryForSecurity() { ContentTemplateServiceImpl serviceImpl = (ContentTemplateServiceImpl) service; assertNotNull(serviceImpl); Map<String, FactoryBindingDescriptor> factoryBindings = serviceImpl.getFactoryBindings(); FactoryBindingDescriptor factory = factoryBindings.get("Workspace"); assertNotNull(factory); // check that ACL is not null assertNotNull(factory.getTemplate().get(1).getAcl()); assertEquals(2, factory.getTemplate().get(1).getAcl().size()); // check root ACL factory = factoryBindings.get("Root"); assertNotNull(factory); assertNotNull(factory.getRootAcl()); assertEquals(2, factory.getRootAcl().size()); } @Test public void testServiceFactoryForNotifications() { ContentTemplateServiceImpl serviceImpl = (ContentTemplateServiceImpl) service; assertNotNull(serviceImpl); Map<String, FactoryBindingDescriptor> factoryBindings = serviceImpl.getFactoryBindings(); FactoryBindingDescriptor factory = factoryBindings.get("Workspace"); assertNotNull(factory); List<NotificationDescriptor> notif = factory.getTemplate().get(1).getNotifications(); assertNotNull(notif); assertTrue(!notif.isEmpty()); assertEquals(2, notif.size()); NotificationDescriptor notif1 = notif.get(0); assertEquals("Modification", notif1.getEvent()); List<String> users = notif1.getUsers(); assertNotNull(users); assertTrue(!users.isEmpty()); assertEquals(2, users.size()); assertEquals("jdoe", users.get(0)); assertEquals("bree", users.get(1)); List<String> groups = notif1.getGroups(); assertNotNull(groups); assertTrue(!groups.isEmpty()); assertEquals(1, groups.size()); assertEquals("members", groups.get(0)); NotificationDescriptor notif2 = notif.get(1); assertEquals("Creation", notif2.getEvent()); users = notif2.getUsers(); assertNotNull(users); assertTrue(users.isEmpty()); groups = notif2.getGroups(); assertNotNull(groups); assertTrue(!groups.isEmpty()); assertEquals(1, groups.size()); assertEquals("members", groups.get(0)); } @Test public void testRootFactory() { // Fake repo init for now DocumentModel root = session.getRootDocument(); service.executeFactoryForType(root); // check root ACL assertTrue(session.getACP(root.getRef()).getAccess("Administrator", "Everything").toBoolean()); assertTrue(session.getACP(root.getRef()).getAccess("Danny", "Dream").toBoolean()); // check that default domain has been created DocumentModelList children = session.getChildren(root.getRef()); assertEquals(1, children.size()); children = session.getChildren(root.getRef(), "Domain"); DocumentModel domain = children.get(0); assertEquals(1, children.size()); assertEquals("defaut domain", domain.getTitle()); // check that the default domain has the template layout children = session.getChildren(domain.getRef()); assertEquals(3, children.size()); children = session.getChildren(domain.getRef(), "WorkspaceRoot"); assertEquals(1, children.size()); assertEquals("Workspaces", children.get(0).getTitle()); // check that Section is created under sectionRoot children = session.getChildren(domain.getRef(), "SectionRoot"); assertEquals(1, children.size()); DocumentModel sectionRoot = children.get(0); assertEquals("Sections", sectionRoot.getTitle()); children = session.getChildren(sectionRoot.getRef(), "Section"); assertEquals(1, children.size()); assertEquals("Section", children.get(0).getTitle()); } @Test public void testDomainFactory() { DocumentModel testDom = session.createDocumentModel("/", "TestDomain", "Domain"); testDom.setProperty("dublincore", "title", "MyTestDomain"); testDom = session.createDocument(testDom); session.save(); // check that the created domain has the template layout DocumentModelList children = session.getChildren(testDom.getRef()); assertEquals(3, children.size()); children = session.getChildren(testDom.getRef(), "WorkspaceRoot"); assertEquals(1, children.size()); assertEquals("Workspaces", children.get(0).getTitle()); } @Test public void testWSFactory() { // reach first available WSRoot DocumentModel root = session.getRootDocument(); service.executeFactoryForType(root); DocumentModel firstDomain = session.getChildren(root.getRef()).get(0); DocumentModel wsRoot = session.getChildren(firstDomain.getRef(), "WorkspaceRoot").get(0); // create new WS DocumentModel testWS = session.createDocumentModel(wsRoot.getPathAsString(), "TestWS", "Workspace"); testWS.setProperty("dublincore", "title", "MyTestWorkspace"); testWS = session.createDocument(testWS); session.save(); // Check children, rights and properties DocumentModelList children = session.getChildren(testWS.getRef()); assertEquals(3, children.size()); for (DocumentModel child : children) { if (child.getTitle().equals("Folder1")) { ACP acp = session.getACP(child.getRef()); ACL existingACL = acp.getACL(ACL.LOCAL_ACL); if (existingACL != null) { assertEquals(0, existingACL.size()); } // check properties assertEquals("Administrator", child.getPropertyValue("dublincore:creator")); assertEquals("coverage", child.getPropertyValue("dublincore:coverage")); } else if (child.getTitle().equals("Secret Folder")) { ACP acp = session.getACP(child.getRef()); ACL existingACL = acp.getACL(ACL.LOCAL_ACL); assertNotNull(existingACL); assertEquals(2, existingACL.size()); } else if (child.getTitle().equals("Folder2")) { ACP acp = session.getACP(child.getRef()); ACL existingACL = acp.getACL(ACL.LOCAL_ACL); if (existingACL != null) { assertEquals(0, existingACL.size()); } } else { // we should not go here !!! fail(); } } } @Test public void testFacetFactories() { // reach first available WSRoot DocumentModel root = session.getRootDocument(); service.executeFactoryForType(root); DocumentModel firstDomain = session.getChildren(root.getRef()).get(0); // Check if every superspaces have FacetFolder Document DocumentModel wsRoot = session.getChildren(firstDomain.getRef(), "WorkspaceRoot").get(0); DocumentModel facetFolder = session.getChild(wsRoot.getRef(), "FacetFolder"); assertNotNull(facetFolder); DocumentModel templateRoot = session.getChildren(firstDomain.getRef(), "TemplateRoot").get(0); facetFolder = session.getChild(templateRoot.getRef(), "FacetFolder"); assertNotNull(facetFolder); DocumentModel sectionRoot = session.getChildren(firstDomain.getRef(), "SectionRoot").get(0); facetFolder = session.getChild(sectionRoot.getRef(), "FacetFolder"); assertNotNull(facetFolder); } }