package com.celements.query; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.HashMap; import java.util.Map; import org.easymock.Capture; import org.junit.Before; import org.junit.Test; import org.xwiki.model.reference.WikiReference; import com.celements.common.test.AbstractBridgedComponentTestCase; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.XWikiException; import com.xpn.xwiki.store.XWikiHibernateBaseStore.HibernateCallback; import com.xpn.xwiki.store.XWikiHibernateStore; import com.xpn.xwiki.web.Utils; public class QueryExecutionServiceTest extends AbstractBridgedComponentTestCase { private QueryExecutionService queryExecService; private XWikiHibernateStore storeMock; @Before public void setUp_CelementsWebScriptServiceTest() throws Exception { queryExecService = (QueryExecutionService) Utils.getComponent(IQueryExecutionServiceRole.class); storeMock = createMockAndAddToDefault(XWikiHibernateStore.class); expect(getWikiMock().getHibernateStore()).andReturn(storeMock).anyTimes(); } @Test public void testExecuteWriteHQL() throws Exception { String hql = "someHQL"; Map<String, Object> binds = new HashMap<String, Object>(); binds.put("key", "someVal"); int ret = 5; Capture<HibernateCallback<Integer>> hibCallbackCapture = new Capture<HibernateCallback<Integer>>(); expect(storeMock.executeWrite(same(getContext()), eq(true), capture( hibCallbackCapture))).andReturn(ret).once(); assertEquals("xwikidb", getContext().getDatabase()); replayDefault(); assertEquals(ret, queryExecService.executeWriteHQL(hql, binds)); verifyDefault(); assertEquals("xwikidb", getContext().getDatabase()); ExecuteWriteCallback callback = (ExecuteWriteCallback) hibCallbackCapture.getValue(); assertEquals(hql, callback.getHQL()); assertNotSame(binds, callback.getBinds()); assertEquals(binds, callback.getBinds()); } @Test @SuppressWarnings("unchecked") public void testExecuteWriteHQL_otherWiki() throws Exception { String hql = "someHQL"; Map<String, Object> binds = new HashMap<String, Object>(); binds.put("key", "someVal"); WikiReference wikiRef = new WikiReference("otherdb"); int ret = 5; Capture<XWikiContext> contextCapture = new ClonedContextCapture(); expect(storeMock.executeWrite(capture(contextCapture), eq(true), anyObject( HibernateCallback.class))).andReturn(ret).once(); assertEquals("xwikidb", getContext().getDatabase()); replayDefault(); assertEquals(ret, queryExecService.executeWriteHQL(hql, binds, wikiRef)); verifyDefault(); assertEquals("xwikidb", getContext().getDatabase()); XWikiContext clonedContext = contextCapture.getValue(); assertEquals(wikiRef.getName(), clonedContext.get("wiki")); clonedContext.setDatabase("xwikidb"); assertEquals(getContext(), contextCapture.getValue()); } @Test @SuppressWarnings("unchecked") public void testExecuteWriteHQL_XWE() throws Exception { String hql = "someHQL"; Map<String, Object> binds = new HashMap<String, Object>(); WikiReference wikiRef = new WikiReference("otherdb"); Throwable cause = new XWikiException(); expect(storeMock.executeWrite(same(getContext()), eq(true), anyObject( HibernateCallback.class))).andThrow(cause).once(); assertEquals("xwikidb", getContext().getDatabase()); replayDefault(); try { queryExecService.executeWriteHQL(hql, binds, wikiRef); } catch (XWikiException xwe) { assertSame(cause, xwe); } verifyDefault(); assertEquals("xwikidb", getContext().getDatabase()); } private class ClonedContextCapture extends Capture<XWikiContext> { private static final long serialVersionUID = 1L; @Override public void setValue(XWikiContext context) { super.setValue((XWikiContext) context.clone()); } } }