53 lines
2.4 KiB
PHP
53 lines
2.4 KiB
PHP
<?php
|
|||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
require_once __DIR__ . '/../app/Domain/Jobcard/StatusTransitionValidator.php';
|
||
|
|
require_once __DIR__ . '/../app/Domain/Jobcard/JobcardWorkflow.php';
|
||
|
|
|
||
|
|
use App\Domain\Jobcard\JobcardWorkflow;
|
||
|
|
|
||
|
|
$workflow = new JobcardWorkflow();
|
||
|
|
|
||
|
|
if ($workflow->allowedInitialStatuses() !== ['new']) {
|
||
|
|
throw new RuntimeException('Expected new to be the only allowed initial status.');
|
||
|
|
}
|
||
|
|
if ($workflow->allowedPriorities() !== ['low', 'normal', 'high', 'critical']) {
|
||
|
|
throw new RuntimeException('Expected the four supported priorities.');
|
||
|
|
}
|
||
|
|
|
||
|
|
$valid = $workflow->validateCommand([
|
||
|
|
'client_id' => '42',
|
||
|
|
'work_requested' => ' Replace the failed pump ',
|
||
|
|
'priority' => 'high',
|
||
|
|
]);
|
||
|
|
if (!$valid['valid'] || $valid['errors'] !== [] || $valid['client_id'] !== 42 || $valid['work_requested'] !== 'Replace the failed pump') {
|
||
|
|
throw new RuntimeException('Expected a valid jobcard command to be normalized.');
|
||
|
|
}
|
||
|
|
|
||
|
|
$invalid = $workflow->validateCommand(['client_id' => 0, 'work_requested' => '', 'priority' => 'urgent']);
|
||
|
|
if ($invalid['valid'] || !isset($invalid['errors']['client_id'], $invalid['errors']['work_requested'], $invalid['errors']['priority'])) {
|
||
|
|
throw new RuntimeException('Expected invalid jobcard command fields to be reported.');
|
||
|
|
}
|
||
|
|
|
||
|
|
$transition = $workflow->validateTransition('in_progress', 'completed', '2026-09-01 12:00:00');
|
||
|
|
if (!$transition['valid'] || $transition['errors'] !== []) {
|
||
|
|
throw new RuntimeException('Expected completion transition with a timestamp to be valid.');
|
||
|
|
}
|
||
|
|
|
||
|
|
$closed = $workflow->validateTransition('completed', 'closed', '2026-09-01 12:00:00', '2026-09-01 13:00:00');
|
||
|
|
if (!$closed['valid'] || $closed['errors'] !== []) {
|
||
|
|
throw new RuntimeException('Expected closure transition with ordered timestamps to be valid.');
|
||
|
|
}
|
||
|
|
|
||
|
|
$invalidTransition = $workflow->validateTransition('new', 'completed');
|
||
|
|
if ($invalidTransition['valid'] || !isset($invalidTransition['errors']['transition'], $invalidTransition['errors']['completed_at'])) {
|
||
|
|
throw new RuntimeException('Expected invalid transition and missing completion timestamp errors.');
|
||
|
|
}
|
||
|
|
|
||
|
|
$invalidDates = $workflow->validateTransition('completed', 'closed', '2026-09-01 14:00:00', '2026-09-01 13:00:00');
|
||
|
|
if ($invalidDates['valid'] || !isset($invalidDates['errors']['timestamps'])) {
|
||
|
|
throw new RuntimeException('Expected closure before completion to be rejected.');
|
||
|
|
}
|
||
|
|
|
||
|
|
printf("Jobcard workflow tests: 7 passed\n");
|