001/*
002 * Licensed to DuraSpace under one or more contributor license agreements.
003 * See the NOTICE file distributed with this work for additional information
004 * regarding copyright ownership.
005 *
006 * DuraSpace licenses this file to you under the Apache License,
007 * Version 2.0 (the "License"); you may not use this file except in
008 * compliance with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.fcrepo.http.commons.api.rdf;
019
020import static org.fcrepo.kernel.api.FedoraTypes.FCR_ACL;
021import static org.fcrepo.kernel.api.FedoraTypes.FCR_METADATA;
022import static org.fcrepo.kernel.api.FedoraTypes.FCR_VERSIONS;
023import static org.fcrepo.kernel.api.FedoraTypes.FEDORA_ID_PREFIX;
024import static org.junit.Assert.assertEquals;
025import static org.junit.Assert.assertFalse;
026import static org.junit.Assert.assertTrue;
027
028import org.fcrepo.kernel.api.identifiers.FedoraId;
029import org.junit.Before;
030import org.junit.Test;
031import org.junit.runner.RunWith;
032import org.mockito.junit.MockitoJUnitRunner;
033
034import javax.ws.rs.core.UriBuilder;
035
036import java.util.UUID;
037
038/**
039 * @author whikloj
040 */
041@RunWith(MockitoJUnitRunner.Silent.class)
042public class HttpIdentifierConverterTest {
043
044    private HttpIdentifierConverter converter;
045
046    private static final String uriBase = "http://localhost:8080/some";
047
048    private static final String uriTemplate = uriBase + "/{path: .*}";
049
050    private UriBuilder uriBuilder;
051
052    @Before
053    public void setUp() {
054        uriBuilder = UriBuilder.fromUri(uriTemplate);
055        converter = new HttpIdentifierConverter(uriBuilder);
056    }
057
058    @Test(expected = IllegalArgumentException.class)
059    public void testBlankUri() {
060        final String testUri = "";
061        converter.toInternalId(testUri);
062    }
063
064    /**
065     * Test that a blank string toDomain becomes a /
066     */
067    @Test
068    public void testBlankToDomain() {
069        final String testUri = "";
070        final String fedoraUri = converter.toDomain(testUri);
071        assertEquals(uriBase + "/", fedoraUri);
072    }
073
074    @Test(expected = IllegalArgumentException.class)
075    public void testBlankId() {
076        final String testId = "";
077        final String fedoraId = converter.toExternalId(testId);
078    }
079
080    @Test
081    public void testinExternalDomainSuccess() {
082        final String testURI = uriBase + "/someurl/thatWeWant";
083        assertTrue(converter.inExternalDomain(testURI));
084    }
085
086    @Test
087    public void testinExternalDomainFailure() {
088        final String testURI = "http://someplace.com/whatHappened";
089        assertFalse(converter.inExternalDomain(testURI));
090    }
091
092    @Test
093    public void testinInternalDomainSuccess() {
094        final String testID = FEDORA_ID_PREFIX + "/myLittleResource";
095        assertTrue(converter.inInternalDomain(testID));
096    }
097
098    @Test
099    public void testinInternalDomainFailure() {
100        final String testID = "info:test/myLittleResource";
101        assertFalse(converter.inInternalDomain(testID));
102    }
103
104    @Test
105    public void testRootUriWithTrailingSlash() {
106        final String testUri = uriBase + "/";
107        final String fedoraId = converter.toInternalId(testUri);
108        assertEquals(FEDORA_ID_PREFIX, fedoraId);
109        final String httpUri = converter.toExternalId(fedoraId);
110        assertEquals(testUri, httpUri);
111    }
112
113    @Test
114    public void testRootUriWithoutTrailingSlash() {
115        final String testUri = uriBase;
116        final String fedoraId = converter.toInternalId(testUri);
117        assertEquals(FEDORA_ID_PREFIX, fedoraId);
118        final String httpUri = converter.toExternalId(fedoraId);
119        // We also return the trailing slash.
120        assertEquals(testUri + "/", httpUri);
121    }
122
123    @Test
124    public void testFirstLevel() {
125        final String baseUid = getUniqueId();
126        final String testUri = uriBase + "/" + baseUid;
127        final String fedoraId = converter.toInternalId(testUri);
128        assertEquals(FEDORA_ID_PREFIX + "/" + baseUid, fedoraId);
129        final String httpUri = converter.toExternalId(fedoraId);
130        assertEquals(testUri, httpUri);
131    }
132
133    @Test
134    public void testFirstLevelExternalPath() {
135        final String baseUid = getUniqueId();
136        final String testUri = "/" + baseUid;
137        final String fedoraId = converter.toInternalId(converter.toDomain(testUri));
138        assertEquals(FEDORA_ID_PREFIX + "/" + baseUid, fedoraId);
139        final String httpUri = converter.toExternalId(fedoraId);
140        assertEquals(uriBase + testUri, httpUri);
141    }
142
143    @Test
144    public void testFirstLevelWithAcl() {
145        final String testUri = "/" + getUniqueId() + "/" + FCR_ACL;
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 testFirstLevelWithMetadata() {
156        final String baseUid = getUniqueId();
157        final String testUri = "/" + baseUid + "/" + FCR_METADATA;
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 testFirstLevelWithVersions() {
168        final String baseUid = getUniqueId();
169        final String testUri = "/" + baseUid + "/" + FCR_VERSIONS;
170        final String external = uriBase + testUri;
171        final String internal = FEDORA_ID_PREFIX + testUri;
172        final String fedoraId = converter.toInternalId(external);
173        assertEquals(internal, fedoraId);
174        final String httpUri = converter.toExternalId(internal);
175        assertEquals(external, httpUri);
176    }
177
178    @Test
179    public void testFirstLevelWithMemento() {
180        final String memento = "20190926133245";
181        final String baseUid = getUniqueId();
182        final String testUri = "/" + baseUid + "/" + FCR_VERSIONS + "/" + memento;
183        final String external = uriBase + testUri;
184        final String internal = FEDORA_ID_PREFIX + testUri;
185        final String fedoraId = converter.toInternalId(external);
186        assertEquals(internal, fedoraId);
187        final String httpUri = converter.toExternalId(internal);
188        assertEquals(external, httpUri);
189    }
190
191    @Test
192    public void testSecondLevel() {
193        final String testUri = "/" + getUniqueId() + "/" + getUniqueId();
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 testSecondLevelWithAcl() {
204        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
205        final String testUri = baseUid + "/" + FCR_ACL;
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 testSecondLevelWithMetadata() {
216        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
217        final String testUri = baseUid + "/" + FCR_METADATA;
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 testSecondLevelWithVersions() {
228        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
229        final String testUri = baseUid + "/" + FCR_VERSIONS;
230        final String external = uriBase + testUri;
231        final String internal = FEDORA_ID_PREFIX + testUri;
232        final String fedoraId = converter.toInternalId(external);
233        assertEquals(internal, fedoraId);
234        final String httpUri = converter.toExternalId(internal);
235        assertEquals(external, httpUri);
236    }
237
238    @Test
239    public void testSecondLevelWithMemento() {
240        final String memento = "20190926133245";
241        final String baseUid = "/" + getUniqueId() + "/" + getUniqueId();
242        final String testUri = baseUid + "/" + FCR_VERSIONS + "/" + memento;
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    @Test
252    public void testItemWithDoubleAcl() {
253        final String baseUid = getUniqueId();
254        final String testUri = "/" + baseUid + "/" + FCR_ACL + "/" + FCR_ACL;
255        final String external = uriBase + testUri;
256        final String internal = FEDORA_ID_PREFIX + testUri;
257        final String fedoraId = converter.toInternalId(external);
258        assertEquals(internal, fedoraId);
259        final String httpUri = converter.toExternalId(internal);
260        assertEquals(external, httpUri);
261    }
262
263    /**
264     * 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
265     */
266    @Test
267    public void testWithEncodedColon() {
268        final String externalOriginal = uriBase + "/some%3Atest";
269        final String internal = FEDORA_ID_PREFIX + "/some:test";
270        final String externalNew = uriBase + "/some:test";
271        final String fedoraId = converter.toInternalId(externalOriginal);
272        assertEquals(internal, fedoraId);
273        final String httpUri = converter.toExternalId(internal);
274        assertEquals(externalNew, httpUri);
275    }
276
277
278    @Test
279    public void testBlankPathToId() {
280        final String testUri = "";
281        final FedoraId fedoraUri = converter.pathToInternalId(testUri);
282        assertEquals(FedoraId.getRepositoryRootId(), fedoraUri);
283    }
284
285    @Test
286    public void testSinglePathToId() {
287        final String externalOriginal = "/object";
288        final FedoraId internal = FedoraId.create("object");
289        final FedoraId id = converter.pathToInternalId(externalOriginal);
290        assertEquals(internal, id);
291        // Without leading slash
292        final String externalOriginal2 = "object";
293        final FedoraId id2 = converter.pathToInternalId(externalOriginal2);
294        assertEquals(internal, id2);
295    }
296
297    @Test
298    public void testDoublePathToId() {
299        final String externalOriginal = "/object/child";
300        final FedoraId internal = FedoraId.create("object", "child");
301        final FedoraId id = converter.pathToInternalId(externalOriginal);
302        assertEquals(internal, id);
303        // Without leading slash
304        final String externalOriginal2 = "object/child";
305        final FedoraId id2 = converter.pathToInternalId(externalOriginal2);
306        assertEquals(internal, id2);
307    }
308
309    /**
310     * Utility function to get a UUID.
311     * @return a UUID.
312     */
313    private static String getUniqueId() {
314        return UUID.randomUUID().toString();
315    }
316}