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
16
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
43
44
45
46
47
48
49
50
51
52 }
53
54
55
56
57 public void testFromKnownInstance() {
58 assertEquals(getDb().getUserTable().administratorUser(),
59 PersistentFactory.fromInstance(getDb(), getDb().getUserTable().administratorUser()));
60 }
61
62
63
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
77
78 public void testFromUnknownInstance() {
79 if (!getDb().getDbms().canDropColumns()) {
80 return;
81 }
82
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
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
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
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
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
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 }