Files
api/services/nginx/app/tests/Api/PlateScannersApiTest.php
T

126 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
usesApiSuite();
it('returns the updated lane id after editing a scanner whose null lane was already cached', function (): void {
api_test_covers('PUT /numberplatescanners', 'happy');
$department = api_fixtures()->createDepartment([
'name' => 'Scanner Department ' . uniqid('', false),
]);
$session = api_fixtures()->createUserSession([
'add_department_lane',
'add_number_plate_scanner',
'edit_number_plate_scanner',
]);
$laneName = 'Lane ' . uniqid('', false);
$laneResponse = api_client()->post('/department/lanes', [
'department' => $department['id'],
'name' => $laneName,
], $session['headers']);
$laneResponse
->assertStatus(200)
->assertEnvelope()
->assertSuccess();
$lane = api_test_runtime()->queryOne(
"SELECT id FROM department_lanes WHERE department = " . (int)$department['id'] .
" AND name = '" . api_test_runtime()->db()->real_escape_string($laneName) . "'" .
' ORDER BY id DESC LIMIT 1'
);
expect($lane)->not->toBeNull();
$laneId = (int)($lane['id'] ?? 0);
expect($laneId)->toBeGreaterThan(0);
api_fixtures()->cleanupDeleteById('department_lanes', $laneId);
$scannerName = 'Scanner ' . uniqid('', false);
$createResponse = api_client()->post('/numberplatescanners', [
'department_id' => $department['id'],
'name' => $scannerName,
'notes' => 'Original notes',
], $session['headers']);
$createResponse
->assertStatus(200)
->assertEnvelope()
->assertSuccess()
->assertMessage('Number plate scanner added');
$createdScanner = api_test_runtime()->queryOne(
"SELECT id FROM plate_scanners WHERE department_id = " . (int)$department['id'] .
" AND name = '" . api_test_runtime()->db()->real_escape_string($scannerName) . "'" .
' ORDER BY id DESC LIMIT 1'
);
expect($createdScanner)->not->toBeNull();
$scannerId = (int)($createdScanner['id'] ?? 0);
expect($scannerId)->toBeGreaterThan(0);
api_fixtures()->cleanupDeleteById('plate_scanners', $scannerId);
$redis = api_test_runtime()->redis();
expect($redis)->not->toBeNull();
$cacheKeys = [
"obj_prop:plate_scanners:{$scannerId}:lane_id" => '___NULL___',
"obj_prop:plate_scanners:{$scannerId}:name" => $scannerName,
"obj_prop:plate_scanners:{$scannerId}:notes" => 'Original notes',
];
foreach ($cacheKeys as $cacheKey => $value) {
$redis->set($cacheKey, $value);
}
$updateResponse = api_client()->put('/numberplatescanners', [
'id' => $scannerId,
'department_id' => $department['id'],
'lane_id' => $laneId,
'name' => 'Updated scanner',
'notes' => 'Updated notes',
], $session['headers']);
$updateResponse
->assertStatus(200)
->assertEnvelope()
->assertSuccess()
->assertMessage('Number plate scanner edited');
$redis->del(array_keys($cacheKeys));
$updatedScanner = $updateResponse->data()['scanner'] ?? null;
expect($updatedScanner)->toBeArray();
expect($updatedScanner['id'] ?? null)->toBe($scannerId);
expect($updatedScanner['department_id'] ?? null)->toBe($department['id']);
expect($updatedScanner['lane_id'] ?? null)->toBe($laneId);
expect($updatedScanner['name'] ?? null)->toBe('Updated scanner');
expect($updatedScanner['notes'] ?? null)->toBe('Updated notes');
$row = api_fixtures()->fetchRowById('plate_scanners', $scannerId);
expect($row)->not->toBeNull();
expect((int)($row['lane_id'] ?? 0))->toBe($laneId);
expect($row['name'] ?? null)->toBe('Updated scanner');
expect($row['notes'] ?? null)->toBe('Updated notes');
});
it('rejects plate scanner edits when the permission is missing', function (): void {
api_test_covers('PUT /numberplatescanners', 'auth');
$session = api_fixtures()->createUserSession([]);
$response = api_client()->put('/numberplatescanners', [
'id' => 1,
'department_id' => 1,
'name' => 'No permission',
'notes' => 'Should fail',
], $session['headers']);
$response
->assertStatus(403)
->assertEnvelope()
->assertSuccess(false)
->assertMissingPermissions(['edit_number_plate_scanner']);
});