package org.sakaiproject.citation.impl; import java.util.Collections; import java.util.List; import org.jmock.Expectations; import org.sakaiproject.citation.api.Citation; import org.sakaiproject.citation.api.CitationService; import org.sakaiproject.citation.api.Schema; import org.sakaiproject.citation.api.Schema.Field; import org.sakaiproject.citation.impl.openurl.BookConverter; import org.sakaiproject.citation.impl.openurl.ContextObjectEntity; public class BookConverterTest extends BaseCitationServiceSupport { private static final String DOI = "/doi/value"; private static final String BOOK_SERIES = "A seris of books"; private static final String ISBN = "1234567890"; private static final String PUBLISHER = "A publisher of books."; private static final String DATE = "2008-08-08"; private static final String AUTHOR = "An Author"; private static final String TITLE = "A Book Title"; public void testSimpleBookConverstion() throws Exception { CitationService citationService = createCitationService(); BookConverter converter = new BookConverter(); converter.setCitationService(citationService); Citation book = citationService.addCitation("book"); book.setCitationProperty(Schema.TITLE, TITLE); book.setCitationProperty(Schema.CREATOR, AUTHOR); book.setCitationProperty(Schema.YEAR, DATE); book.setCitationProperty(Schema.PUBLISHER, PUBLISHER); book.setCitationProperty(Schema.ISN, ISBN); book.setCitationProperty(Schema.SOURCE_TITLE, BOOK_SERIES); book.setCitationProperty("doi", DOI); ContextObjectEntity bookContextObject = converter.convert(book); assertEquals(TITLE, bookContextObject.getValue("btitle")); assertEquals(AUTHOR, bookContextObject.getValue("au")); assertEquals(DATE, bookContextObject.getValue("date")); assertEquals(PUBLISHER, bookContextObject.getValue("pub")); assertEquals(ISBN, bookContextObject.getValue("isbn")); assertEquals(BOOK_SERIES, bookContextObject.getValue("series")); assertTrue(bookContextObject.getIds().contains("info:doi"+ DOI)); } public void testSetMultipleProperties() throws Exception { CitationService citationService = createCitationService(); Citation book = citationService.addCitation("book"); // The Schema aren't loaded so we need to mock the schema. final Schema bookSchema = mock(Schema.class); final Field titleField = mock(Field.class); checking(new Expectations() { { // The single field in our fake schema. allowing(titleField).isMultivalued(); will(returnValue(false)); allowing(titleField).isRequired(); will(returnValue(true)); allowing(titleField).getDefaultValue(); will(returnValue(null)); // The Schema allowing(bookSchema).getFields(); will(returnValue(Collections.singletonList(titleField))); allowing(bookSchema).getRequiredFields(); will(returnValue(Collections.singletonList("title"))); allowing(bookSchema).getField("title"); will(returnValue(titleField)); allowing(bookSchema).getField(with(any(String.class))); will(returnValue(null)); } }); book.setSchema(bookSchema); // Check that a property off schema can grow to be multiple values. book.setCitationProperty("otherId", "first"); assertTrue(book.getCitationProperty("otherId", false) instanceof String); assertTrue(book.getCitationProperty("otherId", true) instanceof String); book.setCitationProperty("otherId", "second"); assertTrue(book.getCitationProperty("otherId", false) instanceof List); List ids = (List)book.getCitationProperty("otherId", false); assertTrue(ids.contains("first")); assertTrue(ids.contains("second")); assertFalse(ids.contains("missing")); assertTrue(book.getCitationProperty("otherId", true) instanceof String); String otherId = (String) book.getCitationProperty("otherId", true); assertEquals("first", otherId); assertNotSame("second", otherId); // Check that titles don't become multivalued. book.setCitationProperty("title", "My Book"); assertEquals("My Book", book.getCitationProperty("title", false)); assertEquals("My Book", book.getCitationProperty("title", true)); book.setCitationProperty("title", "Other Book"); assertEquals("Other Book", book.getCitationProperty("title", false)); assertEquals("Other Book", book.getCitationProperty("title", true)); } }