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