75 lines
4.2 KiB
PHP
75 lines
4.2 KiB
PHP
<?php
|
|
|
|
use App\Enums\PurchasingRole;
|
|
use App\Models\Department;
|
|
use App\Models\Tenant;
|
|
use App\Models\User;
|
|
use App\Services\AdministrativeGeography;
|
|
use Inertia\Testing\AssertableInertia as Assert;
|
|
|
|
beforeEach(function () {
|
|
$this->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');
|
|
});
|