assertUrlIsSecured('/profile/' . UserFixtures::USERNAME_USER); } public function getTabTestData() { $userTabs = ['#charts', '#settings', '#password', '#api-token', '#preferences']; return [ [User::ROLE_USER, UserFixtures::USERNAME_USER, ['#charts', '#settings', '#password', '#api-token', '#preferences']], [User::ROLE_SUPER_ADMIN, UserFixtures::USERNAME_SUPER_ADMIN, array_merge($userTabs, ['#roles'])], ]; } /** * @dataProvider getTabTestData */ public function testIndexAction($role, $username, $expectedTabs) { $client = $this->getClientForAuthenticatedUser($role); $this->request($client, '/profile/' . $username); $this->assertTrue($client->getResponse()->isSuccessful()); $tabs = $client->getCrawler()->filter('div.nav-tabs-custom ul.nav-tabs li'); $this->assertEquals(count($expectedTabs), $tabs->count()); $foundTabs = []; foreach ($tabs->filter('a') as $tab) { $foundTabs[] = $tab->getAttribute('href'); } $this->assertEmpty(array_diff($expectedTabs, $foundTabs)); } public function testIndexActionWithDifferentUsername() { $client = $this->getClientForAuthenticatedUser(); $this->request($client, '/profile/' . UserFixtures::USERNAME_TEAMLEAD); $this->assertFalse($client->getResponse()->isSuccessful()); } public function testEditAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/edit'); /** @var User $user */ $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); $this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername()); $this->assertEquals('John Doe', $user->getAlias()); $this->assertEquals('Developer', $user->getTitle()); $this->assertEquals(UserFixtures::DEFAULT_AVATAR, $user->getAvatar()); $this->assertEquals('john_user@example.com', $user->getEmail()); $this->assertTrue($user->isEnabled()); $form = $client->getCrawler()->filter('form[name=user_edit]')->form(); $client->submit($form, [ 'user_edit' => [ 'alias' => 'Johnny', 'title' => 'Code Monkey', 'avatar' => '/fake/image.jpg', 'email' => 'updated@example.com', 'enabled' => false, ] ]); $this->assertIsRedirect($client, $this->createUrl('/profile/' . urlencode(UserFixtures::USERNAME_USER) . '/edit')); $client->followRedirect(); $this->assertTrue($client->getResponse()->isSuccessful()); $this->assertHasFlashSuccess($client); $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); $this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername()); $this->assertEquals('Johnny', $user->getAlias()); $this->assertEquals('Code Monkey', $user->getTitle()); $this->assertEquals('/fake/image.jpg', $user->getAvatar()); $this->assertEquals('updated@example.com', $user->getEmail()); $this->assertFalse($user->isEnabled()); } public function testPasswordAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/password'); /** @var User $user */ $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); /** @var EncoderFactoryInterface $passwordEncoder */ $passwordEncoder = $client->getContainer()->get('test.PasswordEncoder'); $this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), UserFixtures::DEFAULT_PASSWORD, $user->getSalt())); $this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), 'test123', $user->getSalt())); $this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername()); $form = $client->getCrawler()->filter('form[name=user_password]')->form(); $client->submit($form, [ 'user_password' => [ 'plainPassword' => [ 'first' => 'test123', 'second' => 'test123', ] ] ]); $this->assertIsRedirect($client, $this->createUrl('/profile/' . urlencode(UserFixtures::USERNAME_USER) . '/password')); $client->followRedirect(); $this->assertTrue($client->getResponse()->isSuccessful()); $this->assertHasFlashSuccess($client); $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); $this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), UserFixtures::DEFAULT_PASSWORD, $user->getSalt())); $this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getPassword(), 'test123', $user->getSalt())); } public function testApiTokenAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_USER); $this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/api-token'); /** @var User $user */ $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); /** @var EncoderFactoryInterface $passwordEncoder */ $passwordEncoder = $client->getContainer()->get('test.PasswordEncoder'); $this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN, $user->getSalt())); $this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test123', $user->getSalt())); $this->assertEquals(UserFixtures::USERNAME_USER, $user->getUsername()); $form = $client->getCrawler()->filter('form[name=user_api_token]')->form(); $client->submit($form, [ 'user_api_token' => [ 'plainApiToken' => [ 'first' => 'test123', 'second' => 'test123', ] ] ]); $this->assertIsRedirect($client, $this->createUrl('/profile/' . urlencode(UserFixtures::USERNAME_USER) . '/api-token')); $client->followRedirect(); $this->assertTrue($client->getResponse()->isSuccessful()); $this->assertHasFlashSuccess($client); $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); $this->assertFalse($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), UserFixtures::DEFAULT_API_TOKEN, $user->getSalt())); $this->assertTrue($passwordEncoder->getEncoder($user)->isPasswordValid($user->getApiToken(), 'test123', $user->getSalt())); } public function testRolesActionIsSecured() { $client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD); $this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/roles'); $this->assertFalse($client->getResponse()->isSuccessful()); } public function testRolesAction() { $client = $this->getClientForAuthenticatedUser(User::ROLE_SUPER_ADMIN); $this->request($client, '/profile/' . UserFixtures::USERNAME_USER . '/roles'); /** @var User $user */ $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); $this->assertEquals(['ROLE_USER'], $user->getRoles()); $form = $client->getCrawler()->filter('form[name=user_roles]')->form(); $client->submit($form, [ 'user_roles[roles]' => [ 'ROLE_TEAMLEAD', 'ROLE_SUPER_ADMIN', ] ]); $this->assertIsRedirect($client, $this->createUrl('/profile/' . urlencode(UserFixtures::USERNAME_USER) . '/roles')); $client->followRedirect(); $this->assertTrue($client->getResponse()->isSuccessful()); $this->assertHasFlashSuccess($client); $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByRole($em, User::ROLE_USER); $this->assertEquals(['ROLE_TEAMLEAD', 'ROLE_SUPER_ADMIN', 'ROLE_USER'], $user->getRoles()); } public function getPreferencesTestData() { return [ // assert that the user doesn't have the "hourly-rate_own_profile" permission [User::ROLE_USER, UserFixtures::USERNAME_USER, 82, 82, 'ar'], // admins are allowed to update their own hourly rate [User::ROLE_ADMIN, UserFixtures::USERNAME_ADMIN, 81, 37.5, 'ar'], // admins are allowed to update other peoples hourly rate [User::ROLE_SUPER_ADMIN, UserFixtures::USERNAME_USER, 82, 37.5, 'en'], ]; } /** * @dataProvider getPreferencesTestData */ public function testPreferencesAction($role, $username, $hourlyRateOriginal, $hourlyRate, $expectedLocale) { $client = $this->getClientForAuthenticatedUser($role); $this->request($client, '/profile/' . $username . '/prefs'); /** @var User $user */ $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByName($em, $username); $this->assertEquals($hourlyRateOriginal, $user->getPreferenceValue(UserPreference::HOURLY_RATE)); $this->assertEquals('green', $user->getPreferenceValue(UserPreference::SKIN)); $this->assertEquals(true, $user->getPreferenceValue('theme.fixed_layout')); $this->assertEquals(false, $user->getPreferenceValue('theme.boxed_layout')); $this->assertEquals(false, $user->getPreferenceValue('theme.collapsed_sidebar')); $this->assertEquals(true, $user->getPreferenceValue('theme.mini_sidebar')); $this->assertEquals('month', $user->getPreferenceValue('calendar.initial_view')); $form = $client->getCrawler()->filter('form[name=user_preferences_form]')->form(); $client->submit($form, [ 'user_preferences_form' => [ 'preferences' => [ ['name' => UserPreference::HOURLY_RATE, 'value' => 37.5], ['name' => 'timezone', 'value' => 'America/Creston'], ['name' => 'language', 'value' => 'ar'], ['name' => UserPreference::SKIN, 'value' => 'blue'], ['name' => 'theme.fixed_layout', 'value' => false], ['name' => 'theme.boxed_layout', 'value' => true], ['name' => 'theme.collapsed_sidebar', 'value' => true], ['name' => 'theme.mini_sidebar', 'value' => false], ['name' => 'calendar.initial_view', 'value' => 'agendaDay'], ] ] ]); $targetUrl = '/' . $expectedLocale . '/profile/' . urlencode($username) . '/prefs'; $this->assertIsRedirect($client, $targetUrl); $client->followRedirect(); $this->assertTrue($client->getResponse()->isSuccessful()); $this->assertHasFlashSuccess($client); $em = $client->getContainer()->get('doctrine.orm.entity_manager'); $user = $this->getUserByName($em, $username); $this->assertEquals($hourlyRate, $user->getPreferenceValue(UserPreference::HOURLY_RATE)); $this->assertEquals('', $user->getPreferenceValue('America/Creston')); $this->assertEquals('ar', $user->getPreferenceValue('language')); $this->assertEquals('blue', $user->getPreferenceValue(UserPreference::SKIN)); $this->assertEquals(false, $user->getPreferenceValue('theme.fixed_layout')); $this->assertEquals(true, $user->getPreferenceValue('theme.boxed_layout')); $this->assertEquals(true, $user->getPreferenceValue('theme.collapsed_sidebar')); $this->assertEquals(false, $user->getPreferenceValue('theme.mini_sidebar')); $this->assertEquals('agendaDay', $user->getPreferenceValue('calendar.initial_view')); } }