View Javadoc
1   package org.melati.poem.test;
2   
3   import java.util.Properties;
4   
5   import org.melati.poem.Persistent;
6   import org.melati.poem.PersistentFactory;
7   import org.melati.poem.PoemDatabaseFactory;
8   import org.melati.poem.User;
9   import org.melati.poem.test.pojo.ClassWithByteArrayMember;
10  import org.melati.poem.test.pojo.ClassWithId;
11  import org.melati.poem.test.pojo.ClassWithNoIdAndPrivateMembers;
12  import org.melati.poem.test.pojo.ClassWithNoIdAndPublicMembers;
13  import org.melati.poem.test.pojo.ClassWithStringId;
14  /**
15   * @author timp
16   * @since 14 June 2007
17   *
18   */
19  public class PersistentFactoryTest extends PoemTestCase {
20  
21    public PersistentFactoryTest(String name) {
22      super(name);
23    }
24  
25    protected void setUp() throws Exception {
26      super.setUp();
27    }
28  
29    protected void tearDown() throws Exception {
30      getDb().disconnect();
31      PoemDatabaseFactory.removeDatabase(getDatabaseName());
32    }
33  
34    protected void databaseUnchanged() {
35      assertEquals("Setting changed", 0, getDb().getSettingTable().count());
36      assertEquals("Group changed", 1, getDb().getGroupTable().count());
37      assertEquals("GroupMembership changed", 1, getDb().getGroupMembershipTable().count());
38      assertEquals("Capability changed", 5, getDb().getCapabilityTable().count());
39      assertEquals("GroupCapability changed", 1, getDb().getGroupCapabilityTable().count());
40      assertEquals("TableCategory changed", 3, getDb().getTableCategoryTable().count());
41      assertEquals("User changed", 2, getDb().getUserTable().count());
42      //ColumnInfo newOne = null; 
43      //try{ 
44      //  newOne = (ColumnInfo)getDb().getColumnInfoTable().getObject(69);
45      //} catch (Exception e) {}
46      //if (newOne != null) { 
47      //  System.err.println(newOne.getName() + " " + newOne.getTableinfo().getName());
48      //}
49      //assertEquals("ColumnInfo changed", 69, getDb().getColumnInfoTable().count());
50      //assertEquals("TableInfo changed", 9, getDb().getTableInfoTable().count());
51      //checkTablesAndColumns(9,69);
52    }
53  
54    /**
55     * Test method for {@link org.melati.poem.PersistentFactory#fromInstance}.
56     */
57    public void testFromKnownInstance() {
58      assertEquals(getDb().getUserTable().administratorUser(), 
59              PersistentFactory.fromInstance(getDb(), getDb().getUserTable().administratorUser()));
60    }
61  
62    /**
63     * Test method for {@link org.melati.poem.PersistentFactory#fromInstance}.
64     */
65    public void testFromFloatingPersistent() {
66      User u = (User)getDb().getUserTable().newPersistent();
67      u.setLogin("test");
68      u.setName("Test");
69      u.setPassword("test");
70      User u2 = (User)PersistentFactory.fromInstance(getDb(), u);
71      assertNotNull(u2.getTroid());
72      u2.delete();
73    }
74  
75    /**
76     * Not idempotent.
77     */
78    public void testFromUnknownInstance() { 
79      if (!getDb().getDbms().canDropColumns()) {
80        return;
81      }
82      // Create one before we start so that it can be compared and rejected
83      ClassWithNoIdAndPublicMembers d1 = new ClassWithNoIdAndPublicMembers("Pepper");
84      d1.setThoughts("Squirrels");
85      
86      ClassWithNoIdAndPublicMembers d2 = new ClassWithNoIdAndPublicMembers("Fido");
87      d2.setThoughts("Food");
88      d2.setClassWithNoIdAndPrivateMembers(new ClassWithNoIdAndPrivateMembers("Tiddles"));
89      Persistent persistedDog2 = PersistentFactory.fromInstance(getDb(), d2);
90      assertEquals("Food", persistedDog2.getRaw("thoughts"));
91      assertEquals("Tiddles", ((Persistent)persistedDog2.getCooked("classWithNoIdAndPrivateMembers")).getRaw("name"));
92      
93      // Do it again to exercise selection
94      Persistent persistedDog3 = PersistentFactory.fromInstance(getDb(), d2);
95      assertEquals("Food", persistedDog3.getRaw("thoughts"));
96      assertEquals("Tiddles", ((Persistent)persistedDog3.getCooked("classWithNoIdAndPrivateMembers")).getRaw("name"));
97      assertTrue(persistedDog2.equals(persistedDog3));
98    }
99    
100   /**
101    * @throws Exception 
102    */
103   public void testFrom() throws Exception {
104     if (!getDb().getDbms().canDropColumns()) {
105       return;
106     }
107     ClassWithNoIdAndPublicMembers pojo = new ClassWithNoIdAndPublicMembers("Fido");
108     pojo.setThoughts("Food");
109     pojo.setClassWithNoIdAndPrivateMembers(new ClassWithNoIdAndPrivateMembers("Tiddles"));
110     Persistent persistedDog = PersistentFactory.fromInstance(getDb(), pojo);
111     ClassWithNoIdAndPublicMembers pojo2 = 
112       (ClassWithNoIdAndPublicMembers)PersistentFactory.from(
113               getDb().getTable("classWithNoIdAndPublicMembers").getObject(0), ClassWithNoIdAndPublicMembers.class);
114     assertEquals(persistedDog,getDb().getTable("classWithNoIdAndPublicMembers").getObject(0));
115     assertEquals(pojo.getThoughts(),pojo2.getThoughts());
116     assertEquals(pojo2.getClassWithNoIdAndPrivateMembers().getName(),pojo.getClassWithNoIdAndPrivateMembers().getName());
117     assertEquals(pojo2.getClassWithNoIdAndPrivateMembers().getClass(),pojo.getClassWithNoIdAndPrivateMembers().getClass());
118   }
119   
120   /**
121    * Test Exception throwing.
122    */
123   public void testFromBadInput() throws Exception {
124     try { 
125       PersistentFactory.fromInstance(getDb(), null);
126       fail("Should have bombed");
127     } catch (NullPointerException e) { 
128       e = null;
129     }
130     ClassWithNoIdAndPublicMembers d = new ClassWithNoIdAndPublicMembers("Fido");
131     try { 
132       PersistentFactory.fromInstance(null, d);
133       fail("Should have bombed");
134     } catch (NullPointerException e) { 
135       e = null;
136     }
137   }
138   
139   /**
140    * 
141    */
142   public void testPersistentFromPojoWithIdSet() throws Exception { 
143     if (!getDb().getDbms().canDropColumns()) {
144       return;
145     }
146     ClassWithStringId pojo = new ClassWithStringId();
147     pojo.setId("99"); 
148     Persistent persisted = PersistentFactory.fromInstance(getDb(), pojo);
149     assertEquals("99",persisted.getCooked("id"));
150     
151     ClassWithId withId = new ClassWithId();
152     withId.setId(new Integer(99));
153     persisted = PersistentFactory.fromInstance(getDb(), withId);
154     assertEquals(new Integer(0), persisted.getTroid());
155     assertEquals(new Integer(0), persisted.getCooked("poemId"));
156     assertEquals(new Integer(99), persisted.getCooked("id"));
157   }
158   /**
159    * Test persisting an oject with a byte array member.
160    */
161   public void testPersistentFromPojoWithBinaryField() { 
162     if (!getDb().getDbms().canDropColumns()) {
163       return;
164     }
165     ClassWithByteArrayMember pojo = new ClassWithByteArrayMember();
166     pojo.setBinaryField(new byte[] {34,35,36});
167     Persistent persisted = PersistentFactory.fromInstance(getDb(), pojo);
168     assertEquals(35,((byte[])persisted.getCooked("binaryField"))[1]);
169   }
170   
171   /**
172    * Try to resurrect to wrong class.
173    */
174   public void testPojoFromWrongPersistent() throws Exception { 
175     if (!getDb().getDbms().canDropColumns()) {
176       return;
177     }
178     ClassWithNoIdAndPublicMembers pojo = new ClassWithNoIdAndPublicMembers("Fido");
179     pojo.setThoughts("Food");
180     Persistent persisted = PersistentFactory.fromInstance(getDb(), pojo);
181     try { 
182       PersistentFactory.from(persisted, Properties.class);
183       fail("Should have bombed");
184     } catch (NoSuchMethodException e) { 
185       e = null;
186     }
187   }
188 }