fix(setup): support mariadb in the installation wizard (#704)

Fixes InvoiceShelf/docker#79 — a fresh install using the shipped
docker-compose.mysql.yml cannot get past the database step, because that
compose file sets DB_CONNECTION=mariadb.

getDatabaseEnvironment() switched on sqlite, pgsql and mysql with no arm
for mariadb and no default, so it answered {"config":[]}. The wizard
chooses which form to render from database_connection in that response,
so step 4 rendered blank with no way forward — and nothing reached the
log, because the app never errored, it just replied with nothing.

Adds the mariadb arm, and a default so an unrecognised driver can never
again produce an unrenderable response: it is echoed back with the server
defaults, leaving the fields editable rather than the step empty.

MariaDB is now offered in the driver dropdown too. It was already a valid
DB_CONNECTION with its own connection in config/database.php, and the
form fields are identical to MySQL's.

Tested against the original code, where three of the new cases fail with
"Failed asserting that null is identical to 'mariadb'".
This commit is contained in:
Darko Gjorgjijoski
2026-07-29 12:29:01 +02:00
committed by GitHub
parent 3b2aa1ca2e
commit fdd958c1e5
3 changed files with 80 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
<?php
use function Pest\Laravel\getJson;
/**
* The setup wizard picks which form to render from `database_connection` in this
* response. When the switch had no arm for the requested driver it returned an
* empty config, so step 4 rendered blank with no way to continue and nothing in
* the log — the app never errored, it just answered with nothing.
*
* That is what InvoiceShelf/docker#79 hit: the shipped docker-compose.mysql.yml
* sets DB_CONNECTION=mariadb, so a fresh install using the official compose file
* could not get past the database step.
*/
test('the database config endpoint answers with a usable config for every supported driver', function (string $connection) {
$response = getJson("/api/v1/installation/database/config?connection={$connection}");
$response->assertOk();
expect($response->json('config.database_connection'))->toBe($connection);
})->with([
'mysql',
'mariadb',
'pgsql',
'sqlite',
]);
test('sqlite is told where its database file lives', function () {
$response = getJson('/api/v1/installation/database/config?connection=sqlite');
$response->assertOk();
expect($response->json('config.database_name'))->not->toBeEmpty();
});
test('server-based drivers are given a host and port to prefill', function (string $connection) {
$response = getJson("/api/v1/installation/database/config?connection={$connection}");
expect($response->json('config.database_host'))->not->toBeEmpty()
->and($response->json('config.database_port'))->not->toBeEmpty();
})->with([
'mysql',
'mariadb',
'pgsql',
]);
/**
* A driver we do not recognise must still produce something the wizard can
* render, rather than the empty config that caused #79.
*/
test('an unrecognised driver still returns a renderable config', function () {
$response = getJson('/api/v1/installation/database/config?connection=cockroach');
$response->assertOk();
expect($response->json('config.database_connection'))->toBe('cockroach')
->and($response->json('config'))->not->toBeEmpty();
});