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.http.commons.api.rdf;
007
008import static org.fcrepo.kernel.api.FedoraTypes.FCR_ACL;
009import static org.fcrepo.kernel.api.FedoraTypes.FCR_METADATA;
010import static org.fcrepo.kernel.api.FedoraTypes.FCR_VERSIONS;
011import static org.fcrepo.kernel.api.FedoraTypes.FEDORA_ID_PREFIX;
012import static org.junit.Assert.assertEquals;
013import static org.junit.Assert.assertFalse;
014import static org.junit.Assert.assertTrue;
015
016import org.fcrepo.kernel.api.identifiers.FedoraId;
017import org.junit.Before;
018import org.junit.Test;
019import org.junit.runner.RunWith;
020import org.mockito.junit.MockitoJUnitRunner;
021
022import javax.ws.rs.core.UriBuilder;
023
024import java.util.UUID;
025
026/**
027 * @author whikloj
028 */
029@RunWith(MockitoJUnitRunner.Silent.class)
030public class HttpIdentifierConverterTest {
031
032    private HttpIdentifierConverter converter;
033
034    private static final String uriBase = "http://localhost:8080/some";
035
036    private static final String uriTemplate = uriBase + "/{path: .*}";
037
038    private UriBuilder uriBuilder;
039
040    @Before
041    public void setUp() {
042        uriBuilder = UriBuilder.fromUri(uriTemplate);
043        converter = new HttpIdentifierConverter(uriBuilder);
044    }
045
046    @Test(expected = IllegalArgumentException.class)
047    public void testBlankUri() {
048        final String testUri = "";
049        converter.toInternalId(testUri);
050    }
051
052    /**
053     * Test that a blank string toDomain becomes a /
054     */
055    @Test
056    public void testBlankToDomain() {
057        final String testUri = "";
058        final String fedoraUri = converter.toDomain(testUri);
059        assertEquals(uriBase + "/", fedoraUri);
060    }
061
062    @Test(expected = IllegalArgumentException.class)
063    public void testBlankId() {
064        final String testId = "";
065        final String fedoraId = converter.toExternalId(testId);
066    }
067
068    @Test
069    public void testinExternalDomainSuccess() {
070        final String testURI = uriBase + "/someurl/thatWeWant";
071        assertTrue(converter.inExternalDomain(testURI));
072    }
073
074    @Test
075    public void testinExternalDomainFailure() {
076        final String testURI = "http://someplace.com/whatHappened";
077        assertFalse(converter.inExternalDomain(testURI));
078    }
079
080    @Test
081    public void testinInternalDomainSuccess() {
082        final String testID = FEDORA_ID_PREFIX + "/myLittleResource";
083        assertTrue(converter.inInternalDomain(testID));
084    }
085
086    @Test
087    public void testinInternalDomainFailure() {
088        final String testID = "info:test/myLittleResource";
089        assertFalse(converter.inInternalDomain(testID));
090    }
091
092    @Test
093    public void testRootUriWithTrailingSlash() {
094        final String testUri = uriBase + "/";
095        final String fedoraId = converter.toInternalId(testUri);
096        assertEquals(FEDORA_ID_PREFIX, fedoraId);
097        final String httpUri = converter.toExternalId(fedoraId);
098        assertEquals(testUri, httpUri);
099    }
100
101    @Test
102    public void testRootUriWithoutTrailingSlash() {
103        final String testUri = uriBase;
104        final String fedoraId = converter.toInternalId(testUri);
105        assertEquals(FEDORA_ID_PREFIX, fedoraId);
106        final String httpUri = converter.toExternalId(fedoraId);
107        // We also return the trailing slash.
108        assertEquals(testUri + "/", httpUri);
109    }
110
111    @Test
112    public void testFirstLevel() {
113        final String baseUid = getUniqueId();
114        final String testUri = uriBase + "/" + baseUid;
115        final String fedoraId = converter.toInternalId(testUri);
116        assertEquals(FEDORA_ID_PREFIX + "/" + baseUid, fedoraId);
117        final String httpUri = converter.toExternalId(fedoraId);
118        assertEquals(testUri, httpUri);
119    }
120
121    @Test
122    public void testFirstLevelExternalPath() {
123        final String baseUid = getUniqueId();
124        final String testUri = "/" + baseUid;
125        final String fedoraId = converter.toInternalId(converter.toDomain(testUri));
126        assertEquals(FEDORA_ID_PREFIX + "/" + baseUid, fedoraId);
127        final String httpUri = converter.toExternalId(fedoraId);
128        assertEquals(uriBase + testUri, httpUri);
129    }
130
131    @Test
132    public void testFirstLevelWithAcl() {
133        final String testUri = "/" + getUniqueId() + "/" + FCR_ACL;
134        final String external = uriBase + testUri;
135        final String internal = FEDORA_ID_PREFIX + testUri;
136        final String fedoraId = converter.toInternalId(external);
137        assertEquals(internal, fedoraId);
138        final String httpUri = converter.toExternalId(internal);
139        assertEquals(external, httpUri);
140    }
141
142    @Test
143    public void testFirstLevelWithMetadata() {
144        final String baseUid = getUniqueId();
145        final String testUri = "/" + baseUid + "/" + FCR_METADATA;
146        final String external = uriBase + testUri;
147        final String internal = FEDORA_ID_PREFIX + testUri;
148        final String fedoraId = converter.toInternalId(external);
149        assertEquals(internal, fedoraId);
150        final String httpUri = converter.toExternalId(internal);
151        assertEquals(external, httpUri);
152    }
153
154    @Test
155    public void testFirstLevelWithVersions() {
156        final String baseUid = getUniqueId();
157        final String testUri = "/" + baseUid + "/" + FCR_VERSIONS;
158        final String external = uriBase + testUri;
159        final String internal = FEDORA_ID_PREFIX + testUri;
160        final String fedoraId = converter.toInternalId(external);
161        assertEquals(internal, fedoraId);
162        final String httpUri = converter.toExternalId(internal);
163        assertEquals(external, httpUri);
164    }
165
166    @Test
167    public void testFirstLevelWithMemento() {
168        final String memento = "20190926133245";
169        final String baseUid = getUniqueId();
170        final String testUri = "/" + baseUid + "/" + FCR_VERSIONS + "/" + memento;
171        final String external = uriBase + testUri;
172        final String internal = FEDORA_ID_PREFIX + testUri;
173        final String fedoraId = converter.toInternalId(external);
174        assertEquals(internal, fedoraId);
175        final String httpUri = converter.toExternalId(internal);
176        assertEquals(external, httpUri);
177    }
178
179    @Test
180    public void testSecondLevel() {
181        final String testUri = "/" + getUniqueId() + "/" + getUniqueId();
182        final String external = uriBase + testUri;
183        final String internal = FEDORA_ID_PREFIX + testUri;
184        final String fedoraId = converter.toInternalId(external);
185        assertEquals(internal, fedoraId);
186        final String httpUri = converter.toExternalId(internal);
187        assertEquals(external, httpUri);
188    }
189
190    @Test
191    public void testSecondLevelWithAcl() {
192        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
193        final String testUri = baseUid + "/" + FCR_ACL;
194        final String external = uriBase + testUri;
195        final String internal = FEDORA_ID_PREFIX + testUri;
196        final String fedoraId = converter.toInternalId(external);
197        assertEquals(internal, fedoraId);
198        final String httpUri = converter.toExternalId(internal);
199        assertEquals(external, httpUri);
200    }
201
202    @Test
203    public void testSecondLevelWithMetadata() {
204        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
205        final String testUri = baseUid + "/" + FCR_METADATA;
206        final String external = uriBase + testUri;
207        final String internal = FEDORA_ID_PREFIX + testUri;
208        final String fedoraId = converter.toInternalId(external);
209        assertEquals(internal, fedoraId);
210        final String httpUri = converter.toExternalId(internal);
211        assertEquals(external, httpUri);
212    }
213
214    @Test
215    public void testSecondLevelWithVersions() {
216        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
217        final String testUri = baseUid + "/" + FCR_VERSIONS;
218        final String external = uriBase + testUri;
219        final String internal = FEDORA_ID_PREFIX + testUri;
220        final String fedoraId = converter.toInternalId(external);
221        assertEquals(internal, fedoraId);
222        final String httpUri = converter.toExternalId(internal);
223        assertEquals(external, httpUri);
224    }
225
226    @Test
227    public void testSecondLevelWithMemento() {
228        final String memento = "20190926133245";
229        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
230        final String testUri = baseUid + "/" + FCR_VERSIONS + "/" + memento;
231        final String external = uriBase + testUri;
232        final String internal = FEDORA_ID_PREFIX + testUri;
233        final String fedoraId = converter.toInternalId(external);
234        assertEquals(internal, fedoraId);
235        final String httpUri = converter.toExternalId(internal);
236        assertEquals(external, httpUri);
237    }
238
239    @Test
240    public void testItemWithDoubleAcl() {
241        final String baseUid = getUniqueId();
242        final String testUri = "/" + baseUid + "/" + FCR_ACL + "/" + FCR_ACL;
243        final String external = uriBase + testUri;
244        final String internal = FEDORA_ID_PREFIX + testUri;
245        final String fedoraId = converter.toInternalId(external);
246        assertEquals(internal, fedoraId);
247        final String httpUri = converter.toExternalId(internal);
248        assertEquals(external, httpUri);
249    }
250
251    /**
252     * We decode on the way in, but don't re-encode on the way back out. This is the same as Fedora 5.1.0
253     */
254    @Test
255    public void testWithEncodedColon() {
256        final String externalOriginal = uriBase + "/some%3Atest";
257        final String internal = FEDORA_ID_PREFIX + "/some:test";
258        final String externalNew = uriBase + "/some:test";
259        final String fedoraId = converter.toInternalId(externalOriginal);
260        assertEquals(internal, fedoraId);
261        final String httpUri = converter.toExternalId(internal);
262        assertEquals(externalNew, httpUri);
263    }
264
265
266    @Test
267    public void testBlankPathToId() {
268        final String testUri = "";
269        final FedoraId fedoraUri = converter.pathToInternalId(testUri);
270        assertEquals(FedoraId.getRepositoryRootId(), fedoraUri);
271    }
272
273    @Test
274    public void testSinglePathToId() {
275        final String externalOriginal = "/object";
276        final FedoraId internal = FedoraId.create("object");
277        final FedoraId id = converter.pathToInternalId(externalOriginal);
278        assertEquals(internal, id);
279        // Without leading slash
280        final String externalOriginal2 = "object";
281        final FedoraId id2 = converter.pathToInternalId(externalOriginal2);
282        assertEquals(internal, id2);
283    }
284
285    @Test
286    public void testDoublePathToId() {
287        final String externalOriginal = "/object/child";
288        final FedoraId internal = FedoraId.create("object", "child");
289        final FedoraId id = converter.pathToInternalId(externalOriginal);
290        assertEquals(internal, id);
291        // Without leading slash
292        final String externalOriginal2 = "object/child";
293        final FedoraId id2 = converter.pathToInternalId(externalOriginal2);
294        assertEquals(internal, id2);
295    }
296
297    /**
298     * Test some characters that should remain the same when part of the path
299     */
300    @Test
301    public void testQueryParamCharacters() {
302        final String id = "+&";
303        final String testUri = uriBase + "/" + id;
304        final String fedoraId = converter.toInternalId(testUri);
305        final String expectedId = FEDORA_ID_PREFIX + "/" + id;
306        assertEquals(expectedId, fedoraId);
307    }
308
309    /**
310     * Test encoded versions characters that should remain the same when part of the path
311     */
312    @Test
313    public void testEncodedQueryParamCharacters() {
314        final String encoded = "%2B%26";
315        final String testUri = uriBase + "/" + encoded;
316        final String fedoraId = converter.toInternalId(testUri);
317        final String expectedId = FEDORA_ID_PREFIX + "/+&";
318        assertEquals(expectedId, fedoraId);
319    }
320
321    /**
322     * Utility function to get a UUID.
323     * @return a UUID.
324     */
325    private static String getUniqueId() {
326        return UUID.randomUUID().toString();
327    }
328}