You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by dw...@apache.org on 2009/07/08 20:22:16 UTC

svn commit: r792248 - in /openjpa/trunk/openjpa-integration/validation/src/test: java/org/apache/openjpa/integration/validation/ resources/org/apache/openjpa/integration/validation/

Author: dwoods
Date: Wed Jul  8 18:22:16 2009
New Revision: 792248

URL: http://svn.apache.org/viewvc?rev=792248&view=rev
Log:
OPENJPA-1157 adding @Valid tests of embedded one-to-one entity and tracing of the included ConstraintViolation exceptions contained within the thrown ConstraintViolationException while validating the expected number are in the Set.

Modified:
    openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Address.java
    openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IAddress.java
    openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IPerson.java
    openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Person.java
    openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/TestConstraints.java
    openjpa/trunk/openjpa-integration/validation/src/test/resources/org/apache/openjpa/integration/validation/persistence.xml

Modified: openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Address.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Address.java?rev=792248&r1=792247&r2=792248&view=diff
==============================================================================
--- openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Address.java (original)
+++ openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Address.java Wed Jul  8 18:22:16 2009
@@ -27,7 +27,8 @@
 import javax.persistence.Inheritance;
 import javax.persistence.InheritanceType;
 import javax.persistence.Transient;
-import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
 
 @Entity(name="VAddress")
 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@@ -40,24 +41,31 @@
     private long id;
 
     @Basic
-    @NotNull
-    private String streetAddress;
+    @Pattern(regexp = "^.*$", flags = Pattern.Flag.CASE_INSENSITIVE,
+        message = "can contain any character")
+    private String streetAddress;   // @NotNull is on IAddress getter
 
     @Basic
-    @NotNull
-    private String city;
+    @Pattern(regexp = "^[A-Z .-]*$", flags = Pattern.Flag.CASE_INSENSITIVE,
+        message = "can only contain alpha, '.', '-' and ' ' characters")
+    private String city;            // @NotNull is on IAddress getter
 
     @Basic
-    @NotNull
-    private String state;
+    @Size(min = 2, max = 2)
+    @Pattern(regexp = "^[A-Z]+$", flags = Pattern.Flag.CASE_INSENSITIVE,
+        message = "can only contain alpha characters")
+    private String state;           // @NotNull is on IAddress getter
 
     @Basic
-    @NotNull
-    private String postalCode;
+    @Size(min = 5, max = 5)
+    @Pattern(regexp = "^[0-9]+$", flags = Pattern.Flag.CASE_INSENSITIVE,
+        message = "can only contain numeric characters")
+    private String postalCode;      // @NotNull is on IAddress getter
 
     @Basic
     private String phoneNumber;
 
+    
     public void setStreetAddress(String streetAddress) {
         this.streetAddress = streetAddress;
     }
@@ -66,7 +74,6 @@
         return this.streetAddress;
     }
 
-
     public void setCity(String city) {
         this.city = city;
     }
@@ -75,7 +82,6 @@
         return this.city;
     }
 
-
     public void setState(String state) {
         this.state = state;
     }
@@ -84,7 +90,6 @@
         return this.state;
     }
 
-
     public void setPostalCode(String postalCode) {
         this.postalCode = postalCode;
     }
@@ -93,7 +98,6 @@
         return this.postalCode;
     }
 
-
     public void setPhoneNumber(String phoneNumber) {
         this.phoneNumber = phoneNumber;
     }
@@ -102,7 +106,6 @@
         return this.phoneNumber;
     }
 
-
     public void setId(long id) {
         this.id = id;
     }

Modified: openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IAddress.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IAddress.java?rev=792248&r1=792247&r2=792248&view=diff
==============================================================================
--- openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IAddress.java (original)
+++ openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IAddress.java Wed Jul  8 18:22:16 2009
@@ -18,20 +18,26 @@
  */
 package org.apache.openjpa.integration.validation;
 
+import javax.validation.constraints.NotNull;
+
 public interface IAddress {
 
-    public void setStreetAddress(String streetAddress);
+    @NotNull
     public String getStreetAddress();
+    public void setStreetAddress(String streetAddress);
 
-    public void setCity(String city);
+    @NotNull
     public String getCity();
+    public void setCity(String city);
 
-    public void setState(String state);
+    @NotNull
     public String getState();
+    public void setState(String state);
 
-    public void setPostalCode(String postalCode);
+    @NotNull
     public String getPostalCode();
+    public void setPostalCode(String postalCode);
 
-    public void setPhoneNumber(String phoneNumber);
     public String getPhoneNumber();
+    public void setPhoneNumber(String phoneNumber);
 }

Modified: openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IPerson.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IPerson.java?rev=792248&r1=792247&r2=792248&view=diff
==============================================================================
--- openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IPerson.java (original)
+++ openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/IPerson.java Wed Jul  8 18:22:16 2009
@@ -18,14 +18,19 @@
  */
 package org.apache.openjpa.integration.validation;
 
