content: /**
   * 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");
      }
  }
  