1   package com.atlassian.bonnie.search.extractor;
2   
3   import com.atlassian.bonnie.Searchable;
4   import com.atlassian.bonnie.search.Extractor;
5   import com.atlassian.bonnie.search.MockSearchableAttachment;
6   import com.atlassian.bonnie.search.SearchableAttachment;
7   import junit.framework.TestCase;
8   import org.apache.lucene.document.Document;
9   import org.apache.lucene.document.Field;
10  
11  import java.util.Collection;
12  
13  public abstract class BaseAttachmentContentExtractorTest extends TestCase
14  {
15      protected Extractor extractor;
16  
17      public abstract Extractor getExtractor();
18  
19      protected void setUp() throws Exception
20      {
21          super.setUp();
22  
23  		extractor = getExtractor();
24      }
25  
26  	protected void tearDown() throws Exception
27  	{
28  		extractor = null;
29  
30  		super.tearDown();
31  	}
32  
33  	protected void assertOnExtractedTextOf(SearchableAttachment attachment, String[] expectedWords, String[] nonExpectedWords)
34  	{
35  		StringBuffer searchableContent = new StringBuffer();
36  		extractor.addFields(new Document(), searchableContent, attachment);
37  
38  		for (int i = 0; i < expectedWords.length; i++)
39  		{
40  			String expected = expectedWords[i];
41  			assertTrue("Expected to find: " + expected, searchableContent.indexOf(expected) >= 0);
42  		}
43  
44  		for (int i = 0; i < nonExpectedWords.length; i++)
45  		{
46  			String nonExpected = nonExpectedWords[i];
47  			assertTrue("Not expecting to find: " + nonExpected, searchableContent.indexOf(nonExpected) < 0);
48  		}
49  	}
50  
51      public void testNonAttachment()
52      {
53          Searchable searchable = new Searchable()
54          {
55              public long getId()
56              {
57                  return -1;
58              }
59  
60              public Collection getSearchableDependants()
61              {
62                  return null;
63              }
64  
65              public boolean isIndexable()
66              {
67                  return false;
68              }
69          };
70  
71          Document document = new Document();
72          extractor.addFields(document, new StringBuffer(), searchable);
73          assertNull(document.getField("contentBody"));
74      }
75  
76      public void testSkipAttachmentContentExtractionIfContentBodyExists()
77      {
78          SearchableAttachment attachment = createSearchableAttachment("test-attachment-search.txt", "text/plain");
79  
80  		Document document = new Document();
81  		final String contentBody = "I am a fish";
82  		document.add(new Field("contentBody", contentBody, Field.Store.YES, Field.Index.TOKENIZED));
83  
84  		final StringBuffer extractedText = new StringBuffer();
85  		extractor.addFields(document, extractedText, attachment);
86  
87  		assertEquals(1, document.getFields("contentBody").length);
88          assertEquals(contentBody, document.getField("contentBody").stringValue());
89  		assertEquals(0, extractedText.length());
90  	}
91  
92      protected MockSearchableAttachment createSearchableAttachment(String fileName, String contentType)
93      {
94          MockSearchableAttachment attachment = new MockSearchableAttachment();
95          attachment.setContentType(contentType);
96          attachment.setFileName(fileName);
97          return attachment;
98      }
99  }