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 */
006package org.fcrepo.client;
007
008import static java.net.URI.create;
009import static org.fcrepo.client.TestUtils.baseUrl;
010import static org.junit.Assert.assertEquals;
011import static org.mockito.ArgumentMatchers.any;
012import static org.mockito.ArgumentMatchers.eq;
013import static org.mockito.Mockito.verify;
014import static org.mockito.Mockito.when;
015import static org.fcrepo.client.FedoraHeaderConstants.MEMENTO_DATETIME;
016import static org.fcrepo.client.HeaderHelpers.UTC_RFC_1123_FORMATTER;
017
018import java.net.URI;
019import java.time.Instant;
020import java.time.LocalDateTime;
021import java.time.ZoneOffset;
022import java.time.format.DateTimeParseException;
023
024import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
025import org.apache.http.client.methods.HttpRequestBase;
026import org.junit.Before;
027import org.junit.Test;
028import org.junit.runner.RunWith;
029import org.mockito.ArgumentCaptor;
030import org.mockito.Captor;
031import org.mockito.Mock;
032import org.mockito.junit.MockitoJUnitRunner;
033
034/**
035 * @author bbpennel
036 */
037@RunWith(MockitoJUnitRunner.class)
038public class HistoricMementoBuilderTest {
039
040    private final String HISTORIC_DATETIME =
041            UTC_RFC_1123_FORMATTER.format(LocalDateTime.of(2000, 1, 1, 0, 0).atZone(ZoneOffset.UTC));
042
043    @Mock
044    private FcrepoClient client;
045
046    @Mock
047    private FcrepoResponse fcrepoResponse;
048
049    @Captor
050    private ArgumentCaptor<HttpRequestBase> requestCaptor;
051
052    private HistoricMementoBuilder testBuilder;
053
054    private URI uri;
055
056    @Before
057    public void setUp() throws Exception {
058        when(client.executeRequest(any(URI.class), any(HttpRequestBase.class)))
059                .thenReturn(fcrepoResponse);
060
061        uri = create(baseUrl);
062    }
063
064    @Test
065    public void testCreateWithInstantHeader() throws Exception {
066        final Instant datetime = LocalDateTime.of(2000, 1, 1, 00, 00).atZone(ZoneOffset.UTC).toInstant();
067
068        testBuilder = new HistoricMementoBuilder(uri, client, datetime);
069        testBuilder.perform();
070
071        verify(client).executeRequest(eq(uri), requestCaptor.capture());
072
073        final HttpEntityEnclosingRequestBase request = (HttpEntityEnclosingRequestBase) requestCaptor.getValue();
074        assertEquals(HISTORIC_DATETIME, request.getFirstHeader(MEMENTO_DATETIME).getValue());
075    }
076
077    @Test
078    public void testCreateWithStringMementoDatetime() throws Exception {
079        testBuilder = new HistoricMementoBuilder(uri, client, HISTORIC_DATETIME);
080        testBuilder.perform();
081
082        verify(client).executeRequest(eq(uri), requestCaptor.capture());
083
084        final HttpEntityEnclosingRequestBase request = (HttpEntityEnclosingRequestBase) requestCaptor.getValue();
085        assertEquals(HISTORIC_DATETIME, request.getFirstHeader(MEMENTO_DATETIME).getValue());
086    }
087
088    @Test(expected = NullPointerException.class)
089    public void testCreateWithNoDatetime() throws Exception {
090        testBuilder = new HistoricMementoBuilder(uri, client, (String) null);
091        testBuilder.perform();
092    }
093
094    @Test(expected = DateTimeParseException.class)
095    public void testCreateWithNonRFC1123() throws Exception {
096        final String mementoDatetime = Instant.now().toString();
097        testBuilder = new HistoricMementoBuilder(uri, client, mementoDatetime);
098        testBuilder.perform();
099    }
100}