/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gws.s.oep.declarer;
import org.junit.Assert;
import org.junit.Test;
import ru.codeinside.gws.api.CryptoProvider;
import ru.codeinside.gws.api.InfoSystem;
import ru.codeinside.gws.api.Packet;
import ru.codeinside.gws.api.Revision;
import ru.codeinside.gws.api.ServerRequest;
import ru.codeinside.gws.api.ServerResponse;
import ru.codeinside.gws.api.ServiceDefinition;
import ru.codeinside.gws.api.XmlTypes;
import ru.codeinside.gws.core.sproto.R120315;
import ru.codeinside.gws.s.oep.declarer.data.Result;
import ru.codeinside.gws.wsdl.ServiceDefinitionParser;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import static org.mockito.Mockito.mock;
public class DeclarerTest extends Assert {
static final QName serviceName;
static final QName portName;
static final ServiceDefinition.Port portDef;
static {
ServiceDefinition definition = new ServiceDefinitionParser().parseServiceDefinition(DeclarerTest.class.getClassLoader().getResource("mvvact/mvvact.wsdl"));
serviceName = definition.services.keySet().iterator().next();
ServiceDefinition.Service service = definition.services.get(serviceName);
portName = service.ports.keySet().iterator().next();
portDef = service.ports.get(portName);
}
@Test
public void testGetRevision() throws Exception {
assertEquals(Revision.rev120315, new Declarer().getRevision());
}
@Test
public void testGetWsdlUrl() throws Exception {
final URL wsdlUrl = new Declarer().getWsdlUrl();
assertNotNull("Ссылка на wsdl обяательна", wsdlUrl);
assertTrue("WSDL должен быть ресурсом", wsdlUrl.toExternalForm().contains("/target/classes/"));
}
@Test
public void putData_ping() throws Exception {
Declarer declarer = new Declarer();
DummyRequestContext requestContext = new DummyRequestContext();
requestContext.bid = "1";
requestContext.results.put("1", new ServerResponse());
requestContext.request = new ServerRequest();
requestContext.request.packet = new Packet();
requestContext.request.packet.status = Packet.Status.PING;
requestContext.request.action = new QName("http://smev.gosuslugi.ru/rev120315", "putData");
ServerResponse response = declarer.processRequest(requestContext);
assertSame(requestContext.results.get("1"), response);
}
@Test
public void putData_other() throws Exception {
Declarer declarer = new Declarer();
DummyRequestContext requestContext = new DummyRequestContext();
requestContext.request = new ServerRequest();
requestContext.request.packet = new Packet();
requestContext.request.packet.status = Packet.Status.REQUEST;
requestContext.request.action = new QName("http://smev.gosuslugi.ru/rev120315", "putData");
try {
declarer.processRequest(requestContext);
fail();
} catch (IllegalStateException e) {
assertEquals("Illegal status REQUEST", e.getMessage());
}
}
@Test
public void updateStatus_request() throws Exception {
Declarer declarer = new Declarer();
DummyRequestContext requestContext = new DummyRequestContext();
requestContext.bid = "2";
requestContext.states.put("2", new ServerResponse());
requestContext.request = new ServerRequest();
requestContext.request.packet = new Packet();
requestContext.request.packet.status = Packet.Status.REQUEST;
requestContext.request.action = new QName("http://smev.gosuslugi.ru/rev120315", "updateStatus");
ServerResponse response = declarer.processRequest(requestContext);
assertSame(requestContext.states.get("2"), response);
}
@Test
public void updateStatus_other() throws Exception {
Declarer declarer = new Declarer();
DummyRequestContext requestContext = new DummyRequestContext();
requestContext.bid = "3";
requestContext.states.put("3", new ServerResponse());
requestContext.request = new ServerRequest();
requestContext.request.packet = new Packet();
requestContext.request.packet.status = Packet.Status.STATE;
requestContext.request.action = new QName("http://smev.gosuslugi.ru/rev120315", "updateStatus");
try {
declarer.processRequest(requestContext);
fail();
} catch (IllegalStateException e) {
assertEquals("Illegal status STATE", e.getMessage());
}
}
@Test
public void testProcessStatus() throws Exception {
Declarer declarer = new Declarer();
DummyContext ctx = new DummyContext();
ServerResponse response = declarer.processStatus("x1x", ctx);
assertEquals(new QName("http://mvv.oep.com/", "updateStatus"), response.action);
assertTrue(response.appData.startsWith("<oep:result xmlns:oep=\"http://oep-penza.ru/com/oep\"><oep:params>"));
Result result = new XmlTypes(Result.class).fromXml(Result.class, response.appData);
assertEquals("x1x", result.getParams().getStatusCode());
assertMessage(response);
}
@Test
public void testProcessResult() throws Exception {
Declarer declarer = new Declarer();
DummyContext ctx = new DummyContext();
ctx.vars.put("r1x", "zxx");
ServerResponse response = declarer.processResult("xxx", ctx);
assertEquals(new QName("http://mvv.oep.com/", "updateStatus"), response.action);
assertTrue(response.appData.startsWith(
"<oep:result xmlns:oep=\"http://oep-penza.ru/com/oep\">" +
"<oep:dataRow><oep:name>r1x</oep:name><oep:value>zxx</oep:value></oep:dataRow>"
));
Result result = new XmlTypes(Result.class).fromXml(Result.class, response.appData);
assertEquals("xxx", result.getParams().getStatusCode());
assertMessage(response);
}
@Test
public void testRealRequest() throws SOAPException, IOException {
Declarer declarer = new Declarer();
DummyRequestContext requestContext = new DummyRequestContext();
requestContext.request = parseRequest("request-1.xml");
requestContext.first = true;
requestContext.procedureCode = 1L;
requestContext.declarerContext = new DeclarerContextStub();
ServerResponse response = declarer.processRequest(requestContext);
assertMessage(response);
}
private ServerRequest parseRequest(String name) throws IOException, SOAPException {
final InputStream stream = getClass().getClassLoader().getResourceAsStream(name);
final SOAPMessage message = MessageFactory.newInstance().createMessage(null, stream);
final CryptoProvider provider = mock(CryptoProvider.class);
final R120315 r120315 = new R120315(provider, null, null);
return r120315.processRequest(message, serviceName, portDef);
}
private void assertMessage(ServerResponse response) {
CryptoProvider provider = mock(CryptoProvider.class);
R120315 r120315 = new R120315(provider, null, null);
response.packet.sender = response.packet.recipient = new InfoSystem("x", "y");
response.packet.date = new Date();
assertNotNull(r120315.processResponse(null, response, serviceName, portDef, null));
}
}