Files
api/services/nginx/app/tests/Unit/Users/CustomerAttributesLegacySchemaCompatibilityTest.php
T

109 lines
3.2 KiB
PHP

<?php
app_require('objects/users_o.php');
use objects\users_o;
final class CustomerAttributesLegacySchemaResultStub
{
public int $num_rows;
/** @var list<array<string, mixed>> */
private array $rows;
/** @param list<array<string, mixed>> $rows */
public function __construct(array $rows)
{
$this->rows = array_values($rows);
$this->num_rows = count($rows);
}
/** @return array<string, mixed>|null */
public function fetch_assoc(): ?array
{
if ($this->rows === []) {
return null;
}
return array_shift($this->rows);
}
/** @return list<array<string, mixed>> */
public function rows(): array
{
return $this->rows;
}
}
final class CustomerAttributesLegacySchemaDbStub
{
/** @var list<string> */
public array $queries = [];
public function query(string $sql): CustomerAttributesLegacySchemaResultStub
{
$this->queries[] = $sql;
if (str_contains($sql, 'SELECT customer_number FROM users')) {
return new CustomerAttributesLegacySchemaResultStub([
['customer_number' => 5501],
]);
}
if (str_contains($sql, 'SELECT id FROM users WHERE customer_number')) {
return new CustomerAttributesLegacySchemaResultStub([
['id' => 12],
['id' => 13],
]);
}
if (str_contains($sql, 'FROM customer_attributes')) {
$columnReferences = str_replace('NULL AS created_at', '', $sql);
if (str_contains($columnReferences, 'created_at')) {
throw new RuntimeException("Unknown column 'created_at' in 'SELECT'");
}
return new CustomerAttributesLegacySchemaResultStub([
['id' => 4, 'user_id' => 12, 'attribute' => 'onlyTankCleaning', 'created_at' => null],
['id' => 7, 'user_id' => 13, 'attribute' => 'restrictSpotFree', 'created_at' => null],
]);
}
return new CustomerAttributesLegacySchemaResultStub([]);
}
/** @return list<array<string, mixed>> */
public function fetch_all(CustomerAttributesLegacySchemaResultStub $result): array
{
return $result->rows();
}
}
it('loads sibling customer attributes when the legacy table has no created_at column', function (): void {
$hadDb = array_key_exists('db', $GLOBALS);
$previousDb = $hadDb ? $GLOBALS['db'] : null;
$db = new CustomerAttributesLegacySchemaDbStub();
$GLOBALS['db'] = $db;
try {
$attributes = (new users_o())->getUserAttributes(12);
expect(array_column($attributes, 'attribute'))
->toBe(['onlyTankCleaning', 'restrictSpotFree'])
->and(array_column($attributes, 'created_at'))
->toBe([null, null]);
$attributeQuery = $db->queries[2] ?? '';
expect($attributeQuery)
->toContain('SELECT MIN(id) AS id, MIN(user_id) AS user_id, attribute, NULL AS created_at')
->toContain('WHERE user_id IN (12,13)')
->not->toContain('MIN(created_at)');
} finally {
if ($hadDb) {
$GLOBALS['db'] = $previousDb;
} else {
unset($GLOBALS['db']);
}
}
});