controller = new class { use ReturnUrlTrait; /** * @param array $parameters */ public function generateUrl(string $route, array $parameters = []): string { return ReturnUrlTraitTest::DEFAULT_URL.([] === $parameters ? '' : '?'.http_build_query($parameters)); } }; } public function testTheReturnUrlIsDecoded(): void { $request = Request::create('/somewhere?r='.rawurlencode('/administrative/teamer?page=3&sort=name')); self::assertSame( '/administrative/teamer?page=3&sort=name', $this->controller->getReturnUrl($request, self::DEFAULT_ROUTE) ); } public function testAMissingParameterFallsBackToTheDefaultRoute(): void { $request = Request::create('/somewhere'); self::assertSame(self::DEFAULT_URL, $this->controller->getReturnUrl($request, self::DEFAULT_ROUTE)); } /** * A link forwarding a return url it never received itself emits "r=", which must * not be read as a return url pointing at the root. */ public function testAnEmptyParameterFallsBackToTheDefaultRoute(): void { $request = Request::create('/somewhere?r='); self::assertSame(self::DEFAULT_URL, $this->controller->getReturnUrl($request, self::DEFAULT_ROUTE)); } public function testTheDefaultRouteKeepsItsParameters(): void { $request = Request::create('/somewhere'); self::assertSame( self::DEFAULT_URL.'?uuid=abc', $this->controller->getReturnUrl($request, self::DEFAULT_ROUTE, ['uuid' => 'abc']) ); } }