Add comprehensive test coverage and update notes
Some checks failed
CI/CD Pipeline / test (push) Successful in 3s
CI/CD Pipeline / deploy (push) Failing after 15s

This commit is contained in:
2026-02-08 19:04:12 +01:00
parent 160430e128
commit 88e4a70f88
43 changed files with 6114 additions and 520 deletions

View File

@@ -0,0 +1,146 @@
<?php
use App\Http\Controllers\InstallerController;
use App\Models\Role;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
function withEnvBackup(callable $callback): void
{
$path = base_path('.env');
$hadEnv = file_exists($path);
$original = $hadEnv ? file_get_contents($path) : null;
try {
$callback($path);
} finally {
if ($hadEnv) {
file_put_contents($path, (string) $original);
} elseif (file_exists($path)) {
unlink($path);
}
}
}
function installerRequest(array $overrides = []): Request
{
$db = config('database.connections.mysql');
$data = array_merge([
'app_url' => 'https://example.test',
'db_host' => $db['host'] ?? '127.0.0.1',
'db_port' => $db['port'] ?? 3306,
'db_database' => $db['database'] ?? 'tracer_speedBB_test',
'db_username' => $db['username'] ?? 'root',
'db_password' => $db['password'] ?? '',
'admin_name' => 'Admin',
'admin_email' => 'admin@example.com',
'admin_password' => 'Password123!',
], $overrides);
return Request::create('https://example.test/install', 'POST', $data);
}
it('shows installer when env missing', function (): void {
withEnvBackup(function (): void {
if (file_exists(base_path('.env'))) {
unlink(base_path('.env'));
}
$controller = new InstallerController();
$request = Request::create('https://example.test/install', 'GET');
$response = $controller->show($request);
expect($response)->toBeInstanceOf(Illuminate\View\View::class);
});
});
it('redirects installer when env exists', function (): void {
withEnvBackup(function (): void {
file_put_contents(base_path('.env'), "APP_KEY=base64:test\n");
$controller = new InstallerController();
$request = Request::create('https://example.test/install', 'GET');
$response = $controller->show($request);
expect($response)->toBeInstanceOf(Illuminate\Http\RedirectResponse::class);
});
});
it('store redirects when env exists', function (): void {
withEnvBackup(function (): void {
file_put_contents(base_path('.env'), "APP_KEY=base64:test\n");
$controller = new InstallerController();
$request = installerRequest();
$response = $controller->store($request);
expect($response)->toBeInstanceOf(Illuminate\Http\RedirectResponse::class);
});
});
it('store handles db connection failure', function (): void {
withEnvBackup(function (): void {
if (file_exists(base_path('.env'))) {
unlink(base_path('.env'));
}
DB::shouldReceive('purge')->once();
DB::shouldReceive('connection->getPdo')->andThrow(new RuntimeException('boom'));
$controller = new InstallerController();
$request = installerRequest(['app_url' => 'https://example.test']);
$response = $controller->store($request);
expect($response)->toBeInstanceOf(Illuminate\View\View::class);
expect(file_exists(base_path('.env')))->toBeFalse();
});
});
it('store handles migration failure', function (): void {
withEnvBackup(function (): void {
if (file_exists(base_path('.env'))) {
unlink(base_path('.env'));
}
DB::shouldReceive('purge')->once();
DB::shouldReceive('connection->getPdo')->andReturn(true);
Artisan::shouldReceive('call')->andReturn(1);
$controller = new InstallerController();
$request = installerRequest();
$response = $controller->store($request);
expect($response)->toBeInstanceOf(Illuminate\View\View::class);
expect(file_exists(base_path('.env')))->toBeFalse();
});
});
it('store completes installation on success', function (): void {
withEnvBackup(function (): void {
if (file_exists(base_path('.env'))) {
unlink(base_path('.env'));
}
DB::shouldReceive('purge')->once();
DB::shouldReceive('connection->getPdo')->andReturn(true);
Artisan::shouldReceive('call')->andReturn(0);
$controller = new InstallerController();
$request = installerRequest(['admin_email' => 'success@example.com']);
$response = $controller->store($request);
expect($response)->toBeInstanceOf(Illuminate\View\View::class);
$user = User::where('email', 'success@example.com')->first();
expect($user)->not->toBeNull();
expect(Role::where('name', 'ROLE_ADMIN')->exists())->toBeTrue();
expect(Role::where('name', 'ROLE_FOUNDER')->exists())->toBeTrue();
if (file_exists(base_path('.env'))) {
unlink(base_path('.env'));
}
});
});