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}