/** * 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.jpa; import net.jakubholy.dbunitexpress.EmbeddedDbTesterRule; import org.jboss.aerogear.unifiedpush.api.PushMessageInformation; import org.jboss.aerogear.unifiedpush.api.VariantMetricInformation; import org.jboss.aerogear.unifiedpush.dao.PageResult; import org.jboss.aerogear.unifiedpush.dao.PushMessageInformationDao; import org.jboss.aerogear.unifiedpush.dto.MessageMetrics; import org.jboss.aerogear.unifiedpush.jpa.dao.impl.JPAVariantMetricInformationDao; import org.jboss.aerogear.unifiedpush.utils.DaoDeployment; import org.jboss.aerogear.unifiedpush.utils.DateUtils; import org.jboss.aerogear.unifiedpush.utils.TestUtils; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.PersistenceException; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @RunWith(Arquillian.class) public class PushMessageInformationDaoTest { @Inject private EntityManager entityManager; @Inject private PushMessageInformationDao pushMessageInformationDao; @Inject private JPAVariantMetricInformationDao variantMetricInformationDao; private String pushMessageInformationID = "1"; @Deployment public static JavaArchive createDeployment() { return DaoDeployment.createDeployment(); } @Rule public EmbeddedDbTesterRule testDb = new EmbeddedDbTesterRule("MessageInformation.xml"); @Before public void setUp() { // start the shindig entityManager.getTransaction().begin(); } private void flushAndClear() { // flush to be sure that it's in the database entityManager.flush(); // clear the cache otherwise finding the entity will not perform a select but get the entity from cache entityManager.clear(); } @After public void tearDown() { entityManager.getTransaction().rollback(); } @Test public void createPushMessageInformation() { PushMessageInformation pushMessageInformation = pushMessageInformationDao.find(pushMessageInformationID); assertThat(pushMessageInformation).isNotNull(); assertThat(pushMessageInformation.getSubmitDate()).isNotNull(); } @Test public void addJsonToPushMessageInformation() { PushMessageInformation pushMessageInformation = pushMessageInformationDao.find(pushMessageInformationID); pushMessageInformation.setRawJsonMessage("{\"alert\" : \"hello\"}"); pushMessageInformationDao.update(pushMessageInformation); flushAndClear(); pushMessageInformation = pushMessageInformationDao.find(pushMessageInformationID); assertThat(pushMessageInformation.getRawJsonMessage()).isEqualTo("{\"alert\" : \"hello\"}"); assertThat(pushMessageInformation.getSubmitDate()).isNotNull(); } @Test public void addClientIdentifierToPushMessageInformation() { PushMessageInformation pushMessageInformation = pushMessageInformationDao.find(pushMessageInformationID); pushMessageInformation.setClientIdentifier("Java Sender Client"); pushMessageInformationDao.update(pushMessageInformation); flushAndClear(); pushMessageInformation = pushMessageInformationDao.find(pushMessageInformationID); assertThat(pushMessageInformation.getClientIdentifier()).isEqualTo("Java Sender Client"); assertThat(pushMessageInformation.getSubmitDate()).isNotNull(); } @Test public void addVariantInfoToPushMessageInformation() { PushMessageInformation pushMessageInformation = pushMessageInformationDao.find("2"); assertThat(pushMessageInformation.getVariantInformations()).extracting("receivers", "deliveryStatus") .contains( tuple(1000L, Boolean.FALSE), tuple(200L, Boolean.FALSE) ); assertThat(pushMessageInformation.getSubmitDate()).isNotNull(); } @Test public void findByPushApplicationID() { int page = 0; int pageSize = 20; PageResult<PushMessageInformation, MessageMetrics> messageInformations = pushMessageInformationDao.findAllForPushApplication("231231231", null, Boolean.TRUE, page, pageSize); assertThat(messageInformations.getResultList()).isNotEmpty(); assertThat(messageInformations.getResultList()).hasSize(2); } @Test public void countMessagesPerLoginName() { final String loginName = "admin"; long number = pushMessageInformationDao.getNumberOfPushMessagesForLoginName(loginName); assertThat(number).isEqualTo(3); for (int i = 0; i < 1000; i++) { PushMessageInformation pmi = new PushMessageInformation(); pmi.setPushApplicationId("231231231"); pushMessageInformationDao.create(pmi); } number = pushMessageInformationDao.getNumberOfPushMessagesForLoginName(loginName); assertThat(number).isEqualTo(1003); // a few more for different PushApplication... for (int i = 0; i < 1000; i++) { PushMessageInformation pmi = new PushMessageInformation(); pmi.setPushApplicationId("231231232"); pushMessageInformationDao.create(pmi); } number = pushMessageInformationDao.getNumberOfPushMessagesForLoginName(loginName); assertThat(number).isEqualTo(2003); // check for all assertThat(pushMessageInformationDao.getNumberOfPushMessagesForApplications()).isEqualTo(2003); } @Test public void countMessagesPerApplication() { assertThat(pushMessageInformationDao.getNumberOfPushMessagesForPushApplication("231231231")).isEqualTo(2); assertThat(pushMessageInformationDao.getNumberOfPushMessagesForPushApplication("231231232")).isEqualTo(1); } @Test public void countMessagesPerVariant() { assertThat(pushMessageInformationDao.getNumberOfPushMessagesForVariant("231543432432")).isEqualTo(2); assertThat(pushMessageInformationDao.getNumberOfPushMessagesForVariant("231543432434")).isEqualTo(1); } @Test public void findMostBusyVariants() { List<PushMessageInformation> lastActivity = pushMessageInformationDao.findLatestActivity("admin", 3); assertThat(lastActivity).hasSize(3); } @Test public void findAllBusyVariants() { List<PushMessageInformation> lastActivity = pushMessageInformationDao.findLatestActivity("admin", 5); assertThat(lastActivity).hasSize(3); // we just have three... - but asked for five } @Test public void findMostBusyVariantsForOnlyTwo() { final PushMessageInformation pushMessageInformation = pushMessageInformationDao.find("3"); entityManager.remove(pushMessageInformation); List<PushMessageInformation> lastActivity = pushMessageInformationDao.findLatestActivity("admin", 3); assertThat(lastActivity).hasSize(2); lastActivity = pushMessageInformationDao.findLatestActivity(3); assertThat(lastActivity).hasSize(2); } @Test public void findVariantIDsWithWarnings() { // all warnings: final List<String> variantIDsWithWarnings = pushMessageInformationDao.findVariantIDsWithWarnings(); assertThat(variantIDsWithWarnings).hasSize(4); assertThat(variantIDsWithWarnings).contains("213", "231543432432", "23154343243333", "231543432434"); } @Test public void findVariantIDsWithWarningsForDude() { // all warnings: final List<String> variantIDsWithWarnings = pushMessageInformationDao.findVariantIDsWithWarnings("dude"); assertThat(variantIDsWithWarnings).hasSize(1); assertThat(variantIDsWithWarnings).containsOnly("213"); } @Test public void ascendingDateOrdering() { PageResult<PushMessageInformation, MessageMetrics> messageInformations = pushMessageInformationDao.findAllForPushApplication("231231231", null, Boolean.TRUE, 0, 25); final List<PushMessageInformation> list = messageInformations.getResultList(); assertThat(list).hasSize(2); assertThat(list.get(0).getSubmitDate()).isBefore(list.get(1).getSubmitDate()); } @Test public void descendingDateOrdering() { PageResult<PushMessageInformation, MessageMetrics> messageInformations = pushMessageInformationDao.findAllForPushApplication("231231231", null, Boolean.FALSE, 0, 25); final List<PushMessageInformation> list = messageInformations.getResultList(); assertThat(list).hasSize(2); assertThat(list.get(0).getSubmitDate()).isAfter(list.get(1).getSubmitDate()); } @Test public void testSearchString() { PageResult<PushMessageInformation, MessageMetrics> messageInformations = pushMessageInformationDao.findAllForPushApplication("231231231", "foo", Boolean.TRUE, 0, 25); final List<PushMessageInformation> list = messageInformations.getResultList(); assertThat(list).hasSize(1); } @Test public void testLongRawJsonPayload() { PushMessageInformation largePushMessageInformation = new PushMessageInformation(); largePushMessageInformation.setPushApplicationId("231231231"); largePushMessageInformation.setRawJsonMessage(TestUtils.longString(4500)); pushMessageInformationDao.create(largePushMessageInformation); } @Test(expected = PersistenceException.class) public void testTooLongRawJsonPayload() { PushMessageInformation largePushMessageInformation = new PushMessageInformation(); largePushMessageInformation.setPushApplicationId("231231231"); largePushMessageInformation.setRawJsonMessage(TestUtils.longString(4501)); pushMessageInformationDao.create(largePushMessageInformation); flushAndClear(); } @Test public void deleteOldPushMessageInformations() { List<PushMessageInformation> messageInformations = pushMessageInformationDao.findAllForPushApplication("231231231", Boolean.TRUE); assertThat(messageInformations).hasSize(2); pushMessageInformationDao.deletePushInformationOlderThan(DateUtils.calculatePastDate(0)); flushAndClear(); messageInformations = pushMessageInformationDao.findAllForPushApplication("231231231", Boolean.TRUE); assertThat(messageInformations).hasSize(0); } @Test public void findVariantMetricByVariantId() { VariantMetricInformation variantMetricInformation = variantMetricInformationDao.findVariantMetricInformationByVariantID("213","1"); assertThat(variantMetricInformation).isNotNull(); } }