Add more tests to check that relationships are persisted correctly.

Patch by: cromwellian, amitmanjhi
Review by: rjrjr (desk review)


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8607 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
index 651a46a..3ac6136 100644
--- a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
+++ b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
@@ -33,11 +33,182 @@
  */
 public class RequestFactoryTest extends GWTTestCase {
 
+  /*
+   * TODO: all these tests should check the final values. It will be easy when
+   * we have better persistence than the singleton pattern.
+   */
+  public void testPersistExistingEntityExistingRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+
+    req.simpleBarRequest().findSimpleBarById(999L).fire(
+        new Receiver<SimpleBarRecord>() {
+          public void onSuccess(final SimpleBarRecord barRecord,
+              Set<SyncResult> syncResults) {
+            req.simpleFooRequest().findSimpleFooById(999L).fire(
+                new Receiver<SimpleFooRecord>() {
+                  public void onSuccess(SimpleFooRecord fooRecord,
+                      Set<SyncResult> syncResults) {
+                    RequestObject<Void> updReq = req.simpleFooRequest().persist(
+                        fooRecord);
+                    fooRecord = updReq.edit(fooRecord);
+                    fooRecord.setBarField(barRecord);
+                    updReq.fire(new Receiver<Void>() {
+                      public void onSuccess(Void response,
+                          Set<SyncResult> syncResults) {
+                        finishTest();
+                      }
+                    });
+                  }
+                });
+          }
+        });
+  }
+
+  /*
+   * Find Entity Create Entity2 Relate Entity2 to Entity Persist Entity
+   */
+  public void testPersistExistingEntityNewRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+
+    SimpleBarRecord newBar = (SimpleBarRecord) req.create(SimpleBarRecord.class);
+
+    final RequestObject<Void> barReq = req.simpleBarRequest().persist(newBar);
+    newBar = barReq.edit(newBar);
+    newBar.setUserName("Amit");
+
+    final SimpleBarRecord finalNewBar = newBar;
+    req.simpleFooRequest().findSimpleFooById(999L).fire(
+        new Receiver<SimpleFooRecord>() {
+          public void onSuccess(SimpleFooRecord response,
+              Set<SyncResult> syncResults) {
+            RequestObject<Void> fooReq = req.simpleFooRequest().persist(
+                response);
+            response = fooReq.edit(response);
+            response.setBarField(finalNewBar);
+            fooReq.fire(new Receiver<Void>() {
+              public void onSuccess(Void response, Set<SyncResult> syncResults) {
+                req.simpleFooRequest().findSimpleFooById(999L).with(
+                    "barField.userName").fire(new Receiver<SimpleFooRecord>() {
+                  public void onSuccess(SimpleFooRecord finalFooRecord,
+                      Set<SyncResult> syncResults) {
+                    // barReq hasn't been persisted, so old value
+                    assertEquals("FOO",
+                        finalFooRecord.getBarField().getUserName());
+                    finishTest();
+                  }
+
+                });
+              }
+            });
+          }
+        });
+  }
+
+  /*
+   * Find Entity2 Create Entity, Persist Entity Relate Entity2 to Entity Persist
+   * Entity
+   */
+  public void testPersistNewEntityExistingRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+    SimpleFooRecord newFoo = (SimpleFooRecord) req.create(SimpleFooRecord.class);
+
+    final RequestObject<Void> fooReq = req.simpleFooRequest().persist(newFoo);
+
+    newFoo = fooReq.edit(newFoo);
+    newFoo.setUserName("Ray");
+
+    final SimpleFooRecord finalFoo = newFoo;
+    req.simpleBarRequest().findSimpleBarById(999L).fire(
+        new Receiver<SimpleBarRecord>() {
+          public void onSuccess(SimpleBarRecord response,
+              Set<SyncResult> syncResults) {
+            finalFoo.setBarField(response);
+            fooReq.fire(new Receiver<Void>() {
+              public void onSuccess(Void response, Set<SyncResult> syncResults) {
+                req.simpleFooRequest().findSimpleFooById(999L).fire(
+                    new Receiver<SimpleFooRecord>() {
+                      public void onSuccess(SimpleFooRecord finalFooRecord,
+                          Set<SyncResult> syncResults) {
+                        // newFoo hasn't been persisted, so userName is the old value.
+                        assertEquals("GWT", finalFooRecord.getUserName());
+                        finishTest();
+                      }
+
+                    });
+              }
+            });
+          }
+        });
+  }
+
+  /*
+   * Create Entity, Persist Entity Create Entity2, Perist Entity2 relate Entity2
+   * to Entity Persist
+   */
+  public void testPersistNewEntityNewRelation() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+    SimpleFooRecord newFoo = (SimpleFooRecord) req.create(SimpleFooRecord.class);
+    SimpleBarRecord newBar = (SimpleBarRecord) req.create(SimpleBarRecord.class);
+
+    final RequestObject<SimpleFooRecord> fooReq = req.simpleFooRequest().persistAndReturnSelf(
+        newFoo);
+
+    newFoo = fooReq.edit(newFoo);
+    newFoo.setUserName("Ray");
+
+    final RequestObject<SimpleBarRecord> barReq = req.simpleBarRequest().persistAndReturnSelf(
+        newBar);
+    newBar = barReq.edit(newBar);
+    newBar.setUserName("Amit");
+
+    fooReq.fire(new Receiver<SimpleFooRecord>() {
+      public void onSuccess(final SimpleFooRecord persistedFoo,
+          Set<SyncResult> syncResult) {
+        barReq.fire(new Receiver<SimpleBarRecord>() {
+          public void onSuccess(final SimpleBarRecord persistedBar,
+              Set<SyncResult> syncResults) {
+            assertEquals("Ray", persistedFoo.getUserName());
+            final RequestObject<Void> fooReq2 = req.simpleFooRequest().persist(
+                persistedFoo);
+            SimpleFooRecord editablePersistedFoo = fooReq2.edit(persistedFoo);
+            editablePersistedFoo.setBarField(persistedBar);
+            fooReq2.fire(new Receiver<Void>() {
+              public void onSuccess(Void response, Set<SyncResult> syncResults) {
+                req.simpleFooRequest().findSimpleFooById(999L).with(
+                    "barField.userName").fire(new Receiver<SimpleFooRecord>() {
+                  public void onSuccess(SimpleFooRecord finalFooRecord,
+                      Set<SyncResult> syncResults) {
+                    assertEquals("Amit",
+                        finalFooRecord.getBarField().getUserName());
+                    finishTest();
+                  }
+
+                });
+              }
+            });
+          }
+        });
+      }
+    });
+  }
+
   public void testPersistRelation() {
     final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
     HandlerManager hm = new HandlerManager(null);
     req.init(hm);
-    delayTestFinish(500000);
+    delayTestFinish(5000);
 
     SimpleFooRecord rayFoo = req.create(SimpleFooRecord.class);
     final RequestObject<SimpleFooRecord> persistRay = req.simpleFooRequest().persistAndReturnSelf(
diff --git a/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java b/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java
index 1b2bccd..4839ce8 100644
--- a/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java
+++ b/user/test/com/google/gwt/valuestore/shared/SimpleBarRequest.java
@@ -16,6 +16,7 @@
 package com.google.gwt.valuestore.shared;
 
 import com.google.gwt.requestfactory.shared.Instance;
+import com.google.gwt.requestfactory.shared.RecordListRequest;
 import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.requestfactory.shared.Service;
@@ -26,9 +27,15 @@
 @Service(com.google.gwt.valuestore.server.SimpleBar.class)
 public interface SimpleBarRequest {
 
+  RequestObject<Long> countSimpleBar();
+
+  RecordListRequest<SimpleBarRecord> findAll();
+
+  RecordRequest<SimpleBarRecord> findSimpleBarById(Long id);
+
   @Instance
   RequestObject<Void> persist(SimpleBarRecord record);
-  
+
   @Instance
   RecordRequest<SimpleBarRecord> persistAndReturnSelf(SimpleBarRecord record);
 }