+import javax.validation.constraints.NotNull;
+
 public interface IPerson {
 
-    public void setFirstName(String firstName);
+    @NotNull
     public String getFirstName();
+    public void setFirstName(String firstName);
 
-    public void setLastName(String lastName);
+    @NotNull
     public String getLastName();
+    public void setLastName(String lastName);
 
-    public void setHomeAddress(IAddress homeAddress);
+    @NotNull
     public IAddress getHomeAddress();
+    public void setHomeAddress(IAddress homeAddress);
 }

Modified: openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Person.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Person.java?rev=792248&r1=792247&r2=792248&view=diff
==============================================================================
--- openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Person.java (original)
+++ openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/Person.java Wed Jul  8 18:22:16 2009
@@ -30,10 +30,11 @@
 import javax.persistence.Transient;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 
 @Entity(name="VPerson")
 @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
-public abstract class Person implements IPerson, Serializable {
+public class Person implements IPerson, Serializable {
     @Transient
     private static final long serialVersionUID = 1L;
 
@@ -42,18 +43,21 @@
     private long id;
 
     @Basic
-    @NotNull
-    private String firstName;
+    @Pattern(regexp = "^[A-Z0-9-]+$", flags = Pattern.Flag.CASE_INSENSITIVE,
+        message = "can only contain alphanumeric characters")
+    private String firstName;   // @NotNull is on IPerson getter
 
     @Basic
-    @NotNull
-    private String lastName;
+    @Pattern(regexp = "^[A-Z0-9-]+$", flags = Pattern.Flag.CASE_INSENSITIVE,
+        message = "can only contain alphanumeric characters")
+    private String lastName;    // @NotNull is on IPerson getter
 
     @OneToOne
-    @Valid
     @NotNull
+    @Valid
     private Address homeAddress;
 
+    
     public void setFirstName(String firstName) {
         this.firstName = firstName;
     }

Modified: openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/TestConstraints.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/TestConstraints.java?rev=792248&r1=792247&r2=792248&view=diff
==============================================================================
--- openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/TestConstraints.java (original)
+++ openjpa/trunk/openjpa-integration/validation/src/test/java/org/apache/openjpa/integration/validation/TestConstraints.java Wed Jul  8 18:22:16 2009
@@ -13,8 +13,11 @@
  */
 package org.apache.openjpa.integration.validation;
 
+import java.util.Set;
+
 import javax.persistence.Query;
 import javax.persistence.ValidationMode;
+import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
 
 import org.apache.openjpa.conf.OpenJPAConfiguration;
@@ -54,6 +57,7 @@
  *   23) Test @Past constraint exception on getter in mode=AUTO
  *   25) Test @Pattern constraint exception on variables in mode=AUTO
  *   26) Test @Pattern constraint exception on getter in mode=AUTO
+ *   28) Test @Valid constraint exceptions in mode=AUTO
  *   
  *   Basic constraint test for no violations:
  *   6)  Persist @NotNull and @Null constraints pass in mode=AUTO
@@ -64,6 +68,7 @@
  *   21) Test @Size constraints pass in mode=AUTO
  *   24) Test @Past and @Future constraints pass in mode=AUTO
  *   27) Test @Pattern constraints pass in mode=AUTO
+ *   29) Test @Valid constraints pass in mode=AUTO
  *
  * @version $Rev$ $Date$
  */
@@ -75,7 +80,8 @@
             ConstraintNull.class, ConstraintBoolean.class,
             ConstraintDecimal.class, ConstraintNumber.class,
             ConstraintDigits.class, ConstraintSize.class,
