/*
* Copyright (C) 2010 Jan Pokorsky
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.incad.kramerius.editor.server;
import cz.incad.kramerius.editor.server.HandlerTestUtils.RelationModelBuilder;
import cz.incad.kramerius.editor.server.HandlerTestUtils.GWTKrameriusObjectBuilder;
import cz.incad.kramerius.editor.share.GWTKrameriusObject.Kind;
import java.io.IOException;
import java.util.Map;
import java.util.List;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.name.Names;
import cz.incad.kramerius.FedoraAccess;
import cz.incad.kramerius.KrameriusModels;
import cz.incad.kramerius.editor.share.GWTKrameriusObject;
import cz.incad.kramerius.editor.share.rpc.GetKrameriusObjectQuery;
import cz.incad.kramerius.editor.share.rpc.GetKrameriusObjectResult;
import cz.incad.kramerius.relation.RelationModel;
import cz.incad.kramerius.relation.RelationService;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Jan Pokorsky
*/
public class GetKrameriusObjectQueryHandlerTest {
private Injector injector;
private GetKrameriusObjectQueryHandler queryHandler;
private RelationService mockRelationService;
private FedoraAccess mockFedora;
private RemoteServices mockRemotes;
private HttpServletRequest mockRequest;
public GetKrameriusObjectQueryHandlerTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
injector = Guice.createInjector(new TestGuiceModule());
mockFedora = injector.getInstance(Key.get(FedoraAccess.class, Names.named("rawFedoraAccess")));
mockRelationService = injector.getInstance(RelationService.class);
mockRemotes = injector.getInstance(RemoteServices.class);
queryHandler = injector.getInstance(GetKrameriusObjectQueryHandler.class);
}
@After
public void tearDown() {
}
/**
* Test of execute method, of class GetKrameriusObjectQueryHandler.
*/
@Test
public void testExecute() throws Exception {
//TODO: commented by PS, it will be changed
// System.out.println("execute");
// String pid = "uuid:00000000-0000-0000-0000-000000000001";
// ExecuteData testData = createTestExecuteData(pid);
//
// EasyMock.expect(mockRelationService.load(pid)).andReturn(testData.relModel);
// EasyMock.expect(mockRemotes.fetchDCName(EasyMock.anyObject(String.class)))
// // inject real implementation
// .andDelegateTo(new RemoteServicesImpl(mockFedora)).anyTimes();
// expectGetDCDataStreams(testData);
// EasyMock.replay(mockFedora, mockRelationService, mockRemotes);
//
// GetKrameriusObjectQuery action = new GetKrameriusObjectQuery(pid);
// GetKrameriusObjectResult result = queryHandler.execute(action, null);
//
// assertNotNull("result", result);
//
// GWTKrameriusObject expGkobj = testData.gkobj;
// GWTKrameriusObject gkobj = result.getResult();
// assertGWTKrameriusObjectEquals(expGkobj, gkobj);
// EasyMock.verify(mockFedora, mockRelationService, mockRemotes);
}
private static String DC_TEMPLATE =
"<oai_dc:dc xmlns:dc=\"http://purl.org/dc/elements/1.1/\""
+ " xmlns:oai_dc=\"http://www.openarchives.org/OAI/2.0/oai_dc/\""
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ " xsi:schemaLocation=\"http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd\">"
+ " <dc:title>%s</dc:title>"
+ "</oai_dc:dc>";
/** XXX this should be moved to commons test of DCUtils.titleFromDC() */
private void expectGetDCDataStreams(final ExecuteData testData) throws IOException {
final Capture<String> pidCapture = new Capture<String>();
EasyMock.expect(mockFedora.getDataStream(
EasyMock.capture(pidCapture),
EasyMock.eq("DC"))
).andAnswer(new IAnswer<InputStream>() {
@Override
public InputStream answer() throws Throwable {
String pid = pidCapture.getValue();
String title = testData.pid2title.get(pid);
if (title == null) {
throw new IllegalStateException("undefined title for pid: " + pid);
}
byte[] buf = String.format(DC_TEMPLATE, title).getBytes("UTF-8");
return new ByteArrayInputStream(buf);
}
}).anyTimes();
}
private ExecuteData createTestExecuteData(String pid) {
Map<String, String> pid2title = new HashMap<String, String>();
String title = "Monograph Title";
pid2title.put(pid, title);
String pagePid1 = "uuid:00000000-0000-0000-0000-000000000002";
String pageTitle1 = "Page1 Title";
pid2title.put(pagePid1, pageTitle1);
String pagePid2 = "uuid:00000000-0000-0000-0000-000000000003";
String pageTitle2 = "Page2 Title";
pid2title.put(pagePid2, pageTitle2);
String unitPid1 = "uuid:00000000-0000-0000-0000-000000000004";
String unitTitle1 = "Unit1 Title";
pid2title.put(unitPid1, unitTitle1);
RelationModel model = new RelationModelBuilder(pid, KrameriusModels.MONOGRAPH)
.addRelations(KrameriusModels.PAGE, pagePid1, pagePid2)
.addRelations(KrameriusModels.MONOGRAPHUNIT, unitPid1)
.toInstance();
Map<String, String> map = new HashMap<String, String>();
map.put("title", title);
GWTKrameriusObject expGkobj = new GWTKrameriusObjectBuilder(pid, Kind.MONOGRAPH, map)
.addRelations(Kind.PAGE, pagePid1, pageTitle1, pagePid2, pageTitle2)
.addRelations(Kind.MONOGRAPH_UNIT, unitPid1, unitTitle1)
.toInstance();
return new ExecuteData(model, expGkobj, pid2title);
}
private static final class ExecuteData {
RelationModel relModel;
GWTKrameriusObject gkobj;
private final Map<String, String> pid2title;
public ExecuteData(RelationModel rrm, GWTKrameriusObject gkobj, Map<String, String> pid2title) {
this.relModel = rrm;
this.gkobj = gkobj;
this.pid2title = pid2title;
}
}
private boolean assertGWTKrameriusObjectEquals(GWTKrameriusObject exp, GWTKrameriusObject res) {
assertEquals("pid", exp.getPID(), res.getPID());
assertEquals("kind", exp.getKind(), res.getKind());
assertEquals("title", exp.getProperties().get("title"), res.getProperties().get("title"));
assertRelationMapEquals(exp.getRelations(), res.getRelations());
return true;
}
private boolean assertRelationMapEquals(Map<Kind, List<GWTKrameriusObject>> exp, Map<Kind, List<GWTKrameriusObject>> res) {
if (exp != null) {
assertEquals("relation kinds", exp.keySet(), res.keySet());
for (Kind expRelKind : exp.keySet()) {
assertRelationListEquals(exp.get(expRelKind), res.get(expRelKind));
}
} else {
assertNull("relations", res);
}
return true;
}
private boolean assertRelationListEquals(List<GWTKrameriusObject> exp, List<GWTKrameriusObject> res) {
assertNotNull("relation list", res);
assertEquals("list size", exp.size(), res.size());
for (int i = 0; i < exp.size(); i++) {
GWTKrameriusObject expObj = exp.get(i);
GWTKrameriusObject resObj = res.get(i);
assertGWTKrameriusObjectEquals(expObj, resObj);
}
return true;
}
// /**
// * Test of rollback method, of class GetKrameriusObjectQueryHandler.
// */
// @Test
// public void testRollback() throws Exception {
// System.out.println("rollback");
// GetKrameriusObjectQuery action = null;
// GetKrameriusObjectResult result_2 = null;
// ExecutionContext context = null;
// GetKrameriusObjectQueryHandler instance = null;
// instance.rollback(action, result_2, context);
// // TODO review the generated test code and remove the default call to fail.
// fail("The test case is a prototype.");
// }
}