001/* 002 * The contents of this file are subject to the license and copyright 003 * detailed in the LICENSE and NOTICE files at the root of the source 004 * tree. 005 */ 006 007package org.fcrepo.kernel.impl.services; 008 009import org.fcrepo.kernel.api.RdfLexicon; 010import org.fcrepo.kernel.api.Transaction; 011import org.fcrepo.kernel.api.identifiers.FedoraId; 012import org.fcrepo.kernel.api.models.ResourceHeaders; 013import org.fcrepo.kernel.api.observer.EventAccumulator; 014import org.fcrepo.kernel.api.operations.ResourceOperation; 015import org.fcrepo.kernel.impl.operations.VersionResourceOperationFactoryImpl; 016import org.fcrepo.persistence.api.PersistentStorageSession; 017import org.fcrepo.persistence.api.PersistentStorageSessionManager; 018import org.fcrepo.persistence.api.exceptions.PersistentStorageException; 019import org.junit.Before; 020import org.junit.Test; 021import org.junit.runner.RunWith; 022import org.mockito.ArgumentCaptor; 023import org.mockito.Mock; 024import org.mockito.junit.MockitoJUnitRunner; 025 026import static org.junit.Assert.assertEquals; 027import static org.mockito.Mockito.verify; 028import static org.mockito.Mockito.when; 029import static org.springframework.test.util.ReflectionTestUtils.setField; 030 031/** 032 * @author mdurbin 033 */ 034@RunWith(MockitoJUnitRunner.class) 035public class VersionServiceImplTest { 036 037 private VersionServiceImpl service; 038 039 @Mock 040 private EventAccumulator eventAccumulator; 041 042 @Mock 043 private PersistentStorageSessionManager psManager; 044 045 @Mock 046 private PersistentStorageSession session; 047 048 @Mock 049 private Transaction transaction; 050 051 @Mock 052 private ResourceHeaders headers; 053 054 @Before 055 public void setup() { 056 service = new VersionServiceImpl(); 057 setField(service, "eventAccumulator", eventAccumulator); 058 service.setPsManager(psManager); 059 service.setVersionOperationFactory(new VersionResourceOperationFactoryImpl()); 060 061 when(psManager.getSession(transaction)).thenReturn(session); 062 } 063 064 @Test 065 public void createPersistOperation() throws PersistentStorageException { 066 final var fedoraId = FedoraId.create("info:fedora/test"); 067 final var user = "me"; 068 069 when(session.getHeaders(fedoraId, null)).thenReturn(headers); 070 when(headers.getInteractionModel()).thenReturn(RdfLexicon.RDF_SOURCE.toString()); 071 072 service.createVersion(transaction, fedoraId, user); 073 074 final var captor = ArgumentCaptor.forClass(ResourceOperation.class); 075 verify(transaction).lockResource(fedoraId); 076 verify(session).persist(captor.capture()); 077 final var captured = captor.getValue(); 078 079 assertEquals(fedoraId, captured.getResourceId()); 080 assertEquals(user, captured.getUserPrincipal()); 081 } 082 083 @Test 084 public void createPersistOperationBinaryDesc() throws PersistentStorageException { 085 final var fedoraId = FedoraId.create("info:fedora/test").asDescription(); 086 final var user = "me"; 087 088 when(session.getHeaders(fedoraId, null)).thenReturn(headers); 089 when(headers.getInteractionModel()).thenReturn(RdfLexicon.FEDORA_NON_RDF_SOURCE_DESCRIPTION_URI); 090 091 service.createVersion(transaction, fedoraId, user); 092 093 final var captor = ArgumentCaptor.forClass(ResourceOperation.class); 094 verify(transaction).lockResource(fedoraId); 095 verify(transaction).lockResource(fedoraId.asBaseId()); 096 verify(session).persist(captor.capture()); 097 final var captured = captor.getValue(); 098 099 assertEquals(fedoraId, captured.getResourceId()); 100 assertEquals(user, captured.getUserPrincipal()); 101 } 102 103 @Test 104 public void createPersistOperationAgPart() throws PersistentStorageException { 105 final var agId = FedoraId.create("ag"); 106 final var fedoraId = agId.resolve("test"); 107 final var user = "me"; 108 109 when(session.getHeaders(fedoraId, null)).thenReturn(headers); 110 when(headers.getArchivalGroupId()).thenReturn(agId); 111 when(headers.getInteractionModel()).thenReturn(RdfLexicon.NON_RDF_SOURCE.toString()); 112 113 service.createVersion(transaction, fedoraId, user); 114 115 final var captor = ArgumentCaptor.forClass(ResourceOperation.class); 116 verify(transaction).lockResource(agId); 117 verify(transaction).lockResource(fedoraId.asDescription()); 118 verify(transaction).lockResource(fedoraId); 119 verify(session).persist(captor.capture()); 120 final var captured = captor.getValue(); 121 122 assertEquals(fedoraId, captured.getResourceId()); 123 assertEquals(user, captured.getUserPrincipal()); 124 } 125 126}