em = self::$container->get(EntityManagerInterface::class); $this->userRepo = $this->em->getRepository(User::class); } public function urlMatchDataProvider() { return [ ['/', true], ['/part/2/info', true], ['/part/de/2', true], ['/part/en/', true], ['/de/', false], ['/de_DE/', false], ['/en/', false], ['/en_US/', false], ]; } /** * Test if a certain request to an url will be redirected. * @dataProvider urlMatchDataProvider */ public function testUrlMatch($url, $expect_redirect) { $client = static::createClient(); $client->request('GET', $url); $response = $client->getResponse(); if($expect_redirect) { $this->assertEquals(302, $response->getStatusCode()); } $this->assertEquals($expect_redirect, $response->isRedirect()); } public function urlAddLocaleDataProvider() { return [ //User locale, original target, redirect target ['de', '/', '/de/'], ['de', '/part/3', '/de/part/3'], ['en', '/', '/en/'], ['en', '/category/new', '/en/category/new'], ['en_US', '/part/3', '/en_US/part/3'], //Without an explicit set value, the user should be redirect to english version [null, '/', '/en/'], ['en_US', '/part/3', '/en_US/part/3'], ]; } /** * Test if the user is redirected to the localized version of a page, based on his settings. * @dataProvider urlAddLocaleDataProvider * @depends testUrlMatch * @param $user_locale * @param $input_path * @param $redirect_path */ public function testAddLocale($user_locale, $input_path, $redirect_path) { //Redirect path is absolute $redirect_path = 'http://localhost' . $redirect_path; /** @var User $user */ $user = $this->userRepo->findOneBy(['name' => 'user']); //Set user locale $user->setLanguage($user_locale); $this->em->flush(); $client = static::createClient([], [ 'PHP_AUTH_USER' => 'user', 'PHP_AUTH_PW' => 'test', ]); $client->followRedirects(false); $client->request('GET', $input_path); $this->assertEquals($redirect_path, $client->getResponse()->headers->get('Location')); } /** * Test if the user is redirected to password change page if he should do that * @depends testAddLocale * @testWith ["de"] * ["en"] */ public function testRedirectToPasswordChange(string $locale) { /** @var User $user */ $user = $this->userRepo->findOneBy(['name' => 'user']); //Test for german user $user->setLanguage($locale); $user->setNeedPwChange(true); $this->em->flush(); $client = static::createClient([], [ 'PHP_AUTH_USER' => 'user', 'PHP_AUTH_PW' => 'test', ]); $client->followRedirects(false); $client->request('GET', '/part/3'); $this->assertEquals("/$locale/user/settings", $client->getResponse()->headers->get('Location')); } }