ElixirVault/tests/SeleniumTests/App/PubUsers/pubUserTwoFactorAuthActionT...

164 lines
6.6 KiB
PHP

<?php
declare(strict_types=1);
namespace ElixirAudit\Tests\SeleniumTests\App\PubUsers;
use BRSystems\Core\Library\cGoogle2FA\cGoogle2FA;
use Facebook\WebDriver\WebDriverBy;
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\Helpers\commonTrait;
use ElixirAudit\Tests\DataSetup\Traits\App\pubUsersTrait;
class pubUserTwoFactorAuthActionTest extends BasePhpUnitSeleniumCase
{
use commonTrait;
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',
'exists' => [
'input.code2fa[tabindex=\'1\']', 'input.code2fa[tabindex=\'2\']', 'input.code2fa[tabindex=\'3\']',
'input.code2fa[tabindex=\'4\']', 'input.code2fa[tabindex=\'5\']', 'input.code2fa[tabindex=\'6\']',
'button#submit'
],
'text-exists' => [
'Divu faktoru autentifikācija',
'Ievadi Google Authenticator lietotnes piešķirto', 'Divu faktoru autentifikācijas kodu',
'Ienākt', 'Atpakaļ uz autentifikāciju', 'Ja esat zaudējis piekļuvi sava autentifikācijas ierīcei,'
],
'inv-code' => '2 faktoru autentifikācijas koda kļūda!',
'fill-field' => 'Lūdzu aizpildiet lauku!',
'welcome-msg' => ['Laipni lūdzam,', 'Grāmatvedības sistēma', 'Sākums']
]
];
public function testLogin2fa(): void
{
$loginData = $this->getLoginCredentialsByType(siteUsers::loginAppSelfEmployed);
foreach (self::url as $lang => $pageData) {
// Login - redirect to 2FA
$this->url($pageData['url']);
$this->switchToLanguage($lang);
$this->elementWait('user_login');
// 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);
}
// 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();
$this->waitUntilDomReadyState();
// Accept cookies message
$this->awaitAndAcceptCookies();
$this->switchToLanguage($lang);
// Validate dashboard welcome messages
$this->elementWait("#drop_cnt > .doc > .form-data div.container.dashboard-cnt", self::CSS_SELECTOR);
$this->assertExpected($pageData['welcome-msg'], $this->byTagName('body')->getText());
// Log Out
$this->logout();
$this->assertEquals($pageData['header'], $this->byCssSelector('div#form > .relative > p.font-20')->getText());
}
}
public function testLogin2faForm(): void
{
$loginData = $this->getLoginCredentialsByType(siteUsers::loginAppSelfEmployed);
foreach (self::url as $lang => $pageData) {
// Login - redirect to 2FA
$this->url($pageData['url']);
// Login user till Two-factor authentication
pubUserLoginTest::logInUserByCredentials($this, pubUserLoginTest::url[$lang], $loginData);
// Test if 2FA page loaded correctly
foreach ($pageData['exists'] as $selectorToFind) {
$this->assertTrue($this->elementExists($selectorToFind, self::CSS_SELECTOR),
"Could not find element by selector -> {$selectorToFind}");
}
// Check for form texts in page
$this->assertExpected($pageData['text-exists'], $this->byTagName('body')->getText());
// Check validation
$i = 0;
$inputs = $this->webDriver->findElements(WebDriverBy::cssSelector('#frm_2fa_input input.code2fa'));
foreach ($inputs as $element) {
$i++;
$this->webDriver->action()->moveToElement($this->byCssSelector("input.code2fa[tabindex='" . $i . "']"))->perform();
$this->webDriver->executeScript('$("input.code2fa:focus").blur();');
$this->webDriver->executeScript('$("input.code2fa[tabindex=\'' . $i . '\']").focus().blur().focus();');
$this->byCssSelector("input.code2fa[tabindex='" . $i . "']")->click();
$this->elementWait("input.code2fa[tabindex='" . $i . "'] + div.errMsg", self::CSS_SELECTOR);
$this->assertEquals($pageData['fill-field'], $this->byCssSelector(
"input.code2fa[tabindex='" . $i . "'] + div.errMsg")->getText(),
"2FA code for 2FA not found by input index {$i}"
);
}
// Send random code
foreach ($inputs as $element) {
$element->sendKeys('1');
}
$this->elementWait('div.status_error', self::CSS_SELECTOR);
$this->assertEquals($pageData['inv-code'], $this->byCssSelector('div.status_error')->getText());
// Check for logout - log out
$this->byCssSelector("#frm_2fa_input > a.link")->click();
$this->elementWait('user_login');
$this->assertEquals($pageData['header'], $this->byCssSelector('div#form > .relative > p.font-20')->getText());
}
}
}