60 lines
2.4 KiB
PHP
60 lines
2.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace BattleForge\Tests\Integration;
|
|
|
|
use BattleForge\Http\Request;
|
|
use BattleForge\Http\Response;
|
|
use BattleForge\Http\Handlers\GetHomePage;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
final class GetHomePageTest extends TestCase
|
|
{
|
|
public function testItReturnsTheHomePageWithSecurityHeaders(): void
|
|
{
|
|
$handler = new GetHomePage();
|
|
$request = new Request([], [], [], [], [], '', 'GET', '/', 'text/html', '');
|
|
$response = $handler->handle($request, []);
|
|
|
|
self::assertSame(200, $response->status);
|
|
self::assertStringContainsString('text/html', $response->headers['Content-Type'] ?? '');
|
|
self::assertSame('nosniff', $response->headers['X-Content-Type-Options']);
|
|
self::assertStringContainsString('default-src', $response->headers['Content-Security-Policy']);
|
|
self::assertStringContainsString('<a href="/scenarios/new/edit/team">', $response->body);
|
|
}
|
|
|
|
public function testItRendersTheBundledScenariosListFromTheManifest(): void
|
|
{
|
|
$tmpDir = sys_get_temp_dir() . '/bf-home-bundled-' . bin2hex(random_bytes(4));
|
|
mkdir($tmpDir, 0700, true);
|
|
file_put_contents(
|
|
$tmpDir . '/manifest.json',
|
|
json_encode([
|
|
'skirmish' => ['name' => 'Skirmish', 'summary' => 'Open ground.'],
|
|
'hold-the-line' => ['name' => 'Hold the Line', 'summary' => 'Defend.'],
|
|
], JSON_THROW_ON_ERROR),
|
|
);
|
|
foreach (['skirmish.json', 'hold-the-line.json'] as $file) {
|
|
file_put_contents($tmpDir . '/' . $file, '{}');
|
|
}
|
|
|
|
$handler = new GetHomePage($tmpDir);
|
|
$request = new Request([], [], [], [], [], '', 'GET', '/', 'text/html', '');
|
|
$response = $handler->handle($request, []);
|
|
|
|
self::assertSame(200, $response->status);
|
|
self::assertStringContainsString('id="bf-bundled"', $response->body);
|
|
self::assertStringContainsString('data-bf-bundle="skirmish"', $response->body);
|
|
self::assertStringContainsString('data-bf-bundle="hold-the-line"', $response->body);
|
|
self::assertStringContainsString('Open ground.', $response->body);
|
|
self::assertStringContainsString('Defend.', $response->body);
|
|
|
|
unlink($tmpDir . '/manifest.json');
|
|
foreach (['skirmish.json', 'hold-the-line.json'] as $file) {
|
|
unlink($tmpDir . '/' . $file);
|
|
}
|
|
rmdir($tmpDir);
|
|
}
|
|
}
|