/******************************************************************************* * * Copyright (c) 2010-2011 Sonatype, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * * * *******************************************************************************/ package org.hudsonci.maven.plugin.documents.internal; import org.hudsonci.maven.plugin.documents.DocumentNotFoundException; import org.hudsonci.maven.plugin.documents.DocumentStore; import org.hudsonci.maven.plugin.documents.DuplicateDocumentException; import org.hudsonci.maven.plugin.documents.internal.DocumentManagerImpl; import org.hudsonci.service.SecurityService; import org.hudsonci.utils.common.Iso8601Date; import org.hudsonci.maven.model.config.DocumentDTO; import org.hudsonci.maven.model.config.DocumentTypeDTO; import hudson.model.User; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.text.ParseException; import java.util.Collection; import static org.hudsonci.maven.model.config.DocumentStandardAttributeDTO.CREATED; import static org.hudsonci.maven.model.config.DocumentStandardAttributeDTO.CREATED_BY; import static org.hudsonci.maven.model.config.DocumentStandardAttributeDTO.UPDATED; import static org.hudsonci.maven.model.config.DocumentStandardAttributeDTO.UPDATED_BY; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Mockito.when; /** * Tests for {@link DocumentManagerImpl}. */ @RunWith(MockitoJUnitRunner.class) public class DocumentManagerImplTest { private static final String DUMMY_USER_ID = "dummy"; private static final String INVALID_ID = "invalid-id"; @Mock private SecurityService security; @Mock private User user; @Mock private DocumentStore store; private DocumentManagerImpl manager; @Before public void init() { manager = new DocumentManagerImpl(store, security); when(user.getId()).thenReturn(DUMMY_USER_ID); when(security.getCurrentUser()).thenReturn(user); } @Test public void testInitialState() { Collection<DocumentDTO> documents = manager.getDocuments(false); assertNotNull(documents); assertEquals(0, documents.size()); } @Test(expected = NullPointerException.class) public void testGetDocumentsWithNullType() { manager.getDocuments(null, false); } @Test(expected = NullPointerException.class) public void testGetDocumentWithNullId() { manager.getDocument(null, false); } @Test(expected = NullPointerException.class) public void testAddWithNullDocument() { manager.addDocument(null); } @Test(expected = NullPointerException.class) public void testUpdateWithNullDocument() { manager.addDocument(null); } @Test(expected = NullPointerException.class) public void testRemoveWithNullId() { manager.removeDocument(null); } private DocumentDTO createDocument() { return new DocumentDTO() .withId(manager.randomId()) .withType(DocumentTypeDTO.CUSTOM) .withName("Doc") .withDescription("Desc") .withContent("Content"); } @Test public void testValidateValid() { DocumentDTO doc1 = createDocument(); manager.validate(doc1); } @Test(expected = NullPointerException.class) public void testValidateMissingId() { DocumentDTO doc1 = createDocument().withId(null); manager.validate(doc1); } @Test(expected = IllegalArgumentException.class) public void testValidateInvalidId() { DocumentDTO doc1 = createDocument().withId(INVALID_ID); manager.validate(doc1); } @Test(expected = NullPointerException.class) public void testValidateMissingType() { DocumentDTO doc1 = createDocument().withType(null); manager.validate(doc1); } @Test public void testSummaryOf() { DocumentDTO doc1 = createDocument(); DocumentDTO doc2 = manager.summaryOf(doc1); assertEquals(doc1.getId(), doc2.getId()); assertEquals(doc1.getType(), doc2.getType()); assertEquals(doc1.getName(), doc2.getName()); assertEquals(doc1.getDescription(), doc2.getDescription()); assertNull(doc2.getContent()); } @Test public void testCopyOf() { DocumentDTO doc1 = createDocument(); DocumentDTO doc2 = manager.copyOf(doc1); assertThat(doc1.getId(), equalTo(doc2.getId())); assertThat(doc1.getType(), equalTo(doc2.getType())); assertThat(doc1.getName(), equalTo(doc2.getName())); assertThat(doc1.getDescription(), equalTo(doc2.getDescription())); assertThat(doc1.getContent(), equalTo(doc2.getContent())); // Make sure equality works assertThat(doc1, equalTo(doc2)); // Make sure different objects assertNotSame(doc1, doc2); } private void assertIsIso8601Date(final String value) { try { Iso8601Date.parse(value); } catch (ParseException e) { fail("Expected ISO 8601 formatted date"); } } private void assertHasCreatedAttributes(final DocumentDTO document) { Object created = document.getAttribute(CREATED); assertNotNull(created); assertEquals(created.getClass(), String.class); assertIsIso8601Date((String) created); Object createdBy = document.getAttribute(CREATED_BY); assertNotNull(createdBy); assertEquals(createdBy.getClass(), String.class); assertEquals(DUMMY_USER_ID, createdBy); } private void assertHasUpdateAttributes(final DocumentDTO document) { Object created = document.getAttribute(UPDATED); assertNotNull(created); assertEquals(created.getClass(), String.class); assertIsIso8601Date((String) created); Object createdBy = document.getAttribute(UPDATED_BY); assertNotNull(createdBy); assertEquals(createdBy.getClass(), String.class); assertEquals(DUMMY_USER_ID, createdBy); } @Test public void testAddDocument() { DocumentDTO doc1 = createDocument(); DocumentDTO doc2 = manager.addDocument(doc1); assertNotNull(doc2); assertHasCreatedAttributes(doc2); } @Test public void testAddDocumentGenerateId() { DocumentDTO doc1 = createDocument().withId(null); DocumentDTO doc2 = manager.addDocument(doc1); assertNotNull(doc1.getId()); assertNotNull(doc2.getId()); assertEquals(doc1.getId(), doc2.getId()); assertHasCreatedAttributes(doc2); } @Test(expected = DuplicateDocumentException.class) public void testAddDocumentDuplicate() { DocumentDTO doc1 = createDocument(); manager.addDocument(doc1); manager.addDocument(doc1); } @Test public void testGetDocument() { DocumentDTO doc1 = createDocument(); manager.addDocument(doc1); DocumentDTO doc2 = manager.getDocument(doc1.getId(), false); assertNotNull(doc2); } @Test public void testGetDocumentSummary() { DocumentDTO doc1 = createDocument(); manager.addDocument(doc1); DocumentDTO doc2 = manager.getDocument(doc1.getId(), true); assertNotNull(doc2); assertNull(doc2.getContent()); } @Test(expected = DocumentNotFoundException.class) public void testGetDocumentMissing() { manager.getDocument(manager.randomId(), false); } @Test(expected = IllegalArgumentException.class) public void testGetDocumentInvalidId() { manager.getDocument(INVALID_ID, false); } @Test public void testGetDocumentsInitial() { Collection<DocumentDTO> documents = manager.getDocuments(false); assertNotNull(documents); assertEquals(0, documents.size()); } @Test public void testGetDocuments() { DocumentDTO doc1 = createDocument(); manager.addDocument(doc1); DocumentDTO doc2 = createDocument(); manager.addDocument(doc2); Collection<DocumentDTO> documents = manager.getDocuments(false); assertNotNull(documents); assertEquals(2, documents.size()); // summary = false, should have content for (DocumentDTO doc : documents) { assertNotNull(doc.getContent()); } } @Test public void testGetDocumentsSummary() { DocumentDTO doc1 = createDocument(); manager.addDocument(doc1); DocumentDTO doc2 = createDocument(); manager.addDocument(doc2); Collection<DocumentDTO> documents = manager.getDocuments(true); assertNotNull(documents); assertEquals(2, documents.size()); // summary = true, should have content for (DocumentDTO doc : documents) { assertNull(doc.getContent()); } } @Test(expected = DocumentNotFoundException.class) public void testUpdateDocumentMissing() { DocumentDTO doc1 = createDocument(); manager.updateDocument(doc1); } @Test public void testUpdateDocument() { DocumentDTO doc1 = createDocument(); manager.addDocument(doc1); String name = "new name"; doc1.setName(name); DocumentDTO doc2 = manager.updateDocument(doc1); assertNotNull(doc2); assertEquals(doc1.getId(), doc2.getId()); assertHasUpdateAttributes(doc2); DocumentDTO doc3 = manager.getDocument(doc1.getId(), false); assertEquals(name, doc3.getName()); } @Test(expected = DocumentNotFoundException.class) public void testRemoveDocumentMissing() { manager.removeDocument(manager.randomId()); } @Test(expected = IllegalArgumentException.class) public void testRemoveDocumentInvalidId() { manager.removeDocument(INVALID_ID); } @Test public void testRemoveDocument() { DocumentDTO doc1 = createDocument(); manager.addDocument(doc1); manager.removeDocument(doc1.getId()); Collection<DocumentDTO> documents = manager.getDocuments(true); assertNotNull(documents); assertEquals(0, documents.size()); } }