1   package org.marketchangers.prayer.lucene;
2   
3   import java.io.IOException;
4   import java.text.ParseException;
5   import java.text.SimpleDateFormat;
6   import java.util.Date;
7   import java.util.Hashtable;
8   import java.util.List;
9   import java.util.Map;
10  
11  import junit.framework.TestCase;
12  import junit.textui.TestRunner;
13  
14  import org.apache.lucene.analysis.Analyzer;
15  import org.apache.lucene.analysis.standard.StandardAnalyzer;
16  import org.apache.lucene.index.IndexWriter;
17  import org.apache.lucene.store.Directory;
18  import org.apache.lucene.store.RAMDirectory;
19  import org.marketchangers.prayer.PrayerRequest;
20  import org.marketchangers.prayer.PrayerRequestQuery;
21  import org.marketchangers.prayer.PrayerRequestSearcher;
22  
23  /***
24   * @author <a href="mailto:mtodd@wc-group.com">Matthew Todd</a>
25   */
26  public class LucenePrayerRequestSearcherIntegrationTest extends TestCase {
27  	private PrayerRequestSearcher searcher;
28  	private int currentId;
29  
30  	protected void setUp() throws IOException {
31  		currentId = 0;
32  
33  		Directory directory = new RAMDirectory();
34  		Analyzer analyzer = new StandardAnalyzer();
35  		IndexProvider provider = new DefaultIndexProvider(directory, analyzer);
36  		initializeDirectory(directory, analyzer);
37  
38  		searcher = new LucenePrayerRequestSearcher(provider);
39  	}
40  
41  	// ----------------------------------------------------------- Test Methods
42  	public void testCanSearchOverIndexedRequests() throws ParseException {
43  		searcher.index(request("JOE", "Help.", "08-10-2004", "08-12-2004"));
44  		searcher.index(request("JOE", "Hello?", "08-10-2004", "08-12-2004"));
45  
46  		List results =
47  			searcher.search(query("JOE", "Help.", "08-10-2004", "08-12-2004"));
48  		assertEquals(1, results.size());
49  		assertEquals(0, ((Integer) results.get(0)).intValue());
50  	}
51  
52  	public void testDoesntAssociateDocIdWithHitId() throws ParseException {
53  		searcher.index(request("JOE", "Help.", "08-10-2004", "08-12-2004"));
54  		searcher.index(request("JOE", "Hello?", "08-10-2004", "08-12-2004"));
55  
56  		List results =
57  			searcher.search(query("JOE", "Hello?", "08-10-2004", "08-12-2004"));
58  		assertEquals(1, results.size());
59  		assertEquals(1, ((Integer) results.get(0)).intValue());
60  	}
61  
62  	public void testDateRangesAreHardValues() throws ParseException {
63  		searcher.index(request("JOE", "", "08-19-2004", "08-20-2004"));
64  
65  		size(0, searcher.search(query("JOE", "", "08-17-2004", "08-18-2004")));
66  		size(0, searcher.search(query("JOE", "", "08-18-2004", "08-19-2004")));
67  		size(1, searcher.search(query("JOE", "", "08-19-2004", "08-20-2004")));
68  		size(0, searcher.search(query("JOE", "", "08-20-2004", "08-21-2004")));
69  		size(0, searcher.search(query("JOE", "", "08-21-2004", "08-22-2004")));
70  	}
71  
72  	// -------------------------------------------------------- Private Methods
73  	private Date date(String date) throws ParseException {
74  		return new SimpleDateFormat("MM-dd-yyyy").parse(date);
75  	}
76  
77  	private void initializeDirectory(Directory directory, Analyzer analyzer)
78  		throws IOException {
79  		new IndexWriter(directory, analyzer, true).close();
80  	}
81  
82  	private PrayerRequest request(
83  		String requestorUserId,
84  		String content,
85  		String startDate,
86  		String endDate)
87  		throws ParseException {
88  
89  		PrayerRequest request = new PrayerRequest();
90  		request.setBackground("");
91  		request.setContent(content);
92  		request.setEndDate(date(endDate));
93  		request.setId(new Integer(currentId++));
94  		request.setRequestorUserId(requestorUserId);
95  		request.setStartDate(date(startDate));
96  		request.setStatus(PrayerRequest.OPEN);
97  		request.setSubject("");
98  		return request;
99  	}
100 
101 	private PrayerRequestQuery query(
102 		String requestorUserId,
103 		String searchTerms,
104 		String startDate,
105 		String endDate) {
106 
107 		Map parameters = new Hashtable();
108 		parameters.put("requestorUserId", new String[] { requestorUserId });
109 		parameters.put("searchTerms", new String[] { searchTerms });
110 		parameters.put("startDate", new String[] { startDate });
111 		parameters.put("endDate", new String[] { endDate });
112 
113 		return new PrayerRequestQuery(parameters);
114 	}
115 
116 	private void size(int size, List list) {
117 		assertEquals(size, list.size());
118 	}
119 
120 	// For historical reasons: This test was passing in Eclipse, but not from
121 	// Maven! Running as below in Eclipse did fail, though, providing a helpful
122 	// stacktrace. The bug was leaving the first IndexWriter open, so later 
123 	// ones could not obtain the lock they needed. Really weird that the test
124 	// still passed in Eclipse.
125 	public static void main(String[] args) {
126 		TestRunner.run(LucenePrayerRequestSearcherIntegrationTest.class);
127 	}
128 }