package com.celements.docform;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import org.junit.Before;
import org.junit.Test;
import org.xwiki.model.reference.DocumentReference;
import com.celements.common.test.AbstractBridgedComponentTestCase;
import com.celements.web.service.IWebUtilsService;
import com.xpn.xwiki.web.Utils;
public class DocFormRequestKeyParserTest extends AbstractBridgedComponentTestCase {
private String db;
private DocFormRequestKeyParser parser;
@Before
public void setUp_DocFormRequestKeyParserTest() throws Exception {
db = getContext().getDatabase();
parser = new DocFormRequestKeyParser();
}
@Test
public void testParse_whitelist_content() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
String fieldName = "content";
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, null);
assertKey(key, keyString, docRef, null, false, null, fieldName);
}
@Test
public void testParse_whitelist_content_noFullName() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
String keyString = "content";
DocFormRequestKey key = parser.parse(keyString, docRef);
assertKey(key, keyString, docRef, null, false, null, keyString);
}
@Test
public void testParse_whitelist_title() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
String fieldName = "title";
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, null);
assertKey(key, keyString, docRef, null, false, null, fieldName);
}
@Test
public void testParse_whitelist_title_noFullName() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
String keyString = "title";
DocFormRequestKey key = parser.parse(keyString, docRef);
assertKey(key, keyString, docRef, null, false, null, keyString);
}
@Test
public void testParse_whitelist_other() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
String fieldName = "asdf";
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + fieldName;
try {
parser.parse(keyString, null);
fail("expecting IllegalArgumentException, 'asdf' is not valid keyword");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void testParse_obj() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String fieldName = "asdf";
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + serialize(classRef)
+ DocFormRequestKeyParser.KEY_DELIM + objNb + DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, null);
assertKey(key, keyString, docRef, classRef, false, objNb, fieldName);
}
@Test
public void testParse_obj_noFullName() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String fieldName = "asdf";
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + objNb
+ DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, docRef);
assertKey(key, keyString, docRef, classRef, false, objNb, fieldName);
}
@Test
public void testParse_obj_local() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String fieldName = "asdf";
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + serialize(classRef)
+ DocFormRequestKeyParser.KEY_DELIM + objNb + DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, null);
// IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4
docRef = new DocumentReference("xwikidb", docRef.getLastSpaceReference().getName(),
docRef.getName());
// IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4
classRef = new DocumentReference("xwikidb", classRef.getLastSpaceReference().getName(),
classRef.getName());
assertKey(key, keyString, docRef, classRef, false, objNb, fieldName);
}
@Test
public void testParse_obj_longFieldName() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String fieldName = "asdf_asdf2";
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + objNb
+ DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, docRef);
assertKey(key, keyString, docRef, classRef, false, objNb, fieldName);
}
@Test
public void testParse_obj_create() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = -3;
String fieldName = "asdf";
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + objNb
+ DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, docRef);
assertKey(key, keyString, docRef, classRef, false, objNb, fieldName);
}
@Test
public void testParse_obj_delete() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String fieldName = "asdf";
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + "^" + objNb
+ DocFormRequestKeyParser.KEY_DELIM + fieldName;
DocFormRequestKey key = parser.parse(keyString, docRef);
assertKey(key, keyString, docRef, classRef, true, objNb, fieldName);
}
@Test
public void testParse_obj_delete_noFieldName() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + "^" + objNb
+ DocFormRequestKeyParser.KEY_DELIM;
DocFormRequestKey key = parser.parse(keyString, docRef);
assertKey(key, keyString, docRef, classRef, true, objNb, "");
}
@Test
public void testParse_obj_delete_negative() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = -3;
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + "^" + objNb;
try {
parser.parse(keyString, docRef);
fail("expecting IllegalArgumentException, delete and create not allowed together");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void testParse_obj_invalid_fullName() {
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String fieldName = "asdf";
String keyString = "SpaceDoc" + DocFormRequestKeyParser.KEY_DELIM + serialize(classRef)
+ DocFormRequestKeyParser.KEY_DELIM + objNb + DocFormRequestKeyParser.KEY_DELIM + fieldName;
try {
parser.parse(keyString, null);
fail("expecting IllegalArgumentException, invalid fullName");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void testParse_obj_invalid_className() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
Integer objNb = 3;
String fieldName = "asdf";
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + "ClassesClass"
+ DocFormRequestKeyParser.KEY_DELIM + objNb + DocFormRequestKeyParser.KEY_DELIM + fieldName;
try {
parser.parse(keyString, docRef);
fail("expecting IllegalArgumentException, invalid fullName");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void testParse_obj_invalid_objNb() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
String fieldName = "asdf";
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + serialize(classRef)
+ DocFormRequestKeyParser.KEY_DELIM + "3a" + DocFormRequestKeyParser.KEY_DELIM + fieldName;
try {
parser.parse(keyString, docRef);
fail("expecting IllegalArgumentException, invalid fullName");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void testParse_obj_invalid_fieldName() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb = 3;
String keyString = serialize(docRef) + DocFormRequestKeyParser.KEY_DELIM + serialize(classRef)
+ DocFormRequestKeyParser.KEY_DELIM + objNb + DocFormRequestKeyParser.KEY_DELIM;
try {
parser.parse(keyString, docRef);
fail("expecting IllegalArgumentException, invalid fullName");
} catch (IllegalArgumentException iae) {
// expected
}
}
@Test
public void testParse_skip_blank() {
String keyString = "";
assertNull(parser.parse(keyString, null));
}
@Test
public void testParse_skip_template() {
String keyString = "template";
assertNull(parser.parse(keyString, null));
}
@Test
public void testParse_skip_withDelim() {
String keyString = "template" + DocFormRequestKeyParser.KEY_DELIM + "other";
assertNull(parser.parse(keyString, null));
}
@Test
public void testParse_skip_withDelims_two() {
String keyString = "template" + DocFormRequestKeyParser.KEY_DELIM + "other1"
+ DocFormRequestKeyParser.KEY_DELIM + "other2";
assertNull(parser.parse(keyString, null));
}
@Test
public void testParse_skip_withDelims_multiple() {
String keyString = "template" + DocFormRequestKeyParser.KEY_DELIM + "other1"
+ DocFormRequestKeyParser.KEY_DELIM + "other2" + DocFormRequestKeyParser.KEY_DELIM
+ "other3" + DocFormRequestKeyParser.KEY_DELIM + "other4"
+ DocFormRequestKeyParser.KEY_DELIM + "other5";
assertNull(parser.parse(keyString, null));
}
@Test
public void testParse_skip_nb() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + "nb";
assertNull(parser.parse(keyString, docRef));
}
@Test
public void testParse_multiple() {
DocumentReference docRef = new DocumentReference(db, "Space", "Doc");
DocumentReference classRef = new DocumentReference(db, "Classes", "Class");
Integer objNb1 = 3;
String keyString = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + "^" + objNb1;
String keyString1 = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + objNb1
+ DocFormRequestKeyParser.KEY_DELIM + "asdf1";
String keyString2 = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + objNb1
+ DocFormRequestKeyParser.KEY_DELIM + "asdf2";
String keyString3 = serialize(classRef) + DocFormRequestKeyParser.KEY_DELIM + objNb1
+ DocFormRequestKeyParser.KEY_DELIM + "asdf3";
String keyStringContent = "content";
DocumentReference classRef2 = new DocumentReference(db, "Classes", "OtherClass");
Integer objNb2 = 5;
String fieldName2 = "asdf";
String keyStringOther = serialize(classRef2) + DocFormRequestKeyParser.KEY_DELIM + objNb2
+ DocFormRequestKeyParser.KEY_DELIM + fieldName2;
Collection<DocFormRequestKey> keys = parser.parse(Arrays.asList(keyString1, keyString2,
keyString, keyString3, keyStringContent, keyStringOther), docRef);
assertEquals(3, keys.size());
Iterator<DocFormRequestKey> iter = keys.iterator();
assertKey(iter.next(), keyString, docRef, classRef, true, objNb1, "");
assertKey(iter.next(), keyStringContent, docRef, null, false, null, keyStringContent);
assertKey(iter.next(), keyStringOther, docRef, classRef2, false, objNb2, fieldName2);
}
private void assertKey(DocFormRequestKey key, String keyString, DocumentReference docRef,
DocumentReference classRef, boolean remove, Integer objNb, String fieldName) {
assertEquals(keyString, key.getKeyString());
assertEquals(docRef, key.getDocRef());
assertEquals(classRef, key.getClassRef());
assertSame(remove, key.isRemove());
assertEquals(objNb, key.getObjNb());
assertEquals(fieldName, key.getFieldName());
}
private String serialize(DocumentReference docRef) {
return Utils.getComponent(IWebUtilsService.class).getRefLocalSerializer().serialize(docRef);
}
}