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 }