You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by th...@apache.org on 2013/06/27 10:39:03 UTC
[03/11] DELTASPIKE-60 Data module initial import
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/AuditEntityListenerTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/AuditEntityListenerTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/AuditEntityListenerTest.java
new file mode 100644
index 0000000..febb490
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/AuditEntityListenerTest.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.audit;
+
+import static org.apache.deltaspike.data.test.util.TestDeployments.initDeployment;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.deltaspike.data.api.audit.CurrentUser;
+import org.apache.deltaspike.data.impl.audit.AuditEntityListener;
+import org.apache.deltaspike.data.test.TransactionalTestCase;
+import org.apache.deltaspike.data.test.domain.AuditedEntity;
+import org.apache.deltaspike.data.test.domain.Principal;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.junit.Test;
+
+public class AuditEntityListenerTest extends TransactionalTestCase
+{
+
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ return initDeployment()
+ .addPackage(AuditEntityListener.class.getPackage())
+ .addAsWebInfResource("test-orm.xml", ArchivePaths.create("classes/META-INF/orm.xml"))
+ .addPackage(AuditedEntity.class.getPackage());
+ }
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ private final String who = "test999";
+ private final Principal principal = new Principal(who);
+
+ @Produces
+ @CurrentUser
+ public String who()
+ {
+ return who;
+ }
+
+ @Produces
+ @CurrentUser
+ public Principal entity() throws Exception
+ {
+ try
+ {
+ entityManager.persist(principal);
+ }
+ catch (Throwable e)
+ {
+ }
+ return principal;
+ }
+
+ @Test
+ public void should_set_creation_date() throws Exception
+ {
+ // given
+ AuditedEntity entity = new AuditedEntity();
+
+ // when
+ entityManager.persist(entity);
+ entityManager.flush();
+
+ // then
+ assertNotNull(entity.getCreated());
+ assertNotNull(entity.getModified());
+ assertEquals(entity.getCreated().getTime(), entity.getModified());
+ }
+
+ @Test
+ public void should_set_modification_date() throws Exception
+ {
+ // given
+ AuditedEntity entity = new AuditedEntity();
+ entityManager.persist(entity);
+ entityManager.flush();
+
+ // when
+ entity = entityManager.find(AuditedEntity.class, entity.getId());
+ entity.setName("test");
+ entityManager.flush();
+
+ // then
+ assertNotNull(entity.getGregorianModified());
+ assertNotNull(entity.getTimestamp());
+ }
+
+ @Test
+ public void should_set_changing_principal()
+ {
+ // given
+ AuditedEntity entity = new AuditedEntity();
+
+ // when
+ entityManager.persist(entity);
+ entityManager.flush();
+
+ // then
+ assertNotNull(entity.getChanger());
+ assertEquals(who, entity.getChanger());
+ assertNotNull(entity.getPrincipal());
+ assertEquals(who, entity.getPrincipal().getName());
+ }
+
+ @Override
+ protected EntityManager getEntityManager()
+ {
+ return entityManager;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java
new file mode 100644
index 0000000..baf4f0b
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/audit/TimestampsProviderTest.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.audit;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import org.apache.deltaspike.data.api.audit.CreatedOn;
+import org.apache.deltaspike.data.impl.audit.AuditPropertyException;
+import org.apache.deltaspike.data.impl.audit.TimestampsProvider;
+import org.apache.deltaspike.data.test.domain.AuditedEntity;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.junit.Test;
+
+public class TimestampsProviderTest
+{
+
+ @Test
+ public void should_set_dates_for_creation()
+ {
+ // given
+ AuditedEntity entity = new AuditedEntity();
+
+ // when
+ new TimestampsProvider().prePersist(entity);
+
+ // then
+ assertNotNull(entity.getCreated());
+ assertNotNull(entity.getModified());
+ assertNull(entity.getGregorianModified());
+ assertNull(entity.getTimestamp());
+ }
+
+ @Test
+ public void should_set_dates_for_update()
+ {
+ // given
+ AuditedEntity entity = new AuditedEntity();
+
+ // when
+ new TimestampsProvider().preUpdate(entity);
+
+ // then
+ assertNull(entity.getCreated());
+ assertNotNull(entity.getModified());
+ assertNotNull(entity.getGregorianModified());
+ assertNotNull(entity.getTimestamp());
+ }
+
+ @Test
+ public void should_not_fail_on_non_audited_entity()
+ {
+ // given
+ Simple entity = new Simple();
+
+ // when
+ TimestampsProvider provider = new TimestampsProvider();
+ provider.prePersist(entity);
+ provider.preUpdate(entity);
+
+ // then finish the test
+ }
+
+ @Test(expected = AuditPropertyException.class)
+ public void should_fail_on_invalid_entity()
+ {
+ // given
+ InvalidEntity entity = new InvalidEntity();
+
+ // when
+ new TimestampsProvider().prePersist(entity);
+
+ // then
+ fail();
+ }
+
+ private static class InvalidEntity
+ {
+
+ @CreatedOn
+ private String nonTemporal;
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java
new file mode 100644
index 0000000..0f66c00
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/builder/part/QueryRootTest.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.builder.part;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.deltaspike.data.impl.builder.MethodExpressionException;
+import org.apache.deltaspike.data.impl.meta.RepositoryComponent;
+import org.apache.deltaspike.data.impl.meta.RepositoryEntity;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.service.SimpleFetchRepository;
+import org.apache.deltaspike.data.test.service.SimpleRepository;
+import org.junit.Test;
+
+/**
+ *
+ * @author thomashug
+ */
+public class QueryRootTest
+{
+
+ private final RepositoryComponent repo = new RepositoryComponent(SimpleRepository.class, new RepositoryEntity(Simple.class, Long.class));
+ private final RepositoryComponent repoFetchBy = new RepositoryComponent(SimpleFetchRepository.class, new RepositoryEntity(Simple.class, Long.class));
+
+ @Test
+ public void should_create_simple_query()
+ {
+ // given
+ final String name = "findByName";
+ final String expected =
+ "select e from Simple e " +
+ "where e.name = ?1";
+
+ // when
+ String result = QueryRoot.create(name, repo).getJpqlQuery().trim();
+
+ // then
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void should_create_complex_query()
+ {
+ // given
+ final String name = "findByNameAndTemporalBetweenOrEnabledIsNull" +
+ "AndCamelCaseAndEmbedded_embeddNotEqualOrderByEmbedded_embeddDesc";
+ final String expected =
+ "select e from Simple e " +
+ "where e.name = ?1 " +
+ "and e.temporal between ?2 and ?3 " +
+ "or e.enabled IS NULL " +
+ "and e.camelCase = ?4 " +
+ "and e.embedded.embedd <> ?5 " +
+ "order by e.embedded.embedd desc";
+
+ // when
+ String result = QueryRoot.create(name, repo).getJpqlQuery().trim();
+
+ // then
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void should_create_query_with_order_by_only()
+ {
+ // given
+ final String name = "findByOrderByIdAsc";
+ final String expected =
+ "select e from Simple e " +
+ "order by e.id asc";
+
+ // when
+ String result = QueryRoot.create(name, repo).getJpqlQuery().trim();
+
+ // then
+ assertEquals(expected, result);
+ }
+
+ @Test(expected = MethodExpressionException.class)
+ public void should_fail_in_where()
+ {
+ // given
+ final String name = "findByInvalid";
+
+ // when
+ QueryRoot.create(name, repo);
+ }
+
+ @Test(expected = MethodExpressionException.class)
+ public void should_fail_with_prefix_only()
+ {
+ // given
+ final String name = "findBy";
+
+ // when
+ QueryRoot.create(name, repo);
+ }
+
+ @Test(expected = MethodExpressionException.class)
+ public void should_fail_in_order_by()
+ {
+ // given
+ final String name = "findByNameOrderByInvalidDesc";
+
+ // when
+ QueryRoot.create(name, repo);
+ }
+
+ @Test
+ public void should_use_alternative_prefix()
+ {
+ // given
+ final String name = "fetchByName";
+ final String expected =
+ "select e from Simple e " +
+ "where e.name = ?1";
+
+ // when
+ String result = QueryRoot.create(name, repoFetchBy).getJpqlQuery().trim();
+
+ // then
+ assertEquals(expected, result);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
new file mode 100644
index 0000000..65ad856
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/criteria/CriteriaTest.java
@@ -0,0 +1,308 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.criteria;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.deltaspike.data.test.TransactionalTestCase;
+import org.apache.deltaspike.data.test.domain.OneToMany;
+import org.apache.deltaspike.data.test.domain.OneToOne;
+import org.apache.deltaspike.data.test.domain.Parent;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.service.ParentRepository;
+import org.apache.deltaspike.data.test.service.SimpleCriteriaRepository;
+import org.apache.deltaspike.data.test.service.Statistics;
+import org.apache.deltaspike.data.test.util.TestDeployments;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.Archive;
+import org.junit.Test;
+
+/**
+ *
+ * @author thomashug
+ */
+public class CriteriaTest extends TransactionalTestCase
+{
+
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ return TestDeployments.initDeployment()
+ .addClasses(SimpleCriteriaRepository.class, ParentRepository.class, Statistics.class)
+ .addPackage(Simple.class.getPackage());
+ }
+
+ @Inject
+ private SimpleCriteriaRepository repo;
+
+ @Inject
+ private ParentRepository parentRepo;
+
+ @Produces
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Test
+ public void should_create_criteria_query()
+ {
+ // given
+ final String name = "testCreateCriteriaQuery";
+ createSimple(name, 55);
+
+ // when
+ List<Simple> result1 = repo.queryByCriteria(name, Boolean.TRUE, 0, 50);
+ List<Simple> result2 = repo.queryByCriteria(name, Boolean.TRUE, 50, 100);
+ List<Simple> result3 = repo.queryByCriteria(name, Boolean.FALSE, 50, 100);
+
+ // then
+ assertEquals(0, result1.size());
+ assertEquals(1, result2.size());
+ assertEquals(0, result3.size());
+ }
+
+ @Test
+ public void should_create_join_criteria_query()
+ {
+ // given
+ final String name = "testCreateJoinCriteriaQuery";
+ final String nameOne = name + "-one";
+ final String nameMany = name + "-many";
+ Parent parent = new Parent(name);
+ parent.setOne(new OneToOne(nameOne));
+ parent.add(new OneToMany(nameMany));
+
+ entityManager.persist(parent);
+ entityManager.flush();
+
+ // when
+ List<Parent> result = parentRepo.joinQuery(name, nameOne, nameMany);
+
+ // then
+ assertEquals(1, result.size());
+ assertNotNull(result.get(0));
+
+ Parent queried = result.get(0);
+ assertEquals(name, queried.getName());
+ assertNotNull(queried.getOne());
+ assertEquals(nameOne, queried.getOne().getName());
+ assertEquals(1, queried.getMany().size());
+ assertEquals(nameMany, queried.getMany().get(0).getName());
+ }
+
+ @Test
+ public void should_create_or_query()
+ {
+ // given
+ final String name = "testCreateOrQuery";
+ Parent parent1 = new Parent(name + "1");
+ parent1.setValue(25L);
+ Parent parent2 = new Parent(name + "2");
+ parent2.setValue(75L);
+ Parent parent3 = new Parent(name + "3");
+ parent3.setValue(25L);
+ Parent parent4 = new Parent(name + "1");
+ parent4.setValue(75L);
+
+ entityManager.persist(parent1);
+ entityManager.persist(parent2);
+ entityManager.persist(parent3);
+ entityManager.persist(parent4);
+ entityManager.flush();
+
+ // when
+ List<Parent> result = parentRepo.orQuery(name + "1", name + "2");
+
+ // then
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void should_create_ordered_query()
+ {
+ // given
+ final String name = "testCreateOrderedQuery";
+ Parent parent1 = new Parent(name + "99");
+ Parent parent2 = new Parent(name + "12");
+ Parent parent3 = new Parent(name + "19");
+ Parent parent4 = new Parent(name + "02");
+
+ entityManager.persist(parent1);
+ entityManager.persist(parent2);
+ entityManager.persist(parent3);
+ entityManager.persist(parent4);
+ entityManager.flush();
+
+ // when
+ List<Parent> result = parentRepo.orderedQuery();
+
+ // then
+ assertEquals(4, result.size());
+ assertEquals(name + "02", result.get(0).getName());
+ assertEquals(name + "12", result.get(1).getName());
+ assertEquals(name + "19", result.get(2).getName());
+ assertEquals(name + "99", result.get(3).getName());
+ }
+
+ @Test
+ public void should_create_query_wihtout_nulls()
+ {
+ // given
+ final String name = "testCreateQueryWihtoutNulls";
+ Parent parent = new Parent(name);
+
+ entityManager.persist(parent);
+ entityManager.flush();
+
+ // when
+ List<Parent> result = parentRepo.nullAwareQuery(name, null, null);
+
+ // then
+ assertEquals(1, result.size());
+ assertEquals(name, result.get(0).getName());
+ }
+
+ @Test
+ public void should_create_fetch_query()
+ {
+ // given
+ final String name = "testCreateFetchQuery";
+ Parent parent = new Parent(name);
+ parent.add(new OneToMany(name + "-1"));
+ parent.add(new OneToMany(name + "-2"));
+
+ entityManager.persist(parent);
+ entityManager.flush();
+
+ // when
+ Parent result = parentRepo.fetchQuery(name);
+
+ // then
+ assertNotNull(result);
+ assertEquals(name, result.getName());
+ assertNotNull(result.getMany());
+ assertEquals(2, result.getMany().size());
+ }
+
+ @Test
+ public void should_create_in_query()
+ {
+ // given
+ final String name = "testCreateInQuery";
+ Parent parent1 = new Parent(name + "-1");
+ Parent parent2 = new Parent(name + "-2");
+ Parent parent3 = new Parent(name + "-3");
+
+ entityManager.persist(parent1);
+ entityManager.persist(parent2);
+ entityManager.persist(parent3);
+ entityManager.flush();
+
+ // when
+ List<Parent> result = parentRepo.fetchByName(name + "-1", name + "-2", name + "-3");
+
+ // then
+ assertNotNull(result);
+ assertEquals(3, result.size());
+ }
+
+ @Test
+ public void should_create_select_criteria_with_result_type()
+ {
+ // given
+ final String name = "testCreateSelectCriteriaWithResultType";
+ createSimple(name, 1);
+ createSimple(name, 2);
+ createSimple(name, 3);
+ createSimple(name, 4);
+ createSimple(name, 99);
+
+ // when
+ Statistics result = repo.queryWithSelect(name);
+
+ // then
+ assertNotNull(result.getAverage());
+ assertEquals(Long.valueOf(5l), result.getCount());
+ }
+
+ @Test
+ public void should_create_select_criteria_without_result_type()
+ {
+ // given
+ final String name = "testCreateSelectCriteriaWithoutResultType";
+ createSimple(name, 10);
+ createSimple(name, 99);
+
+ // when
+ Object[] result = repo.queryWithSelectAggregateReturnArray(name);
+
+ // then
+ assertEquals(Integer.valueOf(10), result[0]);
+ assertEquals(Integer.valueOf(99), result[1]);
+ assertTrue(result[2] instanceof java.sql.Date);
+ assertTrue(result[3] instanceof java.sql.Time);
+ assertTrue(result[4] instanceof java.sql.Timestamp);
+ }
+
+ @Test
+ public void should_create_select_criteria_with_attributes()
+ {
+ // given
+ final String name = "testCreateSelectCriteriaWithAttributes";
+ createSimple(name, 10);
+ createSimple(name, 99);
+
+ // when
+ List<Object[]> results = repo.queryWithSelectAttributes(name);
+
+ // then
+ for (Object[] result : results)
+ {
+ assertEquals(name, result[0]);
+ assertEquals(name.toUpperCase(), result[1]);
+ assertEquals(name.toLowerCase(), result[2]);
+ assertEquals(name.substring(1), result[3]);
+ assertEquals(name.substring(1, 1 + 2), result[4]);
+ }
+ }
+
+ @Override
+ protected EntityManager getEntityManager()
+ {
+ return entityManager;
+ }
+
+ private Simple createSimple(String name, Integer counter)
+ {
+ Simple result = new Simple(name);
+ result.setCounter(counter);
+ entityManager.persist(result);
+ entityManager.flush();
+ return result;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java
new file mode 100644
index 0000000..6f40ac4
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.service.SimpleRepositoryWithEntityManager;
+import org.apache.deltaspike.data.test.service.SimpleRepositoryWithOverriddenEntityManager;
+import org.apache.deltaspike.data.test.service.Simplistic;
+import org.apache.deltaspike.data.test.service.SimplisticEntityManagerResolver;
+import org.apache.deltaspike.data.test.util.TestDeployments;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(Arquillian.class)
+public class EntityManagerTest
+{
+
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ return TestDeployments.initDeployment()
+ .addClasses(SimpleRepositoryWithEntityManager.class,
+ SimpleRepositoryWithOverriddenEntityManager.class,
+ EntityManagerTestProducer.class,
+ Simplistic.class, SimplisticEntityManagerResolver.class);
+ }
+
+ @Inject
+ private SimpleRepositoryWithEntityManager repoWithAnnotation;
+
+ @Inject
+ private SimpleRepositoryWithOverriddenEntityManager repoWithInjection;
+
+ @Test
+ public void should_use_qualified_entity_manager()
+ {
+ // when
+ List<Simple> result = repoWithAnnotation.findByName("testUseQualifiedEntityManager");
+
+ // then
+ assertNotNull(result);
+ assertEquals(0, result.size());
+ }
+
+ @Test
+ public void should_use_injected_entity_manager()
+ {
+ // when
+ List<Simple> result = repoWithInjection.findByName("testUseInjectedEntityManager");
+
+ // then
+ assertNotNull(result);
+ assertEquals(0, result.size());
+ }
+
+ @Test
+ public void should_inject_entity_manager()
+ {
+ // when
+ List<Simple> result = repoWithInjection.findWithEm("testInjectEntityManager");
+
+ // then
+ assertNotNull(result);
+ assertEquals(0, result.size());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTestProducer.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTestProducer.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTestProducer.java
new file mode 100644
index 0000000..87aeda4
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityManagerTestProducer.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.handler;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.deltaspike.data.test.service.Simplistic;
+
+public class EntityManagerTestProducer
+{
+
+ @Produces
+ @Simplistic
+ @PersistenceContext
+ private EntityManager entityManager;
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java
new file mode 100644
index 0000000..79c34c0
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/EntityRepositoryHandlerTest.java
@@ -0,0 +1,359 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.List;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.metamodel.SingularAttribute;
+
+import org.apache.deltaspike.data.test.TransactionalTestCase;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.domain.Simple_;
+import org.apache.deltaspike.data.test.service.ExtendedRepositoryInterface;
+import org.apache.deltaspike.data.test.util.TestDeployments;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.Archive;
+import org.junit.Test;
+
+public class EntityRepositoryHandlerTest extends TransactionalTestCase
+{
+
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ return TestDeployments.initDeployment()
+ .addClasses(ExtendedRepositoryInterface.class)
+ .addPackage(Simple.class.getPackage());
+ }
+
+ @Inject
+ private ExtendedRepositoryInterface repo;
+
+ @Produces
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Test
+ public void should_save() throws Exception
+ {
+ // given
+ Simple simple = new Simple("test");
+
+ // when
+ simple = repo.save(simple);
+
+ // then
+ assertNotNull(simple.getId());
+ }
+
+ @Test
+ public void should_merge() throws Exception
+ {
+ // given
+ Simple simple = createSimple("testMerge");
+ Long id = simple.getId();
+
+ // when
+ final String newName = "testMergeUpdated";
+ simple.setName(newName);
+ simple = repo.save(simple);
+
+ // then
+ assertEquals(id, simple.getId());
+ assertEquals(newName, simple.getName());
+ }
+
+ @Test
+ public void should_save_and_flush() throws Exception
+ {
+ // given
+ Simple simple = new Simple("test");
+
+ // when
+ simple = repo.saveAndFlush(simple);
+ Simple fetch = (Simple) entityManager
+ .createNativeQuery("select * from simple_table where id = ?", Simple.class)
+ .setParameter(1, simple.getId())
+ .getSingleResult();
+
+ // then
+ assertEquals(simple.getId(), fetch.getId());
+ }
+
+ @Test
+ public void should_refresh() throws Exception
+ {
+ // given
+ final String name = "testRefresh";
+ Simple simple = createSimple(name);
+
+ // when
+ simple.setName("override");
+ repo.refresh(simple);
+
+ // then
+ assertEquals(name, simple.getName());
+ }
+
+ @Test
+ public void should_find_by_pk() throws Exception
+ {
+ // given
+ Simple simple = createSimple("testFindByPk");
+
+ // when
+ Simple find = repo.findBy(simple.getId());
+
+ // then
+ assertEquals(simple.getName(), find.getName());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_find_by_example() throws Exception
+ {
+ // given
+ Simple simple = createSimple("testFindByExample");
+
+ // when
+ List<Simple> find = repo.findBy(simple, Simple_.name);
+
+ // then
+ assertNotNull(find);
+ assertFalse(find.isEmpty());
+ assertEquals(simple.getName(), find.get(0).getName());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_find_by_example_with_start_and_max() throws Exception
+ {
+ // given
+ Simple simple = createSimple("testFindByExample1", Integer.valueOf(10));
+ createSimple("testFindByExample1", Integer.valueOf(10));
+
+ // when
+ List<Simple> find = repo.findBy(simple, 0, 1, Simple_.name, Simple_.counter);
+
+ // then
+ assertNotNull(find);
+ assertFalse(find.isEmpty());
+ assertEquals(1, find.size());
+ assertEquals(simple.getName(), find.get(0).getName());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_find_by_example_with_no_attributes() throws Exception
+ {
+ // given
+ Simple simple = createSimple("testFindByExample");
+ SingularAttribute<Simple, ?>[] attributes = new SingularAttribute[] {};
+
+ // when
+ List<Simple> find = repo.findBy(simple, attributes);
+
+ // then
+ assertNotNull(find);
+ assertFalse(find.isEmpty());
+ assertEquals(simple.getName(), find.get(0).getName());
+ }
+
+ @Test
+ public void should_find_all()
+ {
+ // given
+ createSimple("testFindAll1");
+ createSimple("testFindAll2");
+
+ // when
+ List<Simple> find = repo.findAll();
+
+ // then
+ assertEquals(2, find.size());
+ }
+
+ @Test
+ public void should_find_by_all_with_start_and_max()
+ {
+ // given
+ createSimple("testFindAll1");
+ createSimple("testFindAll2");
+
+ // when
+ List<Simple> find = repo.findAll(0, 1);
+
+ // then
+ assertEquals(1, find.size());
+ }
+
+ @Test
+ @SuppressWarnings({ "unchecked" })
+ public void should_find_by_like()
+ {
+ // given
+ createSimple("testFindAll1");
+ createSimple("testFindAll2");
+ Simple example = new Simple("test");
+
+ // when
+ List<Simple> find = repo.findByLike(example, Simple_.name);
+
+ // then
+ assertEquals(2, find.size());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_find_by_like_with_start_and_max()
+ {
+ // given
+ createSimple("testFindAll1");
+ createSimple("testFindAll2");
+ Simple example = new Simple("test");
+
+ // when
+ List<Simple> find = repo.findByLike(example, 1, 10, Simple_.name);
+
+ // then
+ assertEquals(1, find.size());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_find_by_like_non_string()
+ {
+ // given
+ createSimple("testFindAll1", 1);
+ createSimple("testFindAll2", 2);
+ Simple example = new Simple("test");
+ example.setCounter(1);
+
+ // when
+ List<Simple> find = repo.findByLike(example, Simple_.name, Simple_.counter);
+
+ // then
+ assertEquals(1, find.size());
+ }
+
+ @Test
+ public void should_count_all()
+ {
+ // given
+ createSimple("testCountAll");
+
+ // when
+ Long result = repo.count();
+
+ // then
+ assertEquals(Long.valueOf(1), result);
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_count_with_attributes()
+ {
+ // given
+ Simple simple = createSimple("testFindAll1", Integer.valueOf(55));
+ createSimple("testFindAll2", Integer.valueOf(55));
+
+ // when
+ Long result = repo.count(simple, Simple_.name, Simple_.counter);
+
+ // then
+ assertEquals(Long.valueOf(1), result);
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_count_with_no_attributes()
+ {
+ // given
+ Simple simple = createSimple("testFindAll1");
+ createSimple("testFindAll2");
+ SingularAttribute<Simple, Object>[] attributes = new SingularAttribute[] {};
+
+ // when
+ Long result = repo.count(simple, attributes);
+
+ // then
+ assertEquals(Long.valueOf(2), result);
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void should_count_by_like()
+ {
+ // given
+ createSimple("testFindAll1");
+ createSimple("testFindAll2");
+ Simple example = new Simple("test");
+
+ // when
+ Long count = repo.countLike(example, Simple_.name);
+
+ // then
+ assertEquals(Long.valueOf(2), count);
+ }
+
+ @Test
+ public void should_remove()
+ {
+ // given
+ Simple simple = createSimple("testRemove");
+
+ // when
+ repo.remove(simple);
+ repo.flush();
+ Simple lookup = entityManager.find(Simple.class, simple.getId());
+
+ // then
+ assertNull(lookup);
+ }
+
+ @Override
+ protected EntityManager getEntityManager()
+ {
+ return entityManager;
+ }
+
+ private Simple createSimple(String name)
+ {
+ return createSimple(name, null);
+ }
+
+ private Simple createSimple(String name, Integer counter)
+ {
+ Simple result = new Simple(name);
+ result.setCounter(counter);
+ entityManager.persist(result);
+ entityManager.flush();
+ return result;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/QueryHandlerTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/QueryHandlerTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/QueryHandlerTest.java
new file mode 100644
index 0000000..5aa48e3
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/handler/QueryHandlerTest.java
@@ -0,0 +1,294 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.deltaspike.data.test.TransactionalTestCase;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.domain.Simple2;
+import org.apache.deltaspike.data.test.domain.SimpleBuilder;
+import org.apache.deltaspike.data.test.service.Simple2Repository;
+import org.apache.deltaspike.data.test.service.SimpleRepository;
+import org.apache.deltaspike.data.test.util.TestDeployments;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.Archive;
+import org.junit.Before;
+import org.junit.Test;
+
+public class QueryHandlerTest extends TransactionalTestCase
+{
+
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ return TestDeployments.initDeployment()
+ .addClasses(SimpleRepository.class, Simple2Repository.class)
+ .addPackage(Simple.class.getPackage());
+ }
+
+ @Inject
+ private SimpleRepository repo;
+
+ @Inject
+ private Simple2Repository repo2;
+
+ @Produces
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ private SimpleBuilder builder;
+
+ @Test
+ public void should_delegate_to_implementation()
+ {
+ // given
+ final String name = "testDelegateToImplementation";
+ builder.createSimple(name);
+
+ // when
+ List<Simple> result = repo.implementedQueryByName(name);
+
+ // then
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ }
+
+ @Test
+ public void should_create_named_query_index()
+ {
+ // given
+ final String name = "testCreateNamedQueryIndex";
+ builder.createSimple(name);
+
+ // when
+ List<Simple> result = repo.findByNamedQueryIndexed(name, Boolean.TRUE);
+
+ // then
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertEquals(name, result.get(0).getName());
+ }
+
+ @Test
+ public void should_create_named_query_named()
+ {
+ // given
+ final String name = "testCreateNamedQueryNamed";
+ Simple simple = builder.createSimple(name);
+
+ // when
+ Simple result = repo.findByNamedQueryNamed(simple.getId(), Boolean.TRUE);
+
+ // then
+ assertNotNull(result);
+ assertEquals(name, result.getName());
+ }
+
+ @Test
+ public void should_run_annotated_query()
+ {
+ // given
+ final String name = "testRunAnnotatedQuery";
+ builder.createSimple(name);
+
+ // when
+ Simple result = repo.findByQuery(name);
+
+ // then
+ assertNotNull(result);
+ assertEquals(name, result.getName());
+ }
+
+ @Test
+ public void should_create_query_by_method_name()
+ {
+ // given
+ final String name = "testCreateQueryByMethodName";
+ builder.createSimple(name);
+
+ // when
+ Simple result = repo.findByNameAndEnabled(name, Boolean.TRUE);
+
+ // then
+ assertNotNull(result);
+ assertEquals(name, result.getName());
+ }
+
+ @Test
+ public void should_restrict_result_size_by_annotation()
+ {
+ // given
+ final String name = "testRestrictResultSizeByAnnotation";
+ builder.createSimple(name);
+ builder.createSimple(name);
+
+ // when
+ List<Simple> result = repo.findByNamedQueryIndexed(name, Boolean.TRUE);
+
+ // then
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ }
+
+ @Test
+ public void should_restrict_result_size_by_parameters()
+ {
+ // given
+ final String name = "testRestrictResultSizeByParameters";
+ builder.createSimple(name);
+ Simple second = builder.createSimple(name);
+
+ // when
+ List<Simple> result = repo.findByNamedQueryRestricted(name, Boolean.TRUE, 1, 1);
+
+ // then
+ assertNotNull(result);
+ assertEquals(1, result.size());
+ assertEquals(second.getId(), result.get(0).getId());
+ }
+
+ @Test
+ public void should_work_with_2nd_repo()
+ {
+ // given
+ final String name = "testWorkWith2ndRepository";
+ Simple2 simple = createSimple2(name);
+
+ // when
+ Simple2 result = repo2.findByName(name);
+
+ // then
+ assertNotNull(result);
+ assertEquals(simple.getId(), result.getId());
+ assertEquals(name, result.getName());
+ }
+
+ @Test
+ public void should_return_aggregate()
+ {
+ // given
+ final String name = "testReturnAggregate";
+ builder.createSimple(name);
+
+ // when
+ Long result = repo.findCountByQuery(name);
+
+ // then
+ assertNotNull(result);
+ }
+
+ @Test
+ public void should_find_with_native_query()
+ {
+ // given
+ final String name = "testFindWithNativeQuery";
+ builder.createSimple(name);
+ builder.createSimple(name);
+
+ // when
+ List<Simple> result = repo.findWithNative(name);
+
+ // then
+ assertNotNull(result);
+ assertEquals(2, result.size());
+ }
+
+ @Test
+ public void should_order_result_by_method_order_by()
+ {
+ // given
+ final String name = "testFindWithNativeQuery";
+ builder.createSimple(name, Integer.valueOf(33));
+ builder.createSimple(name, Integer.valueOf(66));
+ builder.createSimple(name, Integer.valueOf(66));
+ builder.createSimple(name, Integer.valueOf(22));
+ builder.createSimple(name, Integer.valueOf(55));
+
+ // when
+ List<Simple> result = repo.findByOrderByCounterAscIdDesc();
+
+ // then
+ assertNotNull(result);
+ assertFalse(result.isEmpty());
+ long lastId = Long.MAX_VALUE;
+ int lastCounter = Integer.MIN_VALUE;
+ for (Simple simple : result)
+ {
+ long currentId = simple.getId().longValue();
+ int currentCounter = simple.getCounter().intValue();
+ if (currentCounter == lastCounter)
+ {
+ assertTrue(currentId < lastId);
+ }
+ else
+ {
+ assertTrue(currentCounter > lastCounter);
+ }
+ lastId = currentId;
+ lastCounter = currentCounter;
+ }
+ }
+
+ @Test
+ public void should_execute_update()
+ {
+ // given
+ final String name = "testFindWithNativeQuery";
+ final String newName = "testFindWithNativeQueryUpdated" + System.currentTimeMillis();
+ Simple s = builder.createSimple(name);
+
+ // when
+ int count = repo.updateNameForId(newName, s.getId());
+
+ // then
+ assertEquals(1, count);
+ }
+
+ @Before
+ public void setup()
+ {
+ builder = new SimpleBuilder(entityManager);
+ }
+
+ @Override
+ protected EntityManager getEntityManager()
+ {
+ return entityManager;
+ }
+
+ private Simple2 createSimple2(String name)
+ {
+ Simple2 result = new Simple2(name);
+ entityManager.persist(result);
+ entityManager.flush();
+ return result;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/AnnotationMetadataExtractorTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/AnnotationMetadataExtractorTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/AnnotationMetadataExtractorTest.java
new file mode 100644
index 0000000..99aa24f
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/AnnotationMetadataExtractorTest.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.meta.extractor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.deltaspike.data.api.Repository;
+import org.apache.deltaspike.data.impl.meta.RepositoryEntity;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.service.RepositoryInterface;
+import org.junit.Test;
+
+public class AnnotationMetadataExtractorTest
+{
+
+ @Test
+ public void should_extract_entity_class_from_repo_annotation()
+ {
+ // given
+ AnnotationMetadataExtractor extractor = new AnnotationMetadataExtractor();
+
+ // when
+ RepositoryEntity result = extractor.extract(RepositoryInterface.class);
+
+ // then
+ assertNotNull(result);
+ assertEquals(Simple.class, result.getEntityClass());
+ assertEquals(Long.class, result.getPrimaryClass());
+ }
+
+ @Test
+ public void should_throw_excption_when_annotation_with_entity_class_not_present()
+ {
+ // given
+ AnnotationMetadataExtractor extractor = new AnnotationMetadataExtractor();
+
+ // when
+ RepositoryEntity result = extractor.extract(NoEntityPresentRepository.class);
+
+ // then
+ assertNull(result);
+ }
+
+ @Test
+ public void should_throw_exception_when_annotation_with_non_entity_class()
+ {
+ // given
+ AnnotationMetadataExtractor extractor = new AnnotationMetadataExtractor();
+
+ // when
+ RepositoryEntity result = extractor.extract(NonEntityRepository.class);
+
+ // then
+ assertNull(result);
+ }
+
+ @Repository
+ private static class NoEntityPresentRepository
+ {
+ }
+
+ @Repository(forEntity = Object.class)
+ private static class NonEntityRepository
+ {
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractorTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractorTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractorTest.java
new file mode 100644
index 0000000..af2fcda
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/extractor/TypeMetadataExtractorTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.meta.extractor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.deltaspike.data.impl.meta.RepositoryEntity;
+import org.apache.deltaspike.data.impl.meta.extractor.MetadataExtractor;
+import org.apache.deltaspike.data.impl.meta.extractor.TypeMetadataExtractor;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.apache.deltaspike.data.test.service.RepositoryInterface;
+import org.apache.deltaspike.data.test.service.SimpleRepository;
+import org.junit.Test;
+
+public class TypeMetadataExtractorTest
+{
+
+ @Test
+ public void should_extract_from_class()
+ {
+ // given
+ MetadataExtractor extractor = new TypeMetadataExtractor();
+
+ // when
+ RepositoryEntity result = extractor.extract(SimpleRepository.class);
+
+ // then
+ assertNotNull(result);
+ assertEquals(Simple.class, result.getEntityClass());
+ assertEquals(Long.class, result.getPrimaryClass());
+ }
+
+ @Test
+ public void should_not_extract_from_annotation()
+ {
+ // given
+ MetadataExtractor extractor = new TypeMetadataExtractor();
+
+ // when
+ RepositoryEntity result = extractor.extract(RepositoryInterface.class);
+
+ // then
+ assertNull(result);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java
new file mode 100644
index 0000000..9116ba8
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/DescriptorHierarchyBuilderTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.meta.unit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.deltaspike.data.impl.meta.unit.DescriptorHierarchyBuilder;
+import org.apache.deltaspike.data.impl.meta.unit.EntityDescriptor;
+import org.apache.deltaspike.data.impl.meta.unit.MappedSuperclassDescriptor;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DescriptorHierarchyBuilderTest
+{
+
+ private final List<EntityDescriptor> entities = new LinkedList<EntityDescriptor>();
+ private final List<MappedSuperclassDescriptor> superClasses = new LinkedList<MappedSuperclassDescriptor>();
+
+ @Before
+ public void before()
+ {
+ entities.add(new EntityDescriptor("test", null, EntityLevel3.class.getName(), null, null));
+ entities.add(new EntityDescriptor("test", null, EntityLevel5.class.getName(), null, null));
+
+ superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel1.class.getName(), null, "id"));
+ superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel4.class.getName(), null, null));
+ superClasses.add(new MappedSuperclassDescriptor("test", null, MappedUnrelated.class.getName(), null, null));
+ superClasses.add(new MappedSuperclassDescriptor("test", null, MappedLevel2.class.getName(), null, null));
+ }
+
+ @Test
+ public void should_build_hierarchy()
+ {
+ // given
+ DescriptorHierarchyBuilder builder = DescriptorHierarchyBuilder.newInstance(entities, superClasses);
+
+ // when
+ builder.buildHierarchy();
+
+ // then
+ assertEquals(entities.size(), 2);
+ assertEquals(EntityLevel3.class, entities.get(0).getEntityClass());
+ assertEquals(EntityLevel5.class, entities.get(1).getEntityClass());
+ assertEquals(MappedLevel2.class, entities.get(0).getParent().getEntityClass());
+ assertEquals(MappedLevel4.class, entities.get(1).getParent().getEntityClass());
+
+ assertEquals(superClasses.size(), 4);
+ assertNull(superClasses.get(0).getParent());
+ assertEquals(EntityLevel3.class, superClasses.get(1).getParent().getEntityClass());
+ assertNull(superClasses.get(2).getParent());
+ assertEquals(MappedLevel1.class, superClasses.get(3).getParent().getEntityClass());
+ }
+
+ private static class MappedLevel1
+ {
+ @SuppressWarnings("unused")
+ private Long id;
+ }
+
+ private static class MappedLevel2 extends MappedLevel1
+ {
+ }
+
+ private static class EntityLevel3 extends MappedLevel2
+ {
+ }
+
+ private static class MappedLevel4 extends EntityLevel3
+ {
+ }
+
+ private static class EntityLevel5 extends MappedLevel4
+ {
+ }
+
+ private static class MappedUnrelated
+ {
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/OrmXmlBasedRepositoryTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/OrmXmlBasedRepositoryTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/OrmXmlBasedRepositoryTest.java
new file mode 100644
index 0000000..3da8343
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/OrmXmlBasedRepositoryTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.meta.unit;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.deltaspike.data.test.TransactionalTestCase;
+import org.apache.deltaspike.data.test.domain.mapped.MappedOne;
+import org.apache.deltaspike.data.test.service.MappedOneRepository;
+import org.apache.deltaspike.data.test.util.TestDeployments;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+
+public class OrmXmlBasedRepositoryTest extends TransactionalTestCase
+{
+
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ return TestDeployments
+ .initDeployment("(.*mapped.*)|(.*test.*)")
+ .addClasses(MappedOneRepository.class)
+ .addAsLibraries(
+ ShrinkWrap.create(JavaArchive.class, "domain.jar")
+ .addPackage(MappedOne.class.getPackage())
+ .addAsResource("test-custom-orm.xml", ArchivePaths.create("META-INF/custom-orm.xml"))
+ )
+ .addAsWebInfResource("test-mapped-persistence.xml",
+ ArchivePaths.create("classes/META-INF/persistence.xml"))
+ .addAsWebInfResource("test-default-orm.xml", ArchivePaths.create("classes/META-INF/orm.xml"));
+ }
+
+ @Produces
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Inject
+ private MappedOneRepository mappedOneRepository;
+
+ @Test
+ public void should_find_by()
+ {
+ // given
+ MappedOne one = createMappedOne("shouldFindBy");
+
+ // when
+ MappedOne byPk = mappedOneRepository.findBy(one.getId());
+ MappedOne byName = mappedOneRepository.findByName("shouldFindBy");
+
+ // then
+ assertEquals(one.getId(), byPk.getId());
+ assertEquals(one.getId(), byName.getId());
+ }
+
+ @Override
+ protected EntityManager getEntityManager()
+ {
+ return entityManager;
+ }
+
+ private MappedOne createMappedOne(String name)
+ {
+ MappedOne result = new MappedOne(name);
+ entityManager.persist(result);
+ entityManager.flush();
+ return result;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java
new file mode 100644
index 0000000..40da703
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/unit/PersistenceUnitsTest.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.meta.unit;
+
+import static org.apache.deltaspike.data.test.util.TestDeployments.TEST_FILTER;
+import static org.apache.deltaspike.data.test.util.TestDeployments.addDependencies;
+import static org.apache.deltaspike.data.test.util.TestDeployments.createApiArchive;
+import static org.apache.deltaspike.data.test.util.TestDeployments.createImplPackages;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.deltaspike.data.impl.RepositoryDefinitionException;
+import org.apache.deltaspike.data.impl.RepositoryExtension;
+import org.apache.deltaspike.data.impl.meta.RepositoryEntity;
+import org.apache.deltaspike.data.test.TransactionalTestCase;
+import org.apache.deltaspike.data.test.domain.Parent;
+import org.apache.deltaspike.data.test.domain.TeeId;
+import org.apache.deltaspike.data.test.domain.mapped.MappedOne;
+import org.apache.deltaspike.data.test.domain.mapped.MappedThree;
+import org.apache.deltaspike.data.test.domain.mapped.MappedTwo;
+import org.apache.deltaspike.data.test.service.MappedOneRepository;
+import org.apache.deltaspike.data.test.util.Logging;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ArchivePaths;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(Arquillian.class)
+public class PersistenceUnitsTest
+{
+
+ @Deployment
+ public static Archive<?> deployment()
+ {
+ Logging.reconfigure();
+ return addDependencies(ShrinkWrap
+ .create(WebArchive.class, "test.war")
+ .addAsLibrary(createApiArchive())
+ .addPackages(true, TEST_FILTER, createImplPackages())
+ .addPackages(true, Parent.class.getPackage())
+ .addClasses(RepositoryExtension.class, RepositoryDefinitionException.class,
+ TransactionalTestCase.class, MappedOneRepository.class)
+ .addAsWebInfResource("test-mapped-persistence.xml",
+ ArchivePaths.create("classes/META-INF/persistence.xml"))
+ .addAsWebInfResource("test-default-orm.xml", ArchivePaths.create("classes/META-INF/orm.xml"))
+ .addAsWebInfResource("test-custom-orm.xml", ArchivePaths.create("classes/META-INF/custom-orm.xml"))
+ .addAsWebInfResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"))
+ .addAsWebInfResource("META-INF/services/javax.enterprise.inject.spi.Extension",
+ ArchivePaths.create("classes/META-INF/services/javax.enterprise.inject.spi.Extension")));
+ }
+
+ @Test
+ public void should_recognize_entity_data()
+ {
+ // given
+
+ // when
+ boolean positive1 = PersistenceUnits.instance().isEntity(MappedOne.class);
+ boolean positive2 = PersistenceUnits.instance().isEntity(MappedTwo.class);
+ boolean positive3 = PersistenceUnits.instance().isEntity(MappedThree.class);
+ boolean negative = PersistenceUnits.instance().isEntity(Long.class);
+
+ // then
+ assertTrue(positive1);
+ assertTrue(positive2);
+ assertTrue(positive3);
+ assertFalse(negative);
+ }
+
+ @Test
+ public void should_recognize_ids()
+ {
+ // given
+
+ // when
+ String idField1 = PersistenceUnits.instance().primaryKeyField(MappedOne.class);
+ String idField2 = PersistenceUnits.instance().primaryKeyField(MappedThree.class);
+
+ // then
+ assertEquals("id", idField1);
+ assertEquals("id", idField2);
+ }
+
+ @Test
+ public void should_recognize_name()
+ {
+ // given
+
+ // when
+ String name = PersistenceUnits.instance().entityName(MappedOne.class);
+
+ // then
+ assertEquals("Mapped_One", name);
+ }
+
+ @Test
+ public void should_recognize_id_class()
+ {
+ // given
+
+ // when
+ Class<?> idClass = PersistenceUnits.instance().primaryKeyIdClass(MappedTwo.class);
+
+ // then
+ assertEquals(TeeId.class, idClass);
+ }
+
+ @Test
+ public void should_prepare_repo_entity()
+ {
+ // given
+
+ // when
+ RepositoryEntity entity1 = PersistenceUnits.instance().lookupMetadata(MappedOne.class);
+ RepositoryEntity entity2 = PersistenceUnits.instance().lookupMetadata(MappedTwo.class);
+ RepositoryEntity entity3 = PersistenceUnits.instance().lookupMetadata(MappedThree.class);
+
+ // then
+ assertNotNull(entity1);
+ assertNotNull(entity2);
+ assertEquals(Long.class, entity1.getPrimaryClass());
+ assertEquals(TeeId.class, entity2.getPrimaryClass());
+ assertEquals(Long.class, entity3.getPrimaryClass());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifierTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifierTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifierTest.java
new file mode 100644
index 0000000..e190022
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/meta/verifier/EntityVerifierTest.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.meta.verifier;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.deltaspike.data.impl.meta.verifier.EntityVerifier;
+import org.apache.deltaspike.data.test.domain.Simple;
+import org.junit.Test;
+
+public class EntityVerifierTest
+{
+
+ @Test
+ public void should_accept_entity_class()
+ {
+ // given
+ EntityVerifier entityVerifier = new EntityVerifier();
+
+ // when
+ boolean isValid = entityVerifier.verify(Simple.class);
+
+ // then
+ assertTrue(isValid);
+ }
+
+ @Test
+ public void should_not_accept_class_without_entity_annotation()
+ {
+ // given
+ EntityVerifier entityVerifier = new EntityVerifier();
+
+ // when
+ boolean isValid = entityVerifier.verify(EntityWithoutId.class);
+
+ // then
+ assertFalse(isValid);
+
+ }
+
+ private static class EntityWithoutId
+ {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/ClassToIntrospect.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/ClassToIntrospect.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/ClassToIntrospect.java
new file mode 100644
index 0000000..284e935
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/ClassToIntrospect.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.property;
+
+import java.net.URL;
+
+public class ClassToIntrospect
+{
+ private String name;
+
+ private String p;
+
+ private URL URL;
+
+ public long primitiveProperty = 0;
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public String getP()
+ {
+ return p;
+ }
+
+ public void setP(String p)
+ {
+ this.p = p;
+ }
+
+ public String getTitle()
+ {
+ return "Hero";
+ }
+
+ public String get()
+ {
+ return null;
+ }
+
+ public boolean is()
+ {
+ return false;
+ }
+
+ public void getFooBar()
+ {
+ }
+
+ public void setSalary(Double base, Double bonus)
+ {
+ }
+
+ public URL getURL()
+ {
+ return URL;
+ }
+
+ public void setURL(URL URL)
+ {
+ this.URL = URL;
+ }
+
+ public Boolean isValid()
+ {
+ return false;
+ }
+
+ public boolean isValidPrimitiveBoolean()
+ {
+ return false;
+ }
+
+ public long getPrimitiveProperty()
+ {
+ return 0l;
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromFieldTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromFieldTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromFieldTest.java
new file mode 100644
index 0000000..e58fa4f
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromFieldTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.property;
+
+import java.lang.reflect.Field;
+
+import org.apache.deltaspike.data.impl.property.FieldProperty;
+import org.apache.deltaspike.data.impl.property.Properties;
+import org.junit.Test;
+
+/**
+ * Verify that only valid properties are permitted, as per the JavaBean specification.
+ *
+ * @author Vivian Steller
+ */
+public class PropertyFromFieldTest
+{
+
+ @Test
+ public void testAccessingPrimitiveTypedFieldProperty() throws Exception
+ {
+ final Field field = ClassToIntrospect.class.getField("primitiveProperty");
+
+ FieldProperty<Object> propertyUT = Properties.createProperty(field);
+ propertyUT.getValue(new ClassToIntrospect());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromMethodTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromMethodTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromMethodTest.java
new file mode 100644
index 0000000..dbe6d34
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/PropertyFromMethodTest.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.property;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+
+import org.apache.deltaspike.data.impl.property.MethodProperty;
+import org.apache.deltaspike.data.impl.property.Properties;
+import org.apache.deltaspike.data.impl.property.Property;
+import org.junit.Test;
+
+/**
+ * Verify that only valid properties are permitted, as per the JavaBean specification.
+ *
+ * @author Dan Allen
+ * @see http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html
+ */
+public class PropertyFromMethodTest
+{
+
+ @Test
+ public void testValidPropertyGetterMethod() throws Exception
+ {
+ Method getter = ClassToIntrospect.class.getMethod("getName");
+ Property<String> p = Properties.createProperty(getter);
+ assertNotNull(p);
+ assertEquals("name", p.getName());
+ assertEquals(getter, p.getMember());
+ }
+
+ @Test
+ public void testValidPropertySetterMethod() throws Exception
+ {
+ Property<String> p = Properties.createProperty(ClassToIntrospect.class.getMethod("setName", String.class));
+ assertNotNull(p);
+ assertEquals("name", p.getName());
+ }
+
+ @Test
+ public void testReadOnlyProperty() throws Exception
+ {
+ Property<String> p = Properties.createProperty(ClassToIntrospect.class.getMethod("getTitle"));
+ assertNotNull(p);
+ assertEquals("title", p.getName());
+ assertTrue(p.isReadOnly());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testEmptyPropertyGetterMethod() throws Exception
+ {
+ Properties.createProperty(ClassToIntrospect.class.getMethod("get"));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testEmptyBooleanPropertyGetterMethod() throws Exception
+ {
+ Properties.createProperty(ClassToIntrospect.class.getMethod("is"));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testNonPrimitiveBooleanPropertyIsMethod() throws Exception
+ {
+ Properties.createProperty(ClassToIntrospect.class.getMethod("isValid"));
+ }
+
+ @Test
+ public void testSingleCharPropertyGetterMethod() throws Exception
+ {
+ Method getter = ClassToIntrospect.class.getMethod("getP");
+ Property<String> p = Properties.createProperty(getter);
+ assertNotNull(p);
+ assertEquals("p", p.getName());
+ assertEquals(getter, p.getMember());
+ }
+
+ @Test
+ public void testSingleCharPropertySetterMethod() throws Exception
+ {
+ Property<String> p = Properties.createProperty(ClassToIntrospect.class.getMethod("setP", String.class));
+ assertNotNull(p);
+ assertEquals("p", p.getName());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testGetterMethodWithVoidReturnType() throws Exception
+ {
+ Properties.createProperty(ClassToIntrospect.class.getMethod("getFooBar"));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testSetterMethodWithMultipleParameters() throws Exception
+ {
+ Properties.createProperty(ClassToIntrospect.class.getMethod("setSalary", Double.class, Double.class));
+ }
+
+ @Test
+ public void testAcronymProperty() throws Exception
+ {
+ Method getter = ClassToIntrospect.class.getMethod("getURL");
+ Property<URL> p = Properties.createProperty(getter);
+ assertNotNull(p);
+ assertEquals("URL", p.getName());
+ assertEquals(getter, p.getMember());
+ }
+
+ // SOLDER-298
+ @Test
+ public void testPrimitiveBooleanProperty() throws Exception
+ {
+ Property<Boolean> p = Properties.createProperty(ClassToIntrospect.class.getMethod("isValidPrimitiveBoolean"));
+
+ assertNotNull(p);
+ }
+
+ @Test
+ public void testAccessingPrimitiveTypedMethodProperty() throws Exception
+ {
+ final Method method = ClassToIntrospect.class.getMethod("getPrimitiveProperty");
+
+ MethodProperty<Object> propertyUT = Properties.createProperty(method);
+ propertyUT.getValue(new ClassToIntrospect());
+ }
+}
http://git-wip-us.apache.org/repos/asf/deltaspike/blob/ae1a7147/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/query/PropertyQueryTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/query/PropertyQueryTest.java b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/query/PropertyQueryTest.java
new file mode 100644
index 0000000..d37b1d1
--- /dev/null
+++ b/deltaspike/modules/data/impl/src/test/java/org/apache/deltaspike/data/impl/property/query/PropertyQueryTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.deltaspike.data.impl.property.query;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.deltaspike.data.impl.property.Property;
+import org.apache.deltaspike.data.impl.property.query.NamedPropertyCriteria;
+import org.apache.deltaspike.data.impl.property.query.PropertyQueries;
+import org.apache.deltaspike.data.impl.property.query.PropertyQuery;
+import org.apache.deltaspike.data.impl.property.query.TypedPropertyCriteria;
+import org.junit.Test;
+
+/**
+ * Validate the property query mechanism.
+ *
+ * @author Dan Allen
+ */
+public class PropertyQueryTest
+{
+ /**
+ * Querying for a single result with a criteria that matches multiple properties should throw an exception.
+ *
+ * @see PropertyQuery#getSingleResult()
+ */
+ @Test(expected = RuntimeException.class)
+ public void testNonUniqueSingleResultThrowsException()
+ {
+ PropertyQuery<String> q = PropertyQueries.<String> createQuery(Person.class);
+ q.addCriteria(new TypedPropertyCriteria(String.class));
+ q.getSingleResult();
+ }
+
+ /**
+ * Querying for a single result with a criteria that does not match any properties should throw an exception.
+ *
+ * @see PropertyQuery#getSingleResult()
+ */
+ @Test(expected = RuntimeException.class)
+ public void testEmptySingleResultThrowsException()
+ {
+ PropertyQuery<String> q = PropertyQueries.<String> createQuery(Person.class);
+ q.addCriteria(new TypedPropertyCriteria(Integer.class));
+ q.getSingleResult();
+ }
+
+ /**
+ * Querying for a single result with a criterai that matches exactly one property should return the property.
+ *
+ * @see PropertyQuery#getSingleResult()
+ */
+ @Test
+ public void testSingleResult()
+ {
+ PropertyQuery<String> q = PropertyQueries.<String> createQuery(Person.class);
+ q.addCriteria(new NamedPropertyCriteria("name"));
+ Property<String> p = q.getSingleResult();
+ assertNotNull(p);
+ Person o = new Person();
+ o.setName("Trap");
+ assertEquals("Trap", p.getValue(o));
+ }
+
+ public static class Person
+ {
+
+ private String name;
+ private String title;
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public String getTitle()
+ {
+ return title;
+ }
+
+ public void setTitle(String title)
+ {
+ this.title = title;
+ }
+ }
+
+}