/* * #%L * wcm.io * %% * Copyright (C) 2014 wcm.io * %% * 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. * #L% */ package io.wcm.wcm.parsys.controller; import static io.wcm.testing.mock.wcmio.sling.ContextPlugins.WCMIO_SLING; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_GENERATE_DEAFULT_CSS; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_NEWAREA_CSS; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_PARAGRAPH_CSS; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_PARAGRAPH_ELEMENT; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_WRAPPER_CSS; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_WRAPPER_ELEMENT; import static io.wcm.wcm.parsys.controller.Parsys.DEFAULT_ELEMENT_NAME; import static io.wcm.wcm.parsys.controller.Parsys.FALLBACK_NEWAREA_RESOURCE_TYPE; import static io.wcm.wcm.parsys.controller.Parsys.NEWAREA_CHILD_NAME; import static io.wcm.wcm.parsys.controller.Parsys.NEWAREA_CSS_CLASS_NAME; import static io.wcm.wcm.parsys.controller.Parsys.NEWAREA_RESOURCE_PATH; import static io.wcm.wcm.parsys.controller.Parsys.NEWAREA_STYLE; import static io.wcm.wcm.parsys.controller.Parsys.RA_PARSYS_PARENT_RESOURCE; import static io.wcm.wcm.parsys.controller.Parsys.SECTION_DEFAULT_CLASS_NAME; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import java.util.List; import org.apache.sling.api.SlingConstants; import org.apache.sling.api.resource.Resource; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import com.day.cq.wcm.api.NameConstants; import com.day.cq.wcm.api.Page; import com.day.cq.wcm.api.WCMMode; import com.day.cq.wcm.api.components.Component; import com.day.cq.wcm.api.components.ComponentContext; import io.wcm.sling.commons.resource.ImmutableValueMap; import io.wcm.testing.mock.aem.junit.AemContext; import io.wcm.testing.mock.aem.junit.AemContextBuilder; import io.wcm.wcm.parsys.controller.Parsys.Item; @RunWith(MockitoJUnitRunner.class) public class ParsysTest { private static final String RESOURCE_TYPE_SAMPLE = "sample/components/parsys"; private static final String SUPER_RESOURCE_TYPE_SAMPLE = "sample/components/superParsys"; private static final String COMPONENT_PATH_1 = "sample/components/comp1"; private static final String COMPONENT_PATH_2 = "sample/components/comp2"; @Rule public AemContext context = new AemContextBuilder().plugin(WCMIO_SLING).build(); @Mock private ComponentContext componentContext; @Mock private Component component; private Page page; private Resource parsysResource; private Resource par1Resource; private Resource par2Resource; @Before public void setUp() { context.addModelsForPackage("io.wcm.wcm.parsys.controller"); context.request().setAttribute(ComponentContext.CONTEXT_ATTR_NAME, componentContext); when(componentContext.getComponent()).thenReturn(component); when(component.getPath()).thenReturn(RESOURCE_TYPE_SAMPLE); when(component.getProperties()).thenReturn(ImmutableValueMap.of()); page = context.create().page("/content/page1", "sample/templates/test1"); parsysResource = context.create().resource(page.getContentResource().getPath() + "/parsys"); par1Resource = context.create().resource(parsysResource.getPath() + "/par1", ImmutableValueMap.of("sling:resourceType", COMPONENT_PATH_1)); par2Resource = context.create().resource(parsysResource.getPath() + "/par2", ImmutableValueMap.of("sling:resourceType", COMPONENT_PATH_2)); context.currentResource(parsysResource); } @Test public void testEditMode() { WCMMode.EDIT.toRequest(context.request()); Parsys parsys = context.request().adaptTo(Parsys.class); assertFalse(parsys.isWrapperElement()); assertNull(parsys.getWrapperCss()); assertEquals(DEFAULT_ELEMENT_NAME, parsys.getWrapperElementName()); List<Item> items = parsys.getItems(); assertEquals(3, items.size()); Item item1 = items.get(0); assertEquals(par1Resource.getPath(), item1.getResourcePath()); assertNull(item1.getResourceType()); assertNull(item1.getStyle()); assertEquals(SECTION_DEFAULT_CLASS_NAME, item1.getCssClassName()); assertEquals(DEFAULT_ELEMENT_NAME, item1.getElementName()); assertFalse(item1.isNewArea()); Item item2 = items.get(1); assertEquals(par2Resource.getPath(), item2.getResourcePath()); assertNull(item2.getResourceType()); assertNull(item2.getStyle()); assertEquals(SECTION_DEFAULT_CLASS_NAME, item2.getCssClassName()); assertEquals(DEFAULT_ELEMENT_NAME, item2.getElementName()); assertFalse(item2.isNewArea()); Item item3 = items.get(2); assertEquals(NEWAREA_RESOURCE_PATH, item3.getResourcePath()); assertEquals(FALLBACK_NEWAREA_RESOURCE_TYPE, item3.getResourceType()); assertEquals(NEWAREA_STYLE, item3.getStyle()); assertEquals(NEWAREA_CSS_CLASS_NAME + " " + SECTION_DEFAULT_CLASS_NAME, item3.getCssClassName()); assertEquals(DEFAULT_ELEMENT_NAME, item3.getElementName()); assertTrue(item3.isNewArea()); } @Test public void testEditMode_Customized() { when(component.getProperties()).thenReturn(ImmutableValueMap.builder() .put(PN_PARSYS_GENERATE_DEAFULT_CSS, false) .put(PN_PARSYS_PARAGRAPH_CSS, "paracss") .put(PN_PARSYS_NEWAREA_CSS, "newareacss") .put(PN_PARSYS_PARAGRAPH_ELEMENT, "li") .put(PN_PARSYS_WRAPPER_ELEMENT, "ul") .put(PN_PARSYS_WRAPPER_CSS, "wrappercss") .build()); WCMMode.EDIT.toRequest(context.request()); Parsys parsys = context.request().adaptTo(Parsys.class); assertTrue(parsys.isWrapperElement()); assertEquals("wrappercss", parsys.getWrapperCss()); assertEquals("ul", parsys.getWrapperElementName()); List<Item> items = parsys.getItems(); assertEquals(3, items.size()); Item item1 = items.get(0); assertEquals(par1Resource.getPath(), item1.getResourcePath()); assertNull(item1.getResourceType()); assertNull(item1.getStyle()); assertEquals("paracss", item1.getCssClassName()); assertEquals("li", item1.getElementName()); assertFalse(item1.isNewArea()); Item item2 = items.get(1); assertEquals(par2Resource.getPath(), item2.getResourcePath()); assertNull(item2.getResourceType()); assertNull(item2.getStyle()); assertEquals("paracss", item2.getCssClassName()); assertEquals("li", item2.getElementName()); assertFalse(item2.isNewArea()); Item item3 = items.get(2); assertEquals(NEWAREA_RESOURCE_PATH, item3.getResourcePath()); assertEquals(FALLBACK_NEWAREA_RESOURCE_TYPE, item3.getResourceType()); assertNull(item3.getStyle()); assertEquals(NEWAREA_CSS_CLASS_NAME + " newareacss", item3.getCssClassName()); assertEquals("li", item3.getElementName()); assertTrue(item3.isNewArea()); } @Test public void testWcmDisabledMode() { WCMMode.DISABLED.toRequest(context.request()); Parsys parsys = context.request().adaptTo(Parsys.class); List<Item> items = parsys.getItems(); assertEquals(2, items.size()); Item item1 = items.get(0); assertEquals(par1Resource.getPath(), item1.getResourcePath()); assertNull(item1.getResourceType()); assertEquals(SECTION_DEFAULT_CLASS_NAME, item1.getCssClassName()); assertFalse(item1.isNewArea()); Item item2 = items.get(1); assertEquals(par2Resource.getPath(), item2.getResourcePath()); assertNull(item2.getResourceType()); assertEquals(SECTION_DEFAULT_CLASS_NAME, item2.getCssClassName()); assertFalse(item2.isNewArea()); } @Test public void testNewAreaResourceTypeFromCurrentComponent() { context.create().resource("/apps/" + RESOURCE_TYPE_SAMPLE); context.create().resource("/apps/" + RESOURCE_TYPE_SAMPLE + "/" + NEWAREA_CHILD_NAME); WCMMode.EDIT.toRequest(context.request()); Parsys parsys = context.request().adaptTo(Parsys.class); List<Item> items = parsys.getItems(); Item item3 = items.get(2); assertEquals(RESOURCE_TYPE_SAMPLE + "/" + NEWAREA_CHILD_NAME, item3.getResourceType()); } @Test public void testNewAreaResourceTypeFromSuperComponent() { context.create().resource("/apps/" + RESOURCE_TYPE_SAMPLE, ImmutableValueMap.of(SlingConstants.NAMESPACE_PREFIX + ":" + SlingConstants.PROPERTY_RESOURCE_SUPER_TYPE, SUPER_RESOURCE_TYPE_SAMPLE)); context.create().resource("/apps/" + SUPER_RESOURCE_TYPE_SAMPLE); context.create().resource("/apps/" + SUPER_RESOURCE_TYPE_SAMPLE + "/" + NEWAREA_CHILD_NAME); WCMMode.EDIT.toRequest(context.request()); Parsys parsys = context.request().adaptTo(Parsys.class); List<Item> items = parsys.getItems(); Item item3 = items.get(2); assertEquals(SUPER_RESOURCE_TYPE_SAMPLE + "/" + NEWAREA_CHILD_NAME, item3.getResourceType()); } @Test public void testOtherParentParsysResource() { parsysResource = context.create().resource(page.getContentResource().getPath() + "/parsysOther"); par1Resource = context.create().resource(parsysResource.getPath() + "/par1"); context.request().setAttribute(RA_PARSYS_PARENT_RESOURCE, parsysResource); WCMMode.EDIT.toRequest(context.request()); Parsys parsys = context.request().adaptTo(Parsys.class); List<Item> items = parsys.getItems(); assertEquals(2, items.size()); Item item1 = items.get(0); assertEquals(par1Resource.getPath(), item1.getResourcePath()); assertNull(item1.getResourceType()); assertEquals(SECTION_DEFAULT_CLASS_NAME, item1.getCssClassName()); assertFalse(item1.isNewArea()); Item item2 = items.get(1); assertEquals(NEWAREA_RESOURCE_PATH, item2.getResourcePath()); assertEquals(FALLBACK_NEWAREA_RESOURCE_TYPE, item2.getResourceType()); assertEquals(NEWAREA_CSS_CLASS_NAME + " " + SECTION_DEFAULT_CLASS_NAME, item2.getCssClassName()); assertTrue(item2.isNewArea()); } @Test public void testComponentWithTagDecoration() { // prepare tag decoration for one component context.create().resource("/apps/sample/components/comp1/" + NameConstants.NN_HTML_TAG, ImmutableValueMap.of(NameConstants.PN_TAG_NAME, "article", "class", "css1")); WCMMode.EDIT.toRequest(context.request()); Parsys parsys = context.request().adaptTo(Parsys.class); List<Item> items = parsys.getItems(); assertEquals(3, items.size()); Item item1 = items.get(0); assertEquals(par1Resource.getPath(), item1.getResourcePath()); assertNull(item1.getResourceType()); assertEquals("css1 section", item1.getCssClassName()); assertEquals("article", item1.getElementName()); assertFalse(item1.isNewArea()); Item item2 = items.get(1); assertEquals(par2Resource.getPath(), item2.getResourcePath()); assertNull(item2.getResourceType()); assertEquals(SECTION_DEFAULT_CLASS_NAME, item2.getCssClassName()); assertEquals(DEFAULT_ELEMENT_NAME, item2.getElementName()); assertFalse(item2.isNewArea()); Item item3 = items.get(2); assertEquals(NEWAREA_RESOURCE_PATH, item3.getResourcePath()); assertEquals(FALLBACK_NEWAREA_RESOURCE_TYPE, item3.getResourceType()); assertEquals(NEWAREA_CSS_CLASS_NAME + " " + SECTION_DEFAULT_CLASS_NAME, item3.getCssClassName()); assertEquals(DEFAULT_ELEMENT_NAME, item3.getElementName()); assertTrue(item3.isNewArea()); } }