// Copyright 2011 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.enterprise.connector.util.filter;
import com.google.enterprise.connector.spi.Document;
import com.google.enterprise.connector.spi.SimpleDocument;
import com.google.enterprise.connector.spi.Value;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Tests ModifyPropertyFilter.
*/
public class ModifyPropertyFilterTest extends DocumentFilterTest {
/** Creates a ModifyPropertyFilter. */
protected Document createFilter(String propName, String pattern)
throws Exception {
return createFilter(propName, pattern, false);
}
/** Creates a ModifyPropertyFilter. */
protected Document createFilter(
String propName, String pattern, boolean overwrite)
throws Exception {
return createFilter(Collections.singleton(propName), pattern, overwrite);
}
/** Creates a ModifyPropertyFilter. */
protected Document createFilter(
Set<String> propNames, String pattern, boolean overwrite)
throws Exception {
ModifyPropertyFilter factory = new ModifyPropertyFilter();
factory.setPropertyNames(propNames);
factory.setPattern(pattern);
factory.setReplacement(SPACE);
factory.setOverwrite(overwrite);
return factory.newDocumentFilter(createDocument());
}
/** Tests the Factory setters with illegal arguments. */
public void testFactoryIllegalSetterArgs() throws Exception {
ModifyPropertyFilter factory = new ModifyPropertyFilter();
try {
factory.setPropertyName(null);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
// Expected.
}
try {
factory.setPropertyName("");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
// Expected.
}
try {
factory.setPropertyNames((Set<String>) null);
fail("NullPointerException expected");
} catch (NullPointerException expected) {
// Expected.
}
try {
factory.setPattern(null);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
// Expected.
}
try {
factory.setPattern("");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
// Expected.
}
// Null or empty replacements are OK.
factory.setReplacement(null);
factory.setReplacement("");
}
/** Tests illegal state if configuration setters are not called. */
public void testFactoryIllegalState() throws Exception {
ModifyPropertyFilter factory = new ModifyPropertyFilter();
// Test with neither propertyName, nor pattern set.
checkIllegalStateFindProperty(factory);
// Test with propertyName, but no pattern set.
factory.setPropertyName(PROP1);
checkIllegalStateFindProperty(factory);
// Test with pattern, but no propertyName set.
factory = new ModifyPropertyFilter();
factory.setPattern(PATTERN);
checkIllegalStateFindProperty(factory);
}
/** Tests for non-existent property should return null. */
public void testNonExistentProperty() throws Exception {
Document filter = createFilter(PROP1, PATTERN);
assertNull(filter.findProperty("nonExistentProperty"));
}
public void testFilterNoMatchingProperty() throws Exception {
Document filter = createFilter("nonExistentProperty", PATTERN);
checkDocument(filter, createProperties());
}
/** Tests that the filter doesn't modify any Values that don't match. */
public void testFilterNoMatchingValues() throws Exception {
Document filter = createFilter(PROP1, "nonExistentPattern");
checkDocument(filter, createProperties());
}
/**
* Tests that the filter doesn't modify values in other properties
* that do match.
*/
public void testFilterOtherMatchingValuesInSingleValueProperty() throws Exception {
Document filter = createFilter(PROP2, PATTERN);
checkDocument(filter, createProperties());
}
/**
* Tests that the filter doesn't modify values in other properties
* that do match.
*/
public void testFilterOtherMatchingValuesInMultiValueProperty() throws Exception {
Document filter = createFilter(PROP4, PATTERN);
checkDocument(filter, createProperties());
}
/** Tests that the filter changes the value in the target property. */
public void testFilterMatchingValuesInSingleValueProperty() throws Exception {
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP1, valueList(TEST_STRING, CLEAN_STRING));
Document filter = createFilter(PROP1, PATTERN);
checkDocument(filter, expectedProps);
}
/** Tests that the filter changes the value in the target property. */
public void testFilterMatchingFirstValueInMultiValueProperty() throws Exception {
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP3, valueList(TEST_STRING, CLEAN_STRING, EXTRA_STRING));
Document filter = createFilter(PROP3, PATTERN);
checkDocument(filter, expectedProps);
}
/** Tests that the filter changes the value in the target property. */
public void testFilterMatchingLastValueInMultiValueProperty() throws Exception {
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP5, valueList(CLEAN_STRING, TEST_EXTRA_STRING, EXTRA_STRING));
Document filter = createFilter(PROP5, PATTERN);
checkDocument(filter, expectedProps);
}
/** Tests that the filter changes the values in the target property. */
public void testFilterMatchingValuesInMultiValueProperty() throws Exception {
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP6, valueList(TEST_STRING, CLEAN_STRING, TEST_EXTRA_STRING, EXTRA_STRING));
Document filter = createFilter(PROP6, PATTERN);
checkDocument(filter, expectedProps);
}
/** Test overwriting single value (rather than add an additional value). */
public void testOverwriteValueInSingleValueProperty() throws Exception {
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP1, valueList(CLEAN_STRING));
Document filter = createFilter(PROP1, PATTERN, true);
checkDocument(filter, expectedProps);
}
/** Test overwriting values in a multi-valued property. */
public void testOverwriteValueInMultiValueProperty() throws Exception {
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP3, valueList(CLEAN_STRING, EXTRA_STRING));
Document filter = createFilter(PROP3, PATTERN, true);
checkDocument(filter, expectedProps);
}
/** Test overwriting all the values in a multi-valued property. */
public void testOverwriteAllValuesInMultiValueProperty() throws Exception {
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP6, valueList(CLEAN_STRING, EXTRA_STRING));
Document filter = createFilter(PROP6, PATTERN, true);
checkDocument(filter, expectedProps);
}
/** Test filtering multiple properties at once. */
public void testMultipleProperties() throws Exception {
Set<String> names = new HashSet<String>();
names.add(PROP1);
names.add(PROP6);
Document filter = createFilter(names, PATTERN, true);
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP1, valueList(CLEAN_STRING));
expectedProps.put(PROP6, valueList(CLEAN_STRING, EXTRA_STRING));
checkDocument(filter, expectedProps);
}
/** Test capturing groups. */
public void testCaputuringGroups() throws Exception {
ModifyPropertyFilter factory = new ModifyPropertyFilter();
factory.setPropertyName(PROP4);
factory.setPattern("(quick|lazy)");
factory.setReplacement("very $1");
factory.setOverwrite(true);
Document filter = factory.newDocumentFilter(createDocument());
Map<String, List<Value>> expectedProps = createProperties();
expectedProps.put(PROP4,
valueList(CLEAN_STRING.replaceAll("quick", "very quick"),
EXTRA_STRING.replaceAll("lazy", "very lazy")));
checkDocument(filter, expectedProps);
}
/** Test that the null values will match an empty pattern. */
public void testNullValue() throws Exception {
ModifyPropertyFilter factory = new ModifyPropertyFilter();
factory.setPropertyName(PROP2);
factory.setPattern("\\A\\Z");
factory.setReplacement(CLEAN_STRING);
factory.setOverwrite(true);
// Nuke the property, the filter should restore it.
Map<String, List<Value>> props = createProperties();
props.put(PROP2, valueList((String) null));
Document filter = factory.newDocumentFilter(new SimpleDocument(props));
checkDocument(filter, createProperties());
}
/** Test toString(). */
public void testToString() {
ModifyPropertyFilter factory = new ModifyPropertyFilter();
factory.setPropertyName("foo");
factory.setPattern(PATTERN);
factory.setReplacement("bar");
factory.setMimeType("text/plain");
factory.setOverwrite(true);
assertEquals("ModifyPropertyFilter: ([foo] , \"[_\\.]+\" , \"bar\" , "
+ "true , \"UTF-8\" , [text/plain])",
factory.toString());
}
}