Phred/tests/UrlExtensionNegotiationTest.php

51 lines
1.7 KiB
PHP
Raw Normal View History

<?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
{
Refactor M7 module scaffolding, route inclusion, and tests; implement providers discovery; fix URL extension negotiation; clean docs • Add Service Providers loading from config/providers.php and merge with runtime config; ensure AppServiceProvider boots and contributes routes • Create RouteGroups and guard module route includes in routes/web.php; update Kernel to auto-mount module routes and apply provider routes • Implement create:module as a console Command (extends Phred\Console\Command): ◦ Args: name, prefix; Flags: --update-composer, --no-dump ◦ Stable root resolution (dirname(DIR, 2)); robust args/flags handling under ArrayInput ◦ Scaffolds module dirs (Controllers, Views, Templates, Routes, Providers, etc.), ensures Controllers exists, adds .gitkeep ◦ Writes Provider, View, Controller, Template stubs (fix variable interpolation via placeholders) ◦ Appends guarded include snippet to routes/web.php ◦ Optional composer PSR-4 mapping update (+ backup) and optional autoload dump ◦ Prevents providers.php corruption via name validation and existence checks • Add URL extension negotiation middleware tweaks: ◦ Only set Accept for .json (and future .xml), never for none/php ◦ Never override existing Accept header • Add MVC base classes (Controller, APIController, ViewController, View, ViewWithDefaultTemplate); update ViewController signature and View render contract • Add tests: ◦ CreateModuleCommandTest with setup/teardown to snapshot/restore routes/web.php and composer.json; asserts scaffold and PSR-4 mapping ◦ ProviderRouteTest for provider-contributed route ◦ UrlExtensionNegotiationTest sets API_FORMAT=rest and asserts content-type behavior ◦ MvcViewTest validates transformData+render • Fix config/providers.php syntax and add comment placeholder for modules • Update README: M5/M6/M7 docs, MVC examples, template selection conventions, modules section, URL extension negotiation, and module creation workflow • Update MILESTONES.md: mark M6/M7 complete; add M8 task for register:orm; note M12 XML extension support
2025-12-16 22:14:22 +00:00
putenv('API_FORMAT=rest');
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
{
Refactor M7 module scaffolding, route inclusion, and tests; implement providers discovery; fix URL extension negotiation; clean docs • Add Service Providers loading from config/providers.php and merge with runtime config; ensure AppServiceProvider boots and contributes routes • Create RouteGroups and guard module route includes in routes/web.php; update Kernel to auto-mount module routes and apply provider routes • Implement create:module as a console Command (extends Phred\Console\Command): ◦ Args: name, prefix; Flags: --update-composer, --no-dump ◦ Stable root resolution (dirname(DIR, 2)); robust args/flags handling under ArrayInput ◦ Scaffolds module dirs (Controllers, Views, Templates, Routes, Providers, etc.), ensures Controllers exists, adds .gitkeep ◦ Writes Provider, View, Controller, Template stubs (fix variable interpolation via placeholders) ◦ Appends guarded include snippet to routes/web.php ◦ Optional composer PSR-4 mapping update (+ backup) and optional autoload dump ◦ Prevents providers.php corruption via name validation and existence checks • Add URL extension negotiation middleware tweaks: ◦ Only set Accept for .json (and future .xml), never for none/php ◦ Never override existing Accept header • Add MVC base classes (Controller, APIController, ViewController, View, ViewWithDefaultTemplate); update ViewController signature and View render contract • Add tests: ◦ CreateModuleCommandTest with setup/teardown to snapshot/restore routes/web.php and composer.json; asserts scaffold and PSR-4 mapping ◦ ProviderRouteTest for provider-contributed route ◦ UrlExtensionNegotiationTest sets API_FORMAT=rest and asserts content-type behavior ◦ MvcViewTest validates transformData+render • Fix config/providers.php syntax and add comment placeholder for modules • Update README: M5/M6/M7 docs, MVC examples, template selection conventions, modules section, URL extension negotiation, and module creation workflow • Update MILESTONES.md: mark M6/M7 complete; add M8 task for register:orm; note M12 XML extension support
2025-12-16 22:14:22 +00:00
putenv('API_FORMAT=rest');
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);
}
}