Add requestBooleanFlag helper and enhance session synchronization logic
- Introduce `requestBooleanFlag` method for consistent boolean parameter handling with default values. - Add `activate_machine` and `sync_relay_state` parameters to `synchronizeSession` for more flexible relay and machine activation control. - Update methods, routes, and tests to integrate the new session synchronization parameters effectively. - Enhance debugging support with additional metadata in simulation and payload captures.
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
app_require('modules/selfserve/classes/selfserve_studio_graph.php');
|
||||
|
||||
use modules\selfserve\classes\selfserve_studio_graph;
|
||||
use modules\selfserve\classes\selfserve_wash_flow;
|
||||
|
||||
function selfserve_studio_graph_without_constructor(): selfserve_studio_graph
|
||||
{
|
||||
@@ -10,6 +11,12 @@ function selfserve_studio_graph_without_constructor(): selfserve_studio_graph
|
||||
return $reflection->newInstanceWithoutConstructor();
|
||||
}
|
||||
|
||||
function selfserve_wash_flow_without_constructor(): selfserve_wash_flow
|
||||
{
|
||||
$reflection = new ReflectionClass(selfserve_wash_flow::class);
|
||||
return $reflection->newInstanceWithoutConstructor();
|
||||
}
|
||||
|
||||
it('serializes questions, conditions, tasks, scopes, and gateways into one graph', function (): void {
|
||||
$service = selfserve_studio_graph_without_constructor();
|
||||
|
||||
@@ -160,3 +167,173 @@ it('keeps layout loading compatible with native PDO named placeholders', functio
|
||||
expect($source)->toContain(':user_id_filter');
|
||||
expect($source)->toContain(':user_id_sort');
|
||||
});
|
||||
|
||||
it('builds guided simulator debug payload with blockers and canvas annotations', function (): void {
|
||||
$service = selfserve_wash_flow_without_constructor();
|
||||
|
||||
$debug = $service->buildStudioDebugPayload(6, [
|
||||
'lane' => ['id' => 7, 'name' => 'Lane 7'],
|
||||
'machine_type' => ['id' => 1001, 'name' => 'Portal'],
|
||||
'vehicle' => null,
|
||||
'reg' => 'TEST123',
|
||||
'customer_number' => null,
|
||||
'vehicle_type_id' => 2,
|
||||
'answers' => [11 => null],
|
||||
'answer_sources' => [11 => 'override'],
|
||||
'questions' => [],
|
||||
'tasks' => [],
|
||||
'allowed_services' => [],
|
||||
'machine_available' => false,
|
||||
'all_visible_questions_answered' => false,
|
||||
'allowed' => false,
|
||||
'config_version_id' => 90,
|
||||
'config_source' => 'draft',
|
||||
'evaluation_trace' => [
|
||||
'visible_question_ids' => [11],
|
||||
'visibility_condition_results' => [21 => true],
|
||||
'condition_results' => [21 => true],
|
||||
'task_gates' => [
|
||||
['task_id' => 41, 'gate_type' => 'QUESTION', 'gate_ref_id' => 11, 'satisfied' => false],
|
||||
],
|
||||
],
|
||||
'debug_candidates' => [
|
||||
'questions' => [
|
||||
['id' => 11, 'question' => 'Are mirrors folded?', 'condition_id' => 21, 'order_priority' => 1],
|
||||
],
|
||||
'conditions' => [
|
||||
['id' => 21, 'name' => 'Trailer present', 'condition_id' => null],
|
||||
],
|
||||
'rules' => [
|
||||
['id' => 31, 'condition_id' => 21, 'type' => 'IS_TRUE', 'object_type' => 'question', 'object_id' => 11, 'name' => 'Mirror answer'],
|
||||
],
|
||||
'tasks' => [
|
||||
['id' => 41, 'task' => 'Fold mirrors', 'gate_type' => 'QUESTION', 'gate_ref_id' => 11, 'services' => ['MACHINE'], 'buttons' => [1], 'order_priority' => 1],
|
||||
],
|
||||
],
|
||||
], [
|
||||
'lookups' => [
|
||||
'labels' => [
|
||||
'departments' => ['6' => 'Roskilde'],
|
||||
'lanes' => ['7' => 'Lane 7'],
|
||||
'vehicle_types' => ['2' => 'Forvogn'],
|
||||
'machine_types' => ['1001' => 'Portal'],
|
||||
'questions' => ['11' => 'Are mirrors folded?'],
|
||||
'conditions' => ['21' => 'Trailer present'],
|
||||
'rules' => ['31' => 'Mirror answer'],
|
||||
'tasks' => ['41' => 'Fold mirrors'],
|
||||
],
|
||||
],
|
||||
'gateway_workspace' => [
|
||||
'gateways' => [
|
||||
[
|
||||
'id' => 701,
|
||||
'label' => 'Roskilde Edge',
|
||||
'status' => 'ONLINE',
|
||||
'bindings' => [
|
||||
['relay_id' => 'M-7', 'label' => 'Machine relay', 'role' => 'MACHINE', 'services' => ['MACHINE']],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'graph' => [
|
||||
'edges' => [
|
||||
['id' => 'task-gate:question:11:41', 'source' => 'question:11', 'target' => 'task:41', 'label' => 'unlocks'],
|
||||
],
|
||||
],
|
||||
]);
|
||||
|
||||
expect($debug['summary']['status'])->toBe('blocked')
|
||||
->and($debug['parameters']['config_source'])->toBe('draft')
|
||||
->and($debug['questions'][0]['state'])->toBe('missing')
|
||||
->and($debug['questions'][0]['answer_source'])->toBe('override')
|
||||
->and($debug['tasks'][0]['state'])->toBe('blocked')
|
||||
->and(array_column($debug['recommendations'], 'title'))->toContain('Answer required questions')
|
||||
->and(array_column($debug['recommendations'], 'title'))->toContain('Configure lane machine relay')
|
||||
->and($debug['graph_annotations']['nodes']['question:11']['state'])->toBe('warning')
|
||||
->and($debug['graph_annotations']['nodes']['lane:7']['state'])->toBe('error');
|
||||
});
|
||||
|
||||
it('resolves simulator gateway service bindings from lane relay slots', function (): void {
|
||||
$service = selfserve_wash_flow_without_constructor();
|
||||
|
||||
$debug = $service->buildStudioDebugPayload(6, [
|
||||
'lane' => ['id' => 7, 'name' => 'Lane 7'],
|
||||
'machine_type' => ['id' => 1001, 'name' => 'Portal'],
|
||||
'vehicle' => null,
|
||||
'reg' => 'TEST123',
|
||||
'customer_number' => null,
|
||||
'vehicle_type_id' => 2,
|
||||
'answers' => [11 => true],
|
||||
'answer_sources' => [11 => 'override'],
|
||||
'questions' => [],
|
||||
'tasks' => [
|
||||
['id' => 41, 'task' => 'Start machine', 'services' => ['MACHINE']],
|
||||
],
|
||||
'allowed_services' => ['MACHINE'],
|
||||
'machine_available' => true,
|
||||
'all_visible_questions_answered' => true,
|
||||
'allowed' => true,
|
||||
'config_version_id' => 90,
|
||||
'config_source' => 'draft',
|
||||
'evaluation_trace' => [
|
||||
'visible_question_ids' => [11],
|
||||
'visibility_condition_results' => [],
|
||||
'condition_results' => [],
|
||||
'task_gates' => [
|
||||
['task_id' => 41, 'gate_type' => 'ALWAYS', 'gate_ref_id' => null, 'satisfied' => true],
|
||||
],
|
||||
],
|
||||
'debug_candidates' => [
|
||||
'questions' => [
|
||||
['id' => 11, 'question' => 'Are mirrors folded?', 'condition_id' => null, 'order_priority' => 1],
|
||||
],
|
||||
'conditions' => [],
|
||||
'rules' => [],
|
||||
'tasks' => [
|
||||
['id' => 41, 'task' => 'Start machine', 'gate_type' => 'ALWAYS', 'gate_ref_id' => null, 'services' => ['MACHINE'], 'buttons' => [1], 'order_priority' => 1],
|
||||
],
|
||||
],
|
||||
], [
|
||||
'lookups' => [
|
||||
'labels' => [
|
||||
'departments' => ['6' => 'Roskilde'],
|
||||
'lanes' => ['7' => 'Lane 7'],
|
||||
'vehicle_types' => ['2' => 'Forvogn'],
|
||||
'machine_types' => ['1001' => 'Portal'],
|
||||
'questions' => ['11' => 'Are mirrors folded?'],
|
||||
'tasks' => ['41' => 'Start machine'],
|
||||
],
|
||||
],
|
||||
'gateway_workspace' => [
|
||||
'gateways' => [
|
||||
[
|
||||
'id' => 701,
|
||||
'label' => 'Roskilde Edge',
|
||||
'status' => 'ONLINE',
|
||||
'bindings' => [
|
||||
['relay_id' => 'M-7', 'label' => 'Machine relay'],
|
||||
],
|
||||
],
|
||||
],
|
||||
'lanes' => [
|
||||
[
|
||||
'id' => 7,
|
||||
'relay_slots' => [
|
||||
['relay_id' => 'M-7', 'slot' => 'MACHINE'],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'graph' => [
|
||||
'edges' => [
|
||||
['id' => 'task-service:41:MACHINE:701:M-7:0', 'source' => 'task:41', 'target' => 'binding:701:M-7:0', 'label' => 'MACHINE'],
|
||||
],
|
||||
],
|
||||
]);
|
||||
|
||||
expect($debug['hardware']['missing_service_bindings'])->toBe([])
|
||||
->and($debug['hardware']['service_bindings']['MACHINE'][0]['node_id'])->toBe('binding:701:M-7:0')
|
||||
->and($debug['hardware']['summary'])->toBe('Lane relay and gateway service bindings are ready for the simulated services.')
|
||||
->and($debug['tasks'][0]['relay_bindings'][0]['service'])->toBe('MACHINE')
|
||||
->and(array_column($debug['recommendations'], 'title'))->toBe(['Flow is ready']);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user