diff --git a/src/MembersBundle/Document/Areabrick/MembersLogin/MembersLogin.php b/src/MembersBundle/Document/Areabrick/MembersLogin/MembersLogin.php index daf02a31..d66e9d63 100644 --- a/src/MembersBundle/Document/Areabrick/MembersLogin/MembersLogin.php +++ b/src/MembersBundle/Document/Areabrick/MembersLogin/MembersLogin.php @@ -69,9 +69,9 @@ public function action(Info $info) /** @var $formFactory \MembersBundle\Form\Factory\FactoryInterface */ $form = $this->formFactory->createUnnamedForm($formParams); - $view->form = $form->createView(); + $view->getParameters()->set('form', $form->createView()); foreach ($params as $key => $param) { - $view->{$key} = $param; + $view->getParameters()->set($key, $param); } } diff --git a/tests/_support/Helper/Browser/PhpBrowser.php b/tests/_support/Helper/Browser/PhpBrowser.php index 799a91f0..1a8138cc 100644 --- a/tests/_support/Helper/Browser/PhpBrowser.php +++ b/tests/_support/Helper/Browser/PhpBrowser.php @@ -8,11 +8,13 @@ use DachcomBundle\Test\Helper\PimcoreCore; use DachcomBundle\Test\Helper\PimcoreUser; use DachcomBundle\Test\Util\MembersHelper; +use MembersBundle\Adapter\User\UserInterface; use Pimcore\Model\Document\Email; use Pimcore\Model\User; use Symfony\Bundle\SwiftmailerBundle\DataCollector\MessageDataCollector; use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface; use Symfony\Component\HttpFoundation\Session\Session; +use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector; use Symfony\Component\HttpKernel\Profiler\Profile; use Symfony\Component\HttpKernel\Profiler\Profiler; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; @@ -127,6 +129,36 @@ public function seeSentEmailHasPropertyValue(Email $email, string $property, str } } + /** + * Actor Function to login into Members FrontEnd + * + * @param UserInterface $membersUser + */ + public function amLoggedInAsFrontendUser(UserInterface $membersUser) + { + $firewallName = 'members_fe'; + + if (!$membersUser instanceof UserInterface) { + $this->debug(sprintf('[PIMCORE BUNDLE MODULE] user needs to be a instance of %s.', UserInterface::class)); + return; + } + + /** @var Session $session */ + $session = $this->pimcoreCore->getContainer()->get('session'); + + $token = new UsernamePasswordToken($membersUser, null, $firewallName, $membersUser->getRoles()); + $this->pimcoreCore->getContainer()->get('security.token_storage')->setToken($token); + + $session->set('_security_' . $firewallName, serialize($token)); + $session->save(); + + $cookie = new Cookie($session->getName(), $session->getId()); + + $this->pimcoreCore->client->getCookieJar()->clear(); + $this->pimcoreCore->client->getCookieJar()->set($cookie); + + } + /** * Actor Function to login into Pimcore Backend * @@ -233,4 +265,50 @@ protected function getCollectedEmails(Email $email) return $emails; } + + /** + * Actor Function to see if last executed request is in given path + * + * @param string $expectedPath + */ + public function seeLastRequestIsInPath(string $expectedPath) + { + $requestUri = $this->pimcoreCore->client->getInternalRequest()->getUri(); + $requestServer = $this->pimcoreCore->client->getInternalRequest()->getServer(); + + $expectedUri = sprintf('http://%s%s', $requestServer['HTTP_HOST'], $expectedPath); + + $this->assertEquals($expectedUri, $requestUri); + } + + /** + * Actor Function to check if last _fragment request has given properties in request attributes. + * + * @param array $properties + */ + public function seePropertiesInLastFragmentRequest(array $properties = []) + { + /** @var Profiler $profiler */ + $profiler = $this->pimcoreCore->_getContainer()->get('profiler'); + + $tokens = $profiler->find('', '_fragment', 1, 'GET', '', ''); + if (count($tokens) === 0) { + throw new \RuntimeException('No profile found. Is the profiler data collector enabled?'); + } + + $token = $tokens[0]['token']; + /** @var \Symfony\Component\HttpKernel\Profiler\Profile $profile */ + $profile = $profiler->loadProfile($token); + + if (!$profile instanceof Profile) { + throw new \RuntimeException(sprintf('Profile with token "%s" not found.', $token)); + } + + /** @var RequestDataCollector $requestCollector */ + $requestCollector = $profile->getCollector('request'); + + foreach ($properties as $property) { + $this->assertTrue($requestCollector->getRequestAttributes()->has($property), sprintf('"%s" not found in request collector.', $property)); + } + } } diff --git a/tests/_support/Helper/MembersFrontend.php b/tests/_support/Helper/MembersFrontend.php index 1b2071e7..24ee2419 100644 --- a/tests/_support/Helper/MembersFrontend.php +++ b/tests/_support/Helper/MembersFrontend.php @@ -4,6 +4,7 @@ use Codeception\Lib\Interfaces\DependsOnModule; use Codeception\Module; +use DachcomBundle\Test\Util\MembersHelper; use MembersBundle\Adapter\User\UserInterface; use MembersBundle\Configuration\Configuration; use MembersBundle\Manager\UserManager; @@ -35,32 +36,58 @@ public function _inject(PimcoreBackend $connection) $this->pimcoreBackend = $connection; } - public function haveARegisteredFrontEndUser($published = false) + /** + * Actor Function to create a fully registered frontend user. Confirmation is optionally. + * + * @param bool $confirmed + * + * @return mixed + * @throws \Codeception\Exception\ModuleException + */ + public function haveARegisteredFrontEndUser(bool $confirmed = false) { - $userManager = $this->getContainer()->get(UserManager::class); $configuration = $this->getContainer()->get(Configuration::class); - $membersStoreObject = DataObject::getByPath($configuration->getConfig('storage_path')); + $userManager = $this->getContainer()->get(UserManager::class); $userObject = $userManager->createUser(); + $userObject->setParent($membersStoreObject); - $userObject->setEmail('test@universe.org'); - $userObject->setUserName('chuck'); - $userObject->setPlainPassword('test'); + $userObject->setEmail(MembersHelper::DEFAULT_FEU_EMAIL); + $userObject->setUserName(MembersHelper::DEFAULT_FEU_USERNAME); + $userObject->setPlainPassword(MembersHelper::DEFAULT_FEU_PASSWORD); $userObject->setPublished(false); $user = $userManager->updateUser($userObject); - if ($published === true) { - $user->setConfirmationToken(null); - $user->setPublished(true); - $userManager->updateUser($user); + if ($confirmed === true) { + $this->publishAndConfirmAFrontendUser($user); } return $user; } - public function haveALoggedInFrontEndUser() + /** + * Actor Function to publish and confirm (triggered by updateUser()) a frontend user. + * + * @param UserInterface $user + * + * @throws \Codeception\Exception\ModuleException + */ + public function publishAndConfirmAFrontendUser(UserInterface $user) + { + $user->setPublished(true); + + $userManager = $this->getContainer()->get(UserManager::class); + $userManager->updateUser($user); + } + + /** + * Actor function to see a logged in frontend user in session bag. + * + * @throws \Codeception\Exception\ModuleException + */ + public function seeALoggedInFrontEndUser() { $tokenStorage = $this->getContainer()->get('security.token_storage'); @@ -68,20 +95,43 @@ public function haveALoggedInFrontEndUser() $this->assertInstanceOf(UserInterface::class, $tokenStorage->getToken()->getUser()); } - public function haveANotLoggedInFrontEndUser() + /** + * Actor Function to see a not logged in frontend user in session bag. + * + * @throws \Codeception\Exception\ModuleException + */ + public function seeANotLoggedInFrontEndUser() { $tokenStorage = $this->getContainer()->get('security.token_storage'); - $this->assertNotNull($tokenStorage->getToken()); + // null is ok in this case! + if (is_null($tokenStorage->getToken())) { + return; + } + $this->assertSame('anon.', $tokenStorage->getToken()->getUser()); } + /** + * Actor Function to see properties in members user object + * + * @param UserInterface $user + * @param array $expectedProperties + */ + public function seePropertiesInFrontendUser(UserInterface $user, array $expectedProperties = []) + { + $userProperties = $user->getProperties(); + foreach ($expectedProperties as $property) { + $this->assertArrayHasKey($property, $userProperties); + } + } + /** * Actor Function to get confirmation link from email * * @param Email $email * - * @return string|null + * @return string */ public function haveConfirmationLinkInEmail(Email $email) { @@ -105,27 +155,59 @@ public function haveConfirmationLinkInEmail(Email $email) $this->assertNotEmpty($link); return $link; + } + + /** + * Actor Function to check if no users are available in storage. + * + * @throws \Exception + */ + public function seeNoFrontendUserInStorage() + { + $list = MembersUser::getList(['unpublished' => true]); + $users = $list->load(); + $this->assertCount(0, $users); } + /** + * Actor Function to check if the last registered user has an valid token. + * + * @throws \Exception + */ public function seeAUserWithValidToken() { $user = $this->grabOneUserAfterRegistration(); $this->assertNotEmpty($user->getConfirmationToken()); } + /** + * Actor Function to check if the last registered user has an invalid token. + * + * @throws \Exception + */ public function seeAUserWithInvalidatedToken() { $user = $this->grabOneUserAfterRegistration(); $this->assertNull($user->getConfirmationToken()); } + /** + * Actor Function to check if the last registered user is published. + * + * @throws \Exception + */ public function seeAPublishedUserAfterRegistration() { $user = $this->grabOneUserAfterRegistration(); $this->assertTrue($user->getPublished()); } + /** + * Actor Function to check if the last registered user is unpublished. + * + * @throws \Exception + */ public function seeAUnpublishedUserAfterRegistration() { $user = $this->grabOneUserAfterRegistration(); @@ -133,6 +215,9 @@ public function seeAUnpublishedUserAfterRegistration() } /** + * Actor function to get the last registered frontend user. + * Only one user in storage is allowed here. + * * @return UserInterface * @throws \Exception */ @@ -145,7 +230,6 @@ public function grabOneUserAfterRegistration() $this->assertInstanceOf(UserInterface::class, $users[0]); return $users[0]; - } /** diff --git a/tests/_support/Helper/PimcoreBackend.php b/tests/_support/Helper/PimcoreBackend.php index 7c5104ae..584a61ee 100644 --- a/tests/_support/Helper/PimcoreBackend.php +++ b/tests/_support/Helper/PimcoreBackend.php @@ -135,11 +135,14 @@ public function seeDownload($fileName) /** * Actor Function to place a members area on a document * - * @param Page $document + * @param Page $document + * @param null|Page $redirectAfterSuccessDocument + * @param null|Snippet $loginSnippet */ - public function seeAMembersAreaElementPlacedOnDocument(Page $document) + public function seeAMembersAreaElementPlacedOnDocument(Page $document, $redirectAfterSuccessDocument = null, $loginSnippet = null) { - $document->setElements($this->createMembersArea()); + $areaElement = $this->createMembersArea($redirectAfterSuccessDocument, $loginSnippet); + $document->setElements($areaElement); try { $document->save(); @@ -147,7 +150,7 @@ public function seeAMembersAreaElementPlacedOnDocument(Page $document) \Codeception\Util\Debug::debug(sprintf('[MEMBERS ERROR] error while saving document. message was: ' . $e->getMessage())); } - $this->assertCount(6, $document->getElements()); + $this->assertCount(count($areaElement), $document->getElements()); } /** @@ -422,38 +425,46 @@ protected function generateEmailDocument($key = 'members-test-email', array $par } /** + * @param null|Page $redirectAfterSuccessDocument + * @param null|Snippet $loginSnippet + * @param bool $hideSnippetAfterLogin + * * @return array */ - protected function createMembersArea() + protected function createMembersArea($redirectAfterSuccessDocument = null, $loginSnippet = null, $hideSnippetAfterLogin = false) { $blockArea = new Areablock(); $blockArea->setName(MembersHelper::AREA_TEST_NAMESPACE); - $redirectAfterSuccess = new Href(); - $redirectAfterSuccess->setName(sprintf('%s:1.redirectAfterSuccess', MembersHelper::AREA_TEST_NAMESPACE)); - - $data = [ - 'id' => 1, - 'type' => 'document', - 'subtype' => 'page' - ]; - - $redirectAfterSuccess->setDataFromEditmode($data); + $redirectAfterSuccess = null; + if ($redirectAfterSuccessDocument instanceof Page) { + $redirectAfterSuccess = new Href(); + $redirectAfterSuccess->setName(sprintf('%s:1.redirectAfterSuccess', MembersHelper::AREA_TEST_NAMESPACE)); + $data = [ + 'id' => $redirectAfterSuccessDocument->getId(), + 'type' => 'document', + 'subtype' => $redirectAfterSuccessDocument->getType() + ]; + $redirectAfterSuccess->setDataFromEditmode($data); + } $hideWhenLoggedIn = new Checkbox(); $hideWhenLoggedIn->setName(sprintf('%s:1.hideWhenLoggedIn', MembersHelper::AREA_TEST_NAMESPACE)); - $hideWhenLoggedIn->setDataFromEditmode(true); + $hideWhenLoggedIn->setDataFromEditmode($hideSnippetAfterLogin); - $showSnippedWhenLoggedIn = new Href(); - $showSnippedWhenLoggedIn->setName(sprintf('%s:1.showSnippedWhenLoggedIn', MembersHelper::AREA_TEST_NAMESPACE)); + $showSnippedWhenLoggedIn = null; + if ($loginSnippet instanceof Snippet) { + $showSnippedWhenLoggedIn = new Href(); + $showSnippedWhenLoggedIn->setName(sprintf('%s:1.showSnippedWhenLoggedIn', MembersHelper::AREA_TEST_NAMESPACE)); - $data2 = [ - 'id' => 1, - 'type' => 'document', - 'subtype' => 'snippet' - ]; + $data2 = [ + 'id' => $loginSnippet->getId(), + 'type' => 'document', + 'subtype' => $loginSnippet->getType() + ]; - $showSnippedWhenLoggedIn->setDataFromEditmode($data2); + $showSnippedWhenLoggedIn->setDataFromEditmode($data2); + } $blockArea->setDataFromEditmode([ [ @@ -463,12 +474,20 @@ protected function createMembersArea() ] ]); - return [ - sprintf('%s', MembersHelper::AREA_TEST_NAMESPACE) => $blockArea, - sprintf('%s:1.redirectAfterSuccess', MembersHelper::AREA_TEST_NAMESPACE) => $redirectAfterSuccess, - sprintf('%s:1.hideWhenLoggedIn', MembersHelper::AREA_TEST_NAMESPACE) => $hideWhenLoggedIn, - sprintf('%s:1.showSnippedWhenLoggedIn', MembersHelper::AREA_TEST_NAMESPACE) => $showSnippedWhenLoggedIn, + $data = [ + sprintf('%s', MembersHelper::AREA_TEST_NAMESPACE) => $blockArea, + sprintf('%s:1.hideWhenLoggedIn', MembersHelper::AREA_TEST_NAMESPACE) => $hideWhenLoggedIn ]; + + if ($redirectAfterSuccess !== null) { + $data[sprintf('%s:1.redirectAfterSuccess', MembersHelper::AREA_TEST_NAMESPACE)] = $redirectAfterSuccess; + } + + if ($showSnippedWhenLoggedIn !== null) { + $data[sprintf('%s:1.showSnippedWhenLoggedIn', MembersHelper::AREA_TEST_NAMESPACE)] = $showSnippedWhenLoggedIn; + } + + return $data; } /** diff --git a/tests/_support/Test/DachcomBundleTestCase.php b/tests/_support/Test/DachcomBundleTestCase.php index 6ae272f9..bc410064 100644 --- a/tests/_support/Test/DachcomBundleTestCase.php +++ b/tests/_support/Test/DachcomBundleTestCase.php @@ -40,9 +40,9 @@ protected function createUser($published = false, $groups = []) $userObject = $userManager->createUser(); $userObject->setParent($membersStoreObject); - $userObject->setEmail('test@universe.org'); - $userObject->setUserName('chuck'); - $userObject->setPlainPassword('test'); + $userObject->setEmail(MembersHelper::DEFAULT_FEU_EMAIL); + $userObject->setUserName(MembersHelper::DEFAULT_FEU_USERNAME); + $userObject->setPlainPassword(MembersHelper::DEFAULT_FEU_PASSWORD); $userObject->setPublished($published); $user = $userManager->updateUser($userObject); diff --git a/tests/_support/Util/MembersHelper.php b/tests/_support/Util/MembersHelper.php index 573054a2..194c5f7a 100644 --- a/tests/_support/Util/MembersHelper.php +++ b/tests/_support/Util/MembersHelper.php @@ -7,6 +7,9 @@ class MembersHelper { const AREA_TEST_NAMESPACE = 'dachcomBundleTest'; + const DEFAULT_FEU_USERNAME = 'chuck'; + const DEFAULT_FEU_EMAIL = 'test@universe.org'; + const DEFAULT_FEU_PASSWORD = 'default-password'; public static function cleanUp() { diff --git a/tests/bundle_tests/functional/Frontend/Area/LoginAreaCest.php b/tests/bundle_tests/functional/Frontend/Area/LoginAreaCest.php new file mode 100644 index 00000000..d122d088 --- /dev/null +++ b/tests/bundle_tests/functional/Frontend/Area/LoginAreaCest.php @@ -0,0 +1,149 @@ +haveAPageDocument('members-area-test'); + $I->seeAMembersAreaElementPlacedOnDocument($document); + + $I->amOnPage('/members-area-test'); + $I->seeElement('div.members.login.area'); + $I->seeElement('form[class="members_user_login"]'); + $I->seeElement('form[class="members_user_login"] input[type="text"][id="_username"]'); + $I->seeElement('form[class="members_user_login"] input[type="password"][id="_password"]'); + $I->seeElement('form[class="members_user_login"] input[type="checkbox"][id="_remember_me"]'); + $I->seeElement('form[class="members_user_login"] button[type="submit"][id="_submit"]'); + $I->seeElement('form[class="members_user_login"] input[type="hidden"][id="_target_path"]'); + $I->seeElement('form[class="members_user_login"] input[type="hidden"][id="_failure_path"]'); + } + + /** + * @param FunctionalTester $I + * + * @throws \Codeception\Exception\ModuleException + */ + public function testLoginAreaElementWithDefaultSettingsAndInvalidCredentials(FunctionalTester $I) + { + $document = $I->haveAPageDocument('members-area-test'); + $I->seeAMembersAreaElementPlacedOnDocument($document); + + $I->amOnPage('/members-area-test'); + + $I->fillField('form[class="members_user_login"] input[type="text"][id="_username"]', MembersHelper::DEFAULT_FEU_USERNAME); + $I->fillField('form[class="members_user_login"] input[type="password"][id="_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); + $I->click('Log In'); + + $I->seeANotLoggedInFrontEndUser(); + $I->see('Invalid credentials.', '.members.login.area div'); + + } + + /** + * @param FunctionalTester $I + * + * @throws \Codeception\Exception\ModuleException + */ + public function testLoginAreaElementWithDefaultSettingsAndValidCredentials(FunctionalTester $I) + { + $I->haveARegisteredFrontEndUser(true); + + $document = $I->haveAPageDocument('members-area-test'); + $I->seeAMembersAreaElementPlacedOnDocument($document); + + $I->amOnPage('/members-area-test'); + $I->seeElement(sprintf('form[class="members_user_login"] input[type="hidden"][id="_target_path"][value="%s"]', $document->getFullPath())); + $I->seeElement(sprintf('form[class="members_user_login"] input[type="hidden"][id="_failure_path"][value="%s"]', $document->getFullPath())); + + $I->fillField('form[class="members_user_login"] input[type="text"][id="_username"]', MembersHelper::DEFAULT_FEU_USERNAME); + $I->fillField('form[class="members_user_login"] input[type="password"][id="_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); + $I->click('Log In'); + + $I->see('logout', 'a'); + + $I->seeALoggedInFrontEndUser(); + } + + + /** + * @param FunctionalTester $I + * + * @throws \Codeception\Exception\ModuleException + */ + public function testLoginAreaElementWithHiddenAreaAfterLogin(FunctionalTester $I) + { + $I->haveARegisteredFrontEndUser(true); + + $document = $I->haveAPageDocument('members-area-test'); + $I->seeAMembersAreaElementPlacedOnDocument($document, null, null, true); + + $I->amOnPage('/members-area-test'); + $I->seeElement(sprintf('form[class="members_user_login"] input[type="hidden"][id="_target_path"][value="%s"]', $document->getFullPath())); + $I->seeElement(sprintf('form[class="members_user_login"] input[type="hidden"][id="_failure_path"][value="%s"]', $document->getFullPath())); + + $I->fillField('form[class="members_user_login"] input[type="text"][id="_username"]', MembersHelper::DEFAULT_FEU_USERNAME); + $I->fillField('form[class="members_user_login"] input[type="password"][id="_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); + $I->click('Log In'); + + $I->dontSee('logout', 'a'); + + $I->seeALoggedInFrontEndUser(); + } + + /** + * @param FunctionalTester $I + * + * @throws \Codeception\Exception\ModuleException + */ + public function testLoginAreaElementWithRedirectToSpecificDocumentAfterSuccessfullyLogin(FunctionalTester $I) + { + $I->haveARegisteredFrontEndUser(true); + + $redirectDocument = $I->haveAPageDocument('success-document'); + $document = $I->haveAPageDocument('members-area-test'); + $I->seeAMembersAreaElementPlacedOnDocument($document, $redirectDocument); + + $I->amOnPage('/members-area-test'); + $I->seeElement(sprintf('form[class="members_user_login"] input[type="hidden"][id="_target_path"][value="%s"]', $redirectDocument->getFullPath())); + + $I->fillField('form[class="members_user_login"] input[type="text"][id="_username"]', MembersHelper::DEFAULT_FEU_USERNAME); + $I->fillField('form[class="members_user_login"] input[type="password"][id="_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); + $I->click('Log In'); + + $I->seeLastRequestIsInPath($redirectDocument->getFullPath()); + } + + /** + * @param FunctionalTester $I + * + * @throws \Codeception\Exception\ModuleException + */ + public function testLoginAreaElementWithSnippetAfterSuccessfullyLogin(FunctionalTester $I) + { + $I->haveARegisteredFrontEndUser(true); + + $successSnippet = $I->haveASnippetDocument('success-snippet'); + $document = $I->haveAPageDocument('members-area-test'); + $I->seeAMembersAreaElementPlacedOnDocument($document, null, $successSnippet, false); + + $I->amOnPage('/members-area-test'); + + $I->fillField('form[class="members_user_login"] input[type="text"][id="_username"]', MembersHelper::DEFAULT_FEU_USERNAME); + $I->fillField('form[class="members_user_login"] input[type="password"][id="_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); + $I->click('Log In'); + + $I->seeALoggedInFrontEndUser(); + + $I->see(sprintf('snippet content with id %d', $successSnippet->getId()), '.snippet h3'); + + $I->seePropertiesInLastFragmentRequest(['user', 'redirect_uri', 'logout_uri', 'current_uri']); + } +} \ No newline at end of file diff --git a/tests/bundle_tests/functional/Frontend/Form/ChangePasswordFormCest.php b/tests/bundle_tests/functional/Frontend/Form/ChangePasswordFormCest.php new file mode 100644 index 00000000..a092f706 --- /dev/null +++ b/tests/bundle_tests/functional/Frontend/Form/ChangePasswordFormCest.php @@ -0,0 +1,46 @@ +haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/change-password'); + $I->see('Current password', 'form[name="members_user_change_password_form"] label'); + $I->seeElement('form[name="members_user_change_password_form"] input[type="password"][id="members_user_change_password_form_current_password"]'); + $I->see('New password', 'form[name="members_user_change_password_form"] label'); + $I->seeElement('form[name="members_user_change_password_form"] input[type="password"][id="members_user_change_password_form_plainPassword_first"]'); + $I->see('Repeat new password', 'form[name="members_user_change_password_form"] label'); + $I->seeElement('form[name="members_user_change_password_form"] input[type="password"][id="members_user_change_password_form_plainPassword_second"]'); + $I->seeElement('form[name="members_user_change_password_form"] button[type="submit"][id="members_user_change_password_form_submit"]'); + } + + /** + * @param FunctionalTester $I + */ + public function testChangePassword(FunctionalTester $I) + { + $user = $I->haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/change-password'); + $I->fillField('form[name="members_user_change_password_form"] input[type="password"][id="members_user_change_password_form_current_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); + $I->fillField('form[name="members_user_change_password_form"] input[type="password"][id="members_user_change_password_form_plainPassword_first"]', 'default-new-password'); + $I->fillField('form[name="members_user_change_password_form"] input[type="password"][id="members_user_change_password_form_plainPassword_second"]', 'default-new-password'); + $I->click('Change password'); + + $I->see('The password has been changed.', '.alert.flash-success'); + $I->see(sprintf('Username: %s', MembersHelper::DEFAULT_FEU_USERNAME), '.members_user_show'); + $I->see(sprintf('Email: %s', MembersHelper::DEFAULT_FEU_EMAIL), '.members_user_show'); + } +} \ No newline at end of file diff --git a/tests/bundle_tests/functional/Frontend/Form/DeleteAccountFormCest.php b/tests/bundle_tests/functional/Frontend/Form/DeleteAccountFormCest.php new file mode 100644 index 00000000..8d5f19a7 --- /dev/null +++ b/tests/bundle_tests/functional/Frontend/Form/DeleteAccountFormCest.php @@ -0,0 +1,65 @@ +haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/delete-account'); + $I->see('Current password', 'form[name="members_user_delete_account_form"] label'); + $I->seeElement('form[name="members_user_delete_account_form"] input[type="password"][id="members_user_delete_account_form_current_password_first"]'); + $I->see('Repeat password', 'form[name="members_user_delete_account_form"] label'); + $I->seeElement('form[name="members_user_delete_account_form"] input[type="password"][id="members_user_delete_account_form_current_password_second"]'); + $I->see('Yes, I want to delete my account', 'form[name="members_user_delete_account_form"] label'); + $I->seeElement('form[name="members_user_delete_account_form"] input[type="checkbox"][id="members_user_delete_account_form_deleteConfirm"]'); + $I->seeElement('form[name="members_user_delete_account_form"] button[type="submit"][id="members_user_delete_account_form_submit"]'); + } + + /** + * @param FunctionalTester $I + */ + public function testDeleteAccountInvalid(FunctionalTester $I) + { + $user = $I->haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/delete-account'); + $I->fillField('form[name="members_user_delete_account_form"] input[type="password"][id="members_user_delete_account_form_current_password_first"]', + MembersHelper::DEFAULT_FEU_PASSWORD); + $I->fillField('form[name="members_user_delete_account_form"] input[type="password"][id="members_user_delete_account_form_current_password_second"]', + MembersHelper::DEFAULT_FEU_PASSWORD); + $I->click('Delete account'); + + $I->see('members.validation.delete_account.confirm_not_checked', '.form-error-message'); + } + + /** + * @param FunctionalTester $I + */ + public function testDeleteAccountValid(FunctionalTester $I) + { + $user = $I->haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/delete-account'); + $I->fillField('form[name="members_user_delete_account_form"] input[type="password"][id="members_user_delete_account_form_current_password_first"]', + MembersHelper::DEFAULT_FEU_PASSWORD); + $I->fillField('form[name="members_user_delete_account_form"] input[type="password"][id="members_user_delete_account_form_current_password_second"]', + MembersHelper::DEFAULT_FEU_PASSWORD); + $I->checkOption('input[id="members_user_delete_account_form_deleteConfirm"]'); + $I->click('Delete account'); + + $I->seeANotLoggedInFrontEndUser(); + $I->seeNoFrontendUserInStorage(); + } +} \ No newline at end of file diff --git a/tests/bundle_tests/functional/Frontend/LoginLogoutCest.php b/tests/bundle_tests/functional/Frontend/Form/LoginLogoutFormCest.php similarity index 80% rename from tests/bundle_tests/functional/Frontend/LoginLogoutCest.php rename to tests/bundle_tests/functional/Frontend/Form/LoginLogoutFormCest.php index 6fc7c41b..cb73dca5 100644 --- a/tests/bundle_tests/functional/Frontend/LoginLogoutCest.php +++ b/tests/bundle_tests/functional/Frontend/Form/LoginLogoutFormCest.php @@ -1,10 +1,11 @@ login($I); $I->see('invalid credentials.', 'div'); - $I->haveANotLoggedInFrontEndUser(); + $I->seeANotLoggedInFrontEndUser(); } /** @@ -37,10 +38,9 @@ public function testLoginWithNonExistingUser(FunctionalTester $I) public function testLoginWithInactiveUser(FunctionalTester $I) { $I->haveARegisteredFrontEndUser(false); - $this->login($I); $I->see('Account is disabled.', 'div'); - $I->haveANotLoggedInFrontEndUser(); + $I->seeANotLoggedInFrontEndUser(); } /** @@ -50,7 +50,7 @@ public function testLoginWithValidUser(FunctionalTester $I) { $I->haveARegisteredFrontEndUser(true); $this->login($I); - $I->haveALoggedInFrontEndUser(true); + $I->seeALoggedInFrontEndUser(); } /** @@ -60,10 +60,9 @@ public function testLogout(FunctionalTester $I) { $I->haveARegisteredFrontEndUser(true); $this->login($I); - $I->haveALoggedInFrontEndUser(true); - + $I->seeALoggedInFrontEndUser(true); $I->amOnPage('/en/members/logout'); - $I->haveANotLoggedInFrontEndUser(true); + $I->seeANotLoggedInFrontEndUser(); } /** @@ -71,12 +70,9 @@ public function testLogout(FunctionalTester $I) */ private function login(FunctionalTester $I) { - $userName = 'chuck'; - $password = 'test'; - $I->amOnPage('/en/members/login'); - $I->fillField('form[class="members_user_login"] input[type="text"][name="_username"]', $userName); - $I->fillField('form[class="members_user_login"] input[type="password"][name="_password"]', $password); + $I->fillField('form[class="members_user_login"] input[type="text"][name="_username"]', MembersHelper::DEFAULT_FEU_USERNAME); + $I->fillField('form[class="members_user_login"] input[type="password"][name="_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); $I->click('Log In'); } } \ No newline at end of file diff --git a/tests/bundle_tests/functional/Frontend/Form/ProfileFormCest.php b/tests/bundle_tests/functional/Frontend/Form/ProfileFormCest.php new file mode 100644 index 00000000..b06166ac --- /dev/null +++ b/tests/bundle_tests/functional/Frontend/Form/ProfileFormCest.php @@ -0,0 +1,81 @@ +haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile'); + $I->see(sprintf('Username: %s', MembersHelper::DEFAULT_FEU_USERNAME), '.members_user_show'); + $I->see(sprintf('Email: %s', MembersHelper::DEFAULT_FEU_EMAIL), '.members_user_show'); + } + + /** + * @param FunctionalTester $I + */ + public function testProfileEditForm(FunctionalTester $I) + { + $user = $I->haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/edit'); + $I->see('Username', 'form[name="members_user_profile_form"] label'); + $I->seeElement('form[name="members_user_profile_form"] input[type="text"][id="members_user_profile_form_username"]'); + $I->see('Email', 'form[name="members_user_profile_form"] label'); + $I->seeElement('form[name="members_user_profile_form"] input[type="email"][id="members_user_profile_form_email"]'); + $I->see('Current password', 'form[name="members_user_profile_form"] label'); + $I->seeElement('form[name="members_user_profile_form"] input[type="password"][id="members_user_profile_form_current_password"]'); + $I->seeElement('form[name="members_user_profile_form"] button[type="submit"][id="members_user_profile_form_submit"]'); + } + + /** + * @param FunctionalTester $I + */ + public function testProfileEditFormUpdateInvalid(FunctionalTester $I) + { + $user = $I->haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/edit'); + + $I->fillField('form[name="members_user_profile_form"] input[type="text"][id="members_user_profile_form_username"]', 'new-chuck'); + $I->fillField('form[name="members_user_profile_form"] input[type="email"][id="members_user_profile_form_email"]', 'new-test@universe.org'); + $I->fillField('form[name="members_user_profile_form"] input[type="password"][id="members_user_profile_form_current_password"]', 'wrong-password'); + $I->click('Update'); + + $I->see('members.validation.current_password.invalid', '.form-error-message'); + } + + /** + * @param FunctionalTester $I + */ + public function testProfileEditFormUpdateValid(FunctionalTester $I) + { + $newUserName = 'new-' . MembersHelper::DEFAULT_FEU_USERNAME; + $newEmail = 'new-' . MembersHelper::DEFAULT_FEU_EMAIL; + + $user = $I->haveARegisteredFrontEndUser(true); + $I->amLoggedInAsFrontendUser($user); + + $I->amOnPage('/en/members/profile/edit'); + + $I->fillField('form[name="members_user_profile_form"] input[type="text"][id="members_user_profile_form_username"]', $newUserName); + $I->fillField('form[name="members_user_profile_form"] input[type="email"][id="members_user_profile_form_email"]', $newEmail); + $I->fillField('form[name="members_user_profile_form"] input[type="password"][id="members_user_profile_form_current_password"]', MembersHelper::DEFAULT_FEU_PASSWORD); + $I->click('Update'); + + $I->see('The profile has been updated.', '.alert.flash-success'); + $I->see(sprintf('Username: %s', $newUserName), '.members_user_show'); + $I->see(sprintf('Email: %s', $newEmail), '.members_user_show'); + } +} \ No newline at end of file diff --git a/tests/bundle_tests/functional/Frontend/RegisterCest.php b/tests/bundle_tests/functional/Frontend/Form/RegisterFormCest.php similarity index 86% rename from tests/bundle_tests/functional/Frontend/RegisterCest.php rename to tests/bundle_tests/functional/Frontend/Form/RegisterFormCest.php index d466006c..0ac6f97a 100644 --- a/tests/bundle_tests/functional/Frontend/RegisterCest.php +++ b/tests/bundle_tests/functional/Frontend/Form/RegisterFormCest.php @@ -1,11 +1,12 @@ register($I); $I->see('The user has been created successfully.', '.alert.flash-success'); - $I->see(sprintf('An email has been sent to %s. It contains an activation link you must click to activate your account.', $email), 'p'); + $I->see(sprintf('An email has been sent to %s. It contains an activation link you must click to activate your account.', MembersHelper::DEFAULT_FEU_EMAIL), 'p'); $I->seeAUnpublishedUserAfterRegistration(); $I->seeAUserWithValidToken(); @@ -46,7 +44,7 @@ public function testUserRegistrationFormConfirmByMail(FunctionalTester $I) $confirmationLink = $I->haveConfirmationLinkInEmail($email); $I->amOnPage($confirmationLink); - $I->see(sprintf('Congrats %s, your account is now activated.', $userName), 'p'); + $I->see(sprintf('Congrats %s, your account is now activated.', MembersHelper::DEFAULT_FEU_USERNAME), 'p'); $I->seeAPublishedUserAfterRegistration(); $I->seeAUserWithInvalidatedToken(); @@ -76,8 +74,7 @@ public function testUserRegistrationFormConfirmByAdmin(FunctionalTester $I) $I->seeEmailIsNotSent($email); $user = $I->grabOneUserAfterRegistration(); - $user->setPublished(true); - $user->save(); + $I->publishAndConfirmAFrontendUser($user); $email = Email::getByPath('/email/register-confirmed'); $I->seeEmailIsNotSent($email); @@ -95,8 +92,7 @@ public function testUserRegistrationFormConfirmByAdminWithFinalConfirmationMail( $this->register($I); $user = $I->grabOneUserAfterRegistration(); - $user->setPublished(true); - $user->save(); + $I->publishAndConfirmAFrontendUser($user); $email = Email::getByPath('/email/register-confirmed'); $I->canSeeEmailIsSent($email); @@ -113,7 +109,7 @@ public function testUserRegistrationFormConfirmByAdminWithAdminNotificationMail( $I->haveABootedSymfonyConfiguration('config_reg_confirm_by_admin_with_admin_notify.yml'); $email = Email::getByPath('/email/admin-register-notification'); - $email->setTo('test@universe.org'); + $email->setTo('test-admin@universe.org'); $email->save(); $this->register($I); @@ -132,7 +128,7 @@ public function testUserRegistrationFormConfirmInstant(FunctionalTester $I) $this->register($I); $I->see('The user has been created successfully.', '.alert.flash-success'); - $I->see('Congrats chuck, your account is now activated.', 'p'); + $I->see(sprintf('Congrats %s, your account is now activated.', MembersHelper::DEFAULT_FEU_USERNAME), 'p'); $I->seeAPublishedUserAfterRegistration(); $I->seeAUserWithInvalidatedToken(); @@ -146,15 +142,25 @@ public function testUserRegistrationFormConfirmInstant(FunctionalTester $I) /** * @param FunctionalTester $I + * + * @throws \Exception */ - private function register(FunctionalTester $I) + public function testUserPropertiesAfterRegistration(FunctionalTester $I) { - $email = 'test@universe.org'; - $userName = 'chuck'; + $this->register($I); + $user = $I->grabOneUserAfterRegistration(); + $I->seePropertiesInFrontendUser($user, ['_user_locale']); + } + + /** + * @param FunctionalTester $I + */ + private function register(FunctionalTester $I) + { $I->amOnPage('/en/members/register'); - $I->fillField('form[name="members_user_registration_form"] input[type="email"][id="members_user_registration_form_email"]', $email); - $I->fillField('form[name="members_user_registration_form"] input[type="text"][id="members_user_registration_form_username"]', $userName); + $I->fillField('form[name="members_user_registration_form"] input[type="email"][id="members_user_registration_form_email"]', MembersHelper::DEFAULT_FEU_EMAIL); + $I->fillField('form[name="members_user_registration_form"] input[type="text"][id="members_user_registration_form_username"]', MembersHelper::DEFAULT_FEU_USERNAME); $I->fillField('form[name="members_user_registration_form"] input[type="password"][id="members_user_registration_form_plainPassword_first"]', 'password'); $I->fillField('form[name="members_user_registration_form"] input[type="password"][id="members_user_registration_form_plainPassword_second"]', 'password'); $I->click('Register'); diff --git a/tests/bundle_tests/functional/Frontend/Form/ResettingFormCest.php b/tests/bundle_tests/functional/Frontend/Form/ResettingFormCest.php new file mode 100644 index 00000000..5b34293f --- /dev/null +++ b/tests/bundle_tests/functional/Frontend/Form/ResettingFormCest.php @@ -0,0 +1,78 @@ +amOnPage('/en/members/resetting/request'); + + $I->see('Username or email address', 'form[class="members_user_resetting_request"] label'); + $I->seeElement('form[class="members_user_resetting_request"] input[type="text"][id="username"]'); + $I->seeElement('form[class="members_user_resetting_request"] button[type="submit"][id="submit"]'); + } + + /** + * @param FunctionalTester $I + */ + public function testResettingByUsername(FunctionalTester $I) + { + $user = $I->haveARegisteredFrontEndUser(true); + $this->triggerResetForm($I, $user->getUserName()); + } + + /** + * @param FunctionalTester $I + */ + public function testResettingByEmailAddress(FunctionalTester $I) + { + $user = $I->haveARegisteredFrontEndUser(true); + $this->triggerResetForm($I, $user->getEmail()); + } + + /** + * @param FunctionalTester $I + */ + private function triggerResetForm(FunctionalTester $I, $field) + { + $I->amOnPage('/en/members/resetting/request'); + + $I->fillField('form[class="members_user_resetting_request"] input[type="text"][id="username"]', $field); + $I->click('Reset password'); + + $confirmText = 'An email has been sent. It contains a link you must click to reset your password. '; + $confirmText .= 'Note: You can only request a new password once within 2 hours. '; + $confirmText .= 'If you don\'t get an email check your spam folder or try again.'; + + $I->see($confirmText, 'div p'); + + $email = Email::getByPath('/email/password-reset'); + $I->canSeeEmailIsSent($email); + $I->seePropertyKeysInEmail($email, ['user', 'confirmationUrl']); + + $confirmationLink = $I->haveConfirmationLinkInEmail($email); + + $I->amOnPage($confirmationLink); + $I->see('New password', 'form[name="members_user_resetting_form"] label'); + $I->seeElement('form[name="members_user_resetting_form"] input[type="password"][id="members_user_resetting_form_plainPassword_first"]'); + $I->see('Repeat new password', 'form[name="members_user_resetting_form"] label'); + $I->seeElement('form[name="members_user_resetting_form"] input[type="password"][id="members_user_resetting_form_plainPassword_second"]'); + $I->seeElement('form[name="members_user_resetting_form"] button[type="submit"][id="members_user_resetting_form_submit"]'); + + $I->fillField('form[name="members_user_resetting_form"] input[type="password"][id="members_user_resetting_form_plainPassword_first"]', 'new-pass'); + $I->fillField('form[name="members_user_resetting_form"] input[type="password"][id="members_user_resetting_form_plainPassword_second"]', 'new-pass'); + $I->click('Change password'); + + $I->see('The password has been reset successfully.', '.alert.flash-success'); + $I->see(sprintf('Username: %s', MembersHelper::DEFAULT_FEU_USERNAME), '.members_user_show'); + $I->see(sprintf('Email: %s', MembersHelper::DEFAULT_FEU_EMAIL), '.members_user_show'); + } +} \ No newline at end of file diff --git a/tests/bundle_tests/unit/Manager/UserManagerTest.php b/tests/bundle_tests/unit/Manager/UserManagerTest.php index cd65548d..b49a45d2 100644 --- a/tests/bundle_tests/unit/Manager/UserManagerTest.php +++ b/tests/bundle_tests/unit/Manager/UserManagerTest.php @@ -3,6 +3,7 @@ namespace DachcomBundle\Test\unit\Manager; use DachcomBundle\Test\Test\DachcomBundleTestCase; +use DachcomBundle\Test\Util\MembersHelper; use MembersBundle\Adapter\User\UserInterface; use MembersBundle\Manager\UserManager; use Pimcore\Model\DataObject\MembersUser; @@ -34,7 +35,7 @@ public function testFindUserByEmail() $this->createUser(); $userManager = $this->getContainer()->get(UserManager::class); - $this->assertInstanceOf(UserInterface::class, $userManager->findUserByEmail('test@universe.org')); + $this->assertInstanceOf(UserInterface::class, $userManager->findUserByEmail(MembersHelper::DEFAULT_FEU_EMAIL)); } public function testFindUserByUsername() @@ -42,7 +43,7 @@ public function testFindUserByUsername() $this->createUser(); $userManager = $this->getContainer()->get(UserManager::class); - $this->assertInstanceOf(UserInterface::class, $userManager->findUserByUsername('chuck')); + $this->assertInstanceOf(UserInterface::class, $userManager->findUserByUsername(MembersHelper::DEFAULT_FEU_USERNAME)); } public function testFindUserByUsernameOrEmail() @@ -50,8 +51,8 @@ public function testFindUserByUsernameOrEmail() $this->createUser(); $userManager = $this->getContainer()->get(UserManager::class); - $this->assertInstanceOf(UserInterface::class, $userManager->findUserByUsernameOrEmail('test@universe.org')); - $this->assertInstanceOf(UserInterface::class, $userManager->findUserByUsernameOrEmail('chuck')); + $this->assertInstanceOf(UserInterface::class, $userManager->findUserByUsernameOrEmail(MembersHelper::DEFAULT_FEU_EMAIL)); + $this->assertInstanceOf(UserInterface::class, $userManager->findUserByUsernameOrEmail(MembersHelper::DEFAULT_FEU_USERNAME)); } public function testFindUserByCondition() @@ -59,7 +60,7 @@ public function testFindUserByCondition() $this->createUser(); $userManager = $this->getContainer()->get(UserManager::class); - $this->assertInstanceOf(UserInterface::class, $userManager->findUserByCondition('email = ?', ['test@universe.org'])); + $this->assertInstanceOf(UserInterface::class, $userManager->findUserByCondition('email = ?', [MembersHelper::DEFAULT_FEU_EMAIL])); } public function testFindPublishedUsers()