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}