diff --git a/Makefile b/Makefile index ea8a42130..e59f2064f 100755 --- a/Makefile +++ b/Makefile @@ -165,15 +165,16 @@ update: ## Atualiza banco de dados através dos scripts de atualização do sist destroy: .env + @$(CMD_COMPOSE_FUNC) exec org1-http bash -c "rm -rf /var/sei/arquivos/*" + @$(CMD_COMPOSE_FUNC) exec org2-http bash -c "rm -rf /var/sei/arquivos/*" $(CMD_COMPOSE_FUNC) down --volumes - down: .env $(CMD_COMPOSE_FUNC) stop # make teste=TramiteProcessoComDevolucaoTest test-functional -test-functional: .env $(FILE_VENDOR_FUNCIONAL) up +test-functional: .env $(FILE_VENDOR_FUNCIONAL) up vendor $(CMD_COMPOSE_FUNC) run --rm php-test-functional /tests/vendor/bin/phpunit -c /tests/phpunit.xml /tests/tests/$(addsuffix .php,$(teste)) ; @@ -238,4 +239,7 @@ tramitar-pendencias-silent: stop-test-container: docker stop $$(docker ps -a -q --filter="name=php-test") +vendor: composer.json + $(CMD_COMPOSE_FUNC) run -w /tests php-test-functional bash -c './composer.phar install' + diff --git a/composer.json b/composer.json index 6bf33bc8f..09c77f29a 100755 --- a/composer.json +++ b/composer.json @@ -5,6 +5,11 @@ "php": "7.3.12" } }, + "autoload-dev": { + "psr-4": { + "TestDTO\\": "src" + } + }, "require-dev": { "php": "7.3.12", "phpunit/phpunit": "*", diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 3792e9ffb..fd0826650 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -652,25 +652,65 @@ public function enviarProcesso($parametros) }); } catch (\SoapFault $e) { - $naoRespEstruturaOrg = 'Transação não autorizada, pois o sistema não é responsável pela estrutura organizacional remetente'; - if (InfraString::formatarJavaScript(utf8_decode($e->faultstring)) == $naoRespEstruturaOrg) { - $strMensagem = "Por favor, observe o seguinte procedimento para realizar o mapeamento adequado: Acesse a funcionalidade Administração, em seguida selecione Processo Eletrônico Nacional e, por fim, proceda ao mapeamento utilizando somente as unidades pertinentes ao seu órgão/entidade na funcionalidade Mapeamento de Unidades. Certifique-se de seguir esse processo para garantir a correta execução do mapeamento."; - } else { - $strMensagem = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript(utf8_decode($e->faultstring))); - } + $strMensagem = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript(utf8_decode($e->faultstring))); if ($e instanceof \SoapFault && !empty($e->detail->interoperabilidadeException->codigoErro) && $e->detail->interoperabilidadeException->codigoErro == '0005') { - $$strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.'; + $strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.'; } - - $e->faultstring = $this->validarTramitaEmAndamento($parametros, $strMensagem); - $strMensagem = $e->faultstring; - $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); - throw new InfraException($strMensagem, $e, $strDetalhes); + $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + if (strpos(strtolower($strMensagem), "hash de ao menos um componente digital não confere")) { + $strMensagem = $this->validarMudancaOrdemDocumentos($parametros->dblIdProcedimento, $strMensagem, $parametros); + } + throw new InfraException($strMensagem, $e, $strDetalhes); } catch (\Exception $e) { - $mensagem = "Falha no envio externo do processo. Verifique log de erros do sistema para maiores informações."; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); + $mensagem = "Falha no envio externo do processo. Verifique log de erros do sistema para maiores informações."; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + /** + * Validar qual documento mudou na ordem do processo + * + * @param int $dblIdProcedimento + * @param string $strMensagem + * @param array $params + * @return string + */ + private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $params = null) + { + $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); + $objProcessoEletronicoDTO->setDblIdProcedimento($dblIdProcedimento); + + $objProcessoEletronicoRN = new ProcessoEletronicoRN(); + $objUltimoTramiteDTO = $objProcessoEletronicoRN->consultarUltimoTramite($objProcessoEletronicoDTO); + $numIdTramite = $objUltimoTramiteDTO->getNumIdTramite(); + + if (!is_null($numIdTramite) && $numIdTramite > 0) { + $objAtividadeDTO = new AtividadeDTO(); + $objAtividadeDTO->setDblIdProtocolo($dblIdProcedimento); + $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); + $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); + $objAtividadeDTO->retNumIdAtividade(); + $objAtividadeDTO->retDblIdProcedimentoProtocolo(); + + $objAtividadeRN = new AtividadeRN(); + $arrObjAtividadeDTO = $objAtividadeRN->contarRN0035($objAtividadeDTO); + + $msg = "Houve uma alteração na ordem dos documentos no processo, o que impede o reenvio de um processo que já foi tramitado pela plataforma. " . + "Portanto, é recomendado reordenar os documentos de acordo com a ordem original. " . + "Caso você seja um usuário sem permissão para reordenar o processo, é necessário entrar em contato internamente para identificar quem possui essa permissão."; + + if ($arrObjAtividadeDTO > 0) { + $strMensagem = str_replace( + 'hash de ao menos um componente digital não confere', + $msg, + $strMensagem + ); + } } + + return $strMensagem; } private function validarTramitaEmAndamento($parametros, $strMensagem) diff --git a/tests_sei3/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php b/tests_sei3/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php index bbd5c017f..b9c1ebb68 100644 --- a/tests_sei3/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php +++ b/tests_sei3/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php @@ -62,4 +62,4 @@ public function getTiposProcessos(int $idMapeamento, string $sinAtivo = 'S') return $tiposProcessos; } -} +} \ No newline at end of file diff --git a/tests_sei4/funcional/bootstrap.php b/tests_sei4/funcional/bootstrap.php index 8fb3da6b3..99ebfad79 100755 --- a/tests_sei4/funcional/bootstrap.php +++ b/tests_sei4/funcional/bootstrap.php @@ -2,6 +2,16 @@ require_once __DIR__ . '/vendor/autoload.php'; +require_once __DIR__ . '/sei/src/sei/web/SEI.php'; + +define("DIR_SEI_WEB", __DIR__ . '/sei/src/sei/web/' ); +define("DIR_TEST", __DIR__ ); +define("DIR_PROJECT", __DIR__ . '/..' ); +define("DIR_INFRA", __DIR__ . '/../src/infra/infra_php' ); + +error_reporting(E_ERROR); +restore_error_handler(); + //Classes utilitárias para manipulação dos dados do SEI require_once __DIR__ . '/src/utils/DatabaseUtils.php'; require_once __DIR__ . '/src/utils/ParameterUtils.php'; diff --git a/tests_sei4/funcional/composer.json b/tests_sei4/funcional/composer.json index ee2f2e658..187f89cf9 100755 --- a/tests_sei4/funcional/composer.json +++ b/tests_sei4/funcional/composer.json @@ -7,10 +7,17 @@ "autoload": { "classmap": [ - "src/" + "src/", + "sei/modpen/" ] }, + "autoload-dev": { + "psr-4": { + "Tests\\": "sei/" + } + }, + "require-dev": { "phpunit/phpunit": "8.*", "phpunit/php-code-coverage": "*", diff --git a/tests_sei4/funcional/docker-compose.yml b/tests_sei4/funcional/docker-compose.yml index faf26fa00..81dad2bc4 100755 --- a/tests_sei4/funcional/docker-compose.yml +++ b/tests_sei4/funcional/docker-compose.yml @@ -44,15 +44,20 @@ services: php-test-functional: image: processoeletronico/vagrant_sei4_httpd:${ENVIRONMENT_VERSION} depends_on: - - org1-database - org2-database + - org1-database - selenium volumes: - ${SEI_PATH}/sei:/opt/sei - ${SEI_PATH}/sip:/opt/sip - ${SEI_PATH}/infra:/opt/infra - - ./assets/config:/opt/sei/config/mod-pen - .:/tests + - ${SEI_PATH}/../tests:/tests/sei + - ${SEI_PATH}/../src:/tests/sei/src + - ./src/fixtures:/tests/sei/modpen/fixtures + - ../../src/dto:/tests/sei/modpen/dto + - ../../src/bd:/tests/sei/modpen/bd + - ./assets/config:/opt/sei/config/mod-pen - /tmp:/tmp environment: - XDEBUG_CONFIG=client_host=host.docker.internal client_port=9003 start_with_request=0 @@ -66,12 +71,22 @@ services: - ORG1_CERTIFICADO_SENHA=${ORG1_CERTIFICADO_SENHA} - ORG2_CERTIFICADO=${ORG2_CERTIFICADO} - ORG2_CERTIFICADO_SENHA=${ORG2_CERTIFICADO_SENHA} - + - DATABASE_IMAGE=${ORG1_DATABASE_IMAGE} + - DATABASE_TYPE=${ORG1_DATABASE_TYPE} + - DATABASE_HOST=${ORG1_DATABASE_HOST} + - DATABASE_PORT=${ORG1_DATABASE_GUEST_PORT} + - SEI_CHAVE_ACESSO=${ORG1_APP_SEI_CHAVE_ACESSO} + - SEI_DATABASE_NAME=${SEI_DATABASE_NAME} + - SIP_CHAVE_ACESSO=${ORG1_APP_SIP_CHAVE_ACESSO} + - SIP_DATABASE_NAME=${SIP_DATABASE_NAME} + - SIP_DATABASE_USER=${SIP_DATABASE_USER} + - SIP_DATABASE_PASSWORD=${SIP_DATABASE_PASSWORD} + - TEST_FILES_PATH=${TEST_FILES_PATH} extra_hosts: - "host.docker.internal:host-gateway" links: - - org1-database:${ORG1_DATABASE_HOST} - org2-database:${ORG2_DATABASE_HOST} + - org1-database:${ORG1_DATABASE_HOST} - selenium:selenium command: "true" diff --git a/tests_sei4/funcional/src/fixtures/FixtureBase.php b/tests_sei4/funcional/src/fixtures/FixtureBase.php new file mode 100644 index 000000000..347b9984c --- /dev/null +++ b/tests_sei4/funcional/src/fixtures/FixtureBase.php @@ -0,0 +1,61 @@ +cadastrar($parametros["dados"]); + + if (isset($parametros["callback"])) { + $parametros["callback"]($dto); + } + + return $dto; + } + + public function carregar($dados = null, $callback = null){ + $dados = $dados ?: []; + return $this->cadastrarInterno([ + 'dados' => $dados, + 'callback' => $callback + ]); + } + + public function carregarVarios($dados = null, $quantidade = 1){ + $resultado = []; + for ($i=0; $i < $quantidade; $i++) { + $resultado[] = $this->carregar($dados); + } + + return $resultado; + } + + public function carregarVariados($dados){ + $resultado = []; + foreach ($dados as $dado) { + $resultado[] = $this->carregar($dado); + } + + return $resultado; + } + + protected function listarInternoControlado($parametros){ + $dto = $this->listar($parametros["dados"]); + + if (isset($parametros["callback"])) { + $parametros["callback"]($dto); + } + + return $dto; + } + + public function buscar($dados = null, $callback = null){ + $dados = $dados ?: []; + return $this->listarInterno([ + 'dados' => $dados, + 'callback' => $callback + ]); + } + +} diff --git a/tests_sei4/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php b/tests_sei4/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php deleted file mode 100644 index bbd5c017f..000000000 --- a/tests_sei4/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php +++ /dev/null @@ -1,65 +0,0 @@ -getTiposProcessos($dados['idMapeamento'], $dados['sinAtivo']); - - foreach ($tiposProcessos as $tipoProcesso) { - $bancoOrgaoA->execute( - "INSERT INTO md_pen_map_tipo_processo (id, id_map_orgao, id_tipo_processo_origem, nome_tipo_processo, sin_ativo, id_unidade, dth_criacao) ". - "VALUES(?,?,?,?,?,?,?)", - array( - $tipoProcesso[0], - $tipoProcesso[1], - $tipoProcesso[2], - $tipoProcesso[3], - $tipoProcesso[4], - $tipoProcesso[5], - $tipoProcesso[6] - ) - ); - } - - return $tiposProcessos; - } - - public function deletar($dados = []): void - { - $bancoOrgaoA = new DatabaseUtils(self::$contexto); - $tiposProcessos = $this->getTiposProcessos($dados['idMapeamento']); - - foreach ($tiposProcessos as $tipoProcesso) { - $bancoOrgaoA->execute( - "DELETE FROM md_pen_map_tipo_processo WHERE id = ?", - array($tipoProcesso[0]) - ); - } - - } - - public function getTiposProcessos(int $idMapeamento, string $sinAtivo = 'S') - { - $tiposProcessos = array(); - - $tiposProcessos[] = [9997, $idMapeamento, 100000347, utf8_encode('Acompanhamento Legislativo: Câmara dos Deputados'), $sinAtivo, 110000001, date('Y-m-d H:i:s')]; - $tiposProcessos[] = [9998, $idMapeamento, 100000348, utf8_encode('Acompanhamento Legislativo: Congresso Nacional'), $sinAtivo, 110000001, date('Y-m-d H:i:s')]; - $tiposProcessos[] = [9999, $idMapeamento, 100000425, utf8_encode('mauro teste'), $sinAtivo, 110000001, date('Y-m-d H:i:s')]; - - return $tiposProcessos; - } -} diff --git a/tests_sei4/funcional/src/paginas/PaginaReordenarProcesso.php b/tests_sei4/funcional/src/paginas/PaginaReordenarProcesso.php new file mode 100644 index 000000000..30885bc27 --- /dev/null +++ b/tests_sei4/funcional/src/paginas/PaginaReordenarProcesso.php @@ -0,0 +1,46 @@ +test->frame(null); + $this->test->frame("ifrVisualizacao"); + $this->test->byXPath(utf8_encode("//img[@alt='Ordenar Árvore do Processo']"))->click(); + } + + public function irParaTramitarProcesso() + { + $this->test->frame(null); + $this->test->frame("ifrVisualizacao"); + $this->test->byXPath(utf8_encode("//img[@alt='Envio Externo de Processo']"))->click(); + } + + public function clicarOptionReordenar(int $index = 0) + { + $options = $this->test->byId('selRelProtocoloProtocolo') + ->elements($this->test->using('css selector')->value('option')); + $options[$index]->click(); + } + + public function moverParaBaixo(int $vezes = 1) + { + $botaoParaBaixo = $this->test->byXPath(utf8_encode("//img[@alt='Mover Abaixo Protocolo Selecionado']")); + for ($i=0; $i < $vezes; $i++) { + $botaoParaBaixo->click(); + } + } + + public function moverParaCima(int $vezes = 1) + { + $botaoParaCima = $this->test->byXPath(utf8_encode("//img[@alt='Mover Acima Protocolo Selecionado']")); + for ($i=0; $i < $vezes; $i++) { + $botaoParaCima->click(); + } + } + + public function salvar() + { + $this->test->byXPath("//button[@name='sbmSalvar']")->click(); + } +} diff --git a/tests_sei4/funcional/tests/CenarioBaseTestCase.php b/tests_sei4/funcional/tests/CenarioBaseTestCase.php index 9521cd56b..4d833ef09 100755 --- a/tests_sei4/funcional/tests/CenarioBaseTestCase.php +++ b/tests_sei4/funcional/tests/CenarioBaseTestCase.php @@ -43,6 +43,7 @@ class CenarioBaseTestCase extends Selenium2TestCase protected $paginaCadastroMapEnvioCompDigitais = null; protected $paginaExportarTiposProcesso = null; protected $paginaTipoProcessoReativar = null; + protected $paginaReordenarProcesso = null; public function setUpPage(): void { @@ -65,6 +66,7 @@ public function setUpPage(): void $this->paginaCadastroOrgaoExterno = new PaginaCadastroOrgaoExterno($this); $this->paginaExportarTiposProcesso = new PaginaExportarTiposProcesso($this); $this->paginaTipoProcessoReativar = new PaginaTipoProcessoReativar($this); + $this->paginaReordenarProcesso = new PaginaReordenarProcesso($this); $this->currentWindow()->maximize(); } diff --git a/tests_sei4/funcional/tests/TramiteReordenarDocumentosProcessoTest.php b/tests_sei4/funcional/tests/TramiteReordenarDocumentosProcessoTest.php new file mode 100644 index 000000000..32c281548 --- /dev/null +++ b/tests_sei4/funcional/tests/TramiteReordenarDocumentosProcessoTest.php @@ -0,0 +1,179 @@ +definirContextoTeste(CONTEXTO_ORGAO_A); + self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_B); + + $penMapUnidadesFixture = new \PenMapUnidadesFixture(CONTEXTO_ORGAO_A, [ + 'id' => self::$remetente['ID_ESTRUTURA'], + 'sigla' => self::$remetente['SIGLA_ESTRUTURA'], + 'nome' => self::$remetente['NOME_UNIDADE'] + ]); + $penMapUnidadesFixture->cadastrar(); + + $parametros = []; + $objProtocoloFixture = new ProtocoloFixture(); + $this->objProtocoloDTO = $objProtocoloFixture->carregar($parametros, function($objProtocoloDTO) { + + $objProcedimentoFixture = new ProcedimentoFixture(); + $objProcedimentoDTO = $objProcedimentoFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo() + ]); + + $objAtividadeFixture = new AtividadeFixture(); + $objAtividadeDTO = $objAtividadeFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + ]); + + $objParticipanteFixture = new ParticipanteFixture(); + $objParticipanteFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdContato' => 100000006 + ]); + + $objProtocoloAssuntoFixture = new RelProtocoloAssuntoFixture(); + $objProtocoloAssuntoFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo() + ]); + + $objAtributoAndamentoFixture = new AtributoAndamentoFixture(); + $objAtributoAndamentoFixture->carregar([ + 'IdAtividade' => $objAtividadeDTO->getNumIdAtividade() + ]); + + $tiposDocumentos = array(81, 8, 34); + foreach ($tiposDocumentos as $tipoDocumento) { + $objDocumentoFixture = new DocumentoFixture(); + $objDocumentoDTO = $objDocumentoFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdProcedimento' => $objProcedimentoDTO->getDblIdProcedimento(), + 'IdSerie' => $tipoDocumento + ]); + + $objAtividadeFixture = new AtividadeFixture(); + $objAtividadeDTO = $objAtividadeFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdTarefa' => TarefaRN::$TI_ASSINATURA_DOCUMENTO + ]); + + $objAssinaturaFixture = new AssinaturaFixture(); + $objAssinaturaFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdDocumento' => $objDocumentoDTO->getDblIdDocumento(), + 'IdAtividade' => $objAtividadeDTO->getNumIdAtividade() + ]); + } + }); + + } + + /** + * Testa a funcionalidade de reordernar documento + * + * @return true + */ + public function test_reordenar_documentos_remetente_devolucao() + { + //Aumenta o tempo de timeout devido á quantidade de arquivos + $this->setSeleniumServerRequestsTimeout(6000); + + $this->acessarSistema( + self::$remetente['URL'], + self::$remetente['SIGLA_UNIDADE'], + self::$remetente['LOGIN'], + self::$remetente['SENHA'] + ); + + $this->abrirProcesso($this->objProtocoloDTO->getStrProtocoloFormatado()); + $this->tramitarProcessoExternamente( + ['PROTOCOLO' => $this->objProtocoloDTO->getDblIdProtocolo()], + self::$destinatario['REP_ESTRUTURAS'], + self::$destinatario['NOME_UNIDADE'], + self::$destinatario['SIGLA_UNIDADE_HIERARQUIA'], + false + ); + + $this->sairSistema(); + $this->acessarSistema( + self::$destinatario['URL'], + self::$destinatario['SIGLA_UNIDADE'], + self::$destinatario['LOGIN'], + self::$destinatario['SENHA'] + ); + + $this->waitUntil(function ($testCase) { + sleep(5); + $this->abrirProcesso($this->objProtocoloDTO->getStrProtocoloFormatado()); + return true; + }, PEN_WAIT_TIMEOUT); + + $this->paginaReordenarProcesso->irParaPaginaMudarOrdem(); + $this->paginaReordenarProcesso->clicarOptionReordenar(); + $this->paginaReordenarProcesso->moverParaBaixo(2); + $this->paginaReordenarProcesso->salvar(); + sleep(3); + + $callbackEnvio = function ($testCase) { + $testCase->frame('ifrEnvioProcesso'); + $mensagemSucesso = utf8_encode('Inconsistência identificada no documento de ordem'); + $testCase->assertStringContainsString($mensagemSucesso, $testCase->byCssSelector('body')->text()); + sleep(2); + $testCase->byXPath("//input[@id='btnFechar']")->click(); + + return true; + }; + + $this->tramitarProcessoExternamente( + ['PROTOCOLO' => $this->objProtocoloDTO->getDblIdProtocolo()], + self::$remetente['REP_ESTRUTURAS'], + self::$remetente['NOME_UNIDADE'], + self::$remetente['SIGLA_UNIDADE_HIERARQUIA'], + false, + $callbackEnvio + ); + + $this->paginaReordenarProcesso->irParaPaginaMudarOrdem(); + $this->paginaReordenarProcesso->clicarOptionReordenar(2); + $this->paginaReordenarProcesso->moverParaCima(2); + $this->paginaReordenarProcesso->salvar(); + sleep(3); + + $this->tramitarProcessoExternamente( + ['PROTOCOLO' => $this->objProtocoloDTO->getDblIdProtocolo()], + self::$remetente['REP_ESTRUTURAS'], + self::$remetente['NOME_UNIDADE'], + self::$remetente['SIGLA_UNIDADE_HIERARQUIA'], + false + ); + + $this->sairSistema(); + } +} diff --git a/tests_super/funcional/bootstrap.php b/tests_super/funcional/bootstrap.php index 8fb3da6b3..99ebfad79 100755 --- a/tests_super/funcional/bootstrap.php +++ b/tests_super/funcional/bootstrap.php @@ -2,6 +2,16 @@ require_once __DIR__ . '/vendor/autoload.php'; +require_once __DIR__ . '/sei/src/sei/web/SEI.php'; + +define("DIR_SEI_WEB", __DIR__ . '/sei/src/sei/web/' ); +define("DIR_TEST", __DIR__ ); +define("DIR_PROJECT", __DIR__ . '/..' ); +define("DIR_INFRA", __DIR__ . '/../src/infra/infra_php' ); + +error_reporting(E_ERROR); +restore_error_handler(); + //Classes utilitárias para manipulação dos dados do SEI require_once __DIR__ . '/src/utils/DatabaseUtils.php'; require_once __DIR__ . '/src/utils/ParameterUtils.php'; diff --git a/tests_super/funcional/composer.json b/tests_super/funcional/composer.json index ee2f2e658..187f89cf9 100755 --- a/tests_super/funcional/composer.json +++ b/tests_super/funcional/composer.json @@ -7,10 +7,17 @@ "autoload": { "classmap": [ - "src/" + "src/", + "sei/modpen/" ] }, + "autoload-dev": { + "psr-4": { + "Tests\\": "sei/" + } + }, + "require-dev": { "phpunit/phpunit": "8.*", "phpunit/php-code-coverage": "*", diff --git a/tests_super/funcional/docker-compose.yml b/tests_super/funcional/docker-compose.yml index 275413621..fdf37c125 100755 --- a/tests_super/funcional/docker-compose.yml +++ b/tests_super/funcional/docker-compose.yml @@ -44,15 +44,20 @@ services: php-test-functional: image: processoeletronico/vagrant_super4_httpd:${ENVIRONMENT_VERSION} depends_on: - - org1-database - org2-database + - org1-database - selenium volumes: - ${SEI_PATH}/sei:/opt/sei - ${SEI_PATH}/sip:/opt/sip - ${SEI_PATH}/infra:/opt/infra - - ./assets/config:/opt/sei/config/mod-pen - .:/tests + - ${SEI_PATH}/../tests:/tests/sei + - ${SEI_PATH}/../src:/tests/sei/src + - ./src/fixtures:/tests/sei/modpen/fixtures + - ../../src/dto:/tests/sei/modpen/dto + - ../../src/bd:/tests/sei/modpen/bd + - ./assets/config:/opt/sei/config/mod-pen - /tmp:/tmp environment: - XDEBUG_CONFIG=client_host=host.docker.internal client_port=9003 start_with_request=0 @@ -66,11 +71,21 @@ services: - ORG1_CERTIFICADO_SENHA=${ORG1_CERTIFICADO_SENHA} - ORG2_CERTIFICADO=${ORG2_CERTIFICADO} - ORG2_CERTIFICADO_SENHA=${ORG2_CERTIFICADO_SENHA} + - DATABASE_IMAGE=${ORG1_DATABASE_IMAGE} + - DATABASE_TYPE=${ORG1_DATABASE_TYPE} + - DATABASE_HOST=${ORG1_DATABASE_HOST} + - DATABASE_PORT=${ORG1_DATABASE_GUEST_PORT} + - SEI_CHAVE_ACESSO=${ORG1_APP_SEI_CHAVE_ACESSO} + - SEI_DATABASE_NAME=${SEI_DATABASE_NAME} + - SIP_CHAVE_ACESSO=${ORG1_APP_SIP_CHAVE_ACESSO} + - SIP_DATABASE_NAME=${SIP_DATABASE_NAME} + - SIP_DATABASE_USER=${SIP_DATABASE_USER} + - SIP_DATABASE_PASSWORD=${SIP_DATABASE_PASSWORD} extra_hosts: - "host.docker.internal:host-gateway" links: - - org1-database:${ORG1_DATABASE_HOST} - org2-database:${ORG2_DATABASE_HOST} + - org1-database:${ORG1_DATABASE_HOST} - selenium:selenium command: "true" @@ -85,6 +100,7 @@ services: - ./assets/config/ConfiguracaoSip.php:/opt/sip/config/ConfiguracaoSip.php:ro - ../unitario:/tests - ../../src:/opt/sei/web/modulos/pen + - /tmp/sei_arquivos_1:/var/sei/arquivos environment: - XDEBUG_CONFIG=client_host=host.docker.internal client_port=9003 start_with_request=0 - XDEBUG_SESSION=default diff --git a/tests_super/funcional/src/fixtures/FixtureBase.php b/tests_super/funcional/src/fixtures/FixtureBase.php new file mode 100644 index 000000000..347b9984c --- /dev/null +++ b/tests_super/funcional/src/fixtures/FixtureBase.php @@ -0,0 +1,61 @@ +cadastrar($parametros["dados"]); + + if (isset($parametros["callback"])) { + $parametros["callback"]($dto); + } + + return $dto; + } + + public function carregar($dados = null, $callback = null){ + $dados = $dados ?: []; + return $this->cadastrarInterno([ + 'dados' => $dados, + 'callback' => $callback + ]); + } + + public function carregarVarios($dados = null, $quantidade = 1){ + $resultado = []; + for ($i=0; $i < $quantidade; $i++) { + $resultado[] = $this->carregar($dados); + } + + return $resultado; + } + + public function carregarVariados($dados){ + $resultado = []; + foreach ($dados as $dado) { + $resultado[] = $this->carregar($dado); + } + + return $resultado; + } + + protected function listarInternoControlado($parametros){ + $dto = $this->listar($parametros["dados"]); + + if (isset($parametros["callback"])) { + $parametros["callback"]($dto); + } + + return $dto; + } + + public function buscar($dados = null, $callback = null){ + $dados = $dados ?: []; + return $this->listarInterno([ + 'dados' => $dados, + 'callback' => $callback + ]); + } + +} diff --git a/tests_super/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php b/tests_super/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php deleted file mode 100644 index bbd5c017f..000000000 --- a/tests_super/funcional/src/fixtures/ImportacaoTiposProcessoFixture.php +++ /dev/null @@ -1,65 +0,0 @@ -getTiposProcessos($dados['idMapeamento'], $dados['sinAtivo']); - - foreach ($tiposProcessos as $tipoProcesso) { - $bancoOrgaoA->execute( - "INSERT INTO md_pen_map_tipo_processo (id, id_map_orgao, id_tipo_processo_origem, nome_tipo_processo, sin_ativo, id_unidade, dth_criacao) ". - "VALUES(?,?,?,?,?,?,?)", - array( - $tipoProcesso[0], - $tipoProcesso[1], - $tipoProcesso[2], - $tipoProcesso[3], - $tipoProcesso[4], - $tipoProcesso[5], - $tipoProcesso[6] - ) - ); - } - - return $tiposProcessos; - } - - public function deletar($dados = []): void - { - $bancoOrgaoA = new DatabaseUtils(self::$contexto); - $tiposProcessos = $this->getTiposProcessos($dados['idMapeamento']); - - foreach ($tiposProcessos as $tipoProcesso) { - $bancoOrgaoA->execute( - "DELETE FROM md_pen_map_tipo_processo WHERE id = ?", - array($tipoProcesso[0]) - ); - } - - } - - public function getTiposProcessos(int $idMapeamento, string $sinAtivo = 'S') - { - $tiposProcessos = array(); - - $tiposProcessos[] = [9997, $idMapeamento, 100000347, utf8_encode('Acompanhamento Legislativo: Câmara dos Deputados'), $sinAtivo, 110000001, date('Y-m-d H:i:s')]; - $tiposProcessos[] = [9998, $idMapeamento, 100000348, utf8_encode('Acompanhamento Legislativo: Congresso Nacional'), $sinAtivo, 110000001, date('Y-m-d H:i:s')]; - $tiposProcessos[] = [9999, $idMapeamento, 100000425, utf8_encode('mauro teste'), $sinAtivo, 110000001, date('Y-m-d H:i:s')]; - - return $tiposProcessos; - } -} diff --git a/tests_super/funcional/src/paginas/PaginaReordenarProcesso.php b/tests_super/funcional/src/paginas/PaginaReordenarProcesso.php new file mode 100644 index 000000000..30885bc27 --- /dev/null +++ b/tests_super/funcional/src/paginas/PaginaReordenarProcesso.php @@ -0,0 +1,46 @@ +test->frame(null); + $this->test->frame("ifrVisualizacao"); + $this->test->byXPath(utf8_encode("//img[@alt='Ordenar Árvore do Processo']"))->click(); + } + + public function irParaTramitarProcesso() + { + $this->test->frame(null); + $this->test->frame("ifrVisualizacao"); + $this->test->byXPath(utf8_encode("//img[@alt='Envio Externo de Processo']"))->click(); + } + + public function clicarOptionReordenar(int $index = 0) + { + $options = $this->test->byId('selRelProtocoloProtocolo') + ->elements($this->test->using('css selector')->value('option')); + $options[$index]->click(); + } + + public function moverParaBaixo(int $vezes = 1) + { + $botaoParaBaixo = $this->test->byXPath(utf8_encode("//img[@alt='Mover Abaixo Protocolo Selecionado']")); + for ($i=0; $i < $vezes; $i++) { + $botaoParaBaixo->click(); + } + } + + public function moverParaCima(int $vezes = 1) + { + $botaoParaCima = $this->test->byXPath(utf8_encode("//img[@alt='Mover Acima Protocolo Selecionado']")); + for ($i=0; $i < $vezes; $i++) { + $botaoParaCima->click(); + } + } + + public function salvar() + { + $this->test->byXPath("//button[@name='sbmSalvar']")->click(); + } +} diff --git a/tests_super/funcional/tests/CenarioBaseTestCase.php b/tests_super/funcional/tests/CenarioBaseTestCase.php index 580060e64..3d40c86f5 100755 --- a/tests_super/funcional/tests/CenarioBaseTestCase.php +++ b/tests_super/funcional/tests/CenarioBaseTestCase.php @@ -44,6 +44,7 @@ class CenarioBaseTestCase extends Selenium2TestCase protected $paginaExportarTiposProcesso = null; protected $paginaTipoProcessoReativar = null; protected $paginaCadastroOrgaoExterno = null; + protected $paginaReordenarProcesso = null; public function setUpPage(): void { @@ -67,6 +68,7 @@ public function setUpPage(): void $this->paginaExportarTiposProcesso = new PaginaExportarTiposProcesso($this); $this->paginaTipoProcessoReativar = new PaginaTipoProcessoReativar($this); $this->paginaCadastroOrgaoExterno = new PaginaCadastroOrgaoExterno($this); + $this->paginaReordenarProcesso = new PaginaReordenarProcesso($this); $this->currentWindow()->maximize(); } diff --git a/tests_super/funcional/tests/TramiteReordenarDocumentosProcessoTest.php b/tests_super/funcional/tests/TramiteReordenarDocumentosProcessoTest.php new file mode 100644 index 000000000..ba68eace1 --- /dev/null +++ b/tests_super/funcional/tests/TramiteReordenarDocumentosProcessoTest.php @@ -0,0 +1,184 @@ +definirContextoTeste(CONTEXTO_ORGAO_A); + self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_B); + + $penMapUnidadesFixture = new \PenMapUnidadesFixture(CONTEXTO_ORGAO_A, [ + 'id' => self::$remetente['ID_ESTRUTURA'], + 'sigla' => self::$remetente['SIGLA_ESTRUTURA'], + 'nome' => self::$remetente['NOME_UNIDADE'] + ]); + $penMapUnidadesFixture->cadastrar(); + + $parametros = []; + $objProtocoloFixture = new ProtocoloFixture(); + $this->objProtocoloDTO = $objProtocoloFixture->carregar($parametros, function($objProtocoloDTO) { + + $objProcedimentoFixture = new ProcedimentoFixture(); + $objProcedimentoDTO = $objProcedimentoFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo() + ]); + + $objAtividadeFixture = new AtividadeFixture(); + $objAtividadeDTO = $objAtividadeFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + ]); + + $objParticipanteFixture = new ParticipanteFixture(); + $objParticipanteFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdContato' => 100000006 + ]); + + $objProtocoloAssuntoFixture = new RelProtocoloAssuntoFixture(); + $objProtocoloAssuntoFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo() + ]); + + $objAtributoAndamentoFixture = new AtributoAndamentoFixture(); + $objAtributoAndamentoFixture->carregar([ + 'IdAtividade' => $objAtividadeDTO->getNumIdAtividade() + ]); + + $tiposDocumentos = array(81, 8, 34); + foreach ($tiposDocumentos as $tipoDocumento) { + $objDocumentoFixture = new DocumentoFixture(); + $objDocumentoDTO = $objDocumentoFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdProcedimento' => $objProcedimentoDTO->getDblIdProcedimento(), + 'IdSerie' => $tipoDocumento + ]); + + $objAtividadeFixture = new AtividadeFixture(); + $objAtividadeDTO = $objAtividadeFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdTarefa' => TarefaRN::$TI_ASSINATURA_DOCUMENTO + ]); + + $objAssinaturaFixture = new AssinaturaFixture(); + $objAssinaturaFixture->carregar([ + 'IdProtocolo' => $objProtocoloDTO->getDblIdProtocolo(), + 'IdDocumento' => $objDocumentoDTO->getDblIdDocumento(), + 'IdAtividade' => $objAtividadeDTO->getNumIdAtividade() + ]); + } + }); + + } + + /** + * Testa a funcionalidade de reordernar documento + * + * @return true + */ + public function test_reordenar_documentos_remetente_devolucao() + { + //Aumenta o tempo de timeout devido á quantidade de arquivos + $this->setSeleniumServerRequestsTimeout(6000); + + $this->acessarSistema( + self::$remetente['URL'], + self::$remetente['SIGLA_UNIDADE'], + self::$remetente['LOGIN'], + self::$remetente['SENHA'] + ); + + $this->abrirProcesso($this->objProtocoloDTO->getStrProtocoloFormatado()); + $this->tramitarProcessoExternamente( + ['PROTOCOLO' => $this->objProtocoloDTO->getDblIdProtocolo()], + self::$destinatario['REP_ESTRUTURAS'], + self::$destinatario['NOME_UNIDADE'], + self::$destinatario['SIGLA_UNIDADE_HIERARQUIA'], + false + ); + + $this->sairSistema(); + $this->acessarSistema( + self::$destinatario['URL'], + self::$destinatario['SIGLA_UNIDADE'], + self::$destinatario['LOGIN'], + self::$destinatario['SENHA'] + ); + + $this->waitUntil(function ($testCase) { + sleep(5); + $this->abrirProcesso($this->objProtocoloDTO->getStrProtocoloFormatado()); + return true; + }, PEN_WAIT_TIMEOUT); + + $this->paginaReordenarProcesso->irParaPaginaMudarOrdem(); + $this->paginaReordenarProcesso->clicarOptionReordenar(); + $this->paginaReordenarProcesso->moverParaBaixo(2); + $this->paginaReordenarProcesso->salvar(); + sleep(3); + + $callbackEnvio = function ($testCase) { + $testCase->frame('ifrEnvioProcesso'); + $mensagemHash = "Houve uma alteração na ordem dos documentos no processo, " + . "o que impede o reenvio de um processo que já foi tramitado pela plataforma. " + . "Portanto, é recomendado reordenar os documentos de acordo com a ordem original. " + . "Caso você seja um usuário sem permissão para reordenar o processo, é necessário " + . "entrar em contato internamente para identificar quem possui essa permissão."; + $mensagemSucesso = utf8_encode($mensagemHash); + $testCase->assertStringContainsString($mensagemSucesso, $testCase->byCssSelector('body')->text()); + sleep(2); + $testCase->byXPath("//input[@id='btnFechar']")->click(); + + return true; + }; + + $this->tramitarProcessoExternamente( + ['PROTOCOLO' => $this->objProtocoloDTO->getDblIdProtocolo()], + self::$remetente['REP_ESTRUTURAS'], + self::$remetente['NOME_UNIDADE'], + self::$remetente['SIGLA_UNIDADE_HIERARQUIA'], + false, + $callbackEnvio + ); + + $this->paginaReordenarProcesso->irParaPaginaMudarOrdem(); + $this->paginaReordenarProcesso->clicarOptionReordenar(2); + $this->paginaReordenarProcesso->moverParaCima(2); + $this->paginaReordenarProcesso->salvar(); + sleep(3); + + $this->tramitarProcessoExternamente( + ['PROTOCOLO' => $this->objProtocoloDTO->getDblIdProtocolo()], + self::$remetente['REP_ESTRUTURAS'], + self::$remetente['NOME_UNIDADE'], + self::$remetente['SIGLA_UNIDADE_HIERARQUIA'], + false + ); + + $this->sairSistema(); + } +}