/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package com.celements.web.token;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import org.easymock.Capture;
import org.junit.Before;
import org.junit.Test;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.WikiReference;
import org.xwiki.query.Query;
import org.xwiki.query.QueryException;
import org.xwiki.query.QueryManager;
import com.celements.common.test.AbstractBridgedComponentTestCase;
import com.xpn.xwiki.XWiki;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.objects.BaseObject;
import com.xpn.xwiki.store.XWikiStoreInterface;
public class NewCelementsTokenForUserCommandTest extends AbstractBridgedComponentTestCase {
private XWikiContext context;
private NewCelementsTokenForUserCommand celTokenForUserCmd;
@Before
public void setUp_NewCelementsTokenForUserCommandTest() throws Exception {
context = getContext();
celTokenForUserCmd = new NewCelementsTokenForUserCommand();
}
@Test
public void testGetNewCelementsTokenForUser_XWikiGuest() throws XWikiException {
XWiki xwiki = createMock(XWiki.class);
context.setWiki(xwiki);
expect(xwiki.exists(eq("XWiki.XWikiGuest"), same(context))).andReturn(false).once();
expect(xwiki.getDocument(eq("XWiki.XWikiGuest"), same(context))).andReturn(
new XWikiDocument()).once();
replay(xwiki);
assertNull(celTokenForUserCmd.getNewCelementsTokenForUser("XWiki.XWikiGuest", false, context));
verify(xwiki);
}
@Test
public void testRemoveOutdatedTokens_noTokens() throws QueryException {
DocumentReference dRef = new DocumentReference(getContext().getDatabase(), "X", "Y");
XWikiDocument doc = new XWikiDocument(dRef);
QueryManager queryManager = createMock(QueryManager.class);
celTokenForUserCmd.injected_queryManager = queryManager;
Query query = createMock(Query.class);
expect(queryManager.createQuery((String) anyObject(), eq(Query.XWQL))).andReturn(
query).anyTimes();
expect(query.bindValue((String) anyObject(), (String) anyObject())).andReturn(query).anyTimes();
expect(query.setWiki(eq(dRef.getLastSpaceReference().getParent().getName()))).andReturn(
query).anyTimes();
expect(query.execute()).andReturn(Collections.emptyList());
replay(query, queryManager);
celTokenForUserCmd.removeOutdatedTokens(doc);
verify(query, queryManager);
assertNull(doc.getXObjects(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName()))));
}
@Test
public void testRemoveOutdatedTokens_1new() throws QueryException {
DocumentReference dRef = new DocumentReference(getContext().getDatabase(), "X", "Y");
XWikiDocument doc = new XWikiDocument(dRef);
BaseObject obj = new BaseObject();
obj.setXClassReference(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName())));
Date afterNow = new Date();
afterNow.setTime(afterNow.getTime() + 1000000l);
obj.setDateValue("validuntil", afterNow);
doc.addXObject(obj);
QueryManager queryManager = createMock(QueryManager.class);
celTokenForUserCmd.injected_queryManager = queryManager;
Query query = createMock(Query.class);
expect(queryManager.createQuery((String) anyObject(), eq(Query.XWQL))).andReturn(
query).anyTimes();
expect(query.bindValue((String) anyObject(), (String) anyObject())).andReturn(query).anyTimes();
expect(query.setWiki(eq(dRef.getLastSpaceReference().getParent().getName()))).andReturn(
query).anyTimes();
expect(query.execute()).andReturn(Collections.emptyList());
replay(query, queryManager);
celTokenForUserCmd.removeOutdatedTokens(doc);
verify(query, queryManager);
assertEquals(1, doc.getXObjects(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName()))).size());
}
@Test
public void testRemoveOutdatedTokens_1outdated() throws QueryException {
DocumentReference dRef = new DocumentReference(getContext().getDatabase(), "X", "Y");
XWikiDocument doc = new XWikiDocument(dRef);
BaseObject obj = new BaseObject();
obj.setXClassReference(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName())));
Date beforeNow = new Date();
beforeNow.setTime(beforeNow.getTime() - 1000000l);
obj.setDateValue("validuntil", beforeNow);
doc.addXObject(obj);
QueryManager queryManager = createMock(QueryManager.class);
celTokenForUserCmd.injected_queryManager = queryManager;
Query query = createMock(Query.class);
expect(queryManager.createQuery((String) anyObject(), eq(Query.XWQL))).andReturn(
query).anyTimes();
expect(query.bindValue((String) anyObject(), (String) anyObject())).andReturn(query).anyTimes();
expect(query.setWiki(eq(dRef.getLastSpaceReference().getParent().getName()))).andReturn(
query).anyTimes();
List<Object> list = new ArrayList<Object>();
list.add("0");
expect(query.execute()).andReturn(list);
replay(query, queryManager);
celTokenForUserCmd.removeOutdatedTokens(doc);
verify(query, queryManager);
assertNull(doc.getXObjects(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName()))).get(0));
}
@Test
public void testRemoveOutdatedTokens_multiple() throws QueryException {
DocumentReference dRef = new DocumentReference(getContext().getDatabase(), "X", "Y");
XWikiDocument doc = new XWikiDocument(dRef);
BaseObject obj1 = new BaseObject();
obj1.setXClassReference(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName())));
Date afterNow = new Date();
afterNow.setTime(afterNow.getTime() + 1000000l);
obj1.setDateValue("validuntil", afterNow);
doc.addXObject(obj1);
BaseObject obj2 = new BaseObject();
obj2.setXClassReference(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName())));
Date beforeNow = new Date();
beforeNow.setTime(beforeNow.getTime() - 1000000l);
obj2.setDateValue("validuntil", beforeNow);
doc.addXObject(obj2);
BaseObject obj3 = new BaseObject();
obj3.setXClassReference(celTokenForUserCmd.getTokenClassDocRef(new WikiReference(
dRef.getLastSpaceReference().getParent().getName())));
beforeNow.setTime(beforeNow.getTime() - 1000000l);
obj3.setDateValue("validuntil", beforeNow);
doc.addXObject(obj3);
QueryManager queryManager = createMock(QueryManager.class);
celTokenForUserCmd.injected_queryManager = queryManager;
Query query = createMock(Query.class);
expect(queryManager.createQuery((String) anyObject(), eq(Query.XWQL))).andReturn(
query).anyTimes();
expect(query.bindValue((String) anyObject(), (String) anyObject())).andReturn(query).anyTimes();
expect(query.setWiki(eq(dRef.getLastSpaceReference().getParent().getName()))).andReturn(
query).anyTimes();
List<Object> list = new ArrayList<Object>();
list.add("1");
list.add(2);
expect(query.execute()).andReturn(list);
replay(query, queryManager);
celTokenForUserCmd.removeOutdatedTokens(doc);
verify(query, queryManager);
List<BaseObject> objs = doc.getXObjects(celTokenForUserCmd.getTokenClassDocRef(
new WikiReference(dRef.getLastSpaceReference().getParent().getName())));
assertEquals(3, objs.size());
assertEquals(afterNow, objs.get(0).getDateValue("validuntil"));
assertNull(objs.get(1));
assertNull(objs.get(2));
}
@Test
public void testGetNewCelementsTokenForUser_XWikiGuest_withGuestPlus() throws XWikiException,
QueryException {
XWiki xwiki = createMock(XWiki.class);
context.setWiki(xwiki);
XWikiStoreInterface store = createMock(XWikiStoreInterface.class);
BaseObject baseObject = createMock(BaseObject.class);
XWikiDocument doc = createMock(XWikiDocument.class);
String randomString = "123456789012345678901234";
expect(doc.getObject(eq("XWiki.XWikiUsers"))).andReturn(new BaseObject()).once();
expect(doc.newObject(eq("Classes.TokenClass"), same(context))).andReturn(baseObject).once();
baseObject.set(eq("tokenvalue"), eq(randomString), same(context));
expectLastCall().once();
Capture<Date> captDate = new Capture<Date>();
baseObject.set(eq("validuntil"), capture(captDate), same(context));
expectLastCall().once();
Vector<BaseObject> userObjects = new Vector<BaseObject>();
userObjects.add(baseObject);
String hql = "select str.value from BaseObject as obj, StringProperty as str ";
hql += "where obj.className='XWiki.XWikiUsers' ";
hql += "and obj.id=str.id.id ";
hql += "and str.id.name='validkey' ";
hql += "and str.value<>''";
expect(store.search(eq(hql), eq(0), eq(0), same(context))).andReturn(
new ArrayList<Object>()).once();
expect(xwiki.generateRandomString(eq(24))).andReturn(randomString).once();
expect(xwiki.getStore()).andReturn(store).once();
expect(xwiki.exists(eq("XWiki.XWikiGuestPlus"), same(context))).andReturn(true).once();
expect(xwiki.getDocument(eq("XWiki.XWikiGuestPlus"), same(context))).andReturn(doc).once();
xwiki.saveDocument(eq(doc), same(context));
expectLastCall().once();
QueryManager queryManager = createMock(QueryManager.class);
celTokenForUserCmd.injected_queryManager = queryManager;
Query query = createMock(Query.class);
expect(queryManager.createQuery((String) anyObject(), eq(Query.XWQL))).andReturn(
query).anyTimes();
expect(query.bindValue((String) anyObject(), (String) anyObject())).andReturn(query).anyTimes();
expect(query.setWiki(eq("X"))).andReturn(query).anyTimes();
expect(query.execute()).andReturn(Collections.emptyList());
expect(doc.getDocumentReference()).andReturn(new DocumentReference("X", "Y", "Z")).anyTimes();
replay(xwiki, store, baseObject, doc, query, queryManager);
assertEquals(randomString, celTokenForUserCmd.getNewCelementsTokenForUser("XWiki.XWikiGuest",
true, context));
Calendar expectedDateCal = Calendar.getInstance();
expectedDateCal.add(Calendar.DAY_OF_YEAR, 1);
// Depending on time used to run this test, there might be a small difference in
// the computed time values.
assertFalse("The token must not be valid for more than one day",
expectedDateCal.getTime().before(captDate.getValue()));
verify(xwiki, store, baseObject, doc, query, queryManager);
}
}