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}