File manager - Edit - /var/www/html/portalHomolog/tests/Feature/Importacoes/ImportacaoProdataContaAngraSeederTest.php
Back
<?php namespace Tests\Feature\Importacoes; use App\Http\Resources\Importacoes\MapeamentoUnidadeResource; use App\Http\Services\Importacoes\ImportacaoProdataContaAngraService; use App\Models\Permissao; use App\Models\Structure; use App\Models\User; use Database\Seeders\ImportacaoProdataContaAngraSeeder; use Illuminate\Console\Command; use Illuminate\Console\OutputStyle; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Output\BufferedOutput; use Tests\Support\Importacoes\ImportacaoProdataTestHelpers; use Tests\TestCase; class ImportacaoProdataContaAngraSeederTest extends TestCase { use ImportacaoProdataTestHelpers; private string $csvAbsoluteBackup = ''; private string $csvTempPath = ''; protected function setUp(): void { parent::setUp(); $this->limparUsuariosTeste(); $this->csvTempPath = base_path(ImportacaoProdataContaAngraSeeder::CSV_RELATIVO); $this->csvAbsoluteBackup = $this->csvTempPath . '.backup_' . uniqid(); if (file_exists($this->csvTempPath)) { rename($this->csvTempPath, $this->csvAbsoluteBackup); } if (!is_dir(dirname($this->csvTempPath))) { mkdir(dirname($this->csvTempPath), 0775, true); } Storage::disk('local')->delete(MapeamentoUnidadeResource::STORAGE_PATH); } protected function tearDown(): void { if (file_exists($this->csvTempPath)) { unlink($this->csvTempPath); } if (file_exists($this->csvAbsoluteBackup)) { rename($this->csvAbsoluteBackup, $this->csvTempPath); } Storage::disk('local')->delete(MapeamentoUnidadeResource::STORAGE_PATH); $this->limparUsuariosTeste(); parent::tearDown(); } /** * Grava o CSV de entrada para o seeder, replicando o cabecalho original. * * @param array<int,array<int,string>> $linhas */ private function gravarCsv(array $linhas): void { $handle = fopen($this->csvTempPath, 'w'); fputcsv($handle, ['CPF (int8)', 'MATRICULA (int8)', 'NOME (varchar)', 'UNIDADE (varchar)', 'EMAIL (varchar)']); foreach ($linhas as $linha) { fputcsv($handle, $linha); } fclose($handle); } /** * Instancia o seeder injetando um Mapeamento pre-configurado para evitar * prompts interativos durante os testes. */ private function novoSeeder(array $deParaUnidades): ImportacaoProdataContaAngraSeeder { Storage::disk('local')->put( MapeamentoUnidadeResource::STORAGE_PATH, json_encode($deParaUnidades, JSON_UNESCAPED_UNICODE) ); $seeder = new ImportacaoProdataContaAngraSeeder( new ImportacaoProdataContaAngraService(), new MapeamentoUnidadeResource() ); $command = new class extends Command { protected $signature = 'tests:importacao-prodata-stub'; }; $command->setLaravel(app()); $command->setOutput(new OutputStyle( new StringInput(''), new BufferedOutput() )); $seeder->setCommand($command); return $seeder; } public function test_seeder_cria_usuarios_novos_com_permissoes_padrao(): void { $structureId = $this->getStructureIdTeste(); $cpf = $this->gerarCpfTeste(100); $this->gravarCsv([ [$cpf, '10000', 'SEEDER NOVO', 'UNIDADE TESTE A', 'seeder.novo@example.com'], ]); $seeder = $this->novoSeeder(['UNIDADE TESTE A' => $structureId]); $seeder->run(); $user = User::where('cpf', $cpf)->first(); $this->assertNotNull($user); $permissoes = Permissao::where('user_id', $user->id)->pluck('permissao')->all(); sort($permissoes); $this->assertSame(['GERENCIADOR_DE_CONTA_ANGRA', 'GUEST'], $permissoes); $contadores = $seeder->getContadores(); $this->assertSame(1, $contadores['criados']); $this->assertSame(0, $contadores['atualizados']); $this->assertSame(0, $contadores['invalidos']); } public function test_seeder_atualiza_usuario_existente_preservando_senha_e_permissoes(): void { $structureId = $this->getStructureIdTeste(); $cpf = $this->gerarCpfTeste(101); $user = new User(); $user->structure_id = $structureId; $user->firstName = 'Pre'; $user->lastName = 'Existente'; $user->cpf = $cpf; $user->matriculation = '90000'; $user->phoneNumber = '21988887777'; $user->email = 'pre.existente@example.com'; $user->password = 'placeholder'; $user->isPasswordDefault = 0; $user->isServidorPublico = 'Sim'; $user->status = 'ATIVADO'; $user->save(); DB::table('users') ->where('id', $user->id) ->update(['password' => 'hash-preexistente-fake']); Permissao::create([ 'user_id' => $user->id, 'permissao' => 'SYSADMIN', 'visualizar' => 1, 'adicionar' => 1, 'editar' => 1, 'excluir' => 1, 'status' => 'ATIVADO', ]); $this->gravarCsv([ [$cpf, '99001', 'NOME ATUALIZADO', 'UNIDADE TESTE A', 'pre.existente.novo@example.com'], ]); $seeder = $this->novoSeeder(['UNIDADE TESTE A' => $structureId]); $seeder->run(); $userDepois = User::where('cpf', $cpf)->firstOrFail(); $this->assertSame('99001', $userDepois->matriculation); $this->assertSame('pre.existente.novo@example.com', $userDepois->getAttributes()['email']); $this->assertSame('21988887777', $userDepois->getAttributes()['phoneNumber']); $this->assertSame('hash-preexistente-fake', $userDepois->getAttributes()['password']); $this->assertSame(0, (int) $userDepois->isPasswordDefault); $permissoes = Permissao::where('user_id', $userDepois->id)->pluck('permissao')->all(); $this->assertContains('SYSADMIN', $permissoes); $this->assertContains('GERENCIADOR_DE_CONTA_ANGRA', $permissoes); $this->assertContains('GUEST', $permissoes); $contadores = $seeder->getContadores(); $this->assertSame(0, $contadores['criados']); $this->assertSame(1, $contadores['atualizados']); } public function test_seeder_e_idempotente_marca_sincronizado_na_segunda_execucao(): void { $structureId = $this->getStructureIdTeste(); $cpf = $this->gerarCpfTeste(102); $this->gravarCsv([ [$cpf, '10002', 'IDEMPOTENCIA', 'UNIDADE TESTE A', 'idempotencia.seeder@example.com'], ]); $primeiro = $this->novoSeeder(['UNIDADE TESTE A' => $structureId]); $primeiro->run(); $segundo = $this->novoSeeder(['UNIDADE TESTE A' => $structureId]); $segundo->run(); $contadores = $segundo->getContadores(); $this->assertSame(0, $contadores['criados']); $this->assertSame(0, $contadores['atualizados']); $this->assertSame(1, $contadores['sincronizados']); } public function test_seeder_aplica_de_para_de_unidades(): void { [$s1, $s2] = $this->getDuasStructuresTeste(); $cpf = $this->gerarCpfTeste(103); $this->gravarCsv([ [$cpf, '10003', 'DE PARA TESTE', 'NOME ESTRANHO DA UNIDADE', 'depara@example.com'], ]); $seeder = $this->novoSeeder(['NOME ESTRANHO DA UNIDADE' => $s2]); $seeder->run(); $user = User::where('cpf', $cpf)->firstOrFail(); $this->assertSame($s2, $user->structure_id); } public function test_seeder_marca_registros_invalidos_e_continua_processando(): void { $structureId = $this->getStructureIdTeste(); $cpfValido = $this->gerarCpfTeste(104); $this->gravarCsv([ ['11111111111', '10004', 'CPF INVALIDO', 'UNIDADE TESTE A', 'invalido@example.com'], [$cpfValido, '10005', 'CPF VALIDO', 'UNIDADE TESTE A', 'valido.continua@example.com'], [$this->gerarCpfTeste(105), '10006', 'EMAIL INVALIDO', 'UNIDADE TESTE A', 'nao-e-email'], ]); $seeder = $this->novoSeeder(['UNIDADE TESTE A' => $structureId]); $seeder->run(); $this->assertNotNull(User::where('cpf', $cpfValido)->first()); $contadores = $seeder->getContadores(); $this->assertSame(1, $contadores['criados']); $this->assertSame(2, $contadores['invalidos']); $invalidos = $seeder->getInvalidos(); $this->assertCount(2, $invalidos); $this->assertSame('CPF INVALIDO', $invalidos[0]['nome']); $this->assertSame('EMAIL INVALIDO', $invalidos[1]['nome']); } public function test_seeder_em_lote_de_50_registros_processa_em_tempo_aceitavel(): void { $structureId = $this->getStructureIdTeste(); $linhas = []; for ($i = 200; $i < 250; $i++) { $linhas[] = [ $this->gerarCpfTeste($i), '500' . $i, 'LOTE NUMERO ' . $i, 'UNIDADE TESTE A', 'lote.' . $i . '@example.com', ]; } $this->gravarCsv($linhas); $seeder = $this->novoSeeder(['UNIDADE TESTE A' => $structureId]); $inicio = microtime(true); $seeder->run(); $duracao = microtime(true) - $inicio; $contadores = $seeder->getContadores(); $this->assertSame(50, $contadores['criados']); $this->assertLessThan(30.0, $duracao, "Importacao de 50 linhas demorou {$duracao}s (esperado < 30s)."); } public function test_seeder_resolve_unidade_via_match_automatico_de_structures_existentes(): void { $structure = Structure::query()->where('status', 'ATIVADO')->first(); $this->assertNotNull($structure, 'Pelo menos uma Structure ATIVADO precisa existir no banco.'); $cpf = $this->gerarCpfTeste(106); $this->gravarCsv([ [$cpf, '60001', 'MATCH AUTO', mb_strtoupper((string) $structure->name), 'match.auto@example.com'], ]); $seeder = $this->novoSeeder([]); $seeder->run(); $user = User::where('cpf', $cpf)->firstOrFail(); $this->assertSame((string) $structure->id, $user->structure_id); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings