Framework/tests/UrlExtensionNegotiationTest.php
Funky Waddle 7d4265d60e Implement M5 service providers, M6 MVC bases, and URL extension negotiation; update docs and tests
• M5: Add ServiceProviderInterface and ProviderRepository; integrate providers into Kernel (register before container build, boot after); add RouteRegistry with clear(); add default core providers (Routing, Template, ORM, Flags, Testing) and AppServiceProvider; add contracts and default drivers (Template/Eyrie, Orm/Pairity, Flags/Flagpole, Testing/Codeception)
• Routing: allow providers to contribute routes; add ProviderRouteTest
• Config: add config/providers.php; extend config/app.php with driver keys; document env keys
• M6: Introduce MVC bases: Controller, APIController (JSON helpers), ViewController (html + renderView helpers), View (transformData + renderer); add ViewWithDefaultTemplate and default-template flow; adjust method signatures to data-first and delegate template override to View
• HTTP: Add UrlExtensionNegotiationMiddleware (opt-in via URL_EXTENSION_NEGOTIATION, whitelist via URL_EXTENSION_WHITELIST with default json|php|none); wire before ContentNegotiationMiddleware
• Tests: add UrlExtensionNegotiationTest and MvcViewTest; ensure RouteRegistry::clear prevents duplicate routes in tests
• Docs: Update README with M5 provider usage, M6 MVC examples and template selection conventions, and URL extension negotiation; mark M5 complete in MILESTONES; add M12 task to provide XML support and enable xml in whitelist by default
2025-12-15 16:08:57 -06:00

49 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Phred\Tests;
use Nyholm\Psr7\ServerRequest;
use PHPUnit\Framework\TestCase;
final class UrlExtensionNegotiationTest extends TestCase
{
public function testJsonExtensionForcesJsonNegotiation(): void
{
putenv('URL_EXTENSION_NEGOTIATION=true');
putenv('URL_EXTENSION_WHITELIST=json|php|none');
$root = dirname(__DIR__);
/** @var object $app */
$app = require $root . '/bootstrap/app.php';
$request = new ServerRequest('GET', '/_phred/format.json');
$response = $app->handle($request);
$this->assertSame(200, $response->getStatusCode());
$this->assertSame('application/json', $response->getHeaderLine('Content-Type'));
$payload = json_decode((string) $response->getBody(), true);
$this->assertIsArray($payload);
$this->assertSame('rest', $payload['format'] ?? null);
}
public function testNoExtensionHonorsWhitelistAndDoesNotBreakRouting(): void
{
putenv('URL_EXTENSION_NEGOTIATION=true');
putenv('URL_EXTENSION_WHITELIST=json|php|none');
$root = dirname(__DIR__);
/** @var object $app */
$app = require $root . '/bootstrap/app.php';
$request = new ServerRequest('GET', '/_phred/format');
$response = $app->handle($request);
$this->assertSame(200, $response->getStatusCode());
$this->assertSame('application/json', $response->getHeaderLine('Content-Type'));
$payload = json_decode((string) $response->getBody(), true);
$this->assertIsArray($payload);
$this->assertSame('rest', $payload['format'] ?? null);
}
}