/**
* 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 static org.assertj.core.api.Assertions.assertThat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import net.jakubholy.dbunitexpress.EmbeddedDbTesterRule;
import org.jboss.aerogear.unifiedpush.api.AndroidVariant;
import org.jboss.aerogear.unifiedpush.api.Installation;
import org.jboss.aerogear.unifiedpush.api.PushApplication;
import org.jboss.aerogear.unifiedpush.api.VariantType;
import org.jboss.aerogear.unifiedpush.dao.PushApplicationDao;
import org.jboss.aerogear.unifiedpush.utils.DaoDeployment;
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;
@RunWith(Arquillian.class)
public class PushApplicationDaoTest {
@Inject
private EntityManager entityManager;
@Inject
private PushApplicationDao pushApplicationDao;
@Deployment
public static JavaArchive createDeployment() {
return DaoDeployment.createDeployment();
}
@Before
public void setUp() {
// start the shindig
entityManager.getTransaction().begin();
}
@After
public void tearDown() {
entityManager.getTransaction().rollback();
}
@Rule
public EmbeddedDbTesterRule testDb = new EmbeddedDbTesterRule("PushApplications.xml");
@Test
public void findAllForDeveloper() throws Exception {
assertThat(pushApplicationDao.findAllForDeveloper("Admin", 0, 10).getResultList()).hasSize(2);
assertThat(pushApplicationDao.findAllForDeveloper("Dave The Drummer", 0, 10).getResultList()).hasSize(1);
assertThat(pushApplicationDao.findAllForDeveloper("Dave The Drummer", 0, 10).getResultList()).extracting("name").containsOnly("Push App 3");
assertThat(pushApplicationDao.findAllForDeveloper("Admin The Drummer", 0, 10).getResultList()).isEmpty();
assertThat(pushApplicationDao.getNumberOfPushApplicationsForDeveloper("Dave The Drummer")).isEqualTo(1);
assertThat(pushApplicationDao.getNumberOfPushApplicationsForDeveloper("Admin")).isEqualTo(2);
// check all:
assertThat(pushApplicationDao.getNumberOfPushApplicationsForDeveloper()).isEqualTo(3);
assertThat(pushApplicationDao.findAll(0, 10).getAggregate().getCount()).isEqualTo(3);
// check exact:
assertThat(pushApplicationDao.findAllByPushApplicationID("123").getName()).isEqualTo("Push App 2");
}
@Test
public void findAllIDsForDeveloper() {
assertThat(pushApplicationDao.findAllPushApplicationIDsForDeveloper("Admin")).hasSize(2);
assertThat(pushApplicationDao.findAllPushApplicationIDsForDeveloper("Dave The Drummer")).hasSize(1);
assertThat(pushApplicationDao.findAllPushApplicationIDsForDeveloper("Admin The Drummer")).isEmpty();
// check all:
assertThat(pushApplicationDao.getNumberOfPushApplicationsForDeveloper()).isEqualTo(3);
assertThat(pushApplicationDao.findAll(0, 10).getAggregate().getCount()).isEqualTo(3);
}
@Test
public void findByPushApplicationIDForDeveloper() {
final String pushApplicationID1 = "888";
assertThat(pushApplicationDao.findByPushApplicationIDForDeveloper(pushApplicationID1, "Admin")).isNotNull();
assertThat(pushApplicationDao.findByPushApplicationIDForDeveloper(pushApplicationID1, "Admin").getName()).isEqualTo("Push App 1");
assertThat(pushApplicationDao.findByPushApplicationIDForDeveloper("1234", "Admin")).isNull();
assertThat(pushApplicationDao.findByPushApplicationIDForDeveloper(pushApplicationID1, "FooBar")).isNull();
}
@Test
public void findByPushApplicationID() {
final String pushApplicationID1 = "888";
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1)).isNotNull();
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1).getName()).isEqualTo("Push App 1");
assertThat(pushApplicationDao.findByPushApplicationID("13245632")).isNull();
}
@Test
public void updatePushApplication() {
final String pushApplicationID1 = "888";
final PushApplication pushApplication1 = pushApplicationDao.findByPushApplicationID(pushApplicationID1);
assertThat(pushApplication1).isNotNull();
assertThat(pushApplication1.getName()).isEqualTo("Push App 1");
pushApplication1.setName("Cool Push App 1");
pushApplicationDao.update(pushApplication1);
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1)).isNotNull();
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1).getName()).isEqualTo("Cool Push App 1");
}
@Test
public void updateAndDeletePushApplication() {
final String pushApplicationID1 = "888";
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1)).isNotNull();
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1).getName()).isEqualTo("Push App 1");
final PushApplication pushApplication1 = pushApplicationDao.findByPushApplicationID(pushApplicationID1);
pushApplication1.setName("Cool Push App 1");
pushApplicationDao.update(pushApplication1);
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1)).isNotNull();
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1).getName()).isEqualTo("Cool Push App 1");
pushApplicationDao.delete(pushApplication1);
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1)).isNull();
}
@Test
public void pushApplicationIDUnmodifiedAfterUpdate() {
final String pushApplicationID1 = "888";
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1)).isNotNull();
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1).getName()).isEqualTo("Push App 1");
final PushApplication pushApplication1 = pushApplicationDao.findByPushApplicationID(pushApplicationID1);
pushApplication1.setName("Cool Push App 1");
pushApplicationDao.update(pushApplication1);
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1)).isNotNull();
assertThat(pushApplicationDao.findByPushApplicationID(pushApplicationID1).getPushApplicationID()).isEqualTo(pushApplicationID1);
}
@Test
public void primaryKeyUnmodifiedAfterUpdate() {
final String id = "1";
PushApplication pa = pushApplicationDao.find(id);
assertThat(pa.getId()).isEqualTo(id);
final PushApplication pushApplication1 = pushApplicationDao.findByPushApplicationID(pa.getPushApplicationID());
pushApplication1.setName("Cool Push App 1");
pushApplicationDao.update(pushApplication1);
entityManager.flush();
entityManager.clear();
pa = pushApplicationDao.find(id);
assertThat(pa.getName()).isEqualTo("Cool Push App 1");
}
@Test
public void deletePushApplicationIncludingVariantAndInstallations() {
final String id = "888";
final PushApplication pa = pushApplicationDao.findByPushApplicationID(id);
pushApplicationDao.delete(pa);
// 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();
// Installation should be gone:
assertThat(entityManager.find(Installation.class, "1")).isNull();
// Variant should be gone:
assertThat(entityManager.find(AndroidVariant.class, "1")).isNull();
// PushApp should be gone:
assertThat(pushApplicationDao.find(id)).isNull();
}
@Test
public void shouldCountInstallations() {
final Map<String, Long> result = pushApplicationDao.countInstallationsByType("888");
assertThat(result).isNotEmpty();
assertThat(result.get("1")).isEqualTo(2L);
assertThat(result.get("3")).isEqualTo(1L);
assertThat(result.get(VariantType.ANDROID.getTypeName())).isEqualTo(2L);
}
@Test
public void shouldFindPushApplicationNameAndIDBasedOnVariantID() {
//when
final List<PushApplication> applications = pushApplicationDao.findByVariantIds(Arrays.asList("1"));
//then
assertThat(applications).isNotEmpty();
assertThat(applications.size()).isEqualTo(1);
final PushApplication application = applications.iterator().next();
assertThat(application.getName()).isEqualTo("Push App 1");
assertThat(application.getVariants()).isNotEmpty();
assertThat(application.getVariants().size()).isEqualTo(1);
assertThat(application.getVariants().iterator().next().getId()).isEqualTo("1");
}
}