/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.discovery;
import org.apache.commons.io.Charsets;
import org.apache.commons.io.IOUtils;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Item;
import org.dspace.content.service.BitstreamService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class FullTextContentStreamsTest {
private static final String HANDLE = "1234567/123";
private static final String CONTENT_TYPE = "text/plain";
@InjectMocks
private FullTextContentStreams streams;
@Mock
private BitstreamService bitstreamService;
@Mock
private Item item;
@Mock
private Bundle originalBundle;
@Mock
private Bundle textBundle;
@Mock
private Bitstream textBitstream1;
@Mock
private Bitstream textBitstream2;
@Mock
private Bitstream textBitstream3;
@Before
public void setUp() throws Exception {
when(item.getHandle()).thenReturn(HANDLE);
when(originalBundle.getName()).thenReturn("ORIGINAL");
when(textBundle.getName()).thenReturn("TEXT");
when(textBitstream1.getName()).thenReturn("Full Text 1");
when(textBitstream2.getName()).thenReturn("Full Text 2");
when(textBitstream3.getName()).thenReturn("Full Text 3");
when(textBitstream1.getSize()).thenReturn(1L);
when(textBitstream2.getSize()).thenReturn(2L);
when(textBitstream3.getSize()).thenReturn(3L);
when(bitstreamService.retrieve(null, textBitstream1)).thenReturn(new ByteArrayInputStream("This is text 1".getBytes(Charsets.UTF_8)));
when(bitstreamService.retrieve(null, textBitstream2)).thenReturn(new ByteArrayInputStream("This is text 2".getBytes(Charsets.UTF_8)));
when(bitstreamService.retrieve(null, textBitstream3)).thenReturn(new ByteArrayInputStream("This is text 3".getBytes(Charsets.UTF_8)));
streams.bitstreamService = bitstreamService;
}
@Test
public void testItemWithNoBundles() throws Exception {
when(item.getBundles()).thenReturn(null);
streams.init(item);
assertEquals("Source info should give you the handle", HANDLE, streams.getSourceInfo());
assertEquals("Content type should be plain text", CONTENT_TYPE, streams.getContentType());
assertEquals("The name should be empty", "", streams.getName());
assertEquals("The size of the streams should be zero", (Long) 0L, streams.getSize());
assertTrue("Content stream should be empty", streams.isEmpty());
InputStream inputStream = streams.getStream();
assertNotNull(inputStream);
assertEquals("Input stream should be empty", -1, inputStream.read());
}
@Test
public void testItemWithOnlyOriginalBundle() throws Exception {
when(item.getBundles()).thenReturn(Arrays.asList(originalBundle));
streams.init(item);
assertEquals("Source info should give you the handle", HANDLE, streams.getSourceInfo());
assertEquals("Content type should be plain text", CONTENT_TYPE, streams.getContentType());
assertEquals("The name should be empty", "", streams.getName());
assertEquals("The size of the streams should be zero", (Long) 0L, streams.getSize());
assertTrue("Content stream should be empty", streams.isEmpty());
InputStream inputStream = streams.getStream();
assertNotNull(inputStream);
assertEquals("Input stream should be empty", -1, inputStream.read());
}
@Test
public void testItemWithEmptyTextBundle() throws Exception {
when(item.getBundles()).thenReturn(Arrays.asList(originalBundle, textBundle));
when(textBundle.getBitstreams()).thenReturn(null);
streams.init(item);
assertEquals("Source info should give you the handle", HANDLE, streams.getSourceInfo());
assertEquals("Content type should be plain text", CONTENT_TYPE, streams.getContentType());
assertEquals("The name should be empty", "", streams.getName());
assertEquals("The size of the streams should be zero", (Long) 0L, streams.getSize());
assertTrue("Content stream should be empty", streams.isEmpty());
InputStream inputStream = streams.getStream();
assertNotNull(inputStream);
assertEquals("Input stream should be empty", -1, inputStream.read());
}
@Test
public void testItemWithOnlyOneTextBitstream() throws Exception {
when(item.getBundles()).thenReturn(Arrays.asList(originalBundle, textBundle));
when(textBundle.getBitstreams()).thenReturn(Arrays.asList(textBitstream1));
streams.init(item);
assertEquals("Source info should give you the handle", HANDLE, streams.getSourceInfo());
assertEquals("Content type should be plain text", CONTENT_TYPE, streams.getContentType());
assertEquals("The name should match the name of the bitstream", "Full Text 1", streams.getName());
assertEquals("The size of the streams should match the size of bitstream 1", (Long) 1L, streams.getSize());
assertFalse("Content stream should not be empty", streams.isEmpty());
InputStream inputStream = streams.getStream();
assertNotNull(inputStream);
assertEquals("The data in the input stream should match the text of the bitstream", "\nThis is text 1",
IOUtils.toString(inputStream, Charsets.UTF_8));
}
@Test
public void testItemWithMultipleTextBitstreams() throws Exception {
when(item.getBundles()).thenReturn(Arrays.asList(originalBundle, textBundle));
when(textBundle.getBitstreams()).thenReturn(Arrays.asList(textBitstream1, textBitstream2, textBitstream3));
streams.init(item);
assertEquals("Source info should give you the handle", HANDLE, streams.getSourceInfo());
assertEquals("Content type should be plain text", CONTENT_TYPE, streams.getContentType());
assertEquals("The name should match the concatenation of the names of the bitstreams",
"Full Text 1;Full Text 2;Full Text 3", streams.getName());
assertEquals("The size of the streams should be the sum of the bitstream sizes", (Long) 6L, streams.getSize());
assertFalse("Content stream should not be empty", streams.isEmpty());
InputStream inputStream = streams.getStream();
assertNotNull(inputStream);
assertEquals("The data in the input stream should match 'This is text 1'", "\nThis is text 1" +
"\nThis is text 2\nThis is text 3", IOUtils.toString(inputStream, Charsets.UTF_8));
}
@Test
public void testBitstreamThrowingExceptionShouldNotStopIndexing() throws Exception {
when(item.getBundles()).thenReturn(Arrays.asList(originalBundle, textBundle));
when(textBundle.getBitstreams()).thenReturn(Arrays.asList(textBitstream1, textBitstream2, textBitstream3));
when(bitstreamService.retrieve(null, textBitstream2)).thenThrow(new IOException("NOTFOUND"));
streams.init(item);
assertEquals("Source info should give you the handle", HANDLE, streams.getSourceInfo());
assertEquals("Content type should be plain text", CONTENT_TYPE, streams.getContentType());
assertEquals("The name should match the concatenation of the names of the bitstreams",
"Full Text 1;Full Text 2;Full Text 3", streams.getName());
assertEquals("The size of the streams should be the sum of the bitstream sizes", (Long) 6L, streams.getSize());
assertFalse("Content stream should not be empty", streams.isEmpty());
InputStream inputStream = streams.getStream();
assertNotNull(inputStream);
String content = IOUtils.toString(inputStream, Charsets.UTF_8);
assertTrue("The data should contain data of the first bitstream that is not corrupt",
content.contains("This is text 1"));
assertFalse("The data should NOT contain data of the second bitstream that is corrupt",
content.contains("This is text 2"));
assertTrue("The data should contain data of the third bistream that is not corrupt",
content.contains("This is text 3"));
assertTrue("The data should contain data on the exception that occurred",
content.contains("java.io.IOException"));
assertTrue("The data should contain data on the exception that occurred",
content.contains("NOTFOUND"));
}
}