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.FedoraHeaderConstants.ACCEPT_DATETIME;
010import static org.fcrepo.client.FedoraHeaderConstants.CACHE_CONTROL;
011import static org.fcrepo.client.FedoraHeaderConstants.LINK;
012import static org.fcrepo.client.FedoraHeaderConstants.WANT_DIGEST;
013import static org.fcrepo.client.TestUtils.baseUrl;
014import static org.fcrepo.client.HeaderHelpers.UTC_RFC_1123_FORMATTER;
015import static org.junit.Assert.assertEquals;
016import static org.junit.Assert.assertFalse;
017import static org.mockito.ArgumentMatchers.any;
018import static org.mockito.ArgumentMatchers.eq;
019import static org.mockito.Mockito.verify;
020import static org.mockito.Mockito.when;
021
022import java.net.URI;
023import java.time.Instant;
024import java.time.LocalDateTime;
025import java.time.ZoneOffset;
026
027import org.apache.http.client.methods.HttpRequestBase;
028import org.junit.Before;
029import org.junit.Test;
030import org.junit.runner.RunWith;
031import org.mockito.ArgumentCaptor;
032import org.mockito.Captor;
033import org.mockito.Mock;
034import org.mockito.junit.MockitoJUnitRunner;
035
036/**
037 * @author escowles
038 */
039@RunWith(MockitoJUnitRunner.class)
040public class HeadBuilderTest {
041
042    private final String HISTORIC_DATETIME =
043            UTC_RFC_1123_FORMATTER.format(LocalDateTime.of(2000, 1, 1, 0, 0).atZone(ZoneOffset.UTC));
044
045    @Mock
046    private FcrepoClient client;
047
048    @Mock
049    private FcrepoResponse fcrepoResponse;
050
051    private HeadBuilder testBuilder;
052
053    private URI uri;
054
055    @Captor
056    private ArgumentCaptor<HttpRequestBase> requestCaptor;
057
058    @Before
059    public void setUp() throws Exception {
060        when(client.executeRequest(any(URI.class), any(HttpRequestBase.class)))
061                .thenReturn(fcrepoResponse);
062
063        uri = create(baseUrl);
064        testBuilder = new HeadBuilder(uri, client);
065    }
066
067    @Test
068    public void testHead() throws Exception {
069        testBuilder.perform();
070
071        verify(client).executeRequest(eq(uri), requestCaptor.capture());
072    }
073
074    @Test
075    public void testDisableRedirects() throws Exception {
076        testBuilder.disableRedirects();
077        assertFalse(testBuilder.request.getConfig().isRedirectsEnabled());
078    }
079
080    @Test
081    public void testWantDigest() throws Exception {
082        testBuilder.wantDigest("md5").perform();
083
084        verify(client).executeRequest(eq(uri), requestCaptor.capture());
085        final HttpRequestBase request = requestCaptor.getValue();
086        assertEquals("md5", request.getFirstHeader(WANT_DIGEST).getValue());
087    }
088
089    @Test
090    public void testNoCache() throws Exception {
091        testBuilder.noCache().perform();
092
093        verify(client).executeRequest(eq(uri), requestCaptor.capture());
094        final HttpRequestBase request = requestCaptor.getValue();
095        assertEquals("no-cache", request.getFirstHeader(CACHE_CONTROL).getValue());
096    }
097
098    @Test
099    public void testAcceptDatetime() throws Exception {
100        testBuilder.acceptDatetime(HISTORIC_DATETIME).perform();
101
102        verify(client).executeRequest(eq(uri), requestCaptor.capture());
103        final HttpRequestBase request = requestCaptor.getValue();
104        assertEquals(HISTORIC_DATETIME, request.getFirstHeader(ACCEPT_DATETIME).getValue());
105    }
106
107    @Test
108    public void testAcceptDatetimeInstant() throws Exception {
109        final Instant datetime = LocalDateTime.of(2000, 1, 1, 00, 00).atZone(ZoneOffset.UTC).toInstant();
110        testBuilder.acceptDatetime(datetime).perform();
111
112        verify(client).executeRequest(eq(uri), requestCaptor.capture());
113        final HttpRequestBase request = requestCaptor.getValue();
114        assertEquals(HISTORIC_DATETIME, request.getFirstHeader(ACCEPT_DATETIME).getValue());
115    }
116
117    @Test
118    public void testAddHeader() throws Exception {
119        testBuilder.addHeader("my-header", "head-val").perform();
120
121        verify(client).executeRequest(eq(uri), requestCaptor.capture());
122        final HttpRequestBase request = requestCaptor.getValue();
123        assertEquals("head-val", request.getFirstHeader("my-header").getValue());
124    }
125
126    @Test
127    public void testAddLinkHeader() throws Exception {
128        final FcrepoLink link = FcrepoLink.fromUri("http://example.com/link").type("foo").build();
129        testBuilder.addLinkHeader(link).perform();
130
131        verify(client).executeRequest(eq(uri), requestCaptor.capture());
132        final HttpRequestBase request = requestCaptor.getValue();
133        assertEquals(link.toString(), request.getFirstHeader(LINK).getValue());
134    }
135}