Add comprehensive test coverage and update notes
This commit is contained in:
146
tests/Unit/InstallerControllerTest.php
Normal file
146
tests/Unit/InstallerControllerTest.php
Normal 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'));
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user