withoutVite(); config(['geography.enabled' => true]); $tenant = Tenant::query()->create(['name' => 'Revisão cartográfica sintética']); $department = Department::query()->create(['tenant_id' => $tenant->id, 'name' => 'Administração']); $this->admin = User::factory()->create(['tenant_id' => $tenant->id, 'department_id' => $department->id, 'purchasing_role' => PurchasingRole::Admin]); $this->actingAs($this->admin); }); test('administrative geography review paginates all unresolved source records in stable order', function () { $response = $this->get('/administracao/divisao-administrativa'); $response->assertOk()->assertHeader('Cache-Control', 'max-age=0, no-store, private')->assertInertia(fn (Assert $page) => $page->component('company/geography-review')->where('total', 10729)->has('records', 50)->where('manifest.records', 20407)); $first = $response->inertiaProps('records'); $second = $this->get('/administracao/divisao-administrativa?page=2')->assertOk()->inertiaProps('records'); expect(array_intersect(array_column($first, 'id'), array_column($second, 'id')))->toBeEmpty(); $this->get('/administracao/divisao-administrativa?issue=blank_designation')->assertInertia(fn (Assert $page) => $page->where('total', 9)->has('records', 9)); }); test('administrative geography review applies the same filters to complete CSV export', function () { $expected = app(AdministrativeGeography::class)->inconsistencies(['issue' => 'duplicate_code_path']); $response = $this->get('/administracao/divisao-administrativa.csv?issue=duplicate_code_path&page=2'); $response->assertOk()->assertDownload('sgc-cartografia-pendencias.csv'); $stream = fopen('php://temp', 'r+'); fwrite($stream, $response->streamedContent()); rewind($stream); $header = fgetcsv($stream, escape: ''); $rows = []; while (($row = fgetcsv($stream, escape: '')) !== false) { $rows[] = $row; } fclose($stream); expect($header)->toHaveCount(10)->and($rows)->toHaveCount(96)->and(array_column($rows, 1))->toBe(array_column($expected, 'id')); expect($rows[0][2])->toBe($expected[0]['raw']['Provincia'])->and($rows[0][8])->toBe($expected[0]['raw']['Designacao']); $id = $expected[0]['id']; $this->get('/administracao/divisao-administrativa?search='.$id.'&issue=duplicate_code_path')->assertInertia(fn (Assert $page) => $page->where('total', 1)->where('records.0.id', $id)); }); test('administrative geography review rejects non administrators and revoked roles', function () { $this->admin->forceFill(['purchasing_role' => PurchasingRole::Procurement])->save(); $this->get('/administracao/divisao-administrativa')->assertForbidden(); $this->get('/administracao/divisao-administrativa.csv')->assertForbidden(); }); test('administrative geography review validates filters and honours the feature switch', function () { $this->getJson('/administracao/divisao-administrativa?issue=invented')->assertUnprocessable(); $this->getJson('/administracao/divisao-administrativa?page=0')->assertUnprocessable(); config(['geography.enabled' => false]); $this->get('/administracao/divisao-administrativa')->assertServiceUnavailable(); $this->get('/administracao/divisao-administrativa.csv')->assertServiceUnavailable(); }); test('administrative geography review CSV neutralizes formulas without modifying catalogue values', function () { $original = app(AdministrativeGeography::class)->record('2'); $malicious = $original; $malicious['raw']['Designacao'] = "\t=1+1"; $this->partialMock(AdministrativeGeography::class)->shouldReceive('inconsistencies')->once()->andReturn([$malicious]); $response = $this->get('/administracao/divisao-administrativa.csv')->assertOk(); $stream = fopen('php://temp', 'r+'); fwrite($stream, $response->streamedContent()); rewind($stream); fgetcsv($stream, escape: ''); $row = fgetcsv($stream, escape: ''); fclose($stream); expect($row[8])->toBe("'\t=1+1")->and($original['raw']['Designacao'])->toBe('Niassa'); });