/** * JBoss, Home of Professional Open Source * Copyright Red Hat, Inc., and individual contributors. * * 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. */ package org.jboss.aerogear.unifiedpush.service; import org.apache.openejb.jee.Beans; import org.apache.openejb.junit.ApplicationComposer; import org.apache.openejb.mockito.MockitoInjector; import org.apache.openejb.testing.MockInjector; import org.apache.openejb.testing.Module; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPAPushMessageInformationDao; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPACategoryDao; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPAInstallationDao; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPAVariantDao; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPAPushApplicationDao; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPAVariantMetricInformationDao; import org.jboss.aerogear.unifiedpush.service.impl.ClientInstallationServiceImpl; import org.jboss.aerogear.unifiedpush.service.impl.GenericVariantServiceImpl; import org.jboss.aerogear.unifiedpush.service.impl.PushApplicationServiceImpl; import org.jboss.aerogear.unifiedpush.service.impl.PushSearchByDeveloperServiceImpl; import org.jboss.aerogear.unifiedpush.service.impl.PushSearchServiceImpl; import org.jboss.aerogear.unifiedpush.service.impl.SearchManager; import org.jboss.aerogear.unifiedpush.service.metrics.PushMessageMetricsService; import org.junit.Before; import org.junit.runner.RunWith; import org.keycloak.KeycloakPrincipal; import org.keycloak.KeycloakSecurityContext; import org.keycloak.representations.AccessToken; import org.mockito.Mock; import javax.annotation.PreDestroy; import javax.ejb.Stateful; import javax.enterprise.context.SessionScoped; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.servlet.http.HttpServletRequest; import java.io.Serializable; import static org.mockito.Mockito.when; @RunWith(ApplicationComposer.class) public abstract class AbstractBaseServiceTest { @Mock protected HttpServletRequest httpServletRequest; @Mock protected KeycloakSecurityContext context; @Mock protected KeycloakPrincipal keycloakPrincipal; @Inject protected SearchManager searchManager; @Inject protected PushApplicationServiceImpl pushApplicationService; @Inject protected PushSearchByDeveloperServiceImpl searchApplicationService; // ===================== JUnit hooks ===================== /** * Basic setup stuff, needed for all the UPS related service classes */ @Before public void setUp(){ // Keycloak test environment AccessToken token = new AccessToken(); //The current developer will always be the admin in this testing scenario token.setPreferredUsername("admin"); when(context.getToken()).thenReturn(token); when(keycloakPrincipal.getKeycloakSecurityContext()).thenReturn(context); when(httpServletRequest.getUserPrincipal()).thenReturn(keycloakPrincipal); // glue it to serach mgr searchManager.setHttpServletRequest(httpServletRequest); // more to setup ? specificSetup(); } /** * Enforced to override to make sure test-case specific * setup is done inside here! */ protected abstract void specificSetup(); // ===================== OpenEJB hooks and base methods ===================== @MockInjector public Class<?> mockitoInjector() { return MockitoInjector.class; } @Module public Beans getBeans() { final Beans beans = new Beans(); beans.addManagedClass(ClientInstallationServiceImpl.class); beans.addManagedClass(JPAPushMessageInformationDao.class); beans.addManagedClass(JPAInstallationDao.class); beans.addManagedClass(GenericVariantServiceImpl.class); beans.addManagedClass(JPAVariantDao.class); beans.addManagedClass(JPACategoryDao.class); beans.addManagedClass(JPAVariantMetricInformationDao.class); beans.addManagedClass(PushSearchByDeveloperServiceImpl.class); beans.addManagedClass(PushApplicationServiceImpl.class); beans.addManagedClass(JPAPushApplicationDao.class); beans.addManagedClass(PushSearchServiceImpl.class); beans.addManagedClass(SearchManager.class); beans.addManagedClass(PushMessageMetricsService.class); return beans; } @Module public Class<?>[] produceTestEntityManager() throws Exception { return new Class<?>[] { EntityManagerProducer.class}; } /** * Static class to have OpenEJB produce/lookup a test EntityManager. */ @SessionScoped @Stateful public static class EntityManagerProducer implements Serializable { { EntityManagerFactory emf = Persistence.createEntityManagerFactory("UnifiedPush"); entityManager = emf.createEntityManager(); } private static EntityManager entityManager; @Produces public EntityManager produceEm() { if (! entityManager.getTransaction().isActive()) { entityManager.getTransaction().begin(); } return entityManager; } @PreDestroy public void closeEntityManager() { if (entityManager.isOpen()) { entityManager.getTransaction().commit(); entityManager.close(); } } } }