/** * Copyright (c) Codice Foundation * <p/> * This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation, either version 3 of the * License, or any later version. * <p/> * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. */ package org.codice.ddf.confluence.source; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.opengis.filter.Filter; import ddf.catalog.data.Metacard; import ddf.catalog.data.types.Topic; import ddf.catalog.filter.FilterAdapter; import ddf.catalog.filter.FilterBuilder; import ddf.catalog.filter.proxy.adapter.GeotoolsFilterAdapterImpl; import ddf.catalog.filter.proxy.builder.GeotoolsFilterBuilder; public class ConfluenceFilterDelegateTest { private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm"; private FilterBuilder builder = new GeotoolsFilterBuilder(); private FilterAdapter adapter = new GeotoolsFilterAdapterImpl(); @Test public void testAttributeAnd() throws Exception { Filter filter = builder.allOf(builder.attribute("title") .is() .equalTo() .text("val1"), builder.attribute("id") .is() .equalTo() .text("val2")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("( title = \"val1\" AND id = \"val2\" )")); } @Test public void testInvalidAttributeAnd() throws Exception { Filter filter = builder.allOf(builder.attribute("title") .is() .equalTo() .text("val1"), builder.attribute("invalid") .is() .equalTo() .text("val2")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("( title = \"val1\" )")); } @Test public void testTextAnd() throws Exception { Filter filter = builder.allOf(builder.attribute("anyText") .is() .like() .text("val1"), builder.attribute("anyText") .is() .like() .text("val2")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("( ( text ~ \"val1\" ) AND ( text ~ \"val2\" ) )")); } @Test public void testAttributeOr() throws Exception { Filter filter = builder.anyOf(builder.attribute("contact.creator-name") .is() .equalTo() .text("val1"), builder.attribute("contact.contributor-name") .is() .equalTo() .text("val2")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("( creator = \"val1\" OR contributor = \"val2\" )")); } @Test public void testInvalidAttributeOr() throws Exception { Filter filter = builder.anyOf(builder.attribute("contact.creator-name") .is() .equalTo() .text("val1"), builder.attribute("invalid") .is() .equalTo() .text("val2")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("( creator = \"val1\" )")); } @Test public void testTextOr() throws Exception { Filter filter = builder.anyOf(builder.attribute("anyText") .is() .like() .text("val1"), builder.attribute("title") .is() .like() .text("val2")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("( ( text ~ \"val1\" ) OR ( title ~ \"val2\" ) )")); } @Test public void testNot() throws Exception { Filter filter = builder.not(builder.attribute("title") .is() .equalTo() .text("val1")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("NOT title = \"val1\"")); } @Test public void testMultiWordLike() throws Exception { Filter filter = builder.attribute("anyText") .is() .like() .text("multi word test"); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("( text ~ \"multi\" OR text ~ \"word\" OR text ~ \"test\" )")); } @Test public void testAfter() throws Exception { Filter filter = builder.attribute("created") .after() .date(new SimpleDateFormat(DATE_FORMAT).parse("2015-12-31 17:00")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("created > \"2015-12-31 17:00\"")); } @Test public void testBefore() throws Exception { Filter filter = builder.attribute("modified") .before() .date(new SimpleDateFormat(DATE_FORMAT).parse("2015-12-31 17:00")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("lastmodified < \"2015-12-31 17:00\"")); } @Test public void testAfterInvalidAttribute() throws Exception { Filter filter = builder.attribute("effective") .after() .date(new Date(10000)); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is(nullValue())); } @Test public void testBeforeInvalidAttribute() throws Exception { Filter filter = builder.attribute("effective") .before() .date(new Date(10000)); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is(nullValue())); } @Test public void testAfterInvalidDateAttribute() throws Exception { Filter filter = builder.attribute("id") .after() .date(new Date(10000)); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is(nullValue())); } @Test public void testBeforeInvalidDateAttribute() throws Exception { Filter filter = builder.attribute("id") .before() .date(new Date(10000)); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is(nullValue())); } @Test public void testDuring() throws Exception { Filter filter = builder.attribute("modified") .dateRange(new SimpleDateFormat(DATE_FORMAT).parse("2015-12-31 17:00"), new SimpleDateFormat(DATE_FORMAT).parse("2015-12-31 18:00")); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is("lastmodified > \"2015-12-31 17:00\" AND lastmodified < \"2015-12-31 18:00\"")); } @Test public void testDuringInvalidAttribute() throws Exception { Filter filter = builder.attribute("effective") .dateRange(new Date(10000), new Date(10000000)); assertThat(adapter.adapt(filter, new ConfluenceFilterDelegate()), is(nullValue())); } @Test public void testQueryCaptures() throws Exception { Filter filter = builder.allOf(builder.attribute("anyText") .is() .like() .text("val1"), builder.attribute(Metacard.TAGS) .is() .like() .text("confluence")); ConfluenceFilterDelegate delegate = new ConfluenceFilterDelegate(); adapter.adapt(filter, delegate); assertThat(delegate.isConfluenceQuery(), is(true)); filter = builder.allOf(builder.attribute("anyText") .is() .like() .text("val1"), builder.attribute(Metacard.TAGS) .is() .like() .text("resource")); delegate = new ConfluenceFilterDelegate(); adapter.adapt(filter, delegate); assertThat(delegate.isConfluenceQuery(), is(true)); filter = builder.attribute("anyText") .is() .like() .text("val1"); delegate = new ConfluenceFilterDelegate(); adapter.adapt(filter, delegate); assertThat(delegate.isConfluenceQuery(), is(true)); filter = builder.attribute("anyText") .is() .like() .text("*"); delegate = new ConfluenceFilterDelegate(); adapter.adapt(filter, delegate); assertThat(delegate.isWildCardQuery(), is(true)); filter = builder.allOf(builder.attribute("anyText") .is() .like() .text("*"), builder.attribute(Metacard.TITLE) .is() .like() .text("confluence")); delegate = new ConfluenceFilterDelegate(); adapter.adapt(filter, delegate); assertThat(delegate.isWildCardQuery(), is(false)); } @Test public void testLikeTransform() throws Exception { Filter filter = builder.allOf(builder.attribute(Topic.KEYWORD) .is() .like() .text("val1")); ConfluenceFilterDelegate delegate = new ConfluenceFilterDelegate(); assertThat(adapter.adapt(filter, delegate), is("( label = \"val1\" )")); } @Test public void testWildCardNotAllowed() throws Exception { Filter filter = builder.allOf(builder.attribute(Metacard.ID) .is() .like() .text("val*")); ConfluenceFilterDelegate delegate = new ConfluenceFilterDelegate(); assertThat(StringUtils.isEmpty(adapter.adapt(filter, delegate)), is(true)); } @Test public void testWildCardAllowed() throws Exception { Filter filter = builder.allOf(builder.attribute(Metacard.TITLE) .is() .equalTo() .text("val*")); ConfluenceFilterDelegate delegate = new ConfluenceFilterDelegate(); assertThat(adapter.adapt(filter, delegate), is("title = \"val*\"")); } }