From 965551532d684456b74baf960157c0c2cef7335d Mon Sep 17 00:00:00 2001 From: Brett Parson Date: Sat, 29 Aug 2026 15:56:31 -0500 Subject: Add regression and integration test suite Port the stress-test findings into PHPUnit: realistic brett-parson.com route model, known-issue baselines, router boundary cases, and a standalone scaling benchmark (composer bench). --- tests/Fixtures/AdminLoggingMiddleware.php | 31 +++++++++ tests/Fixtures/CollidingController.php | 21 ++++++ tests/Fixtures/CsrfLoggingMiddleware.php | 30 +++++++++ tests/Fixtures/DuplicateParamController.php | 21 ++++++ tests/Fixtures/MixedVisibilityController.php | 27 ++++++++ tests/Fixtures/OnlyGetController.php | 21 ++++++ tests/Fixtures/RealisticAdminController.php | 98 ++++++++++++++++++++++++++++ tests/Fixtures/RealisticPublicController.php | 72 ++++++++++++++++++++ tests/Fixtures/StatefulController.php | 23 +++++++ tests/Fixtures/StatefulMiddleware.php | 26 ++++++++ 10 files changed, 370 insertions(+) create mode 100644 tests/Fixtures/AdminLoggingMiddleware.php create mode 100644 tests/Fixtures/CollidingController.php create mode 100644 tests/Fixtures/CsrfLoggingMiddleware.php create mode 100644 tests/Fixtures/DuplicateParamController.php create mode 100644 tests/Fixtures/MixedVisibilityController.php create mode 100644 tests/Fixtures/OnlyGetController.php create mode 100644 tests/Fixtures/RealisticAdminController.php create mode 100644 tests/Fixtures/RealisticPublicController.php create mode 100644 tests/Fixtures/StatefulController.php create mode 100644 tests/Fixtures/StatefulMiddleware.php (limited to 'tests/Fixtures') diff --git a/tests/Fixtures/AdminLoggingMiddleware.php b/tests/Fixtures/AdminLoggingMiddleware.php new file mode 100644 index 0000000..8613475 --- /dev/null +++ b/tests/Fixtures/AdminLoggingMiddleware.php @@ -0,0 +1,31 @@ +log->append('admin:before'); + $response = $next($request); + $this->log->append('admin:after'); + + return $response; + } +} diff --git a/tests/Fixtures/CollidingController.php b/tests/Fixtures/CollidingController.php new file mode 100644 index 0000000..434ffbf --- /dev/null +++ b/tests/Fixtures/CollidingController.php @@ -0,0 +1,21 @@ +log->append('csrf:before'); + $response = $next($request); + $this->log->append('csrf:after'); + + return $response; + } +} diff --git a/tests/Fixtures/DuplicateParamController.php b/tests/Fixtures/DuplicateParamController.php new file mode 100644 index 0000000..8ea3060 --- /dev/null +++ b/tests/Fixtures/DuplicateParamController.php @@ -0,0 +1,21 @@ +param('id')); + } + + #[Post('/admin/notes')] + public function notesStore(): ResponseInterface + { + return new TestResponse(200, 'notes-store'); + } + + #[Post('/admin/notes/{id}')] + public function notesUpdate(RequestInterface $request): ResponseInterface + { + return new TestResponse(200, 'notes-update:' . $request->param('id')); + } + + #[Post('/admin/notes/{id}/delete')] + public function notesDelete(): ResponseInterface + { + return new TestResponse(200, 'notes-delete'); + } + + #[Post('/admin/notes/{id}/restore')] + public function notesRestore(): ResponseInterface + { + return new TestResponse(200, 'notes-restore'); + } + + #[Get('/admin/entries/new')] + public function entriesNew(): ResponseInterface + { + return new TestResponse(200, 'entries-new'); + } + + #[Post('/admin/entries')] + public function entriesStore(): ResponseInterface + { + return new TestResponse(200, 'entries-store'); + } + + #[Post('/admin/entries/preview')] + public function entriesPreview(): ResponseInterface + { + return new TestResponse(200, 'entries-preview-literal'); + } + + #[Get('/admin/entries/{id}/edit')] + public function entriesEdit(RequestInterface $request): ResponseInterface + { + return new TestResponse(200, 'entries-edit:' . $request->param('id')); + } + + #[Post('/admin/entries/{id}')] + public function entriesUpdate(): ResponseInterface + { + return new TestResponse(200, 'entries-update'); + } +} diff --git a/tests/Fixtures/RealisticPublicController.php b/tests/Fixtures/RealisticPublicController.php new file mode 100644 index 0000000..992b17b --- /dev/null +++ b/tests/Fixtures/RealisticPublicController.php @@ -0,0 +1,72 @@ +param('slug')); + } + + #[Get('/feed.xml')] + public function feed(): ResponseInterface + { + return new TestResponse(200, 'feed'); + } + + #[Get('/robots.txt')] + public function robots(): ResponseInterface + { + return new TestResponse(200, 'robots'); + } + + #[Get('/sitemap.xml')] + public function sitemap(): ResponseInterface + { + return new TestResponse(200, 'sitemap'); + } + + #[Get('/notes')] + public function notes(): ResponseInterface + { + return new TestResponse(200, 'notes'); + } + + #[Get('/notes/{id}')] + public function noteShow(RequestInterface $request): ResponseInterface + { + return new TestResponse(200, 'note-show:' . $request->param('id')); + } +} diff --git a/tests/Fixtures/StatefulController.php b/tests/Fixtures/StatefulController.php new file mode 100644 index 0000000..bd09592 --- /dev/null +++ b/tests/Fixtures/StatefulController.php @@ -0,0 +1,23 @@ +count++; + + return $next($request); + } +} -- cgit v1.2.3