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.api; 019 020import org.fcrepo.http.commons.api.rdf.HttpIdentifierConverter; 021import org.fcrepo.search.api.Condition; 022import org.fcrepo.search.api.InvalidConditionExpressionException; 023import org.junit.Before; 024import org.junit.Test; 025import org.junit.runner.RunWith; 026import org.mockito.junit.MockitoJUnitRunner; 027 028import javax.ws.rs.core.UriBuilder; 029import java.util.ArrayList; 030import java.util.Arrays; 031 032import static org.fcrepo.kernel.api.FedoraTypes.FEDORA_ID_PREFIX; 033import static org.fcrepo.search.api.Condition.Field.FEDORA_ID; 034import static org.fcrepo.search.api.Condition.Operator.EQ; 035import static org.junit.Assert.assertEquals; 036import static org.junit.Assert.assertNotNull; 037import static org.junit.Assert.fail; 038 039/** 040 * @author dbernstein 041 */ 042@RunWith(MockitoJUnitRunner.Silent.class) 043public class FedoraSearchTest { 044 045 private HttpIdentifierConverter converter; 046 047 private static final String uriBase = "http://localhost:8080/rest"; 048 049 private static final String uriTemplate = uriBase + "/{path: .*}"; 050 051 private UriBuilder uriBuilder; 052 053 @Before 054 public void setUp() { 055 uriBuilder = UriBuilder.fromUri(uriTemplate); 056 converter = new HttpIdentifierConverter(uriBuilder); 057 } 058 059 @Test 060 public void testValidConditionsForFedoraId() throws InvalidConditionExpressionException { 061 final var conditions = new ArrayList<String>(); 062 final var objects = new String[]{"test", "/test", uriBase + "/test", FEDORA_ID_PREFIX + "/test"}; 063 for (final String object : objects) { 064 for (final Condition.Operator operator : Condition.Operator.values()) { 065 conditions.add(FEDORA_ID.name().toLowerCase() + operator.getStringValue() + object); 066 } 067 } 068 069 for (final String condition : conditions) { 070 final var con = FedoraSearch.parse(condition, converter); 071 assertNotNull(con.getField()); 072 assertNotNull(con.getOperator()); 073 assertEquals("unexpected object for condition: " + con, "info:fedora/test", 074 con.getObject()); 075 } 076 077 verifyEquals(FedoraSearch.parse("fedora_id=*", converter), FEDORA_ID, EQ, "*"); 078 } 079 080 private void verifyEquals(final Condition condition, final Condition.Field field, final Condition.Operator op, 081 final String s) { 082 assertEquals(field, condition.getField()); 083 assertEquals(op, condition.getOperator()); 084 assertEquals(s, condition.getObject()); 085 } 086 087 @Test 088 public void testValidConditionsNonFedoraId() throws InvalidConditionExpressionException { 089 final var conditions = new ArrayList<String>(); 090 final var object = "test"; 091 Arrays.stream(Condition.Field.values()).filter(x -> !x.equals(FEDORA_ID)).forEach(field -> { 092 for (final Condition.Operator operator : Condition.Operator.values()) { 093 conditions.add(field.name().toLowerCase() + operator.getStringValue() + object); 094 } 095 }); 096 097 for (final String condition : conditions) { 098 final var con = FedoraSearch.parse(condition, converter); 099 assertNotNull(con.getField()); 100 assertNotNull(con.getOperator()); 101 assertEquals("unexpected object for condition: " + con, "test", 102 con.getObject()); 103 } 104 } 105 106 @Test 107 public void testInvalidOperators() { 108 final var conditions = new String[]{ 109 "fedora_id>>/test", 110 "invalid_field=/test", 111 "fedora_id==/test" 112 }; 113 114 for (final String condition : conditions) { 115 try { 116 FedoraSearch.parse(condition, converter); 117 fail("Condition should have failed: " + condition); 118 } catch (final Exception ex) { 119 } 120 } 121 } 122 123 124}