1   package org.marketchangers.prayer.hibernate;
2   
3   import java.util.Collections;
4   import java.util.Hashtable;
5   import java.util.List;
6   
7   import junit.framework.TestCase;
8   import net.sf.hibernate.HibernateException;
9   import net.sf.hibernate.Session;
10  
11  import org.marketchangers.PortalUserManager;
12  import org.marketchangers.ServiceLocator;
13  import org.marketchangers.prayer.PrayerCategory;
14  import org.marketchangers.prayer.PrayerComment;
15  import org.marketchangers.prayer.PrayerRequest;
16  import org.marketchangers.prayer.PrayerRequestManager;
17  import org.marketchangers.prayer.PrayerRequestQuery;
18  import org.marketchangers.prayer.PrayerRequestSearcher;
19  import org.marketchangers.prayer.UserContract;
20  import org.nanocontainer.hibernate.SessionProvider;
21  
22  import com.mockobjects.dynamic.C;
23  import com.mockobjects.dynamic.Mock;
24  
25  /***
26   * @author <a href="mailto:mtodd@wc-group.com">Matthew Todd</a>
27   */
28  public class HibernatePrayerRequestManagerTest extends TestCase {
29  	private PrayerRequestManager manager;
30  
31  	private Mock provider;
32  	private Mock searcher;
33  	private Mock serviceLocator;
34  	private Mock session;
35  	private Mock userManager;
36  
37  	// --------------------------------------------- SetUp and TearDown Methods
38  	public void setUp() {
39  		provider = new Mock(SessionProvider.class);
40  		searcher = new Mock(PrayerRequestSearcher.class);
41  		serviceLocator = new Mock(ServiceLocator.class);
42  		session = new Mock(Session.class);
43  		userManager = new Mock(PortalUserManager.class);
44  
45  		this.manager =
46  			new HibernatePrayerRequestManager(
47  				(PrayerRequestSearcher)searcher.proxy(),
48  				(SessionProvider)provider.proxy());
49  	}
50  
51  	public void tearDown() {
52  		provider.verify();
53  		searcher.verify();
54  		serviceLocator.verify();
55  		session.verify();
56  		userManager.verify();
57  	}
58  
59  	// ----------------------------------------------------------- Test Methods
60  	public void testSubmitsPrayerRequests() {
61  		PrayerRequest request = new PrayerRequest();
62  
63  		provider.expectAndReturn("getSession", (Session)session.proxy());
64  		session.expect("save", request);
65  		provider.expect("commit");
66  
67  		searcher.expect("index", request);
68  
69  		assertTrue(manager.submitPrayerRequest(request));
70  	}
71  
72  	public void testHandlesExceptionsWellOnSubmitPrayerRequest() {
73  		PrayerRequest request = new PrayerRequest();
74  
75  		provider.expectAndReturn("getSession", (Session)session.proxy());
76  		session.expectAndThrow("save", request, new HibernateException("Doh"));
77  		provider.expect("reset");
78  
79  		assertFalse(manager.submitPrayerRequest(request));
80  
81  		System.out.println(
82  			"If you see a stack trace above, it's okay -- we're testing that.");
83  	}
84  
85  	public void testCreatesPrayerCategory() {
86  		PrayerCategory category = new PrayerCategory();
87  
88  		provider.expectAndReturn("getSession", (Session)session.proxy());
89  		session.expect("save", category);
90  		provider.expect("commit");
91  
92  		assertTrue(manager.createPrayerCategory(category));
93  	}
94  
95  	public void testGetsPrayerCategoriesByName() {
96  		PrayerCategory category = new PrayerCategory();
97  		category.setName("TEST CATEGORY");
98  
99  		provider.expectAndReturn("getSession", (Session)session.proxy());
100 
101 		session.expectAndReturn(
102 			"find",
103 			C.ANY_ARGS,
104 			Collections.singletonList(category));
105 
106 		provider.expect("close");
107 
108 		assertEquals(category, manager.getPrayerCategory(category.getName()));
109 	}
110 
111 	public void testGetsPrayerRequestById() {
112 		PrayerRequest request = new PrayerRequest();
113 		request.setRequestorUserId("bob");
114 		request.setId(new Integer(0));
115 
116 		provider.expectAndReturn("getSession", (Session)session.proxy());
117 		session.expectAndReturn("get", C.ANY_ARGS, request);
118 		provider.expect("close");
119 
120 		assertEquals(
121 			request,
122 			manager.getPrayerRequestById("bob", new Integer(0)));
123 	}
124 
125 	public void testGetCategoriesForRequestor() {
126 		String userid = "JETHRO";
127 		PrayerCategory category = new PrayerCategory();
128 		category.setRequestorUserId(userid);
129 		category.setName("Get me");
130 
131 		provider.expectAndReturn("getSession", (Session)session.proxy());
132 
133 		session.expectAndReturn(
134 			"find",
135 			C.ANY_ARGS,
136 			Collections.singletonList(category));
137 
138 		provider.expect("close");
139 
140 		assertEquals(
141 			Collections.singletonList(category),
142 			manager.getCategoriesForRequestor(userid));
143 	}
144 
145 	public void testGetRequestsForRequestor() {
146 		String userid = "JOE BOB";
147 		PrayerRequest request = new PrayerRequest();
148 		request.setRequestorUserId(userid);
149 
150 		provider.expectAndReturn("getSession", (Session)session.proxy());
151 
152 		session.expectAndReturn(
153 			"find",
154 			C.ANY_ARGS,
155 			Collections.singletonList(request));
156 
157 		provider.expect("close");
158 
159 		List requests = manager.getPrayerRequestList(userid, "requestor");
160 		assertEquals(request, requests.get(0));
161 	}
162 
163 	public void testGetCurrentIntercessors() {
164 		String userid = "JETHRO";
165 		UserContract contract = new UserContract();
166 		contract.setRequestorUserId(userid);
167 		contract.setRequesteeUserId("THELMA");
168 
169 		provider.expectAndReturn("getSession", (Session)session.proxy());
170 
171 		session.expectAndReturn(
172 			"find",
173 			C.ANY_ARGS,
174 			Collections.singletonList(contract));
175 
176 		provider.expect("close");
177 
178 		List contracts = manager.getCurrentIntercessors(userid);
179 		assertEquals(contract, contracts.get(0));
180 	}
181 
182 	public void testGetCurrentRequestors() {
183 		String userid = "JETHRO";
184 		UserContract contract = new UserContract();
185 		contract.setRequestorUserId("THELMA");
186 		contract.setRequesteeUserId(userid);
187 
188 		provider.expectAndReturn("getSession", (Session)session.proxy());
189 
190 		session.expectAndReturn(
191 			"find",
192 			C.ANY_ARGS,
193 			Collections.singletonList(contract));
194 
195 		provider.expect("close");
196 
197 		List contracts = manager.getCurrentRequestors(userid);
198 		assertEquals(contract, contracts.get(0));
199 	}
200 
201 	public void testAddContract() {
202 		UserContract contract = new UserContract();
203 		contract.setRequesteeUserId("JOE BOB");
204 		contract.setRequestorUserId("THELMA");
205 
206 		provider.expectAndReturn("getSession", (Session)session.proxy());
207 		session.expectAndReturn("find", C.ANY_ARGS, Collections.EMPTY_LIST);
208 		session.expect("save", contract);
209 		provider.expect("commit");
210 
211 		assertTrue(manager.addContract(contract));
212 	}
213 
214 	public void testAddNullContract() {
215 		UserContract contract = null;
216 		assertFalse(manager.addContract(contract));
217 	}
218 
219 	public void testAddBadContract() {
220 		UserContract contract = new UserContract();
221 		contract.setRequesteeUserId(null);
222 		contract.setRequestorUserId(null);		
223 		assertFalse(manager.addContract(contract));
224 	}
225 
226 	public void testAddContractFailsWhenAddingDuplicateContract() {
227 		UserContract contract = new UserContract();
228 		contract.setRequesteeUserId("JOE BOB");
229 		contract.setRequestorUserId("THELMA");
230 
231 		provider.expectAndReturn("getSession", (Session)session.proxy());
232 		session.expectAndReturn("find", C.ANY_ARGS, Collections.EMPTY_LIST);
233 		session.expect("save", contract);
234 		provider.expect("commit");
235 
236 		assertTrue(manager.addContract(contract));
237 
238 		provider.expectAndReturn("getSession", (Session)session.proxy());
239 		session.expectAndReturn(
240 			"find",
241 			C.ANY_ARGS,
242 			Collections.singletonList(contract));
243 		provider.expect("close");
244 
245 		assertFalse(manager.addContract(contract));
246 	}
247 
248 	public void testUpdateContractStatus() {
249 		UserContract contract = new UserContract();
250 		contract.setId(new Integer(0));
251 
252 		provider.expectAndReturn("getSession", (Session)session.proxy());
253 		session.expectAndReturn(
254 			"get",
255 			C.args(C.eq(UserContract.class), C.eq(contract.getId())),
256 			contract);
257 		session.expect("update", contract);
258 		provider.expect("commit");
259 
260 		assertTrue(manager.updateContractStatus(contract));
261 	}
262 
263 	public void testUpdateContractStatusIfContractDoesntExist() {
264 		UserContract contract = new UserContract();
265 		contract.setId(new Integer(0));
266 
267 		provider.expectAndReturn("getSession", (Session)session.proxy());
268 		session.expectAndReturn(
269 			"get",
270 			C.args(C.eq(UserContract.class), C.eq(contract.getId())),
271 			null);
272 
273 		assertFalse(manager.updateContractStatus(contract));
274 	}
275 
276 	public void testUpdateContractStatusIfContractIsNull() {
277 		assertFalse(manager.updateContractStatus(null));
278 	}
279 
280 	public void testRemoveContractIfIdSet() {
281 		UserContract contract = new UserContract();
282 		contract.setId(new Integer(0));
283 
284 		provider.expectAndReturn("getSession", (Session)session.proxy());
285 		session.expectAndReturn("delete", C.ANY_ARGS, 1);
286 		provider.expect("commit");
287 
288 		assertTrue(manager.removeContract(contract));
289 	}
290 
291 	public void testRemoveContractFailsIfIdNotSet() {
292 		UserContract contract = new UserContract();
293 
294 		provider.expectAndReturn("getSession", (Session)session.proxy());
295 		session.expectAndReturn("delete", C.ANY_ARGS, 0);
296 		provider.expect("close");
297 
298 		assertFalse(manager.removeContract(contract));
299 		System.out.println(
300 			"If you see a stack trace above, it's okay -- we're testing that.");
301 	}
302 
303 	public void testRemoveContractFailsContractDoesntExist() {
304 		UserContract contract = new UserContract();
305 
306 		provider.expectAndReturn("getSession", (Session)session.proxy());
307 		session.expectAndReturn("delete", C.ANY_ARGS, 0);
308 		provider.expect("close");
309 
310 		assertFalse(manager.removeContract(contract));
311 		System.out.println(
312 			"If you see a stack trace above, it's okay -- we're testing that.");
313 	}
314 
315 	public void testGetRequestorsForIntercessor() {
316 		UserContract contract = new UserContract();
317 		contract.setRequestorUserId("THELMA LOU REQUESTOR");
318 		contract.setRequesteeUserId("JOE BOB INTERCESSOR");
319 		List contracts = Collections.singletonList(contract);
320 
321 		provider.expectAndReturn("getSession", (Session)session.proxy());
322 		session.expectAndReturn("iterate", C.ANY_ARGS, contracts.iterator());
323 		provider.expect("close");
324 
325 		assertEquals(
326 			"THELMA LOU REQUESTOR",
327 			manager.getRequestorsForIntercessor("JOE BOB INTERCESSOR").get(0));
328 	}
329 
330 	public void testSearchWhenNoUsersAreSpecified() {
331 		PrayerRequestQuery query = new PrayerRequestQuery(new Hashtable());
332 
333 		// expect looks up UserContracts
334 		UserContract contract = new UserContract();
335 		contract.setRequestorUserId("THELMA LOU REQUESTOR");
336 		contract.setRequesteeUserId("JOE BOB INTERCESSOR");
337 		List contracts = Collections.singletonList(contract);
338 
339 		provider.expectAndReturn("getSession", (Session)session.proxy());
340 		session.expectAndReturn("iterate", C.ANY_ARGS, contracts.iterator());
341 		provider.expect("close");
342 
343 		// expect modifies query's requestorUserIds based on contracts
344 		PrayerRequestQuery modifiedQuery =
345 			new PrayerRequestQuery(new Hashtable());
346 		modifiedQuery.getRequestorUserIds().add("THELMA LOU REQUESTOR");
347 
348 		// expect calls searcher
349 		Integer prayerRequestId = new Integer(42);
350 		searcher.expectAndReturn(
351 			"search",
352 			modifiedQuery,
353 			Collections.singletonList(prayerRequestId));
354 
355 		// expect looks up PrayerRequests for returned ids
356 		PrayerRequest request = new PrayerRequest();
357 		request.setRequestorUserId("THELMA LOU REQUESTOR");
358 
359 		provider.expectAndReturn("getSession", (Session)session.proxy());
360 		session.expectAndReturn("get", C.ANY_ARGS, request);
361 		session.expectAndReturn(
362 			"find",
363 			C.ANY_ARGS,
364 			Collections.singletonList(new UserContract()));
365 		provider.expect("close");
366 
367 		// run the actual search
368 		List results = manager.search("JOE BOB INTERCESSOR", query);
369 		assertEquals(1, results.size());
370 		assertSame(request, results.get(0));
371 	}
372 
373 	public void testSearchWhenUsersAreSpecified() {
374 		PrayerRequestQuery query = new PrayerRequestQuery(new Hashtable());
375 		query.getRequestorUserIds().add("THELMA LOU REQUESTOR");
376 		query.getRequestorUserIds().add("REQUESTOR WE SHOULD NOT SEE");
377 
378 		// expect looks up UserContracts
379 		UserContract contract = new UserContract();
380 		contract.setRequestorUserId("THELMA LOU REQUESTOR");
381 		contract.setRequesteeUserId("JOE BOB INTERCESSOR");
382 		List contracts = Collections.singletonList(contract);
383 
384 		provider.expectAndReturn("getSession", (Session)session.proxy());
385 		session.expectAndReturn("iterate", C.ANY_ARGS, contracts.iterator());
386 		provider.expect("close");
387 
388 		// expect modifies query's requestorUserIds based on contracts
389 		PrayerRequestQuery modifiedQuery =
390 			new PrayerRequestQuery(new Hashtable());
391 		modifiedQuery.getRequestorUserIds().add("THELMA LOU REQUESTOR");
392 
393 		// expect calls searcher
394 		Integer prayerRequestId = new Integer(42);
395 		searcher.expectAndReturn(
396 			"search",
397 			modifiedQuery,
398 			Collections.singletonList(prayerRequestId));
399 
400 		// expect looks up PrayerRequests for returned ids
401 		PrayerRequest request = new PrayerRequest();
402 		request.setRequestorUserId("THELMA LOU REQUESTOR");
403 		provider.expectAndReturn("getSession", (Session)session.proxy());
404 		session.expectAndReturn("get", C.ANY_ARGS, request);
405 		session.expectAndReturn(
406 			"find",
407 			C.ANY_ARGS,
408 			Collections.singletonList(new UserContract()));
409 		provider.expect("close");
410 
411 		// run the actual search
412 		List results = manager.search("JOE BOB INTERCESSOR", query);
413 		assertEquals(1, results.size());
414 		assertSame(request, results.get(0));
415 	}
416 
417 	public void testAddComment() {
418 		PrayerComment comment = new PrayerComment();
419 
420 		provider.expectAndReturn("getSession", (Session)session.proxy());
421 		session.expect("save", comment);
422 		provider.expect("commit");
423 
424 		assertTrue(manager.addComment(comment));
425 	}
426 
427 	public void testAddCommentHandlesException() {
428 		PrayerComment comment = new PrayerComment();
429 
430 		provider.expectAndReturn("getSession", (Session)session.proxy());
431 		session.expectAndThrow(
432 			"save",
433 			comment,
434 			new HibernateException("Bad comment"));
435 		provider.expect("reset");
436 
437 		assertFalse(manager.addComment(comment));
438 	}
439 
440 	public void testGetCommentsByPrayerId() {
441 		PrayerRequest request = new PrayerRequest();
442 		request.setId(new Integer(0));
443 		PrayerComment comment = new PrayerComment();
444 		comment.setParentRequest(request);
445 		List comments = Collections.singletonList(comment);
446 
447 		provider.expectAndReturn("getSession", (Session)session.proxy());
448 		session.expectAndReturn("find", C.ANY_ARGS, comments);
449 		provider.expect("close");
450 
451 		assertEquals(comments, manager.getCommentsByPrayerId(new Integer(0)));
452 	}
453 
454 	public void testUpdateStatus() {
455 		PrayerRequest request = new PrayerRequest();
456 		request.setId(new Integer(0));
457 		request.setStatus(PrayerRequest.CLOSED);
458 
459 		provider.expectAndReturn("getSession", (Session)session.proxy());
460 		session.expectAndReturn(
461 			"get",
462 			C.args(C.eq(PrayerRequest.class), C.eq(request.getId())),
463 			request);
464 		session.expect("update", request);
465 		provider.expect("commit");
466 		searcher.expect("updateStatus", request);
467 		assertTrue(manager.updateStatus(request));
468 	}
469 }