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}