Add unit tests for self-serve invoice billing logic, refactor minute-based billing calculations, and improve error handling for billable minutes adjustments.

This commit is contained in:
Jeppe Bundgaard
2026-03-26 21:09:21 +01:00
parent b42a1a69a0
commit 0dc1581eb4
5 changed files with 192 additions and 18 deletions
@@ -0,0 +1,131 @@
<?php
app_require('modules/selfserve/traits/selfserve_lane_invoice_t.php');
app_require('modules/selfserve/helpers/selfserve_lane_mode.php');
app_require('modules/selfserve/helpers/selfserve_lane_status.php');
app_require('objects/orders_o.php');
use modules\selfserve\helpers\selfserve_lane_mode;
use modules\selfserve\helpers\selfserve_lane_status;
use modules\selfserve\traits\selfserve_lane_invoice_t;
use objects\orders_o;
class SelfserveLaneInvoiceModeOrderStub extends orders_o
{
public function __construct() {}
}
class SelfserveLaneInvoiceModeBillingHarness
{
use selfserve_lane_invoice_t;
public int $id = 101;
public ?int $lastAddedOrderId = null;
public ?int $lastAddedProductId = null;
public ?int $lastAddedQuantity = null;
private selfserve_lane_status $laneStatus = selfserve_lane_status::OCCUPIED;
private selfserve_lane_mode $laneMode = selfserve_lane_mode::MANUAL;
private int $customerNumber = 1234;
private string $licensePlate = 'AB12345';
private int $elapsedWashTimeSeconds = 0;
private int $minuteBillingProductId = 999;
private int $includedMinutes = 0;
public function setLaneModeForTest(selfserve_lane_mode $mode): void
{
$this->laneMode = $mode;
}
public function setElapsedWashTimeSecondsForTest(int $seconds): void
{
$this->elapsedWashTimeSeconds = $seconds;
}
public function setIncludedMinutesForTest(int $minutes): void
{
$this->includedMinutes = $minutes;
}
public function getLaneStatus(): selfserve_lane_status
{
return $this->laneStatus;
}
public function getLaneMode(): selfserve_lane_mode
{
return $this->laneMode;
}
public function getCustomerNumber(): int
{
return $this->customerNumber;
}
public function getLicensePlate(): string
{
return $this->licensePlate;
}
public function getMinuteBillingProductId(): ?int
{
return $this->minuteBillingProductId;
}
public function getElapsedWashTime(): ?int
{
return $this->elapsedWashTimeSeconds;
}
public function getMachineWashMinutesIncluded(): int
{
return $this->includedMinutes;
}
protected function createInvoiceOrderContext(): orders_o
{
$order = new SelfserveLaneInvoiceModeOrderStub();
$order->id = 424242;
$this->last_invoice_order_id = (int)$order->id;
return $order;
}
protected function addMinuteBillingLine(int $order_id, int $product_id, int $quantity): void
{
$this->lastAddedOrderId = $order_id;
$this->lastAddedProductId = $product_id;
$this->lastAddedQuantity = $quantity;
}
}
it('bills manual self-serve stop using full elapsed minutes without included-minute reduction', function (): void {
$harness = new SelfserveLaneInvoiceModeBillingHarness();
$harness->setLaneModeForTest(selfserve_lane_mode::MANUAL);
$harness->setElapsedWashTimeSecondsForTest(59);
$harness->setIncludedMinutesForTest(5);
$result = $harness->invoice();
expect($result)->toBeTrue();
expect($harness->lastAddedOrderId)->toBe(424242);
expect($harness->lastAddedProductId)->toBe(999);
expect($harness->lastAddedQuantity)->toBe(1);
expect($harness->getLastInvoiceOrderId())->toBe(424242);
});
it('keeps included-minute reduction for automatic mode', function (): void {
$harness = new SelfserveLaneInvoiceModeBillingHarness();
$harness->setLaneModeForTest(selfserve_lane_mode::AUTOMATIC);
$harness->setElapsedWashTimeSecondsForTest(59);
$harness->setIncludedMinutesForTest(5);
$result = $harness->invoice();
expect($result)->toBeTrue();
expect($harness->lastAddedOrderId)->toBeNull();
expect($harness->lastAddedProductId)->toBeNull();
expect($harness->lastAddedQuantity)->toBeNull();
expect($harness->getLastInvoiceOrderId())->toBeNull();
});