147 lines
4.7 KiB
PHP
147 lines
4.7 KiB
PHP
<?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'));
|
|
}
|
|
});
|
|
});
|