44
55use PHPUnit \Framework \TestCase ;
66use PSFS \base \Router ;
7+ use PSFS \base \Request ;
78use PSFS \base \Security ;
9+ use PSFS \base \admin \AdminFrontendCsrf ;
810use PSFS \base \exception \ApiException ;
911use PSFS \controller \AdminFrontendRoutesController ;
1012
1113class AdminFrontendRoutesControllerTest extends TestCase
1214{
1315 protected function setUp (): void
1416 {
17+ Request::dropInstance ();
1518 Router::dropInstance ();
1619 Router::getInstance ()->hydrateRouting ();
1720 }
@@ -20,6 +23,7 @@ protected function tearDown(): void
2023 {
2124 Security::setTest (false );
2225 Security::dropInstance ();
26+ Request::dropInstance ();
2327 Router::dropInstance ();
2428 }
2529
@@ -37,7 +41,12 @@ public function testDocumentationIndexReturnsTheKnownDomainsAsAnEnvelope(): void
3741 $ response = json_decode ((new AdminFrontendRoutesControllerProbe ())->documentation (), true , 512 , JSON_THROW_ON_ERROR );
3842
3943 self ::assertTrue ($ response ['ok ' ]);
40- self ::assertNotEmpty ($ response ['data ' ]['domains ' ]);
44+ self ::assertIsArray ($ response ['data ' ]['domains ' ]);
45+ self ::assertIsArray ($ response ['data ' ]['documentPaths ' ]);
46+
47+ $ documentPathDomains = array_keys ($ response ['data ' ]['documentPaths ' ]);
48+ sort ($ documentPathDomains , SORT_NATURAL | SORT_FLAG_CASE );
49+ self ::assertSame ($ documentPathDomains , $ response ['data ' ]['domains ' ]);
4150 foreach ($ response ['data ' ]['domains ' ] as $ domain ) {
4251 self ::assertSame ('/ ' . strtoupper ($ domain ) . '/api/doc ' , $ response ['data ' ]['documentPaths ' ][$ domain ]);
4352 }
@@ -57,12 +66,28 @@ public function testDocumentationDomainReturnsTheV2EnvelopeForAnUnknownDomain():
5766 ], $ response );
5867 }
5968
60- public function testRegenerationKeepsTheExistingAuthorizationBoundary (): void
69+ public function testRegenerationWithValidCsrfTokenKeepsTheExistingAuthorizationBoundary (): void
70+ {
71+ Security::setTest (false );
72+ Security::dropInstance ();
73+ $ token = AdminFrontendCsrf::issue ();
74+ Request::dropInstance ();
75+ Request::getInstance ()->setServer ([
76+ 'HTTP_X_PSFS_CSRF ' => $ token ,
77+ ]);
78+
79+ $ this ->expectException (ApiException::class);
80+ $ this ->expectExceptionMessage ('Restricted area ' );
81+ (new AdminFrontendRoutesControllerProbe ())->regenerate ();
82+ }
83+
84+ public function testRegenerationRejectsAMissingCsrfTokenBeforeRouteWork (): void
6185 {
6286 Security::setTest (false );
6387 Security::dropInstance ();
6488
6589 $ this ->expectException (ApiException::class);
90+ $ this ->expectExceptionMessage ('Invalid CSRF token ' );
6691 (new AdminFrontendRoutesControllerProbe ())->regenerate ();
6792 }
6893}
0 commit comments