/* * 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.gses.beans; import org.activiti.engine.delegate.BpmnError; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.db.DbSqlSession; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.entity.CommentManager; import org.activiti.engine.impl.variable.EntityManagerSession; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import ru.codeinside.adm.AdminService; import ru.codeinside.adm.database.Bid; import ru.codeinside.adm.database.ClientRequestEntity; import ru.codeinside.adm.database.ExternalGlue; import ru.codeinside.adm.database.InfoSystem; import ru.codeinside.adm.database.InfoSystemService; import ru.codeinside.gses.webui.gws.ClientRefRegistry; import ru.codeinside.gses.webui.gws.ServiceRefRegistry; import ru.codeinside.gses.webui.gws.TRef; import ru.codeinside.gws.api.Client; import ru.codeinside.gws.api.ClientRequest; import ru.codeinside.gws.api.Enclosure; import ru.codeinside.gws.api.ExchangeContext; import ru.codeinside.gws.api.Packet; import ru.codeinside.gws.api.Server; import ru.codeinside.gws.api.Signature; import javax.persistence.EntityManager; import java.util.HashSet; import java.util.List; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class SmevTest { private EntityManagerSession entityManagerSession; private DelegateExecution execution; private AdminService adminService; private TRef<Server> tRefServer; private Client client; private CommandContext commandContext; private Smev smev; private EntityManager entityManager; final static String SERVICE_NAME = "SERVICE_NAME"; @Test public void test() { DelegateExecution delegateExecution = mock(DelegateExecution.class); when(delegateExecution.getProcessInstanceId()).thenReturn("321"); when(delegateExecution.getVariableNames()).thenReturn(new HashSet<String>()); Bid bid = new Bid(); bid.setId(13L); ExternalGlue glue = new ExternalGlue(); glue.setId(13L); glue.setName("xyz"); bid.setGlue(glue); AdminService adminService = mock(AdminService.class); when(adminService.getBidByProcessInstanceId("321")).thenReturn(bid); when(adminService.countOfServerResponseByBidIdAndStatus(13L, "RESULT")).thenReturn(0); Server server = mock(Server.class); TRef<Server> tRef = mock(TRef.class); when(tRef.getRef()).thenReturn(server); ServiceRefRegistry serviceRegistry = mock(ServiceRefRegistry.class); when(serviceRegistry.getServerByName("xyz")).thenReturn(tRef); try { Smev smev = new Smev(); smev.adminService = adminService; smev.serviceRegistry = serviceRegistry; smev.completeReceipt(delegateExecution, null); fail(); } catch (BpmnError e) { assertEquals("suddenly_bpmn_error", e.getErrorCode()); assertEquals("Поставщик xyz при вызове метода processResult вернул null (errorCode='suddenly_bpmn_error')", e.getMessage()); } } @Test public void managed_call() { Smev smev = new Smev(); smev.adminService = mock(AdminService.class); smev.serviceRegistry = mock(ServiceRefRegistry.class); DelegateExecution execution = mock(DelegateExecution.class); try { smev.managedCall(execution, "xyz"); fail(); } catch (BpmnError bpmnError) { assertEquals("client_bpmn_error", bpmnError.getErrorCode()); ArgumentCaptor<String> arg1 = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> arg2 = ArgumentCaptor.forClass(String.class); verify(execution).setVariable(arg1.capture(), arg2.capture()); assertEquals("call_error", arg1.getValue()); assertTrue(arg2.getValue(), arg2.getValue().startsWith("xyz managedCall error\njava.lang.IllegalStateException: Нет модуля потребителя СМЭВ с именем 'xyz'")); } } @Before public void prepareEnvironment() { entityManagerSession = mock(EntityManagerSession.class); execution = mock(DelegateExecution.class); adminService = mock(AdminService.class); Server server = mock(Server.class); tRefServer = mock(TRef.class); when(tRefServer.getRef()).thenReturn(server); client = mock(Client.class); ServiceRefRegistry serviceRegistry = mock(ServiceRefRegistry.class); when(serviceRegistry.getServerByName(null)).thenReturn(tRefServer); ClientRefRegistry clientRegistry = mock(ClientRefRegistry.class); TRef<Client> clientRef = mock(TRef.class); when(clientRegistry.getClientByNameAndVersion(anyString(), anyString())).thenReturn(clientRef); when(clientRef.getRef()).thenReturn(client); commandContext = mock(CommandContext.class); Context.setCommandContext(commandContext); entityManager = mock(EntityManager.class); when(entityManagerSession.getEntityManager()).thenReturn(entityManager); when(commandContext.getDbSqlSession()).thenReturn(mock(DbSqlSession.class)); when(commandContext.getCommentManager()).thenReturn(mock(CommentManager.class)); when(commandContext.getSession(any(Class.class))).thenReturn(entityManagerSession); when(adminService.getGlueByProcessInstanceId(null)).thenReturn(new ExternalGlue()); when(adminService.getInfoSystemServiceBySName(eq(SERVICE_NAME))).thenReturn(createInfoSystemService(SERVICE_NAME)); when(execution.getId()).thenReturn("1"); smev = new Smev(); smev.adminService = adminService; smev.serviceRegistry = serviceRegistry; smev.registry = clientRegistry; } @Test public void testAddOneEnclosureToContext() { final String variableName = "variableName"; when(execution.hasVariable(variableName)).thenReturn(false); when(client.createClientRequest(any(ExchangeContext.class))).thenReturn(createClientRequest(1, false)); smev.prepare(execution, SERVICE_NAME, variableName); verify(entityManager, times(1)).persist(any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq(variableName), any(ClientRequestEntity.class)); // enclosure должно помещаться в соответствующий attach verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_0"), eq("null:attachment")); // 1 на конце это ид execution verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_vars"), eq(variableName + "_enclosure_to_sign_0")); } @Test public void testAddSeveralEnclosureToContext() { final String variableName = "variableName"; when(execution.hasVariable(variableName)).thenReturn(false); when(client.createClientRequest(any(ExchangeContext.class))).thenReturn(createClientRequest(2, false)); smev.prepare(execution, SERVICE_NAME, variableName); verify(entityManager, times(1)).persist(any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq(variableName), any(ClientRequestEntity.class)); // enclosure должно помещаться в соответствующий attach verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_0"), eq("null:attachment")); verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_1"), eq("null:attachment")); // 1 на конце это ид execution verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_vars"), eq(variableName + "_enclosure_to_sign_0;" + variableName + "_enclosure_to_sign_1")); } @Test public void testAlreadySignedEnclosureDoNotNeedAddToSign() { when(execution.hasVariable("variableName")).thenReturn(false); when(client.createClientRequest(any(ExchangeContext.class))).thenReturn(createClientRequest(1, true)); smev.prepare(execution, SERVICE_NAME, "variableName"); verify(entityManager, times(1)).persist(any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq("variableName"), any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq("variableName_enclosure_to_sign_0"), eq("null:attachment")); verify(execution, times(1)).setVariable(eq("variableName_enclosure_to_sign_vars"), eq("variableName_enclosure_to_sign_0")); } @Test public void testAttemptAddEnclosureButVariableIsExist() { final String variableName = "variableName"; when(execution.hasVariable(variableName)).thenReturn(false); when(execution.hasVariable(variableName + "_enclosure_to_sign_0")).thenReturn(false); when(execution.hasVariable(variableName + "_enclosure_to_sign_1")).thenReturn(true); when(client.createClientRequest(any(ExchangeContext.class))).thenReturn(createClientRequest(2, false)); smev.prepare(execution, SERVICE_NAME, variableName); verify(entityManager, times(1)).persist(any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq(variableName), any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_0"), eq("null:attachment")); verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_1"), eq("null:attachment")); verify(execution, times(1)).setVariable(eq(variableName + "_enclosure_to_sign_vars"), eq("variableName_enclosure_to_sign_0;variableName_enclosure_to_sign_1")); } @Test public void testPrepareRequestNoEnclosure() { when(execution.hasVariable("variableName")).thenReturn(false); when(client.createClientRequest(any(ExchangeContext.class))).thenReturn(createClientRequest(0, false)); smev.prepare(execution, SERVICE_NAME, "variableName"); verify(entityManager, times(1)).persist(any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq("variableName"), any(ClientRequestEntity.class)); verify(execution, times(1)).setVariable(eq("variableName_enclosure_to_sign_vars"), eq("")); } private ClientRequest createClientRequest(int countEnclosure, boolean createSignedEnclosure) { final ClientRequest clientRequest = new ClientRequest(); final Packet packet = new Packet(); packet.typeCode = Packet.Type.SERVICE; packet.status = Packet.Status.REQUEST; clientRequest.packet = packet; if (countEnclosure > 0) { clientRequest.enclosures = new Enclosure[countEnclosure]; for (int idx = 0; idx < countEnclosure; idx++) { final Enclosure enclosure = new Enclosure("zipName.xml", new byte[]{0x00}); if (createSignedEnclosure) { enclosure.signature = new Signature(null, null, null, true); } clientRequest.enclosures[idx] = enclosure; } } clientRequest.enclosureDescriptor = "описание вложения"; return clientRequest; } private List<InfoSystemService> createInfoSystemService(String serviceName) { InfoSystemService service = new InfoSystemService(); service.setAddress("testAddr"); service.setId(1l); service.setSversion("1"); service.setRevision("0"); service.setAvailable(true); service.setName(serviceName); service.setSname(serviceName); service.setInfoSystem(new InfoSystem("testCode", "testName")); return asList(service); } }