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;
010import static org.fcrepo.client.FedoraHeaderConstants.ACCEPT_DATETIME;
011import static org.fcrepo.client.FedoraHeaderConstants.CACHE_CONTROL;
012import static org.fcrepo.client.FedoraHeaderConstants.IF_MODIFIED_SINCE;
013import static org.fcrepo.client.FedoraHeaderConstants.IF_NONE_MATCH;
014import static org.fcrepo.client.FedoraHeaderConstants.LINK;
015import static org.fcrepo.client.FedoraHeaderConstants.PREFER;
016import static org.fcrepo.client.FedoraHeaderConstants.RANGE;
017import static org.fcrepo.client.FedoraHeaderConstants.WANT_DIGEST;
018import static org.fcrepo.client.HeaderHelpers.UTC_RFC_1123_FORMATTER;
019import static org.fcrepo.client.TestUtils.baseUrl;
020import static org.junit.Assert.assertEquals;
021import static org.junit.Assert.assertFalse;
022import static org.mockito.ArgumentMatchers.any;
023import static org.mockito.ArgumentMatchers.eq;
024import static org.mockito.Mockito.verify;
025import static org.mockito.Mockito.when;
026
027import java.net.URI;
028import java.time.LocalDateTime;
029import java.time.ZoneOffset;
030import java.util.Arrays;
031import java.util.List;
032
033import org.apache.http.client.methods.HttpRequestBase;
034import org.junit.Before;
035import org.junit.Test;
036import org.junit.runner.RunWith;
037import org.mockito.ArgumentCaptor;
038import org.mockito.Mock;
039import org.mockito.junit.MockitoJUnitRunner;
040
041/**
042 * @author bbpennel
043 */
044@RunWith(MockitoJUnitRunner.class)
045public class GetBuilderTest {
046
047    private final String HISTORIC_DATETIME =
048            UTC_RFC_1123_FORMATTER.format(LocalDateTime.of(2000, 1, 1, 0, 0).atZone(ZoneOffset.UTC));
049
050    @Mock
051    private FcrepoClient client;
052
053    @Mock
054    private FcrepoResponse fcrepoResponse;
055
056    private GetBuilder testBuilder;
057
058    private URI uri;
059
060    @Before
061    public void setUp() throws Exception {
062        when(client.executeRequest(any(URI.class), any(HttpRequestBase.class)))
063                .thenReturn(fcrepoResponse);
064
065        uri = create(baseUrl);
066        testBuilder = new GetBuilder(uri, client);
067    }
068
069    @Test
070    public void testGet() throws Exception {
071        testBuilder.perform();
072
073        final ArgumentCaptor<HttpRequestBase> requestCaptor = ArgumentCaptor.forClass(HttpRequestBase.class);
074        verify(client).executeRequest(eq(uri), requestCaptor.capture());
075
076        final HttpRequestBase request = getRequest();
077        assertEquals(0, request.getAllHeaders().length);
078    }
079
080    @Test
081    public void testPreferMinimal() throws Exception {
082        testBuilder.preferRepresentation(Arrays.asList(
083                URI.create("http://www.w3.org/ns/ldp#PreferMinimalContainer")), null)
084                .perform();
085
086        final HttpRequestBase request = getRequest();
087        assertEquals("return=representation; include=\"http://www.w3.org/ns/ldp#PreferMinimalContainer\"",
088                request.getFirstHeader(PREFER).getValue());
089    }
090
091    @Test
092    public void testPreferRepresentation() throws Exception {
093        testBuilder.preferRepresentation().perform();
094
095        final HttpRequestBase request = getRequest();
096        assertEquals("return=representation", request.getFirstHeader(PREFER).getValue());
097    }
098
099    @Test
100    public void testPreferInclude() throws Exception {
101        final List<URI> includes = Arrays.asList(
102                new URI("http://fedora.info/definitions/v4/repository#InboundReferences"),
103                new URI("http://www.w3.org/ns/ldp#PreferMembership"));
104        testBuilder.preferRepresentation(includes, null).perform();
105
106        final HttpRequestBase request = getRequest();
107        assertEquals("return=representation; include=\"" +
108                "http://fedora.info/definitions/v4/repository#InboundReferences" +
109                " http://www.w3.org/ns/ldp#PreferMembership\"",
110                request.getFirstHeader(PREFER).getValue());
111    }
112
113    @Test
114    public void testModificationHeaders() throws Exception {
115        final String etag = "123456";
116        final String lastModified = "Mon, 19 May 2014 19:44:59 GMT";
117        testBuilder.ifNoneMatch(etag).ifModifiedSince(lastModified).perform();
118
119        final HttpRequestBase request = getRequest();
120        assertEquals(etag, request.getFirstHeader(IF_NONE_MATCH).getValue());
121        assertEquals(lastModified, request.getFirstHeader(IF_MODIFIED_SINCE).getValue());
122    }
123
124    @Test
125    public void testRange() throws Exception {
126        testBuilder.range(5L, 100L).perform();
127
128        final HttpRequestBase request = getRequest();
129        assertEquals("bytes=5-100", request.getFirstHeader(RANGE).getValue());
130    }
131
132    @Test
133    public void testStartRange() throws Exception {
134        testBuilder.range(5L, null).perform();
135
136        final HttpRequestBase request = getRequest();
137        assertEquals("bytes=5-", request.getFirstHeader(RANGE).getValue());
138    }
139
140    @Test
141    public void testEndRange() throws Exception {
142        testBuilder.range(null, 100L).perform();
143
144        final HttpRequestBase request = getRequest();
145        assertEquals("bytes=-100", request.getFirstHeader(RANGE).getValue());
146    }
147
148    @Test
149    public void testAccept() throws Exception {
150        testBuilder.accept("text/turtle").perform();
151
152        final HttpRequestBase request = getRequest();
153        assertEquals("text/turtle", request.getFirstHeader(ACCEPT).getValue());
154    }
155
156    @Test
157    public void testDisableRedirects() throws Exception {
158        testBuilder.disableRedirects();
159        assertFalse(testBuilder.request.getConfig().isRedirectsEnabled());
160    }
161
162    @Test
163    public void testWantDigest() throws Exception {
164        testBuilder.wantDigest("md5").perform();
165
166        final HttpRequestBase request = getRequest();
167        assertEquals("md5", request.getFirstHeader(WANT_DIGEST).getValue());
168    }
169
170    @Test
171    public void testNoCache() throws Exception {
172        testBuilder.noCache().perform();
173
174        final HttpRequestBase request = getRequest();
175        assertEquals("no-cache", request.getFirstHeader(CACHE_CONTROL).getValue());
176    }
177
178    @Test
179    public void testAcceptDatetime() throws Exception {
180        testBuilder.acceptDatetime(HISTORIC_DATETIME).perform();
181
182        final HttpRequestBase request = getRequest();
183        assertEquals(HISTORIC_DATETIME, request.getFirstHeader(ACCEPT_DATETIME).getValue());
184    }
185
186    @Test
187    public void testAddHeader() throws Exception {
188        testBuilder.addHeader("my-header", "head-val").perform();
189
190        final HttpRequestBase request = getRequest();
191        assertEquals("head-val", request.getFirstHeader("my-header").getValue());
192    }
193
194    @Test
195    public void testAddLinkHeader() throws Exception {
196        final FcrepoLink link = FcrepoLink.fromUri("http://example.com/link").type("foo").build();
197        testBuilder.addLinkHeader(link).perform();
198
199        final HttpRequestBase request = getRequest();
200        assertEquals(link.toString(), request.getFirstHeader(LINK).getValue());
201    }
202
203    private HttpRequestBase getRequest() throws FcrepoOperationFailedException {
204        final ArgumentCaptor<HttpRequestBase> requestCaptor = ArgumentCaptor.forClass(HttpRequestBase.class);
205        verify(client).executeRequest(eq(uri), requestCaptor.capture());
206
207        return requestCaptor.getValue();
208    }
209}