-            ConstraintDates.class, ConstraintPattern.class);
+            ConstraintDates.class, ConstraintPattern.class,
+            Person.class, Address.class);
     }
 
     /**
@@ -1111,6 +1117,146 @@
         }
     }
 
+    /**
+     * Scenario being tested:
+     *   28) Test @Valid constraint exceptions in mode=AUTO
+     *       Basic constraint test for violation exceptions.
+     */
+    public void testValidFailuresConstraint() {
+        Address a = new Address();
+        getLog().trace("testValidFailuresConstraint() started");
+        
+        // Part 1 - Create an invalid Address entity
+        try {
+            OpenJPAEntityManagerFactorySPI emf = (OpenJPAEntityManagerFactorySPI)
+            OpenJPAPersistence.createEntityManagerFactory(
+                    "address-none-mode",
+                    "org/apache/openjpa/integration/validation/persistence.xml");
+            assertNotNull(emf);
+            // create EM
+            OpenJPAEntityManager em = emf.createEntityManager();
+            assertNotNull(em);
+            try{
+                // verify Validation Mode
+                OpenJPAConfiguration conf = em.getConfiguration();
+                assertNotNull(conf);
+                assertTrue("ValidationMode",
+                    conf.getValidationMode().equalsIgnoreCase("NONE"));
+                // provide an invalid Address (every value is invalid)
+                em.getTransaction().begin();
+                a.setStreetAddress(null);
+                a.setCity("a1!b2@c3#");
+                a.setState("00");
+                a.setPostalCode("a1b2c3");
+                // persist, which should NOT cause a CVE
+                em.persist(a);
+                em.getTransaction().commit();
+                getLog().trace("testValidFailuresConstraint() Part 1 of 2 passed");
+            } catch (Exception e) {
+                // unexpected
+                getLog().trace("testValidFailuresConstraint() Part 1 of 2 failed");
+                fail("Caught unexpected exception = " + e);
+            } finally {
+                if (em.getTransaction().isActive()) {
+                    em.getTransaction().rollback();
+                }
+                cleanup(emf);
+                em = null;
+            }
+        } catch (Exception e) {
+            // unexpected
+            getLog().trace("testValidFailuresConstraint() Part 1 of 2 failed");
+            fail("Caught unexpected exception = " + e);
+        }
+
+        // Part 2 - Create a Person entity that uses the invalid address above
+        OpenJPAEntityManager em = emf.createEntityManager();
+        assertNotNull(em);
+        try {
+            // verify Validation Mode
+            OpenJPAConfiguration conf = em.getConfiguration();
+            assertNotNull(conf);
+            assertTrue("ValidationMode",
+                conf.getValidationMode().equalsIgnoreCase("AUTO"));
+            // create invalid Person instance
+            em.getTransaction().begin();
+            // create a valid Person, minus the address
+            Person p = new Person();
+            p.setFirstName("Java");
+            p.setLastName("Joe");
+            // use invalid Address, which should cause CVEs due to @Valid
+            assertNotNull(a);
+            p.setHomeAddress(a);
+            // persist, which should cause a CVE
+            em.persist(p);
+            em.getTransaction().commit();
+            getLog().trace("testValidFailuresConstraint() Part 2 of 2 failed");
+            fail("Expected a ConstraintViolationException");
+        } catch (ConstraintViolationException e) {
+            // expected
+            getLog().trace("Caught expected ConstraintViolationException = " + e);
+            Set<ConstraintViolation<?>> cves = e.getConstraintViolations();
+            assertNotNull(cves);
+            for (ConstraintViolation<?> cv: cves) {
+                getLog().trace("CVE Contains ConstraintViolation = " + cv);
+            }
+            assertEquals("Wrong number of embedded ConstraintViolation failures",
+                5, cves.size());
+            getLog().trace("testValidFailuresConstraint() Part 2 of 2 passed");
+        } finally {
+            if ((em != null) && em.isOpen()) {
+                if (em.getTransaction().isActive())
+                    em.getTransaction().rollback();
+                em.close();
+            }
+        }            
+    }
+    
+    /**
+     * Scenario being tested:
+     *   29) Test @Pattern constraints pass in mode=AUTO
+     *       Basic constraint test for no violations.
+     */
+    public void testValidPassConstraint() {
+        getLog().trace("testValidPassConstraint() started");
+        // create EM from default EMF
+        OpenJPAEntityManager em = emf.createEntityManager();
+        assertNotNull(em);
+        try {
+            // provide a valid Address
+            em.getTransaction().begin();
+            Address a = new Address();
+            a.setStreetAddress("4205 South Miami Blvd.");
+            a.setCity("R.T.P.");
+            a.setState("NC");
+            a.setPostalCode("27709");
+            // persist, which should NOT cause a CVE
+            em.persist(a);
+            em.getTransaction().commit();
+
+            // create a valid Person
+            em.getTransaction().begin();
+            Person p = new Person();
+            p.setFirstName("Java");
+            p.setLastName("Joe");
+            p.setHomeAddress(a);
+            // persist, which should NOT cause a CVE
+            em.persist(p);
+            em.getTransaction().commit();
+            getLog().trace("testValidPassConstraint() passed");
+        } catch (Exception e) {
+            // unexpected
+            getLog().trace("testValidPassConstraint() failed");
+            fail("Caught unexpected exception = " + e);
+        } finally {
+            if ((em != null) && em.isOpen()) {
+                if (em.getTransaction().isActive())
+                    em.getTransaction().rollback();
+                em.close();
+            }
+        }
+    }
+
 
     /**
      * Helper method to remove entities and close the emf an any open em's.

Modified: openjpa/trunk/openjpa-integration/validation/src/test/resources/org/apache/openjpa/integration/validation/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-integration/validation/src/test/resources/org/apache/openjpa/integration/validation/persistence.xml?rev=792248&r1=792247&r2=792248&view=diff
==============================================================================
--- openjpa/trunk/openjpa-integration/validation/src/test/resources/org/apache/openjpa/integration/validation/persistence.xml (original)
+++ openjpa/trunk/openjpa-integration/validation/src/test/resources/org/apache/openjpa/integration/validation/persistence.xml Wed Jul  8 18:22:16 2009
@@ -70,6 +70,16 @@
         <validation-mode>CALLBACK</validation-mode>
     </persistence-unit>
 
+    <persistence-unit name="address-none-mode">
+        <class>org.apache.openjpa.integration.validation.Address</class>
+        <validation-mode>NONE</validation-mode>
+    </persistence-unit>
+
+    <persistence-unit name="person-none-mode">
+        <class>org.apache.openjpa.integration.validation.Person</class>
+        <validation-mode>NONE</validation-mode>
+    </persistence-unit>
+
     <persistence-unit name="default-validation-group">
         <class>org.apache.openjpa.integration.validation.DefGrpEntity</class>
         <validation-mode>CALLBACK</validation-mode>