maison_alexandra/tests/SeleniumTests/App/PubUsers/pubUserLoginForcePwdChangeT...

217 lines
9.7 KiB
PHP

<?php
namespace ElixirAudit\Tests\SeleniumTests\App\PubUsers;
use BRSystems\Core\Library\cGoogle2FA\cGoogle2FA;
use ElixirAudit\Tests\BasePhpUnitSeleniumCase;
use ElixirAudit\Tests\DataSetup\Constants\siteAccounts;
use ElixirAudit\Tests\DataSetup\Constants\siteLanguages;
use ElixirAudit\Tests\DataSetup\Constants\siteUsers;
use ElixirAudit\Tests\DataSetup\Traits\App\pubUsersTrait;
class pubUserLoginForcePwdChangeTest extends BasePhpUnitSeleniumCase
{
use pubUsersTrait;
const url = [
siteLanguages::LANG_LV => [
'url' => 'ienakt-gramatvedibas-sistema',
'header' => 'Ienākt grāmatvedības sistēmā',
'header-2fa' => 'Divu faktoru autentifikācija',
'header-3pwd' => 'Mainīt lietotāja paroli',
'exists' => ['#user_name', '#old_password', '#new_password', '#rnew_password', 'button.btn.btn-block'],
'text-exists' => ['Mainīt lietotāja paroli','Manīt paroli'],
'inv-pwd' => 'Jaunā lietotāja parole nevar sakrist ar veco!',
'pwd-ok' => 'Lietotāja parole veiksmīgi nomainīta!',
'welcome-msg' => ['Laipni lūdzam,', 'Grāmatvedības sistēma', 'Sākums'],
'fill-field' => 'Lūdzu aizpildiet lauku!',
'fill-min' => 'Min value length is 6',
'fill-dont-match' => 'Fields do not match!',
]
];
protected function setUp(): void
{
parent::setUp();
// Set user force password change param
$this->cDb->query("UPDATE mod_users SET user_fchange = '1' WHERE id = 12");
}
protected function tearDown(): void
{
//$this->dbSetup(['App/pubUsers/mod_users_db_setup.sql']);
$this->reloadDbTables(['mod_users']);
parent::tearDown();
}
public function testPwdChange(): void
{
foreach (self::url as $lang => $pageData) {
// Got to location to test
$this->goToPasswordChangeForm($pageData);
// Change user password
$this->changeUserPassword($pageData);
}
}
public function testPwdChangeForm(): void
{
$loginData = $this->getLoginCredentialsByType(siteUsers::loginAppSelfEmployed);
foreach (self::url as $lang => $pageData) {
// Got to location to test
$this->goToPasswordChangeForm($pageData);
// Test error containing fields
$this->webDriver->action()->moveToElement($this->byId('new_password'))->perform();
$this->webDriver->executeScript('$("#new_password").focus().blur();');
$this->elementWait('#new_password + div.errMsg', self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-field'], $this->byCssSelector('#new_password + div.errMsg')->getText());
$this->webDriver->action()->moveToElement($this->byId('rnew_password'))->perform();
$this->webDriver->executeScript('$("#rnew_password").focus().blur();');
$this->elementWait('#rnew_password + div.errMsg', self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-field'], $this->byCssSelector('#rnew_password + div.errMsg')->getText());
$this->webDriver->executeScript('$("#new_password").focus().val("asd").blur();');
$this->webDriver->action()->moveToElement($this->byId('new_password'))->perform();
$this->elementWait('#new_password + div.errMsg', self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-min'], $this->byCssSelector('#new_password + div.errMsg')->getText());
$this->webDriver->executeScript('$("#new_password").focus().val("' . $loginData['password'] . '").blur();');
$this->webDriver->action()->moveToElement($this->byId('new_password'))->perform();
$this->elementWait('#new_password + div.errMsg', self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-dont-match'], $this->byCssSelector('#new_password + div.errMsg')->getText());
// Both fields should have error
$this->webDriver->action()->moveToElement($this->byId('rnew_password'))->perform();
$this->elementWait('#rnew_password + div.errMsg', self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-field'], $this->byCssSelector('#rnew_password + div.errMsg')->getText());
$this->webDriver->executeScript('$("#rnew_password").focus().val("dsa").blur();');
$this->webDriver->action()->moveToElement($this->byId('rnew_password'))->perform();
$this->elementWait('#rnew_password + div.errMsg', self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-min'], $this->byCssSelector('#rnew_password + div.errMsg')->getText());
$this->webDriver->executeScript('$("#rnew_password").focus().val("testLongerPassword").blur();');
$this->webDriver->action()->moveToElement($this->byId('rnew_password'))->perform();
$this->elementWait('#rnew_password + div.errMsg', self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-dont-match'], $this->byCssSelector('#rnew_password + div.errMsg')->getText());
// Set both fields to same long password
$this->webDriver->executeScript('$("#rnew_password").focus().val("' . $loginData['password'] . '").blur();');
$this->webDriver->action()->moveToElement($this->byId('rnew_password'))->perform();
// Errors should be gone - hidden/removed
$this->assertEquals('', $this->byCssSelector('#new_password + div.errMsg')->getText());
$this->assertEquals('', $this->byCssSelector('#rnew_password + div.errMsg')->getText());
$this->assertTrue($this->elementExists('.v-ok #new_password', self::CSS_SELECTOR));
$this->assertTrue($this->elementExists('.v-ok #rnew_password', self::CSS_SELECTOR));
// Send password change request
$this->byCssSelector("form#pwd_cnt button.btn.btn-block")->click();
// Wait for error message
$this->elementWait('status_error', self::CLASS_NAME);
$this->assertEquals($pageData['inv-pwd'], $this->byCssSelector('div.status_error')->getText());
// Change user password
$this->changeUserPassword($pageData);
}
}
public function testPwdChangePageLoaded(): void
{
foreach (self::url as $lang => $pageData) {
// Got to location to test
$this->goToPasswordChangeForm($pageData);
foreach ($pageData['exists'] as $selectorToFind) {
$this->assertTrue($this->elementExists($selectorToFind, self::CSS_SELECTOR));
}
$this->assertExpected($pageData['text-exists'], $this->byTagName('body')->getText());
}
}
private function goToPasswordChangeForm(array $pageData): void
{
$loginData = $this->getLoginCredentialsByType(siteUsers::loginAppSelfEmployed);
$this->url($pageData['url']);
$this->elementWait('user_login');
$this->assertEquals($pageData['header'], $this->byCssSelector('div#form > .relative > p.font-20')->getText());
// Input login data
$this->byId("user_login")->sendKeys($loginData['user']);
$this->byId("user_password")->sendKeys($loginData['password']);
$this->byCssSelector("form#frm_input div#agree_to_terms")->click();
$this->byCssSelector("form#frm_input button.btn.btn-block")->click();
$this->elementWait('frm_2fa_input');
$this->assertEquals($pageData['header-2fa'], $this->byCssSelector('div#form > .relative > p.font-20')->getText());
// Validate 2fa code from google
$oGoogle2FA = new cGoogle2FA();
$next2FACode = $oGoogle2FA->getGoogleAuthCode($loginData['2fa']);
foreach (str_split($next2FACode) as $i => $char) {
$this->byCssSelector("input.code2fa[tabindex='" . ++$i . "']")->clear()->sendKeys($char);
}
$this->elementWait('pwd_cnt');
$this->assertEquals(
$pageData['header-3pwd'],
$this->byCssSelector('div.container .relative > p.font-20')->getText()
);
}
private function changeUserPassword(array $pageData, bool $has2FASecurityEnabled = true): void
{
// Input data
$this->byId("new_password")->sendKeys('testmynewpassword12!@');
$this->byId("rnew_password")->sendKeys('testmynewpassword12!@');
$this->byCssSelector("form#pwd_cnt > button.btn.btn-block")->click();
// Increase response timeout before redirect - Wait for confirmation message
$this->webDriver->executeScript('JsBase.jsModule.iMessageTimeOut = 3000;');
$this->waitUntilDomReadyState();
$this->assertEquals(
$pageData['pwd-ok'],
$this->byCssSelector('div.container .relative > div.status_ok')->getText()
);
// Wait for company selection screen by default user has now multiple companies
$this->elementWait(
"//ul[@id='favorite']//li/a/i[contains(text(),'" . siteAccounts::ACCOUNT_SELF_EMPLOYED . "')]",
self::XPATH
);
$this->elementExists(
"//ul[@id='favorite']//li/a/i[contains(text(),'" . siteAccounts::ACCOUNT_SELF_EMPLOYED . "')]",
self::XPATH
);
$this->byXPath(
"//ul[@id='favorite']//li/a/i[contains(text(),'" . siteAccounts::ACCOUNT_SELF_EMPLOYED . "')]/.."
)->click();
// Validate dashboard welcome messages
if ($has2FASecurityEnabled) {
$this->elementWait("#drop_cnt > .doc > .form-data div.container.dashboard-cnt", self::CSS_SELECTOR);
$this->assertExpected($pageData['welcome-msg'], $this->byTagName('body')->getText());
}
// Accept cookies message
$this->awaitAndAcceptCookies();
}
}