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 */
018package org.fcrepo.http.api;
019
020import org.fcrepo.common.db.DbTransactionExecutor;
021import org.fcrepo.kernel.api.Transaction;
022import org.fcrepo.kernel.api.identifiers.FedoraId;
023import org.fcrepo.kernel.api.models.FedoraResource;
024import org.fcrepo.kernel.api.models.ResourceFactory;
025import org.fcrepo.kernel.api.models.Tombstone;
026import org.fcrepo.kernel.api.services.PurgeResourceService;
027import org.junit.Before;
028import org.junit.Test;
029import org.junit.runner.RunWith;
030import org.mockito.Mock;
031import org.mockito.junit.MockitoJUnitRunner;
032
033import javax.servlet.ServletContext;
034import javax.ws.rs.core.Request;
035import javax.ws.rs.core.Response;
036import javax.ws.rs.core.SecurityContext;
037
038import static javax.ws.rs.core.Response.Status.NOT_FOUND;
039import static javax.ws.rs.core.Response.Status.NO_CONTENT;
040
041import static org.fcrepo.http.commons.test.util.TestHelpers.getUriInfoImpl;
042import static org.junit.Assert.assertEquals;
043import static org.mockito.ArgumentMatchers.any;
044import static org.mockito.ArgumentMatchers.eq;
045import static org.mockito.Mockito.spy;
046import static org.mockito.Mockito.verify;
047import static org.mockito.Mockito.when;
048import static org.springframework.test.util.ReflectionTestUtils.setField;
049
050/**
051 * @author cabeer
052 */
053@RunWith(MockitoJUnitRunner.Silent.class)
054public class FedoraTombstonesTest {
055
056    private final String path = "/test/object";
057
058    private final FedoraId fedoraId = FedoraId.create(path);
059
060    private FedoraTombstones testObj;
061
062    @Mock
063    private Request mockRequest;
064
065    @Mock
066    private ServletContext mockServletContext;
067
068    @Mock
069    private Tombstone mockTombstone;
070
071    @Mock
072    private FedoraResource mockDeletedObj;
073
074    @Mock
075    private Transaction mockTransaction;
076
077    @Mock
078    private SecurityContext mockSecurityContext;
079
080    @Mock
081    private PurgeResourceService purgeResourceService;
082
083    @Mock
084    private ResourceFactory resourceFactory;
085
086    @Before
087    public void setUp() throws Exception {
088
089        testObj = spy(new FedoraTombstones(path));
090        setField(testObj, "transaction", mockTransaction);
091        setField(testObj, "purgeResourceService", purgeResourceService);
092        setField(testObj, "resourceFactory", resourceFactory);
093        setField(testObj, "uriInfo", getUriInfoImpl());
094        setField(testObj, "securityContext", mockSecurityContext);
095        setField(testObj, "request", mockRequest);
096        setField(testObj, "context", mockServletContext);
097        setField(testObj, "dbTransactionExecutor", new DbTransactionExecutor());
098
099        when(resourceFactory.getResource((Transaction)any(), eq(fedoraId))).thenReturn(mockTombstone);
100        when(mockTombstone.getDeletedObject()).thenReturn(mockDeletedObj);
101    }
102
103    @Test
104    public void testDelete() {
105        final Response actual = testObj.delete();
106        assertEquals(NO_CONTENT.getStatusCode(), actual.getStatus());
107        verify(purgeResourceService).perform(mockTransaction, mockDeletedObj, null);
108        verify(mockTransaction).commitIfShortLived();
109    }
110
111    /**
112     * If a resource is not deleted, it doesn't return a TombstoneImpl so the fcr:tombstone URI should return 404.
113     */
114    @Test
115    public void testNotYetDeleted() throws Exception {
116        when(resourceFactory.getResource((Transaction)any(), eq(fedoraId))).thenReturn(mockDeletedObj);
117        final Response actual = testObj.delete();
118        assertEquals(NOT_FOUND.getStatusCode(), actual.getStatus());
119    }
120}