requestStack = self::getContainer()->get(RequestStack::class); } public function testTheReturnUrlOptionIsUsed(): void { $this->pushRequest(); $item = $this->buildBackItem(AdminMenuBuilder::class, ['return_url' => '/administrative/teamer?page=3']); self::assertSame('/administrative/teamer?page=3', $item->getUri()); } public function testTheReturnUrlOptionWinsOverTheRequestParameter(): void { $this->pushRequest(rawurlencode('/administrative/teamer?page=9')); $item = $this->buildBackItem(AdminMenuBuilder::class, ['return_url' => '/administrative/teamer?page=3']); self::assertSame('/administrative/teamer?page=3', $item->getUri()); } public function testTheRequestParameterIsDecoded(): void { $this->pushRequest(rawurlencode('/administrative/teamer?page=3&sort=name')); $item = $this->buildBackItem(AdminMenuBuilder::class); self::assertSame('/administrative/teamer?page=3&sort=name', $item->getUri()); } /** * The regression guard: reachable e.g. after the status update in * Admin\Teamer\SkillsController, which redirects without carrying "r" forward. * * @dataProvider builderProvider */ public function testWithoutAnyReturnUrlTheOverviewIsLinked(string $builderClass): void { $this->pushRequest(); $deprecations = []; set_error_handler( static function (int $level, string $message) use (&$deprecations): bool { $deprecations[] = $message; return true; }, \E_DEPRECATED ); try { $item = $this->buildBackItem($builderClass); } finally { restore_error_handler(); } self::assertSame(self::OVERVIEW_PATH, $item->getUri()); self::assertSame([], $deprecations); } /** * @return iterable */ public static function builderProvider(): iterable { yield 'admin' => [AdminMenuBuilder::class]; yield 'manager' => [ManagerMenuBuilder::class]; } private function pushRequest(?string $returnUrlParameter = null): void { $query = null !== $returnUrlParameter ? '?r='.$returnUrlParameter : ''; $this->requestStack->push(Request::create('/administrative/teamer/profile/0'.$query)); } /** * @param array $options */ private function buildBackItem(string $builderClass, array $options = []): ItemInterface { $builder = self::getContainer()->get($builderClass); $children = $builder->createTeamerMenu($options)->getChildren(); $backItem = end($children); self::assertInstanceOf(ItemInterface::class, $backItem); self::assertSame('zurück zur Übersicht', $backItem->getLabel()); return $backItem; } }