package org.molgenis.omx.plugins;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.AssertJUnit.assertEquals;
import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collections;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.codec.digest.DigestUtils;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.QueryRule;
import org.molgenis.framework.db.QueryRule.Operator;
import org.molgenis.framework.server.MolgenisRequest;
import org.molgenis.framework.ui.ScreenController;
import org.molgenis.observ.Category;
import org.molgenis.observ.DataSet;
import org.molgenis.observ.ObservableFeature;
import org.molgenis.observ.Protocol;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.testng.annotations.Test;
public class ProtocolViewerControllerTest
{
@Test
public void handleRequest_getDataset_protocol() throws Exception
{
// mock db
Database db = mock(Database.class);
DataSet dataSet = new DataSet();
dataSet.setId(1);
dataSet.setName("dataset");
dataSet.setProtocolUsed(2);
Protocol protocol = new Protocol();
protocol.setId(2);
protocol.setName("protocol");
protocol.setFeatures_Id(Arrays.asList(3, 4));
ObservableFeature feature1 = new ObservableFeature();
feature1.setId(3);
feature1.setName("feature1");
ObservableFeature feature2 = new ObservableFeature();
feature2.setId(4);
feature2.setName("feature2");
when(db.find(DataSet.class, new QueryRule(DataSet.ID, Operator.EQUALS, 1))).thenReturn(
Collections.singletonList(dataSet));
when(db.find(Protocol.class, new QueryRule(Protocol.ID, Operator.EQUALS, 2))).thenReturn(
Collections.singletonList(protocol));
when(db.find(ObservableFeature.class, new QueryRule(ObservableFeature.ID, Operator.IN, Arrays.asList(3, 4))))
.thenReturn(Arrays.asList(feature1, feature2));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
when(httpServletRequest.getMethod()).thenReturn("GET");
MolgenisRequest request = new MolgenisRequest(httpServletRequest);
request.set("datasetid", "1");
request.set("__action", "download_json_getdataset");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
controller.handleRequest(db, request, bos);
String output = new String(bos.toByteArray(), Charset.forName("UTF-8"));
String expected = "{\"id\":1,\"name\":\"dataset\",\"protocol\":{\"id\":2,\"name\":\"protocol\",\"features\":[{\"id\":3,\"name\":\"feature1\",\"dataType\":\"string\"},{\"id\":4,\"name\":\"feature2\",\"dataType\":\"string\"}]}}";
assertEquals(output, expected);
}
finally
{
bos.close();
}
}
@Test
public void handleRequest_getDataset_noProtocol() throws Exception
{
// mock db
Database db = mock(Database.class);
DataSet dataSet = new DataSet();
dataSet.setId(1);
dataSet.setName("dataset");
when(db.find(DataSet.class, new QueryRule(DataSet.ID, Operator.EQUALS, 1))).thenReturn(
Collections.singletonList(dataSet));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
when(httpServletRequest.getMethod()).thenReturn("GET");
MolgenisRequest request = new MolgenisRequest(httpServletRequest);
request.set("datasetid", "1");
request.set("__action", "download_json_getdataset");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
controller.handleRequest(db, request, bos);
String output = new String(bos.toByteArray(), Charset.forName("UTF-8"));
String expected = "{\"id\":1,\"name\":\"dataset\"}";
assertEquals(output, expected);
}
finally
{
bos.close();
}
}
@Test
public void handleRequest_getFeature_category() throws Exception
{
// mock db
Database db = mock(Database.class);
ObservableFeature feature = new ObservableFeature();
feature.setId(1);
feature.setName("feature");
feature.setIdentifier("featureid1");
Category category1 = new Category();
category1.setId(2);
category1.setValueCode("code1");
category1.setName("label1");
category1.setDescription("description1");
Category category2 = new Category();
category2.setId(2);
category2.setValueCode("code2");
category2.setName("label2");
category2.setDescription("description2");
when(db.find(ObservableFeature.class, new QueryRule(ObservableFeature.ID, Operator.EQUALS, 1))).thenReturn(
Collections.singletonList(feature));
when(
db.find(Category.class, new QueryRule(Category.OBSERVABLEFEATURE_IDENTIFIER, Operator.EQUALS,
"featureid1"))).thenReturn(Arrays.asList(category1, category2));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
when(httpServletRequest.getMethod()).thenReturn("GET");
MolgenisRequest request = new MolgenisRequest(httpServletRequest);
request.set("featureid", "1");
request.set("__action", "download_json_getfeature");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
controller.handleRequest(db, request, bos);
String output = new String(bos.toByteArray(), Charset.forName("UTF-8"));
String expected = "{\"id\":1,\"name\":\"feature\",\"dataType\":\"string\",\"categories\":[{\"id\":2,\"code\":\"code1\",\"label\":\"label1\",\"description\":\"description1\"},{\"id\":2,\"code\":\"code2\",\"label\":\"label2\",\"description\":\"description2\"}]}";
assertEquals(output, expected);
}
finally
{
bos.close();
}
}
@Test
public void handleRequest_getFeature_noCategory() throws Exception
{
// mock db
Database db = mock(Database.class);
ObservableFeature feature = new ObservableFeature();
feature.setId(1);
feature.setName("feature");
when(db.find(ObservableFeature.class, new QueryRule(ObservableFeature.ID, Operator.EQUALS, 1))).thenReturn(
Collections.singletonList(feature));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
when(httpServletRequest.getMethod()).thenReturn("GET");
MolgenisRequest request = new MolgenisRequest(httpServletRequest);
request.set("featureid", "1");
request.set("__action", "download_json_getfeature");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
controller.handleRequest(db, request, bos);
String output = new String(bos.toByteArray(), Charset.forName("UTF-8"));
String expected = "{\"id\":1,\"name\":\"feature\",\"dataType\":\"string\"}";
assertEquals(output, expected);
}
finally
{
bos.close();
}
}
@Test
public void handleRequest_download_emeasure() throws Exception
{
// mock db
Database db = mock(Database.class);
ObservableFeature feature1 = new ObservableFeature();
feature1.setId(1);
feature1.setName("feature1");
feature1.setIdentifier("featureid1");
ObservableFeature feature2 = new ObservableFeature();
feature2.setId(2);
feature2.setName("feature2");
feature2.setIdentifier("featureid2");
ObservableFeature feature3 = new ObservableFeature();
feature3.setId(3);
feature3.setName("feature3");
feature3.setIdentifier("featureid3");
when(db.find(ObservableFeature.class, new QueryRule(ObservableFeature.ID, Operator.IN, Arrays.asList(1, 2, 3))))
.thenReturn(Arrays.asList(feature1, feature2, feature3));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
MockHttpServletRequest httpRequest = new MockHttpServletRequest();
httpRequest.setMethod("GET");
MolgenisRequest request = mock(MolgenisRequest.class);
when(request.getRequest()).thenReturn(httpRequest);
when(request.getString("features")).thenReturn("1,2,3");
when(request.getAction()).thenReturn("download_emeasure");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
when(request.getResponse()).thenReturn(httpResponse);
controller.handleRequest(db, request);
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<QualityMeasureDocument classCode=\"CONTAINER\" moodCode=\"DEF\"\n"
+ " xmlns=\"urn:hl7-org:v3\"\n"
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+ " xsi:schemaLocation=\"urn:hl7-org:v3 multicacheschemas/REPC_MT000100UV01.xsd\" xsi:type=\"REPC_MT000100UV01.Organizer\">\n"
+ " <subjectOf>\n" + " <measureAttribute>\n"
+ " <code code=\"feature1\" codeSystem=\"TBD\" displayName=\"null\"/>\n"
+ " <value code=\"dunno\" codeSystem=\"TBD\"\n"
+ " displayName=\"This should be the mappingsname\" xsi:type=\"string\"/>\n"
+ " </measureAttribute>\n" + " </subjectOf>\n" + " <subjectOf>\n" + " <measureAttribute>\n"
+ " <code code=\"feature2\" codeSystem=\"TBD\" displayName=\"null\"/>\n"
+ " <value code=\"dunno\" codeSystem=\"TBD\"\n"
+ " displayName=\"This should be the mappingsname\" xsi:type=\"string\"/>\n"
+ " </measureAttribute>\n" + " </subjectOf>\n" + " <subjectOf>\n" + " <measureAttribute>\n"
+ " <code code=\"feature3\" codeSystem=\"TBD\" displayName=\"null\"/>\n"
+ " <value code=\"dunno\" codeSystem=\"TBD\"\n"
+ " displayName=\"This should be the mappingsname\" xsi:type=\"string\"/>\n"
+ " </measureAttribute>\n" + " </subjectOf>\n" + "</QualityMeasureDocument>\n";
assertEquals(httpResponse.getContentAsString(), expected);
}
@Test
public void handleRequest_download_emeasure_noFeatures() throws Exception
{
// mock db
Database db = mock(Database.class);
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
MockHttpServletRequest httpRequest = new MockHttpServletRequest();
httpRequest.setMethod("GET");
MolgenisRequest request = mock(MolgenisRequest.class);
when(request.getRequest()).thenReturn(httpRequest);
when(request.getString("features")).thenReturn(null);
when(request.getAction()).thenReturn("download_emeasure");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
when(request.getResponse()).thenReturn(httpResponse);
controller.handleRequest(db, request);
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<QualityMeasureDocument classCode=\"CONTAINER\" moodCode=\"DEF\"\n"
+ " xmlns=\"urn:hl7-org:v3\"\n"
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+ " xsi:schemaLocation=\"urn:hl7-org:v3 multicacheschemas/REPC_MT000100UV01.xsd\" xsi:type=\"REPC_MT000100UV01.Organizer\"/>\n";
assertEquals(httpResponse.getContentAsString(), expected);
}
@Test
public void handleRequest_download_xls_protocol() throws Exception
{
// mock db
Database db = mock(Database.class);
DataSet dataSet = new DataSet();
dataSet.setId(1);
dataSet.setName("dataset");
dataSet.setProtocolUsed_Identifier("protocol1");
ObservableFeature feature1 = new ObservableFeature();
feature1.setId(1);
feature1.setName("feature1");
feature1.setIdentifier("featureid1");
feature1.setDescription("this is feature1");
ObservableFeature feature2 = new ObservableFeature();
feature2.setId(2);
feature2.setName("feature2");
feature2.setIdentifier("featureid2");
feature2.setDescription("this is feature2");
ObservableFeature feature3 = new ObservableFeature();
feature3.setId(3);
feature3.setName("feature3");
feature3.setIdentifier("featureid3");
feature3.setDescription("this is feature3");
when(db.find(DataSet.class, new QueryRule(DataSet.ID, Operator.EQUALS, 1))).thenReturn(
Collections.singletonList(dataSet));
when(db.find(ObservableFeature.class, new QueryRule(ObservableFeature.ID, Operator.IN, Arrays.asList(1, 2, 3))))
.thenReturn(Arrays.asList(feature1, feature2, feature3));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
MockHttpServletRequest httpRequest = new MockHttpServletRequest();
httpRequest.setMethod("GET");
MolgenisRequest request = mock(MolgenisRequest.class);
when(request.getRequest()).thenReturn(httpRequest);
when(request.getInt("datasetid")).thenReturn(1);
when(request.getString("features")).thenReturn("1,2,3");
when(request.getAction()).thenReturn("download_xls");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
when(request.getResponse()).thenReturn(httpResponse);
controller.handleRequest(db, request);
assertEquals(DigestUtils.md5Hex(httpResponse.getContentAsByteArray()), "4351a541e9cc6f62bd76d05df5a2d865");
}
@Test
public void handleRequest_download_xls_noProtocol() throws Exception
{
// mock db
Database db = mock(Database.class);
DataSet dataSet = new DataSet();
dataSet.setId(1);
dataSet.setName("dataset");
ObservableFeature feature1 = new ObservableFeature();
feature1.setId(1);
feature1.setName("feature1");
feature1.setIdentifier("featureid1");
feature1.setDescription("this is feature1");
ObservableFeature feature2 = new ObservableFeature();
feature2.setId(2);
feature2.setName("feature2");
feature2.setIdentifier("featureid2");
feature2.setDescription("this is feature2");
ObservableFeature feature3 = new ObservableFeature();
feature3.setId(3);
feature3.setName("feature3");
feature3.setIdentifier("featureid3");
feature3.setDescription("this is feature3");
when(db.find(DataSet.class, new QueryRule(DataSet.ID, Operator.EQUALS, 1))).thenReturn(
Collections.singletonList(dataSet));
when(db.find(ObservableFeature.class, new QueryRule(ObservableFeature.ID, Operator.IN, Arrays.asList(1, 2, 3))))
.thenReturn(Arrays.asList(feature1, feature2, feature3));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
MockHttpServletRequest httpRequest = new MockHttpServletRequest();
httpRequest.setMethod("GET");
MolgenisRequest request = mock(MolgenisRequest.class);
when(request.getRequest()).thenReturn(httpRequest);
when(request.getInt("datasetid")).thenReturn(1);
when(request.getString("features")).thenReturn("1,2,3");
when(request.getAction()).thenReturn("download_xls");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
when(request.getResponse()).thenReturn(httpResponse);
controller.handleRequest(db, request);
assertEquals(DigestUtils.md5Hex(httpResponse.getContentAsByteArray()), "c8953444319fe6add92c0aa8637ed2df");
}
@Test
public void handleRequest_download_xls_noFeatures() throws Exception
{
// mock db
Database db = mock(Database.class);
DataSet dataSet = new DataSet();
dataSet.setId(1);
dataSet.setName("dataset");
when(db.find(DataSet.class, new QueryRule(DataSet.ID, Operator.EQUALS, 1))).thenReturn(
Collections.singletonList(dataSet));
ProtocolViewerController controller = new ProtocolViewerController("test", mock(ScreenController.class));
// mock request
MockHttpServletRequest httpRequest = new MockHttpServletRequest();
httpRequest.setMethod("GET");
MolgenisRequest request = mock(MolgenisRequest.class);
when(request.getRequest()).thenReturn(httpRequest);
when(request.getInt("datasetid")).thenReturn(1);
when(request.getString("features")).thenReturn("1,2,3");
when(request.getAction()).thenReturn("download_xls");
MockHttpServletResponse httpResponse = new MockHttpServletResponse();
when(request.getResponse()).thenReturn(httpResponse);
controller.handleRequest(db, request);
assertEquals(DigestUtils.md5Hex(httpResponse.getContentAsByteArray()), "0e4cf5b90004d86d2967e189f8094658");
}
}