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 }