Files
api/services/nginx/app/tests/Api/SelfserveFixtureApiTest.php
T
Jeppe Bundgaard 90ebec84bf Add PHP CI test script and optimize Redis config in tests
- Introduced a PHP CI test script for managing test suites.
- Consolidated Redis configuration retrieval.
- Optimized test fixture queries with dynamic object type assignments.
2026-05-28 17:58:06 +02:00

107 lines
5.4 KiB
PHP

<?php
usesApiSuite();
function selfserve_fixture_ensure_legacy_redis_constant(): void
{
if (defined('redis')) {
return;
}
global $REDIS_CONFIG;
$REDIS_CONFIG = [
'host' => getenv('REDIS_CONFIG_HOST') ?: getenv('REDIS_CONFIG_DEBUG_HOST') ?: 'redis',
'user' => getenv('REDIS_CONFIG_USER') ?: getenv('REDIS_CONFIG_DEBUG_USER') ?: 'default',
'database' => getenv('REDIS_CONFIG_DATABASE') ?: getenv('REDIS_CONFIG_DEBUG_DATABASE') ?: '0',
'password' => getenv('REDIS_CONFIG_PASSWORD') ?: getenv('REDIS_CONFIG_DEBUG_PASSWORD') ?: '',
'port' => getenv('REDIS_CONFIG_PORT') ?: getenv('REDIS_CONFIG_DEBUG_PORT') ?: '6379',
];
define('redis', (new \classes\redis())->connect());
}
it('creates a comprehensive self-serve API scenario with demo relays', function (): void {
$scenario = api_fixtures()->createSelfServeScenario();
expect($scenario['relay_ids']['machine'])->toStartWith('demo-')
->and($scenario['relay_ids']['entry'])->toStartWith('demo-')
->and($scenario['lane']['relay_machine_id'])->toStartWith('demo-')
->and($scenario['session']['status'])->toBe('MACHINE_STARTED')
->and($scenario['session']['metadata_json']['relay_ids']['machine'])->toBe($scenario['relay_ids']['machine'])
->and($scenario['tasks'])->toHaveCount(2)
->and($scenario['events'])->toHaveCount(3);
$lane = api_fixtures()->fetchRowById('department_lanes', (int)$scenario['lane']['id']);
$session = api_fixtures()->fetchRowById('selfserve_wash_sessions', (int)$scenario['session']['id']);
expect($lane)->not->toBeNull()
->and($lane['relay_machine_id'])->toBe($scenario['relay_ids']['machine'])
->and($session)->not->toBeNull()
->and($session['reg'])->toBe($scenario['vehicle']['reg']);
});
it('creates self-serve invoice orders on the draft customer with original customer and driver metadata attached', function (): void {
selfserve_fixture_ensure_legacy_redis_constant();
$draftCustomer = api_fixtures()->createUser(['display_name' => 'Self-Serve Draft Customer']);
$scenario = api_fixtures()->createSelfServeScenario();
$subuser = api_fixtures()->createSubuser([
'name' => 'Self-Serve Driver',
'username' => 'selfserve-driver-' . $scenario['vehicle']['reg'],
]);
api_fixtures()->setModuleConfig('economic', 'transactionDraftCustomerNumber', (string)$draftCustomer['customer_number'], 'int');
api_fixtures()->setModuleConfig('selfserve', 'minute_product', (string)$scenario['product']['id'], 'int');
$lane = (new \classes\selfserve())->lane((int)$scenario['lane']['id']);
$lane->setLaneStatus(\modules\selfserve\helpers\selfserve_lane_status::OCCUPIED);
$lane->setLaneState(\modules\selfserve\helpers\selfserve_lane_state::IN_WASH);
$lane->setLaneMode(\modules\selfserve\helpers\selfserve_lane_mode::MANUAL);
$lane->setCustomerNumber((int)$scenario['customer']['customer_number']);
$lane->setLicensePlate((string)$scenario['vehicle']['reg']);
$lane->setWashStartTime(time() - 620);
$arguments = (new \modules\selfserve\classes\selfserve_lane_command_arguments())
->setCustomerNumber((int)$scenario['customer']['customer_number'])
->setSubuserId((int)$subuser['id']);
expect($lane->invoice($arguments))->toBeTrue();
$orderId = $lane->getLastInvoiceOrderId();
expect($orderId)->toBeInt()->toBeGreaterThan(0);
$order = api_fixtures()->fetchRowById('orders', $orderId);
$attachmentObjectType = '`orders`';
$invoiceCollectionId = (int)($order['invoice_collection_id'] ?? 0);
if ($invoiceCollectionId > 0) {
api_fixtures()->cleanupDeleteById('collected_order_invoices', $invoiceCollectionId);
}
api_fixtures()->cleanupDeleteById('orders', $orderId);
api_fixtures()->cleanupDeleteWhere('order_items', ['order_id' => $orderId]);
api_fixtures()->cleanupDeleteWhere('object_attachments', ['object_type' => $attachmentObjectType, 'object_id' => $orderId]);
expect($order)->not->toBeNull()
->and((int)$order['customer_id'])->toBe((int)$draftCustomer['customer_number'])
->and((int)$order['department_id'])->toBe((int)$scenario['department']['id'])
->and((string)$order['reg_1'])->toBe((string)$scenario['vehicle']['reg'])
->and((int)$order['lane'])->toBe((int)$scenario['lane']['id'])
->and($order['completed_at'])->toBeNull();
$db = api_test_runtime()->db();
$result = $db->query(
"SELECT content FROM object_attachments WHERE object_type = '{$attachmentObjectType}' AND object_id = " . (int)$orderId . ' AND deleted_at IS NULL ORDER BY id DESC LIMIT 1'
);
$attachment = $result ? $result->fetch_assoc() : null;
$content = json_decode((string)($attachment['content'] ?? ''), true);
$metadata = is_array($content) ? ($content['other'] ?? null) : null;
expect($metadata)->toBeArray()
->and($metadata['type'] ?? null)->toBe(\attachments\helpers\attachment_content::OTHER_TYPE_SELF_SERVE_WASH)
->and((int)($metadata['customer_number'] ?? 0))->toBe((int)$scenario['customer']['customer_number'])
->and((int)($metadata['draft_customer_number'] ?? 0))->toBe((int)$draftCustomer['customer_number'])
->and((int)($metadata['subuser_id'] ?? 0))->toBe((int)$subuser['id'])
->and((int)($metadata['session_id'] ?? 0))->toBe((int)$scenario['session']['id'])
->and($metadata['subuser']['name'] ?? null)->toBe('Self-Serve Driver');
});