Add unit tests for cleaner and machine relay flows, refactor relay logic with hard set methods, enhance route handling for lane state transitions, and update session management.
This commit is contained in:
@@ -140,6 +140,7 @@ class selfserve_wash_flow implements selfserve_wash_flow_i
|
||||
if ((int)$lane->getWashStartTime() <= 0) {
|
||||
$lane->setWashStartTime(time());
|
||||
}
|
||||
$this->enableCleanerRelayForStartedWash($lane);
|
||||
|
||||
$session->markMachineStartTriggered();
|
||||
$this->logSessionEvent((int)$session->id, selfserve_wash_event_type::MACHINE_START_TRIGGERED, $payload + [
|
||||
@@ -151,6 +152,39 @@ class selfserve_wash_flow implements selfserve_wash_flow_i
|
||||
return $this->getSessionSummary((int)$session->id);
|
||||
}
|
||||
|
||||
protected function enableCleanerRelayForStartedWash(selfserve_lane $lane): void
|
||||
{
|
||||
try {
|
||||
if (
|
||||
empty($lane->department_lane)
|
||||
|| empty($lane->department_lane->relay_machine_cleaner_id)
|
||||
|| trim((string)$lane->department_lane->relay_machine_cleaner_id->value()) === ''
|
||||
) {
|
||||
return;
|
||||
}
|
||||
$lane->setMachineCleanerRelayStatusHard(true);
|
||||
} catch (\Throwable) {
|
||||
// Best effort only; webhook start flow must continue.
|
||||
}
|
||||
}
|
||||
|
||||
protected function disableMachineRelayForCompletedWash(int $laneId): void
|
||||
{
|
||||
try {
|
||||
$lane = (new selfserve())->lane($laneId);
|
||||
if (
|
||||
empty($lane->department_lane)
|
||||
|| empty($lane->department_lane->relay_machine_id)
|
||||
|| trim((string)$lane->department_lane->relay_machine_id->value()) === ''
|
||||
) {
|
||||
return;
|
||||
}
|
||||
$lane->setMachineRelayStatusHard(false);
|
||||
} catch (\Throwable) {
|
||||
// Best effort only; session completion flow must continue.
|
||||
}
|
||||
}
|
||||
|
||||
public function getSessionSummary(int $sessionId): array
|
||||
{
|
||||
$session = (new selfserve_wash_sessions_o())->select($sessionId);
|
||||
@@ -220,6 +254,7 @@ class selfserve_wash_flow implements selfserve_wash_flow_i
|
||||
}
|
||||
|
||||
$session->markCompleted($orderId);
|
||||
$this->disableMachineRelayForCompletedWash($laneId);
|
||||
$this->logSessionEvent((int)$session->id, selfserve_wash_event_type::SESSION_COMPLETED, [
|
||||
'lane_id' => $laneId,
|
||||
'reg' => $reg === null ? (string)$session->reg->value() : selfserve::standardize_registration($reg),
|
||||
|
||||
@@ -77,6 +77,23 @@ trait selfserve_lane_command_t
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable cleaner relay when a wash is started.
|
||||
* Best-effort and skipped when cleaner relay is not configured.
|
||||
*/
|
||||
protected function turnOnCleanerRelayForWashStart(): void
|
||||
{
|
||||
if (!$this->isRelayConfigured(selfserve_lane_relay::MACHINE_CLEANER)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$this->setMachineCleanerRelayStatusHard(true);
|
||||
} catch (\Throwable) {
|
||||
// Best effort only; wash start must continue.
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable relays after STOP in deterministic order:
|
||||
* cleaner -> machine -> program selector.
|
||||
@@ -88,7 +105,7 @@ trait selfserve_lane_command_t
|
||||
selfserve_lane_relay::MACHINE,
|
||||
selfserve_lane_relay::MACHINE_PROGRAM_PICKER,
|
||||
] as $relay) {
|
||||
if (!$this->isRelayConfiguredForStop($relay)) {
|
||||
if (!$this->isRelayConfigured($relay)) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
@@ -99,7 +116,7 @@ trait selfserve_lane_command_t
|
||||
}
|
||||
}
|
||||
|
||||
protected function isRelayConfiguredForStop(selfserve_lane_relay $relay): bool
|
||||
protected function isRelayConfigured(selfserve_lane_relay $relay): bool
|
||||
{
|
||||
if (empty($this->department_lane)) {
|
||||
return false;
|
||||
@@ -191,6 +208,8 @@ trait selfserve_lane_command_t
|
||||
$this->open(selfserve_lane_port::ENTRANCE);
|
||||
// Start the wash timer
|
||||
$this->setWashStartTime(time());
|
||||
// Ensure cleaner relay is enabled whenever wash starts.
|
||||
$this->turnOnCleanerRelayForWashStart();
|
||||
// Log the lane start event
|
||||
$this->logLaneAction(selfserve_lane_log_action::START_WASH);
|
||||
break;
|
||||
|
||||
@@ -4,13 +4,11 @@ namespace modules\selfserve\traits;
|
||||
require_once WD . '/modules/selfserve/helpers/selfserve_lane_port.php';
|
||||
require_once WD . '/modules/selfserve/classes/selfserve_lane.php';
|
||||
|
||||
use classes\shelly;
|
||||
use modules\selfserve\helpers\selfserve_lane_port;
|
||||
use modules\selfserve\helpers\selfserve_lane_log_action;
|
||||
use modules\selfserve\helpers\selfserve_lane_state;
|
||||
use modules\selfserve\helpers\selfserve_lane_status;
|
||||
use modules\shelly\helpers\shelly_device_switch;
|
||||
use modules\shelly\helpers\shelly_request_body_get_states;
|
||||
|
||||
trait selfserve_lane_port_controller_t
|
||||
{
|
||||
@@ -69,23 +67,14 @@ trait selfserve_lane_port_controller_t
|
||||
if (empty($relay_id)) {
|
||||
throw new \Exception("Invalid relay ID for port {$port->name}");
|
||||
}
|
||||
$shelly = new shelly();
|
||||
$shelly->requireModuleEnabled();
|
||||
$shelly->requireValidSecretKey();
|
||||
$parameters = new shelly_request_body_get_states();
|
||||
$parameters->ids = [$relay_id];
|
||||
$parameters->select = ['status'];
|
||||
$result = $shelly->sendPostRequest('/v2/devices/api/get', (array)$parameters);
|
||||
// Wait 1 second
|
||||
sleep(1);
|
||||
// Format the result
|
||||
$result = array_map(function ($device) {
|
||||
return (new shelly_device_switch())->populate($device);
|
||||
}, $result);
|
||||
// Open the switch
|
||||
foreach ($result as $device) {
|
||||
$device->switch(true);
|
||||
}
|
||||
$device = $this->createShellySwitchDevice();
|
||||
$device->id = (string)$relay_id;
|
||||
$device->switch(true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
protected function createShellySwitchDevice(): shelly_device_switch
|
||||
{
|
||||
return new shelly_device_switch();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -535,6 +535,10 @@ class departmentsRoute
|
||||
$this->setOptionalLaneRelayState($lane, 'relay_machine_program_picker_id', static function () use ($lane): void {
|
||||
$lane->setMachineProgramPickerRelayStatusHard(true);
|
||||
});
|
||||
// Re-assert cleaner ON after stack enable sequence to avoid relay-side flip-back.
|
||||
$this->setOptionalLaneRelayState($lane, 'relay_machine_cleaner_id', static function () use ($lane): void {
|
||||
$lane->setMachineCleanerRelayStatusHard(true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -63,42 +63,14 @@ class moduleSelfServeRoute
|
||||
self::requireType($lane_id, self::type_int());
|
||||
self::requireMinValue($lane_id, 1);
|
||||
|
||||
$rows = (new selfserve_wash_sessions_o())->getFieldsWhere([
|
||||
'lane_id' => $lane_id,
|
||||
'completed_at' => null,
|
||||
'deleted_at' => null,
|
||||
], ['id']);
|
||||
$build_customer = static function (?int $customer_number): ?array {
|
||||
if ($customer_number === null || $customer_number <= 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($rows === []) {
|
||||
$response->success([
|
||||
'lane_id' => $lane_id,
|
||||
'in_progress' => false,
|
||||
'session' => null,
|
||||
'customer' => null,
|
||||
'vehicle' => null,
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
usort($rows, static fn(array $a, array $b): int => (int)$b['id'] <=> (int)$a['id']);
|
||||
$session = (new selfserve_wash_sessions_o())->select((int)$rows[0]['id']);
|
||||
if (!$session->exists()) {
|
||||
$response->success([
|
||||
'lane_id' => $lane_id,
|
||||
'in_progress' => false,
|
||||
'session' => null,
|
||||
'customer' => null,
|
||||
'vehicle' => null,
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
$customer = null;
|
||||
$customer_number = $session->customer_number->value() === null ? null : (int)$session->customer_number->value();
|
||||
if ($customer_number !== null && $customer_number > 0) {
|
||||
$customer_obj = (new users_o())->getUserByCustomerNumber($customer_number);
|
||||
if ($customer_obj->exists()) {
|
||||
$customer = [
|
||||
return [
|
||||
'id' => (int)$customer_obj->id,
|
||||
'customer_number' => $customer_number,
|
||||
'display_name' => $customer_obj->display_name->value() === null ? null : (string)$customer_obj->display_name->value(),
|
||||
@@ -106,53 +78,127 @@ class moduleSelfServeRoute
|
||||
'phone_country_code' => $customer_obj->phone_country_code->value() === null ? null : (int)$customer_obj->phone_country_code->value(),
|
||||
'phone' => $customer_obj->phone->value() === null ? null : (string)$customer_obj->phone->value(),
|
||||
];
|
||||
} else {
|
||||
$customer = [
|
||||
'id' => null,
|
||||
'customer_number' => $customer_number,
|
||||
'display_name' => null,
|
||||
'email' => null,
|
||||
'phone_country_code' => null,
|
||||
'phone' => null,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$vehicle = null;
|
||||
$vehicle_obj = null;
|
||||
$vehicle_id = $session->vehicle_id->value() === null ? null : (int)$session->vehicle_id->value();
|
||||
if ($vehicle_id !== null && $vehicle_id > 0) {
|
||||
$tmp_vehicle = (new customer_vehicles_o())->select($vehicle_id);
|
||||
if ($tmp_vehicle->exists()) {
|
||||
$vehicle_obj = $tmp_vehicle;
|
||||
}
|
||||
}
|
||||
if ($vehicle_obj === null) {
|
||||
$session_reg = trim((string)$session->reg->value());
|
||||
if ($session_reg !== '') {
|
||||
$tmp_vehicle = (new customer_vehicles_o())->selectByPlate($session_reg);
|
||||
return [
|
||||
'id' => null,
|
||||
'customer_number' => $customer_number,
|
||||
'display_name' => null,
|
||||
'email' => null,
|
||||
'phone_country_code' => null,
|
||||
'phone' => null,
|
||||
];
|
||||
};
|
||||
|
||||
$build_vehicle = static function (?int $vehicle_id, ?string $reg): ?array {
|
||||
$vehicle_obj = null;
|
||||
if ($vehicle_id !== null && $vehicle_id > 0) {
|
||||
$tmp_vehicle = (new customer_vehicles_o())->select($vehicle_id);
|
||||
if ($tmp_vehicle->exists()) {
|
||||
$vehicle_obj = $tmp_vehicle;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($vehicle_obj !== null) {
|
||||
$vehicle = [
|
||||
if ($vehicle_obj === null && $reg !== null && trim($reg) !== '') {
|
||||
$tmp_vehicle = (new customer_vehicles_o())->selectByPlate(trim($reg));
|
||||
if ($tmp_vehicle->exists()) {
|
||||
$vehicle_obj = $tmp_vehicle;
|
||||
}
|
||||
}
|
||||
if ($vehicle_obj === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => (int)$vehicle_obj->id,
|
||||
'customer_id' => (int)$vehicle_obj->customer_id->value(),
|
||||
'type' => (int)$vehicle_obj->type->value(),
|
||||
'reg' => (string)$vehicle_obj->reg->value(),
|
||||
'reference' => $vehicle_obj->reference->value() === null ? null : (string)$vehicle_obj->reference->value(),
|
||||
];
|
||||
};
|
||||
|
||||
$rows = (new selfserve_wash_sessions_o())->getFieldsWhere([
|
||||
'lane_id' => $lane_id,
|
||||
'completed_at' => null,
|
||||
'deleted_at' => null,
|
||||
], ['id']);
|
||||
$session = null;
|
||||
if ($rows !== []) {
|
||||
usort($rows, static fn(array $a, array $b): int => (int)$b['id'] <=> (int)$a['id']);
|
||||
$tmp_session = (new selfserve_wash_sessions_o())->select((int)$rows[0]['id']);
|
||||
if ($tmp_session->exists()) {
|
||||
$session = $tmp_session;
|
||||
}
|
||||
}
|
||||
|
||||
if ($session === null) {
|
||||
$selfserve = new selfserve();
|
||||
$lane = $selfserve->lane($lane_id);
|
||||
$lane_status = $lane->getLaneStatus();
|
||||
$lane_state = $lane->getLaneState();
|
||||
$in_progress = $lane_status->equals(\modules\selfserve\helpers\selfserve_lane_status::OCCUPIED)
|
||||
|| $lane_state->equals(\modules\selfserve\helpers\selfserve_lane_state::IN_WASH);
|
||||
|
||||
if (!$in_progress) {
|
||||
$response->success([
|
||||
'lane_id' => $lane_id,
|
||||
'in_progress' => false,
|
||||
'session' => null,
|
||||
'customer' => null,
|
||||
'vehicle' => null,
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
$runtime_customer_number = (int)$lane->getCustomerNumber();
|
||||
if ($runtime_customer_number <= 0) {
|
||||
$runtime_customer_number = null;
|
||||
}
|
||||
$runtime_reg = trim((string)$lane->getLicensePlate());
|
||||
if ($runtime_reg === '') {
|
||||
$runtime_reg = null;
|
||||
}
|
||||
|
||||
$customer = $build_customer($runtime_customer_number);
|
||||
$vehicle = $build_vehicle(null, $runtime_reg);
|
||||
$response->success([
|
||||
'lane_id' => $lane_id,
|
||||
'in_progress' => true,
|
||||
'session' => [
|
||||
'id' => null,
|
||||
'status' => $lane_state->name,
|
||||
'reg' => $runtime_reg,
|
||||
'customer_number' => $runtime_customer_number,
|
||||
'vehicle_id' => $vehicle['id'] ?? null,
|
||||
'vehicle_type_id' => $vehicle['type'] ?? null,
|
||||
'machine_type_id' => null,
|
||||
'machine_start_triggered' => $lane_state->equals(\modules\selfserve\helpers\selfserve_lane_state::IN_WASH),
|
||||
'machine_start_triggered_at' => null,
|
||||
'created_at' => null,
|
||||
'updated_at' => null,
|
||||
],
|
||||
'customer' => $customer,
|
||||
'vehicle' => $vehicle,
|
||||
]);
|
||||
return;
|
||||
}
|
||||
|
||||
$customer_number = $session->customer_number->value() === null ? null : (int)$session->customer_number->value();
|
||||
$vehicle_id = $session->vehicle_id->value() === null ? null : (int)$session->vehicle_id->value();
|
||||
$session_reg = trim((string)$session->reg->value());
|
||||
if ($session_reg === '') {
|
||||
$session_reg = null;
|
||||
}
|
||||
$customer = $build_customer($customer_number);
|
||||
$vehicle = $build_vehicle($vehicle_id, $session_reg);
|
||||
|
||||
$response->success([
|
||||
'lane_id' => $lane_id,
|
||||
'in_progress' => true,
|
||||
'session' => [
|
||||
'id' => (int)$session->id,
|
||||
'status' => (string)$session->status->value(),
|
||||
'reg' => (string)$session->reg->value(),
|
||||
'reg' => $session_reg,
|
||||
'customer_number' => $customer_number,
|
||||
'vehicle_id' => $vehicle_id,
|
||||
'vehicle_type_id' => $session->vehicle_type_id->value() === null ? null : (int)$session->vehicle_type_id->value(),
|
||||
@@ -735,6 +781,16 @@ class moduleSelfServeRoute
|
||||
if ((int)$lane->getWashStartTime() <= 0) {
|
||||
$lane->setWashStartTime(time());
|
||||
}
|
||||
// A started wash should always have cleaner relay enabled when configured.
|
||||
try {
|
||||
if (
|
||||
!empty($lane->department_lane)
|
||||
&& !empty($lane->department_lane->relay_machine_cleaner_id)
|
||||
&& trim((string)$lane->department_lane->relay_machine_cleaner_id->value()) !== ''
|
||||
) {
|
||||
$lane->setMachineCleanerRelayStatusHard(true);
|
||||
}
|
||||
} catch (\Throwable $ignored) {}
|
||||
// Force enable the machine relay (bypass gating)
|
||||
$lane->forceTurnOnMachineRelay($duration);
|
||||
// Reflect relay state explicitly
|
||||
@@ -781,6 +837,16 @@ class moduleSelfServeRoute
|
||||
if ((int)$lane->getWashStartTime() <= 0) {
|
||||
$lane->setWashStartTime(time());
|
||||
}
|
||||
// A started wash should always have cleaner relay enabled when configured.
|
||||
try {
|
||||
if (
|
||||
!empty($lane->department_lane)
|
||||
&& !empty($lane->department_lane->relay_machine_cleaner_id)
|
||||
&& trim((string)$lane->department_lane->relay_machine_cleaner_id->value()) !== ''
|
||||
) {
|
||||
$lane->setMachineCleanerRelayStatusHard(true);
|
||||
}
|
||||
} catch (\Throwable $ignored) {}
|
||||
// Turn off the machine relay (do not swallow errors)
|
||||
$lane->forceTurnOffMachineRelay();
|
||||
// Reflect relay state explicitly
|
||||
|
||||
+1
@@ -12,4 +12,5 @@ it('syncs lane relay states when department self-serve enabled flag changes', fu
|
||||
expect($routeContent)->toContain('setMachineCleanerRelayStatusHard(true)');
|
||||
expect($routeContent)->toContain('setMachineRelayStatusHard(true)');
|
||||
expect($routeContent)->toContain('setMachineProgramPickerRelayStatusHard(true)');
|
||||
expect(substr_count($routeContent, 'setMachineCleanerRelayStatusHard(true)'))->toBeGreaterThanOrEqual(2);
|
||||
});
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
app_require('modules/selfserve/traits/selfserve_lane_port_controller_t.php');
|
||||
app_require('modules/selfserve/helpers/selfserve_lane_port.php');
|
||||
app_require('modules/shelly/helpers/shelly_device_switch.php');
|
||||
|
||||
use modules\selfserve\helpers\selfserve_lane_port;
|
||||
use modules\selfserve\traits\selfserve_lane_port_controller_t;
|
||||
use modules\shelly\helpers\shelly_device_switch;
|
||||
|
||||
class SelfserveLanePortValueFake
|
||||
{
|
||||
public function __construct(private readonly string $value) {}
|
||||
|
||||
public function value(): string
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
|
||||
class SelfserveLanePortDepartmentLaneFake
|
||||
{
|
||||
public SelfserveLanePortValueFake $relay_in_id;
|
||||
public SelfserveLanePortValueFake $relay_out_id;
|
||||
|
||||
public function __construct(string $relayInId, string $relayOutId)
|
||||
{
|
||||
$this->relay_in_id = new SelfserveLanePortValueFake($relayInId);
|
||||
$this->relay_out_id = new SelfserveLanePortValueFake($relayOutId);
|
||||
}
|
||||
}
|
||||
|
||||
class SelfserveLanePortSwitchFake extends shelly_device_switch
|
||||
{
|
||||
/** @var array<int,array{id:string,on:bool}> */
|
||||
public array $switchCalls = [];
|
||||
|
||||
public function switch(bool $on, ?bool $skip_toggle_after = false): array|object|null
|
||||
{
|
||||
$this->switchCalls[] = [
|
||||
'id' => $this->id,
|
||||
'on' => $on,
|
||||
];
|
||||
return ['ok' => true];
|
||||
}
|
||||
}
|
||||
|
||||
class SelfserveLanePortControllerHarness
|
||||
{
|
||||
use selfserve_lane_port_controller_t;
|
||||
|
||||
public int $id = 55;
|
||||
public object $department_lane;
|
||||
public SelfserveLanePortSwitchFake $switchFake;
|
||||
|
||||
public function __construct(string $relayInId, string $relayOutId)
|
||||
{
|
||||
$this->department_lane = new SelfserveLanePortDepartmentLaneFake($relayInId, $relayOutId);
|
||||
$this->switchFake = new SelfserveLanePortSwitchFake();
|
||||
}
|
||||
|
||||
protected function createShellySwitchDevice(): shelly_device_switch
|
||||
{
|
||||
return $this->switchFake;
|
||||
}
|
||||
}
|
||||
|
||||
it('opens exit port by switching relay_in_id on', function (): void {
|
||||
$lane = new SelfserveLanePortControllerHarness(
|
||||
relayInId: 'relay-in-123',
|
||||
relayOutId: 'relay-out-123'
|
||||
);
|
||||
|
||||
$result = $lane->shellyOpenPort(selfserve_lane_port::EXIT);
|
||||
|
||||
expect($result)->toBeTrue();
|
||||
expect($lane->switchFake->switchCalls)->toBe([
|
||||
[
|
||||
'id' => 'relay-in-123',
|
||||
'on' => true,
|
||||
],
|
||||
]);
|
||||
});
|
||||
|
||||
it('opens entrance port by switching relay_out_id on', function (): void {
|
||||
$lane = new SelfserveLanePortControllerHarness(
|
||||
relayInId: 'relay-in-123',
|
||||
relayOutId: 'relay-out-123'
|
||||
);
|
||||
|
||||
$result = $lane->shellyOpenPort(selfserve_lane_port::ENTRANCE);
|
||||
|
||||
expect($result)->toBeTrue();
|
||||
expect($lane->switchFake->switchCalls)->toBe([
|
||||
[
|
||||
'id' => 'relay-out-123',
|
||||
'on' => true,
|
||||
],
|
||||
]);
|
||||
});
|
||||
@@ -48,6 +48,7 @@ it('wires machine relay status get and set endpoints', function (): void {
|
||||
expect($moduleSelfServeRoute)->toContain('setMachineProgramPickerRelayStatus');
|
||||
expect($moduleSelfServeRoute)->toContain('getMachineCleanerRelayStatus');
|
||||
expect($moduleSelfServeRoute)->toContain('setMachineCleanerRelayStatus');
|
||||
expect($moduleSelfServeRoute)->toContain('setMachineCleanerRelayStatusHard(true)');
|
||||
});
|
||||
|
||||
it('wires self-serve lane gate open endpoint', function (): void {
|
||||
@@ -69,4 +70,6 @@ it('wires in-progress self-serve wash details endpoint', function (): void {
|
||||
expect($moduleSelfServeRoute)->toContain('modules_selfserve_lane_wash_in_progress_view');
|
||||
expect($moduleSelfServeRoute)->toContain("'in_progress' => true");
|
||||
expect($moduleSelfServeRoute)->toContain("'in_progress' => false");
|
||||
expect($moduleSelfServeRoute)->toContain('selfserve_lane_status::OCCUPIED');
|
||||
expect($moduleSelfServeRoute)->toContain('selfserve_lane_state::IN_WASH');
|
||||
});
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
it('enables cleaner relay on wash start command and webhook flow', function (): void {
|
||||
$commandTrait = file_get_contents(app_path('modules/selfserve/traits/selfserve_lane_command_t.php'));
|
||||
$washFlow = file_get_contents(app_path('modules/selfserve/classes/selfserve_wash_flow.php'));
|
||||
|
||||
expect($commandTrait)->not->toBeFalse();
|
||||
expect($commandTrait)->toContain('turnOnCleanerRelayForWashStart()');
|
||||
expect($commandTrait)->toContain('setMachineCleanerRelayStatusHard(true)');
|
||||
|
||||
expect($washFlow)->not->toBeFalse();
|
||||
expect($washFlow)->toContain('enableCleanerRelayForStartedWash(');
|
||||
expect($washFlow)->toContain('setMachineCleanerRelayStatusHard(true)');
|
||||
});
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
it('forces machine relay off when a self-serve wash session is completed', function (): void {
|
||||
$washFlow = file_get_contents(app_path('modules/selfserve/classes/selfserve_wash_flow.php'));
|
||||
|
||||
expect($washFlow)->not->toBeFalse();
|
||||
expect($washFlow)->toContain('$this->disableMachineRelayForCompletedWash($laneId);');
|
||||
expect($washFlow)->toContain('setMachineRelayStatusHard(false)');
|
||||
});
|
||||
Reference in New Issue
Block a user