File manager - Edit - /var/www/html/portal/tests/Feature/EmpresasDeTurismoCadastroTest.php
Back
<?php namespace Tests\Feature; use App\Http\Resources\TurisAngra\EmpresasDeTurismo\EmpresaTurismoResource; use App\Http\Services\TurisAngra\EmpresasDeTurismo\EmpresaTurismoService; use App\Helpers\EmpresaTurismoFileHelper; use App\Models\Empresa; use App\Models\Endereco; use App\Models\TurisAngra\EmpresasDeTurismo\EmpresaTurismo; use App\Models\TurisAngra\EmpresasDeTurismo\EmpresaTurismoCadasturAlertaEnviado; use App\Models\User; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; use Tests\TestCase; /** * Testes do fluxo de cadastro e listagem — Empresas de Turismo. */ class EmpresasDeTurismoCadastroTest extends TestCase { private ?User $adminUser = null; private string $testPrefix = 'TEST_AUTO_ET_'; public function test_store_cadastro_completo_aparece_na_listagem_sem_filtro(): void { $user = $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $response = $this->post(route('admin.empresasDeTurismo.store'), $payload); $response->assertRedirect(route('admin.empresasDeTurismo.index')); $response->assertSessionHas('success'); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $this->assertNotNull($empresaId, 'Empresa deve existir em mysql após store'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->assertNotNull($empresaTurismo, 'Registro empresas_turismo deve existir após store'); $indexResponse = $this->get(route('admin.empresasDeTurismo.index')); $indexResponse->assertOk(); $indexResponse->assertSee($payload['razaoSocial'], false); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_store_com_filtro_q_incompativel_redireciona_lista_completa(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['q'] = 'ZZZ_FILTRO_STORE_999'; $response = $this->post(route('admin.empresasDeTurismo.store'), $payload); $response->assertRedirect(route('admin.empresasDeTurismo.index')); $response->assertSessionHas('success'); $indexResponse = $this->get(route('admin.empresasDeTurismo.index')); $indexResponse->assertSee($payload['razaoSocial'], false); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->assertNotNull($empresaTurismo); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_update_com_filtro_q_incompativel_esconde_empresa_na_listagem(): void { $user = $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->assertNotNull($empresaTurismo); $updatePayload = [ 'razaoSocial' => $payload['razaoSocial'], 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'possui_whatsapp' => $payload['possui_whatsapp'] ?? '1', 'email' => $payload['email'], 'cadastur' => $payload['cadastur'], 'status' => 'ATIVADO', 'q' => 'ZZZ_FILTRO_INEXISTENTE_999', ]; $response = $this->put( route('admin.empresasDeTurismo.update', $empresaTurismo->id), $updatePayload ); $response->assertRedirect(); $target = $response->headers->get('Location'); $this->assertNotNull($target); $this->assertStringNotContainsString('q=', $target); $this->assertStringContainsString('cadastur=' . urlencode($payload['cadastur']), $target); $response->assertSessionHas('success'); $response->assertSessionHas('info'); $indexResponse = $this->get(route('admin.empresasDeTurismo.index')); $indexResponse->assertSee($payload['razaoSocial'], false); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_verify_cnpj_existente_cria_vinculo_e_aparece_na_listagem(): void { $user = $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $endereco = Endereco::create([ 'user_id' => $user->id, 'cep' => '23900-000', 'logradouro' => 'Rua Teste', 'numero' => '1', 'bairro' => 'Centro', 'cidade' => 'Angra dos Reis', 'uf' => 'RJ', 'status' => 'ATIVADO', ]); $empresa = Empresa::create([ 'razaoSocial' => $this->testPrefix . 'ORPHAN_' . $suffix, 'nomeFantasia' => $this->testPrefix . 'ORPHAN_' . $suffix, 'numeroInscricaoMunicipal' => (string) random_int(10000000, 99999999), 'cnpj' => preg_replace('/\D/', '', $cnpj), 'anoAbertura' => '2020', 'owner_id' => $user->id, 'endereco_id' => $endereco->id, 'responsavel_id' => $user->id, 'telefone' => '(24) 3333-4444', 'celular' => '(24) 99999-8888', 'email' => $this->testPrefix . 'orphan_' . $suffix . '@test.local', 'status' => 'ATIVADO', ]); $this->assertNull( EmpresaTurismo::where('empresa_id', $empresa->id)->first(), 'Antes do verify não deve haver vínculo turismo' ); $response = $this->post(route('admin.empresasDeTurismo.verify'), ['cnpj' => $cnpj]); $response->assertSessionHas('info'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresa->id)->first(); $this->assertNotNull($empresaTurismo, 'verify deve criar empresas_turismo via firstOrCreate'); $indexResponse = $this->get(route('admin.empresasDeTurismo.index')); $indexResponse->assertSee($empresa->razaoSocial, false); $this->cleanupTestRecords($empresa->id, $empresaTurismo->id); } public function test_index_service_sem_filtro_inclui_empresa_turismo_recém_criada(): void { $user = $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $razaoSocial = $this->testPrefix . 'SERVICE_' . $suffix; $endereco = Endereco::create([ 'user_id' => $user->id, 'cep' => '23900-000', 'logradouro' => 'Rua Teste', 'numero' => '1', 'bairro' => 'Centro', 'cidade' => 'Angra dos Reis', 'uf' => 'RJ', 'status' => 'ATIVADO', ]); $empresa = Empresa::create([ 'razaoSocial' => $razaoSocial, 'nomeFantasia' => $razaoSocial, 'numeroInscricaoMunicipal' => (string) random_int(10000000, 99999999), 'cnpj' => preg_replace('/\D/', '', $cnpj), 'anoAbertura' => '2020', 'owner_id' => $user->id, 'endereco_id' => $endereco->id, 'responsavel_id' => $user->id, 'telefone' => '(24) 3333-4444', 'celular' => '(24) 99999-8888', 'email' => $this->testPrefix . 'svc_' . $suffix . '@test.local', 'status' => 'ATIVADO', ]); $empresaTurismo = EmpresaTurismo::create([ 'empresa_id' => $empresa->id, 'owner_id' => $user->id, 'cadastur' => 'CAD' . random_int(100000, 999999), 'status' => 'ATIVADO', ]); $service = app(EmpresaTurismoService::class); $paginator = $service->index(new Request()); $ids = collect($paginator->items())->pluck('id'); $this->assertTrue( $ids->contains($empresaTurismo->id), 'Index service deve retornar empresa turismo recém-criada' ); $paginatorFiltered = $service->index(new Request(['q' => $empresaTurismo->cadastur])); $filteredIds = collect($paginatorFiltered->items())->pluck('id'); $this->assertTrue($filteredIds->contains($empresaTurismo->id)); $paginatorWrong = $service->index(new Request(['q' => 'NOMExxxINEXISTENTE'])); $wrongIds = collect($paginatorWrong->items())->pluck('id'); $this->assertFalse( $wrongIds->contains($empresaTurismo->id), 'Filtro incompatível não deve retornar a empresa' ); $this->cleanupTestRecords($empresa->id, $empresaTurismo->id); } public function test_store_persiste_documento_e_exibe_link_na_edicao(): void { Storage::fake('public'); $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['contratoSocial'] = UploadedFile::fake()->createWithContent( 'contrato.pdf', '%PDF-1.4 test content' ); $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresa = Empresa::find($empresaId); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->assertNotNull($empresa->contratoSocial); $this->assertStringStartsWith('empresas-de-turismo/documentos/', $empresa->contratoSocial); Storage::disk('public')->assertExists($empresa->contratoSocial); $editResponse = $this->get(route('admin.empresasDeTurismo.edit', $empresaTurismo->id)); $editResponse->assertOk(); $editResponse->assertSee(__('Contrato Social'), false); $editResponse->assertSee(__('baixar'), false); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); Storage::disk('public')->delete($empresa->contratoSocial); } public function test_update_persiste_documento_enviado_no_formulario_de_edicao(): void { Storage::fake('public'); $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->assertNull(Empresa::find($empresaId)->contratoSocial); $updatePayload = [ 'razaoSocial' => $payload['razaoSocial'], 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'possui_whatsapp' => $payload['possui_whatsapp'] ?? '1', 'email' => $payload['email'], 'cadastur' => $payload['cadastur'], 'status' => 'ATIVADO', 'contratoSocial' => UploadedFile::fake()->createWithContent( 'contrato-update.pdf', '%PDF-1.4 update content' ), ]; $this->put(route('admin.empresasDeTurismo.update', $empresaTurismo->id), $updatePayload) ->assertRedirect(); $empresa = Empresa::find($empresaId); $this->assertNotNull($empresa->contratoSocial); Storage::disk('public')->assertExists($empresa->contratoSocial); $this->assertNotNull(EmpresaTurismoFileHelper::publicUrl($empresa->contratoSocial)); Storage::disk('public')->delete($empresa->contratoSocial); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_index_busca_por_cnpj_formatado_encontra_empresa(): void { $this->actingAsAdmin(); $empresaTurismo = EmpresaTurismo::with('companhia')->first(); $this->assertNotNull($empresaTurismo); $empresa = $empresaTurismo->companhia; $this->assertNotNull($empresa?->cnpj); $service = app(EmpresaTurismoService::class); $porCnpjFormatado = $service->index(new Request(['q' => $empresa->cnpj])); $ids = collect($porCnpjFormatado->items())->pluck('id'); $this->assertTrue( $ids->contains($empresaTurismo->id), 'Busca por CNPJ formatado deve retornar a empresa' ); $cnpjLimpo = preg_replace('/\D/', '', $empresa->cnpj); $porCnpjParcial = $service->index(new Request(['q' => substr($cnpjLimpo, 0, 8)])); $idsParcial = collect($porCnpjParcial->items())->pluck('id'); $this->assertTrue( $idsParcial->contains($empresaTurismo->id), 'Busca por parte do CNPJ deve retornar a empresa' ); } public function test_index_busca_por_email_encontra_empresa(): void { $this->actingAsAdmin(); $empresaTurismo = null; foreach (EmpresaTurismo::with('companhia')->limit(50)->get() as $candidate) { if ($candidate->companhia && filled($candidate->companhia->email)) { $empresaTurismo = $candidate; break; } } $this->assertNotNull($empresaTurismo, 'Empresa de turismo com e-mail necessária para o teste'); $email = $empresaTurismo->companhia->email; $service = app(EmpresaTurismoService::class); $paginator = $service->index(new Request(['q' => $email])); $ids = collect($paginator->items())->pluck('id'); $this->assertTrue($ids->contains($empresaTurismo->id)); } public function test_store_e_update_persistem_possui_whatsapp(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['possui_whatsapp'] = '1'; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $empresa = Empresa::find($empresaId); $this->assertTrue($empresa->possui_whatsapp); $this->put(route('admin.empresasDeTurismo.update', $empresaTurismo->id), [ 'razaoSocial' => $payload['razaoSocial'], 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'email' => $payload['email'], 'cadastur' => $payload['cadastur'], 'status' => 'ATIVADO', 'possui_whatsapp' => '0', ])->assertRedirect(); $this->assertFalse(Empresa::find($empresaId)->possui_whatsapp); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_store_persiste_cadastur_vencimento_e_links_de_documentos(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $empresa = Empresa::find($empresaId); $this->assertSame('2027-12-31', $empresaTurismo->cadastur_vencimento->format('Y-m-d')); $this->assertSame('https://drive.google.com/file/d/example/view', $empresa->contratoSocialLink); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_index_filtros_combinados_status_e_cadastur(): void { $user = $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $cadastur = 'CAD' . random_int(100000, 999999); $endereco = Endereco::create([ 'user_id' => $user->id, 'cep' => '23900-000', 'logradouro' => 'Rua Teste', 'numero' => '1', 'bairro' => 'Centro', 'cidade' => 'Angra dos Reis', 'uf' => 'RJ', 'status' => 'ATIVADO', ]); $empresa = Empresa::create([ 'razaoSocial' => $this->testPrefix . 'COMBO_' . $suffix, 'nomeFantasia' => $this->testPrefix . 'COMBO_' . $suffix, 'numeroInscricaoMunicipal' => (string) random_int(10000000, 99999999), 'cnpj' => preg_replace('/\D/', '', $cnpj), 'anoAbertura' => '2020', 'owner_id' => $user->id, 'endereco_id' => $endereco->id, 'responsavel_id' => $user->id, 'telefone' => '(24) 3333-4444', 'celular' => '(24) 99999-8888', 'email' => $this->testPrefix . 'combo_' . $suffix . '@test.local', 'status' => 'ATIVADO', ]); $empresaTurismo = EmpresaTurismo::create([ 'empresa_id' => $empresa->id, 'owner_id' => $user->id, 'cadastur' => $cadastur, 'status' => 'ATIVADO', ]); $service = app(EmpresaTurismoService::class); $paginator = $service->index(new Request([ 'status' => 'ATIVADO', 'cadastur' => $cadastur, ])); $ids = collect($paginator->items())->pluck('id'); $this->assertTrue($ids->contains($empresaTurismo->id)); $paginatorDesativado = $service->index(new Request([ 'status' => 'DESATIVADO', 'cadastur' => $cadastur, ])); $idsDesativado = collect($paginatorDesativado->items())->pluck('id'); $this->assertFalse($idsDesativado->contains($empresaTurismo->id)); $this->cleanupTestRecords($empresa->id, $empresaTurismo->id); } public function test_update_persiste_filtros_e_pagina_na_redirecionamento(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $cadastur = 'CAD' . random_int(100000, 999999); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadastur'] = $cadastur; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $updatePayload = [ 'razaoSocial' => $payload['razaoSocial'], 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'possui_whatsapp' => '1', 'email' => $payload['email'], 'cadastur' => $cadastur, 'status' => 'ATIVADO', 'page' => '9', ]; $response = $this->put( route('admin.empresasDeTurismo.update', $empresaTurismo->id), $updatePayload ); $response->assertRedirect(); $target = $response->headers->get('Location'); $this->assertNotNull($target); $this->assertStringContainsString('page=9', $target); $this->assertStringContainsString('cadastur=' . urlencode($cadastur), $target); $this->assertStringContainsString('status=ATIVADO', $target); $this->assertStringContainsString('possui_whatsapp=1', $target); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_status_toggle_persiste_filtros_na_redirecionamento(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $cadastur = 'CAD' . random_int(100000, 999999); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadastur'] = $cadastur; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $response = $this->post( route('admin.empresasDeTurismo.status', $empresaTurismo->id), [ 'checkStatus' => 'DESATIVADO', 'page' => '2', 'cadastur' => $cadastur, 'q' => $payload['razaoSocial'], ] ); $response->assertRedirect(); $target = $response->headers->get('Location'); $this->assertNotNull($target); $this->assertStringContainsString('page=2', $target); $this->assertStringContainsString('cadastur=' . urlencode($cadastur), $target); $this->assertStringContainsString('q=', $target); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_update_com_list_filter_prefixado_nao_conflita_com_campos_do_form(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $cadastur = 'CAD' . random_int(100000, 999999); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadastur'] = $cadastur; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $updatePayload = [ 'razaoSocial' => $payload['razaoSocial'] . ' OK', 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'possui_whatsapp' => '1', 'email' => $payload['email'], 'cadastur' => $cadastur, 'status' => 'ATIVADO', 'list_filter_sent' => '1', 'list_filter' => [ 'page' => '3', ], ]; $response = $this->put(route('admin.empresasDeTurismo.update', $empresaTurismo->id), $updatePayload); $response->assertRedirect(); $response->assertSessionHas('success'); $empresa = Empresa::find($empresaId); $this->assertSame($payload['razaoSocial'] . ' OK', $empresa->razaoSocial); $this->assertSame($cadastur, EmpresaTurismo::find($empresaTurismo->id)->cadastur); $this->assertTrue($empresa->possui_whatsapp); $target = $response->headers->get('Location'); $this->assertNotNull($target); $this->assertStringContainsString('page=3', $target); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_update_list_filter_nao_sobrescreve_campos_do_formulario(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $cadastur = 'CAD' . random_int(100000, 999999); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadastur'] = $cadastur; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->put(route('admin.empresasDeTurismo.update', $empresaTurismo->id), [ 'razaoSocial' => $payload['razaoSocial'], 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'possui_whatsapp' => '1', 'email' => $payload['email'], 'cadastur' => $cadastur, 'status' => 'ATIVADO', 'list_filter_sent' => '1', 'list_filter' => [ 'status' => 'DESATIVADO', 'cadastur' => 'FILTRO_OUTRO', 'cnpj' => '00.000.000/0001-00', 'possui_whatsapp' => '0', ], ])->assertRedirect()->assertSessionHas('success'); $empresa = Empresa::find($empresaId); $this->assertSame($cadastur, EmpresaTurismo::find($empresaTurismo->id)->cadastur); $this->assertTrue($empresa->possui_whatsapp); $this->assertSame('ATIVADO', EmpresaTurismo::find($empresaTurismo->id)->status); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_update_redireciona_sem_aplicar_campos_do_formulario_como_filtro(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $cadastur = 'CAD' . random_int(100000, 999999); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadastur'] = $cadastur; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $response = $this->put(route('admin.empresasDeTurismo.update', $empresaTurismo->id), [ 'razaoSocial' => $payload['razaoSocial'], 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'possui_whatsapp' => '1', 'email' => $payload['email'], 'cadastur' => $cadastur, 'status' => 'ATIVADO', 'list_filter_sent' => '1', 'list_filter' => [ 'page' => '5', ], ]); $response->assertRedirect()->assertSessionHas('success'); $target = $response->headers->get('Location'); $this->assertNotNull($target); $this->assertStringContainsString('page=5', $target); $this->assertStringNotContainsString('cadastur=', $target); $this->assertStringNotContainsString('cnpj=', $target); $this->assertStringNotContainsString('possui_whatsapp=', $target); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_edit_page_exibe_botoes_atualizar_e_radio_whatsapp_valido(): void { $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $response = $this->get(route('admin.empresasDeTurismo.edit', [ 'empresaTurismo' => $empresaTurismo->id, 'status' => 'ATIVADO', 'page' => '2', ])); $response->assertOk(); $response->assertSee(__('Atualizar Empresa'), false); $response->assertSee('empresaTurismoFormAlert', false); $response->assertSee('empresas-de-turismo.js', false); $content = $response->getContent(); $this->assertStringContainsString('list_filter[status]', $content); $this->assertStringContainsString('list_filter_sent', $content); $this->assertStringContainsString('novalidate', $content); $this->assertMatchesRegularExpression( '/id="possui_whatsapp_sim"[^>]*required/s', $content, 'Radio Sim deve manter required no grupo WhatsApp' ); $this->assertDoesNotMatchRegularExpression( '/id="possui_whatsapp_nao"[^>]*required/s', $content, 'Radio Não não deve ter required (bloqueava o submit)' ); $updatePayload = [ 'razaoSocial' => $payload['razaoSocial'] . ' ALT', 'nomeFantasia' => $payload['nomeFantasia'], 'cnpj' => $cnpj, 'numeroInscricaoMunicipal' => $payload['numeroInscricaoMunicipal'], 'anoAbertura' => $payload['anoAbertura'], 'telefone' => $payload['telefone'], 'celular' => $payload['celular'], 'possui_whatsapp' => '1', 'email' => $payload['email'], 'cadastur' => $payload['cadastur'], 'status' => 'ATIVADO', ]; $this->put(route('admin.empresasDeTurismo.update', $empresaTurismo->id), $updatePayload) ->assertRedirect() ->assertSessionHas('success'); $this->assertSame( $payload['razaoSocial'] . ' ALT', Empresa::find($empresaId)->razaoSocial ); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); } public function test_cadastur_alerta_visual_ativo_no_periodo_de_30_dias(): void { Carbon::setTestNow('2026-06-15'); $empresaTurismo = new EmpresaTurismo([ 'status' => 'ATIVADO', 'cadastur' => 'CAD123456', 'cadastur_vencimento' => '2026-07-01', ]); $empresaTurismo->cadastur_vencimento = Carbon::parse('2026-07-01'); $this->assertTrue(EmpresaTurismoResource::cadasturEmAlertaVisual($empresaTurismo)); $this->assertSame( 16, EmpresaTurismoResource::cadasturDiasRestantes($empresaTurismo) ); $this->assertNotNull(EmpresaTurismoResource::cadasturMensagemAlertaVisual($empresaTurismo)); $this->assertStringContainsString( 'dessa empresa', EmpresaTurismoResource::cadasturMensagemAlertaVisualGestor($empresaTurismo) ); Carbon::setTestNow(); } public function test_cadastur_alerta_visual_inativo_fora_do_periodo(): void { Carbon::setTestNow('2026-05-01'); $empresaTurismo = new EmpresaTurismo([ 'status' => 'ATIVADO', 'cadastur' => 'CAD123456', ]); $empresaTurismo->cadastur_vencimento = Carbon::parse('2026-07-01'); $this->assertFalse(EmpresaTurismoResource::cadasturEmAlertaVisual($empresaTurismo)); Carbon::setTestNow('2026-07-02'); $this->assertFalse(EmpresaTurismoResource::cadasturEmAlertaVisual($empresaTurismo)); Carbon::setTestNow(); } public function test_emails_cadastur_pendentes_apenas_na_data_de_referencia(): void { config(['empresas_turismo.alertas_email_turisangra' => ['turisangra@test.local']]); Carbon::setTestNow('2026-06-01'); $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadasturVencimento'] = '2026-07-01'; $payload['email'] = 'empresa-alerta-' . $suffix . '@test.local'; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::with('companhia')->where('empresa_id', $empresaId)->first(); $pendentes = EmpresaTurismoResource::emailsCadasturPendentesEnvio($empresaTurismo); $this->assertCount(2, $pendentes); Carbon::setTestNow('2026-05-31'); $this->assertTrue(EmpresaTurismoResource::emailsCadasturPendentesEnvio($empresaTurismo)->isEmpty()); EmpresaTurismoResource::registrarCadasturAlertaEnviado( $empresaTurismo, EmpresaTurismoResource::TIPO_CADASTUR_VENCIMENTO_30_DIAS_EMPRESA, Carbon::parse('2026-06-01') ); Carbon::setTestNow('2026-06-01'); $pendentesAposRegistro = EmpresaTurismoResource::emailsCadasturPendentesEnvio($empresaTurismo); $this->assertCount(1, $pendentesAposRegistro); $this->assertSame( EmpresaTurismoResource::TIPO_CADASTUR_VENCIMENTO_30_DIAS_TURISANGRA, $pendentesAposRegistro->first()['tipo'] ); EmpresaTurismoCadasturAlertaEnviado::where('empresa_turismo_id', $empresaTurismo->id)->delete(); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); Carbon::setTestNow(); } public function test_index_exibe_badge_alerta_cadastur_no_periodo(): void { Carbon::setTestNow('2026-06-20'); $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadasturVencimento'] = '2026-07-10'; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $response = $this->get(route('admin.empresasDeTurismo.index')); $response->assertOk(); $response->assertSee(__('Vencimento'), false); $response->assertSee('fa-triangle-exclamation', false); $response->assertSee(__('O CADASTUR dessa empresa vence'), false); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); Carbon::setTestNow(); } public function test_cadastur_vencido_exibe_badge_vermelha_na_index(): void { Carbon::setTestNow('2026-06-24'); $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadasturVencimento'] = '2026-06-22'; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::where('empresa_id', $empresaId)->first(); $this->assertTrue(EmpresaTurismoResource::cadasturVencido($empresaTurismo)); $response = $this->get(route('admin.empresasDeTurismo.index')); $response->assertOk(); $response->assertSee(__('Vencido'), false); $response->assertSee('bg-danger', false); $response->assertSee('fa-circle-exclamation', false); $response->assertSee(__('O CADASTUR dessa empresa está vencido'), false); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); Carbon::setTestNow(); } public function test_conta_angra_alerta_cadastur_apenas_por_email_empresa_sem_gestor_admin(): void { Carbon::setTestNow('2026-06-24'); $admin = $this->actingAsAdmin(); $cnpj = $this->generateUniqueValidCnpj(); $suffix = uniqid('', true); $emailEmpresa = 'cadastur-conta-' . $suffix . '@test.local'; $payload = $this->buildStorePayload($cnpj, $suffix); $payload['cadasturVencimento'] = '2026-07-24'; $payload['email'] = $emailEmpresa; $this->post(route('admin.empresasDeTurismo.store'), $payload)->assertRedirect(); $empresaId = Empresa::where('cnpj', preg_replace('/\D/', '', $cnpj))->value('id'); $empresaTurismo = EmpresaTurismo::with('companhia')->where('empresa_id', $empresaId)->first(); $this->assertNotNull($empresaTurismo); $alertasGestor = EmpresaTurismoResource::empresasTurismoCadasturAlertaVisualParaUsuario($admin); $this->assertFalse($alertasGestor->contains('id', $empresaTurismo->id)); $outroUsuario = User::where('id', '!=', $admin->id) ->whereDoesntHave('permissoes', function ($q) { $q->where('permissao', 'GERENCIADOR_DE_EMPRESAS_DE_TURISMO'); }) ->first(); $this->assertNotNull($outroUsuario); $emailOriginalOutro = $outroUsuario->getAttributes()['email'] ?? ''; $outroUsuario->forceFill(['email' => 'sem-vinculo-' . $suffix . '@test.local'])->save(); $alertasSemVinculo = EmpresaTurismoResource::empresasTurismoCadasturAlertaVisualParaUsuario( $outroUsuario->fresh() ); $this->assertFalse($alertasSemVinculo->contains('id', $empresaTurismo->id)); $outroUsuario->forceFill(['email' => $emailEmpresa])->save(); $alertasPorEmail = EmpresaTurismoResource::empresasTurismoCadasturAlertaVisualParaUsuario( $outroUsuario->fresh() ); $this->assertTrue($alertasPorEmail->contains('id', $empresaTurismo->id)); $outroUsuario->forceFill(['email' => $emailOriginalOutro])->save(); $this->cleanupTestRecords($empresaId, $empresaTurismo->id); Carbon::setTestNow(); } private function actingAsAdmin(): User { $user = User::whereHas('permissoes', function ($q) { $q->where('permissao', 'GERENCIADOR_DE_EMPRESAS_DE_TURISMO'); })->first(); if (!$user) { $user = User::whereHas('permissoes', function ($q) { $q->where('permissao', 'SYSADMIN'); })->first(); } $this->assertNotNull($user, 'Usuário com permissão de Empresas de Turismo necessário para testes'); $this->adminUser = $user; $this->actingAs($user); return $user; } private function buildStorePayload(string $cnpj, string $suffix): array { return [ 'razaoSocial' => $this->testPrefix . $suffix, 'nomeFantasia' => $this->testPrefix . 'FANT_' . $suffix, 'numeroInscricaoMunicipal' => (string) random_int(10000000, 99999999), 'cnpj' => $cnpj, 'anoAbertura' => '2020', 'telefone' => '(24) 3333-4444', 'celular' => '(24) 99999-8888', 'possui_whatsapp' => '1', 'email' => $this->testPrefix . $suffix . '@test.local', 'site' => 'https://example.com', 'cadastur' => 'CAD' . random_int(100000, 999999), 'cadasturVencimento' => '2027-12-31', 'contratoSocialLink' => 'https://drive.google.com/file/d/example/view', 'fullNameResponsavelEmpresa' => 'Teste Responsavel', 'cpfResponsavelEmpresa' => $this->generateUniqueValidCpf(), 'emailResponsavelEmpresa' => $this->testPrefix . 'resp_' . $suffix . '@test.local', 'phoneNumberResponsavelEmpresa' => '(24) 98888-7777', 'cep' => '23900-000', 'logradouro' => 'Rua Teste', 'numero' => '100', 'bairro' => 'Centro', 'cidade' => 'Angra dos Reis', 'uf' => 'RJ', 'status' => 'ATIVADO', ]; } private function generateUniqueValidCnpj(): string { $base = str_pad((string) random_int(0, 99999999), 8, '0', STR_PAD_LEFT); $partial = $base . '0001'; $weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; $sum = 0; for ($i = 0; $i < 12; $i++) { $sum += (int) $partial[$i] * $weights1[$i]; } $d1 = $sum % 11 < 2 ? 0 : 11 - ($sum % 11); $partial .= $d1; $weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; $sum = 0; for ($i = 0; $i < 13; $i++) { $sum += (int) $partial[$i] * $weights2[$i]; } $d2 = $sum % 11 < 2 ? 0 : 11 - ($sum % 11); $full = $partial . $d2; return substr($full, 0, 2) . '.' . substr($full, 2, 3) . '.' . substr($full, 5, 3) . '/' . substr($full, 8, 4) . '-' . substr($full, 12, 2); } private function generateUniqueValidCpf(): string { $n = []; for ($i = 0; $i < 9; $i++) { $n[$i] = random_int(0, 9); } $sum = 0; for ($i = 0; $i < 9; $i++) { $sum += $n[$i] * (10 - $i); } $d1 = $sum % 11 < 2 ? 0 : 11 - ($sum % 11); $sum = 0; for ($i = 0; $i < 9; $i++) { $sum += $n[$i] * (11 - $i); } $sum += $d1 * 2; $d2 = $sum % 11 < 2 ? 0 : 11 - ($sum % 11); return sprintf( '%d%d%d.%d%d%d.%d%d%d-%d%d', $n[0], $n[1], $n[2], $n[3], $n[4], $n[5], $n[6], $n[7], $n[8], $d1, $d2 ); } private function cleanupTestRecords(string $empresaId, string $empresaTurismoId): void { EmpresaTurismo::where('id', $empresaTurismoId)->delete(); Empresa::where('id', $empresaId)->delete(); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings