package com.celements.lastChanged;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.SpaceReference;
import org.xwiki.model.reference.WikiReference;
import org.xwiki.query.Query;
import org.xwiki.query.QueryManager;
import com.celements.common.test.AbstractBridgedComponentTestCase;
import com.celements.model.access.IModelAccessFacade;
import com.celements.web.service.IWebUtilsService;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.web.Utils;
public class LastChangedServiceTest extends AbstractBridgedComponentTestCase {
private LastChangedService lastChangedServ;
private XWikiContext context;
private QueryManager queryManagerMock;
private IModelAccessFacade modelAccessMock;
private IWebUtilsService webUtilsMock;
private String mySpaceName;
private SpaceReference spaceRef;
@Before
public void setUp_AbstractBridgedComponentTestCase() throws Exception {
lastChangedServ = (LastChangedService) Utils.getComponent(ILastChangedRole.class);
context = getContext();
queryManagerMock = createMockAndAddToDefault(QueryManager.class);
lastChangedServ.queryManager = queryManagerMock;
modelAccessMock = createMockAndAddToDefault(IModelAccessFacade.class);
lastChangedServ.modelAccess = modelAccessMock;
webUtilsMock = createMockAndAddToDefault(IWebUtilsService.class);
lastChangedServ.webUtilsService = webUtilsMock;
mySpaceName = "mySpace";
spaceRef = new SpaceReference(mySpaceName, new WikiReference(context.getDatabase()));
expect(webUtilsMock.getDefaultLanguage(eq(spaceRef))).andReturn("de").anyTimes();
}
@Test
public void testInternal_getLastChangeDate_emptyDocumentsList() throws Exception {
Query mockQuery = createMockAndAddToDefault(Query.class);
expect(queryManagerMock.createQuery(isA(String.class), eq("xwql"))).andReturn(mockQuery).once();
expect(mockQuery.bindValue(eq("spaceName"), eq(mySpaceName))).andReturn(mockQuery).once();
expect(mockQuery.setLimit(eq(1))).andReturn(mockQuery).once();
expect(mockQuery.execute()).andReturn(Collections.emptyList()).once();
replayDefault();
Date lastUpdated = lastChangedServ.internal_getLastChangeDate(spaceRef);
verifyDefault();
assertNull(lastUpdated);
assertTrue(lastChangedServ.lastUpdatedWikiCache.isEmpty());
assertTrue(lastChangedServ.lastUpdatedSpaceCache.isEmpty());
}
@Test
public void testInternal_getLastChangeDate_emptyLangResponse() throws Exception {
Query mockQuery = createMockAndAddToDefault(Query.class);
expect(queryManagerMock.createQuery(isA(String.class), eq("xwql"))).andReturn(mockQuery).once();
expect(mockQuery.bindValue(eq("spaceName"), eq(mySpaceName))).andReturn(mockQuery).once();
expect(mockQuery.setLimit(eq(1))).andReturn(mockQuery).once();
DocumentReference docRef = new DocumentReference("myDoc", spaceRef);
String firstDocFN = mySpaceName + ".myDoc";
expect(webUtilsMock.resolveDocumentReference(eq(firstDocFN))).andReturn(docRef).anyTimes();
Object[] firstRow = new Object[] { firstDocFN, "" };
List<Object[]> testResult = Arrays.<Object[]>asList(firstRow);
expect(mockQuery.<Object[]>execute()).andReturn(testResult).once();
expect(modelAccessMock.exists(eq(docRef))).andReturn(true).anyTimes();
XWikiDocument doc = new XWikiDocument(docRef);
Date expectedUpdated = new Date();
doc.setDate(expectedUpdated);
expect(modelAccessMock.getDocument(eq(docRef), eq("de"))).andReturn(doc).once();
replayDefault();
Date lastUpdated = lastChangedServ.internal_getLastChangeDate(spaceRef);
verifyDefault();
assertEquals(expectedUpdated, lastUpdated);
}
@Test
public void testInternal_getLastChangeDate_nullLangResponse() throws Exception {
String mySpaceName = "mySpace";
SpaceReference spaceRef = new SpaceReference(mySpaceName, new WikiReference(context
.getDatabase()));
Query mockQuery = createMockAndAddToDefault(Query.class);
expect(queryManagerMock.createQuery(isA(String.class), eq("xwql"))).andReturn(mockQuery).once();
expect(mockQuery.bindValue(eq("spaceName"), eq(mySpaceName))).andReturn(mockQuery).once();
expect(mockQuery.setLimit(eq(1))).andReturn(mockQuery).once();
DocumentReference docRef = new DocumentReference("myDoc", spaceRef);
String firstDocFN = mySpaceName + ".myDoc";
expect(webUtilsMock.resolveDocumentReference(eq(firstDocFN))).andReturn(docRef).anyTimes();
Object[] firstRow = new Object[] { firstDocFN, null };
List<Object[]> testResult = Arrays.<Object[]>asList(firstRow);
expect(mockQuery.<Object[]>execute()).andReturn(testResult).once();
XWikiDocument doc = new XWikiDocument(docRef);
Date expectedUpdated = new Date();
doc.setDate(expectedUpdated);
expect(modelAccessMock.getDocument(eq(docRef), eq("de"))).andReturn(doc).once();
replayDefault();
Date lastUpdated = lastChangedServ.internal_getLastChangeDate(spaceRef);
verifyDefault();
assertEquals(expectedUpdated, lastUpdated);
}
}