1   package org.marketchangers.prayer;
2   
3   import java.text.ParseException;
4   import java.text.SimpleDateFormat;
5   import java.util.Collections;
6   import java.util.Date;
7   import java.util.Hashtable;
8   import java.util.Map;
9   
10  import junit.framework.TestCase;
11  
12  /***
13   * @author <a href="mailto:mtodd@wc-group.com">Matthew Todd</a>
14   * @author <a href="mailto:jniu@wc-group.com">Jianshuo Niu</a>
15   */
16  public class PrayerRequestQueryTest extends TestCase {
17  	public void testHasAMapBasedConstructor() {
18  		new PrayerRequestQuery(new Hashtable());
19  	}
20  
21  	public void testProvidesBeanViewOfParametersInTheMap() throws Exception {
22  		Map parameters = new Hashtable();
23  		parameters.put("categoryName", array("pigs feet"));
24  		parameters.put("endDate", array("08-04-2004"));
25  		parameters.put("organizationName", array("wcg"));
26  		parameters.put("requestorUserId", array("jniu@wc-group.com"));
27  		parameters.put("searchTerms", array("pickled"));
28  		parameters.put("startDate", array("04-03-1978"));
29  		parameters.put("status", array(PrayerRequest.OPEN));
30  
31  		PrayerRequestQuery query = new PrayerRequestQuery(parameters);
32  
33  		assertEquals("pigs feet", query.getCategoryName());
34  		assertEquals(date("08-04-2004"), query.getEndDate());
35  		assertEquals("wcg", query.getOrganizationName());
36  		assertEquals(1, query.getRequestorUserIds().size());
37  		assertEquals("pickled", query.getSearchTerms());
38  		assertEquals(date("04-03-1978"), query.getStartDate());
39  		assertEquals(PrayerRequest.OPEN, query.getStatus());
40  
41  		assertTrue(query.getRequestorUserIds().contains("jniu@wc-group.com"));
42  
43  		assertTrue(query.hasCategoryName());
44  		assertTrue(query.hasEndDate());
45  		assertTrue(query.hasOrganizationName());
46  		assertTrue(query.hasRequestorUserIds());
47  		assertTrue(query.hasSearchTerms());
48  		assertTrue(query.hasStartDate());
49  		assertTrue(query.hasStatus());
50  		assertTrue(query.hasValidDate());
51  	}
52  
53  	public void testDoesNotHaveInvalidDates() {
54  		Map parameters = new Hashtable();
55  		parameters.put("startDate", array("wibble"));
56  		parameters.put("endDate", array("wobble"));
57  
58  		PrayerRequestQuery query = new PrayerRequestQuery(parameters);
59  
60  		assertFalse(query.hasStartDate());
61  		assertNull(query.getStartDate());
62  		assertFalse(query.hasValidDate());
63  
64  		assertFalse(query.hasEndDate());
65  		assertNull(query.getEndDate());
66  	}
67  
68  	public void testDoesNotHaveMissingValues() {
69  		PrayerRequestQuery query = new PrayerRequestQuery(new Hashtable());
70  
71  		assertFalse(query.hasCategoryName());
72  		assertFalse(query.hasEndDate());
73  		assertFalse(query.hasOrganizationName());
74  		assertFalse(query.hasRequestorUserIds());
75  		assertFalse(query.hasSearchTerms());
76  		assertFalse(query.hasStartDate());
77  		assertFalse(query.hasStatus());
78  
79  		assertNull(query.getCategoryName());
80  		assertNull(query.getEndDate());
81  		assertNull(query.getOrganizationName());
82  		assertNull(query.getSearchTerms());
83  		assertNull(query.getStartDate());
84  		assertNull(query.getStatus());
85  
86  		assertTrue(query.getRequestorUserIds().isEmpty());
87  	}
88  
89  	public void testDoesNotHaveEmptyValues() {
90  		Map parameters = new Hashtable();
91  		parameters.put("categoryName", array(""));
92  		parameters.put("endDate", array(""));
93  		parameters.put("organizationName", array(""));
94  		parameters.put("requestorUserId", array(""));
95  		parameters.put("searchTerms", array(""));
96  		parameters.put("startDate", array(""));
97  		parameters.put("status", array(""));
98  
99  		PrayerRequestQuery query = new PrayerRequestQuery(parameters);
100 
101 		assertFalse(query.hasCategoryName());
102 		assertFalse(query.hasEndDate());
103 		assertFalse(query.hasOrganizationName());
104 		assertFalse(query.hasRequestorUserIds());
105 		assertFalse(query.hasSearchTerms());
106 		assertFalse(query.hasStartDate());
107 		assertFalse(query.hasStatus());
108 
109 		assertNull(query.getCategoryName());
110 		assertNull(query.getEndDate());
111 		assertNull(query.getOrganizationName());
112 		assertNull(query.getSearchTerms());
113 		assertNull(query.getStartDate());
114 		assertNull(query.getStatus());
115 
116 		assertTrue(query.getRequestorUserIds().isEmpty());
117 	}
118 
119 	public void testCanAddAdditionalRequestorUserIds() {
120 		PrayerRequestQuery query = new PrayerRequestQuery(new Hashtable());
121 
122 		assertFalse(query.hasRequestorUserIds());
123 
124 		query.getRequestorUserIds().addAll(
125 			Collections.singletonList("JOE BOB"));
126 
127 		assertTrue(query.hasRequestorUserIds());
128 
129 		assertEquals(1, query.getRequestorUserIds().size());
130 		assertTrue(query.getRequestorUserIds().contains("JOE BOB"));
131 	}
132 
133 	public void testCanRetainCertainRequestorUserIds() {
134 		PrayerRequestQuery query = new PrayerRequestQuery(new Hashtable());
135 
136 		query.getRequestorUserIds().add("JOE BOB");
137 		query.getRequestorUserIds().add("THELMA LOU");
138 		query.getRequestorUserIds().add("MATTHEW");
139 		query.getRequestorUserIds().add("JIANSHUO");
140 
141 		assertEquals(4, query.getRequestorUserIds().size());
142 
143 		query.getRequestorUserIds().retainAll(
144 			Collections.singleton("JIANSHUO"));
145 
146 		assertEquals(1, query.getRequestorUserIds().size());
147 	}
148     
149     public void testImplementsEqualsAndHashCode() {
150         PrayerRequestQuery one = new PrayerRequestQuery(new Hashtable());
151         PrayerRequestQuery another = new PrayerRequestQuery(new Hashtable());
152         
153         assertEquals(one, another);
154         assertEquals(one.hashCode(), another.hashCode());
155     }
156 
157 	// -------------------------------------------------------- Private Methods
158 	private String[] array(String value) {
159 		return new String[] { value };
160 	}
161 
162 	private Date date(String value) throws ParseException {
163 		return new SimpleDateFormat("MM-dd-yyyy").parse(value);
164 	}
165 }