001/* 002 * Licensed to DuraSpace under one or more contributor license agreements. 003 * See the NOTICE file distributed with this work for additional information 004 * regarding copyright ownership. 005 * 006 * DuraSpace licenses this file to you under the Apache License, 007 * Version 2.0 (the "License"); you may not use this file except in 008 * compliance with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019package org.fcrepo.kernel.impl.services; 020 021import org.fcrepo.kernel.api.RdfLexicon; 022import org.fcrepo.kernel.api.Transaction; 023import org.fcrepo.kernel.api.identifiers.FedoraId; 024import org.fcrepo.kernel.api.models.ResourceHeaders; 025import org.fcrepo.kernel.api.observer.EventAccumulator; 026import org.fcrepo.kernel.api.operations.ResourceOperation; 027import org.fcrepo.kernel.impl.operations.VersionResourceOperationFactoryImpl; 028import org.fcrepo.persistence.api.PersistentStorageSession; 029import org.fcrepo.persistence.api.PersistentStorageSessionManager; 030import org.fcrepo.persistence.api.exceptions.PersistentStorageException; 031import org.junit.Before; 032import org.junit.Test; 033import org.junit.runner.RunWith; 034import org.mockito.ArgumentCaptor; 035import org.mockito.Mock; 036import org.mockito.junit.MockitoJUnitRunner; 037 038import static org.junit.Assert.assertEquals; 039import static org.mockito.Mockito.verify; 040import static org.mockito.Mockito.when; 041import static org.springframework.test.util.ReflectionTestUtils.setField; 042 043/** 044 * @author mdurbin 045 */ 046@RunWith(MockitoJUnitRunner.class) 047public class VersionServiceImplTest { 048 049 private VersionServiceImpl service; 050 051 @Mock 052 private EventAccumulator eventAccumulator; 053 054 @Mock 055 private PersistentStorageSessionManager psManager; 056 057 @Mock 058 private PersistentStorageSession session; 059 060 @Mock 061 private Transaction transaction; 062 063 @Mock 064 private ResourceHeaders headers; 065 066 @Before 067 public void setup() { 068 service = new VersionServiceImpl(); 069 setField(service, "eventAccumulator", eventAccumulator); 070 service.setPsManager(psManager); 071 service.setVersionOperationFactory(new VersionResourceOperationFactoryImpl()); 072 073 when(psManager.getSession(transaction)).thenReturn(session); 074 } 075 076 @Test 077 public void createPersistOperation() throws PersistentStorageException { 078 final var fedoraId = FedoraId.create("info:fedora/test"); 079 final var user = "me"; 080 081 when(session.getHeaders(fedoraId, null)).thenReturn(headers); 082 when(headers.getInteractionModel()).thenReturn(RdfLexicon.RDF_SOURCE.toString()); 083 084 service.createVersion(transaction, fedoraId, user); 085 086 final var captor = ArgumentCaptor.forClass(ResourceOperation.class); 087 verify(transaction).lockResource(fedoraId); 088 verify(session).persist(captor.capture()); 089 final var captured = captor.getValue(); 090 091 assertEquals(fedoraId, captured.getResourceId()); 092 assertEquals(user, captured.getUserPrincipal()); 093 } 094 095 @Test 096 public void createPersistOperationBinaryDesc() throws PersistentStorageException { 097 final var fedoraId = FedoraId.create("info:fedora/test").asDescription(); 098 final var user = "me"; 099 100 when(session.getHeaders(fedoraId, null)).thenReturn(headers); 101 when(headers.getInteractionModel()).thenReturn(RdfLexicon.FEDORA_NON_RDF_SOURCE_DESCRIPTION_URI); 102 103 service.createVersion(transaction, fedoraId, user); 104 105 final var captor = ArgumentCaptor.forClass(ResourceOperation.class); 106 verify(transaction).lockResource(fedoraId); 107 verify(transaction).lockResource(fedoraId.asBaseId()); 108 verify(session).persist(captor.capture()); 109 final var captured = captor.getValue(); 110 111 assertEquals(fedoraId, captured.getResourceId()); 112 assertEquals(user, captured.getUserPrincipal()); 113 } 114 115 @Test 116 public void createPersistOperationAgPart() throws PersistentStorageException { 117 final var agId = FedoraId.create("ag"); 118 final var fedoraId = agId.resolve("test"); 119 final var user = "me"; 120 121 when(session.getHeaders(fedoraId, null)).thenReturn(headers); 122 when(headers.getArchivalGroupId()).thenReturn(agId); 123 when(headers.getInteractionModel()).thenReturn(RdfLexicon.NON_RDF_SOURCE.toString()); 124 125 service.createVersion(transaction, fedoraId, user); 126 127 final var captor = ArgumentCaptor.forClass(ResourceOperation.class); 128 verify(transaction).lockResource(agId); 129 verify(transaction).lockResource(fedoraId.asDescription()); 130 verify(transaction).lockResource(fedoraId); 131 verify(session).persist(captor.capture()); 132 final var captured = captor.getValue(); 133 134 assertEquals(fedoraId, captured.getResourceId()); 135 assertEquals(user, captured.getUserPrincipal()); 136 } 137 138}