1 package com.atlassian.bonnie.search;
2
3 import com.atlassian.bonnie.Searchable;
4 import com.atlassian.bonnie.search.extractor.DefaultTextContentExtractor;
5 import com.mockobjects.dynamic.C;
6 import com.mockobjects.dynamic.Mock;
7 import junit.framework.TestCase;
8 import org.apache.lucene.document.Document;
9
10 import java.util.ArrayList;
11 import java.util.List;
12
13 public class TestBaseDocumentBuilder extends TestCase
14 {
15 private List<Extractor> extractors;
16 private DocumentBuilder builder;
17
18 protected void setUp() throws Exception
19 {
20 super.setUp();
21 extractors = new ArrayList<Extractor>();
22 }
23
24 public void testBaseDocument()
25 {
26 builder = new DocumentBuilderForTests(extractors);
27
28 MockSearchableObject searchable = new MockSearchableObject();
29 searchable.setId(12);
30 Document document = builder.getDocument(searchable);
31 assertEquals("com.atlassian.bonnie.search.MockSearchableObject-12", document.getField(BaseDocumentBuilder.FieldName.HANDLE).stringValue());
32 assertEquals("com.atlassian.bonnie.search.MockSearchableObject", document.getField(BaseDocumentBuilder.FieldName.CLASS_NAME).stringValue());
33 assertNull(document.getField(BaseDocumentBuilder.FieldName.CONTENT_BODY));
34 }
35
36 public void testContentExtraction()
37 {
38 MockSearchableObject searchable = new MockSearchableObject();
39 searchable.setId(12);
40 extractors.add(new Extractor()
41 {
42 public void addFields(Document document, StringBuffer defaultSearchableText, Searchable searchable)
43 {
44 defaultSearchableText.append("I like cheese");
45 }
46 });
47 builder = new DocumentBuilderForTests(extractors);
48
49 Document document = builder.getDocument(searchable);
50 assertEquals("I like cheese", document.getField(BaseDocumentBuilder.FieldName.CONTENT_BODY).stringValue());
51 }
52
53 public void testWithExtractors()
54 {
55 MockSearchableObject searchable = new MockSearchableObject();
56 searchable.setId(12);
57
58 Mock mockExtractorOne = new Mock(Extractor.class);
59 Mock mockExtractorTwo = new Mock(Extractor.class);
60
61 mockExtractorOne.expect("addFields", C.args(C.isA(Document.class), C.isA(StringBuffer.class), C.same(searchable)));
62 mockExtractorTwo.expect("addFields", C.args(C.isA(Document.class), C.isA(StringBuffer.class), C.same(searchable)));
63
64 extractors.add((Extractor) mockExtractorOne.proxy());
65 extractors.add((Extractor) mockExtractorTwo.proxy());
66
67 builder = new DocumentBuilderForTests(extractors);
68
69 builder.getDocument(searchable);
70
71 mockExtractorOne.verify();
72 mockExtractorTwo.verify();
73 }
74
75 public void testDefaultProperty()
76 {
77 BaseDocumentBuilder.ContentBodyMaxSizeSystemProperty property = new BaseDocumentBuilder.ContentBodyMaxSizeSystemProperty();
78 assertEquals(BaseDocumentBuilder.ContentBodyMaxSizeSystemProperty.DEFAULT, property.getValue());
79 }
80
81 public void testInvalidSystemProperty()
82 {
83 System.setProperty("atlassian.indexing.contentbody.maxsize", "1asdf");
84 BaseDocumentBuilder.ContentBodyMaxSizeSystemProperty property = new BaseDocumentBuilder.ContentBodyMaxSizeSystemProperty();
85 assertEquals(BaseDocumentBuilder.ContentBodyMaxSizeSystemProperty.DEFAULT, property.getValue());
86 }
87
88 public void testContentIsNotStoredWhenSizeAboveLimit()
89 {
90 Searchable searchable = createTextAttachment("test-big-attachment.txt");
91
92 extractors.add(new DefaultTextContentExtractor());
93 builder = new DocumentBuilderForTests(extractors);
94
95 Document document = builder.getDocument(searchable);
96 assertFalse(document.getField(BaseDocumentBuilder.FieldName.CONTENT_BODY).isStored());
97 }
98
99 public void testContentIsStoredWhenSizeBelowLimit()
100 {
101 Searchable searchable = createTextAttachment("test-attachment-search.txt");
102
103 extractors.add(new DefaultTextContentExtractor());
104 builder = new DocumentBuilderForTests(extractors);
105
106 Document document = builder.getDocument(searchable);
107 assertTrue(document.getField(BaseDocumentBuilder.FieldName.CONTENT_BODY).isStored());
108 }
109
110 private MockSearchableAttachment createTextAttachment(String fileName)
111 {
112 MockSearchableAttachment searchable = new MockSearchableAttachment();
113 searchable.setId(12);
114 searchable.setContentType("text/plain");
115 searchable.setFileName(fileName);
116
117 return searchable;
118 }
119 }