/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.core.rest.resources;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.regex.Pattern;
import org.eclipse.skalli.model.Expression;
import org.eclipse.skalli.model.NoSuchPropertyException;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.services.search.QueryParseException;
import org.eclipse.skalli.services.search.SearchQuery;
import org.eclipse.skalli.testutil.TestExtension;
import org.eclipse.skalli.testutil.TestUUIDs;
import org.junit.Test;
@SuppressWarnings("nls")
public class ProjectsResourceTest {
private static final String PREFIX = "testext.";
@Test
public void testMatches() throws Exception {
SearchQuery queryParams = new SearchQuery();
queryParams.setPattern("fo.+", false);
Pattern pattern = queryParams.getPattern();
assertTrue(ProjectsResource.matches("foobar", pattern));
assertFalse(ProjectsResource.matches("", pattern));
assertFalse(ProjectsResource.matches(null, pattern));
assertTrue(ProjectsResource.matches(Arrays.asList("foo", "foobar"), pattern));
assertFalse(ProjectsResource.matches(Arrays.asList("a", "b"), pattern));
assertFalse(ProjectsResource.matches((Collection<?>)null, pattern));
assertFalse(ProjectsResource.matches(Collections.emptyList(), pattern));
assertTrue(ProjectsResource.matches(
new StringBuilder("foobar"), pattern)); // StringBuilder#toString("foobar") == "foobar" => true
assertFalse(ProjectsResource.matches(
new String[]{ "foobar" }, pattern)); // String[] is not iterable and toString() == "[foobar]" => false
}
@Test
public void testMatchesLineEndings() throws Exception {
SearchQuery queryParams = new SearchQuery();
queryParams.setPattern(".+", false);
assertTrue(ProjectsResource.matches("\nfoobar", queryParams.getPattern()));
}
@Test
public void testMatchesIgnoreCase() throws Exception {
SearchQuery queryParams = new SearchQuery();
queryParams.setPattern("FoO.+", false);
assertFalse(ProjectsResource.matches("foobar", queryParams.getPattern()));
queryParams.setPattern("FoO.+", true);
assertTrue(ProjectsResource.matches("foobar", queryParams.getPattern()));
}
@Test
public void testIsBlank() throws Exception {
assertTrue(ProjectsResource.isBlank(null));
assertTrue(ProjectsResource.isBlank(""));
assertFalse(ProjectsResource.isBlank("foobar"));
assertTrue(ProjectsResource.isBlank(Collections.emptyList()));
assertFalse(ProjectsResource.isBlank(Arrays.asList("foobar")));
assertFalse(ProjectsResource.isBlank(Arrays.asList((String)null)));
assertFalse(ProjectsResource.isBlank(Arrays.asList("")));
assertFalse(ProjectsResource.isBlank(new Integer(4711)));
}
@Test
public void testMatchesPropertyQueryOfProject() throws Exception {
ProjectsResource resource = new ProjectsResource();
Project project = createProject();
SearchQuery queryParams = new SearchQuery();
// properties of the project
project.setDescription("foobar");
queryParams.setProperty(Project.PROPERTY_DESCRIPTION);
queryParams.setPattern("foo.+", false);
assertTrue(resource.matchesPropertyQuery(project, project, queryParams));
// !property
queryParams.setProperty("!" + Project.PROPERTY_DESCRIPTION);
assertFalse(resource.matchesPropertyQuery(project, project, queryParams));
project.setDescription("");
assertTrue(resource.matchesPropertyQuery(project, project, queryParams));
project.setDescription(null);
assertTrue(resource.matchesPropertyQuery(project, project, queryParams));
queryParams.setNegate(false);
}
@Test
public void testMatchesPropertyQueryOfExtension() throws Exception {
ProjectsResource resource = new ProjectsResource();
Project project = createProject();
TestExtension ext = project.getExtension(TestExtension.class);
SearchQuery queryParams = new SearchQuery();
// non-collection property
queryParams.setProperty(PREFIX + TestExtension.PROPERTY_STR);
queryParams.setPattern("foo", false);
assertFalse(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setPattern("foo.+", false);
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
// !property
queryParams.setProperty("!" + PREFIX + TestExtension.PROPERTY_STR);
assertFalse(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setNegate(false);
// !property with null value
ext.setStr(null);
queryParams.setProperty(PREFIX + TestExtension.PROPERTY_STR);
assertFalse(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setProperty("!" + PREFIX + TestExtension.PROPERTY_STR);queryParams.setNegate(true);
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setNegate(false);
// property with collection-like value
queryParams.setProperty(PREFIX + TestExtension.PROPERTY_ITEMS);
queryParams.setPattern("b", false);
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setPattern("b.*", false);
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setPattern("x", false);
assertFalse(resource.matchesPropertyQuery(project, ext, queryParams));
// property with accessor method
queryParams.setProperty(PREFIX + "inner(a).str");
queryParams.setPattern("x", false);
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setPattern("z", false);
assertFalse(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setProperty(PREFIX + "inner('b').str()");
queryParams.setPattern(".y.", false);
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
// inner() returns null, if no inner with the given argument exists
// thus, the negated expression should match
queryParams.setProperty("!" + PREFIX + "inner(c).str()");
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setProperty("!" + PREFIX + "inner('').str()");
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
queryParams.setProperty("!" + PREFIX + "inner(' ').str()");
assertTrue(resource.matchesPropertyQuery(project, ext, queryParams));
}
@Test
public void testNoSuchProperty() throws Exception {
assertQueryParseException("inner", new Expression("inner"));
assertQueryParseException("inner()", new Expression("inner"));
assertQueryParseException("unknown", new Expression("unknown"));
assertQueryParseException("unpublished", new Expression("unpublished"));
}
private void assertQueryParseException(String query, Expression expr) {
ProjectsResource resource = new ProjectsResource();
Project project = createProject();
TestExtension ext = project.getExtension(TestExtension.class);
SearchQuery queryParams = new SearchQuery();
try {
queryParams.setProperty(PREFIX + query);
resource.matchesPropertyQuery(project, ext, queryParams);
fail("QueryParseException expected");
} catch (QueryParseException e) {
NoSuchPropertyException cause = (NoSuchPropertyException)e.getCause();
assertEquals(expr, cause.getExpression());
}
}
private Project createProject() {
Project project = new Project("bla.blubb", null, "Blubber");
project.setUuid(TestUUIDs.TEST_UUIDS[0]);
TestExtension ext = new TestExtension();
ext.setStr("foobar");
ext.addItem("a");
ext.addItem("b");
ext.addItem("c");
ext.putInner("a", new TestExtension.Inner("x"));
ext.putInner("b", new TestExtension.Inner("xyz"));
project.addExtension(ext);
return project;
}
}