/* * #%L * ACS AEM Commons Bundle * %% * Copyright (C) 2013 - 2014 Adobe * %% * 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 com.adobe.acs.commons.models.injectors.impl; import com.adobe.granite.xss.XSSAPI; import com.day.cq.wcm.api.Page; import com.day.cq.wcm.api.PageManager; import com.day.cq.wcm.api.components.ComponentContext; import com.day.cq.wcm.api.designer.Design; import com.day.cq.wcm.api.designer.Designer; import com.day.cq.wcm.api.designer.Style; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.Optional; import org.apache.sling.models.impl.ModelAdapterFactory; import org.apache.sling.models.spi.Injector; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import javax.inject.Inject; import javax.jcr.Session; import java.util.Collections; import java.util.Hashtable; import java.util.Map; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AemObjectInjectorTest { @Mock private Resource resource; @Mock private SlingHttpServletRequest request; @Mock private ResourceResolver resourceResolver; @Mock private Session session; @Mock private PageManager pageManager; @Mock private Designer designer; private TestModelAdapterFactory factory; @Before public final void setUp() throws Exception { AemObjectInjector aemObjectsInjector = new AemObjectInjector(); factory = new TestModelAdapterFactory(); factory.bindInjector(aemObjectsInjector, Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 1L)); } @Test public final void testResourceInjection() { when(resource.getResourceResolver()).thenReturn(resourceResolver); when(resourceResolver.adaptTo(Session.class)).thenReturn(session); when(resourceResolver.adaptTo(PageManager.class)).thenReturn(pageManager); when(resourceResolver.adaptTo(Designer.class)).thenReturn(designer); TestResourceModel testResourceModel = factory.getAdapter(resource, TestResourceModel.class); assertNotNull(testResourceModel); assertNotNull(testResourceModel.getResource()); assertNotNull(testResourceModel.getResourceResolver()); assertNotNull(testResourceModel.getPageManager()); assertNotNull(testResourceModel.getDesigner()); assertNotNull(testResourceModel.getSession()); // TODO: Tests for the remaining injectable objects } @Test public final void testSlingHttpServiceRequestInjection() { when(request.getResource()).thenReturn(resource); when(request.getResourceResolver()).thenReturn(resourceResolver); when(resourceResolver.adaptTo(Session.class)).thenReturn(session); when(resourceResolver.adaptTo(PageManager.class)).thenReturn(pageManager); when(resourceResolver.adaptTo(Designer.class)).thenReturn(designer); TestResourceModel testResourceModel = factory.getAdapter(request, TestResourceModel.class); assertNotNull(testResourceModel); assertNotNull(testResourceModel.getResource()); assertNotNull(testResourceModel.getResourceResolver()); assertNotNull(testResourceModel.getPageManager()); assertNotNull(testResourceModel.getDesigner()); assertNotNull(testResourceModel.getSession()); // TODO: Tests for the remaining injectable objects } // --- inner classes --- @Model(adaptables = {Resource.class, SlingHttpServletRequest.class}) public static class TestResourceModel { @Inject private Resource resource; @Inject private ResourceResolver resourceResolver; @Inject @Optional private ComponentContext componentContext; @Inject private PageManager pageManager; @Inject @Optional private Page currentPage; @Inject @Optional private Page resourcePage; @Inject @Optional private Designer designer; @Inject @Optional private Design currentDesign; @Inject @Optional private Design resourceDesign; @Inject @Optional private Style currentStyle; @Inject @Optional private Session session; @Inject @Optional private XSSAPI xssApi; @Inject @Optional private String namedSomethingElse; public Resource getResource() { return resource; } public ResourceResolver getResourceResolver() { return resourceResolver; } public ComponentContext getComponentContext() { return componentContext; } public PageManager getPageManager() { return pageManager; } public Page getCurrentPage() { return currentPage; } public Page getResourcePage() { return resourcePage; } public Designer getDesigner() { return designer; } public Design getCurrentDesign() { return currentDesign; } public Design getResourceDesign() { return resourceDesign; } public Style getCurrentStyle() { return currentStyle; } public Session getSession() { return session; } public XSSAPI getXssApi() { return xssApi; } } // makes activate() and bindInjector() accessible private class TestModelAdapterFactory extends ModelAdapterFactory { public TestModelAdapterFactory() { super(); org.osgi.service.component.ComponentContext componentCtx = mock(org.osgi.service.component.ComponentContext.class); BundleContext bundleContext = mock(BundleContext.class); when(componentCtx.getBundleContext()).thenReturn(bundleContext); when(componentCtx.getProperties()).thenReturn(new Hashtable()); activate(componentCtx); } @Override public void bindInjector(Injector injector, Map<String, Object> props) { super.bindInjector(injector, props); } } }