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}