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}