346 lines
14 KiB
PHP
346 lines
14 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace ElixirAudit\Tests\DataSetup\Traits\App\Helpers;
|
||
|
||
use Facebook\WebDriver\WebDriverBy;
|
||
use ElixirAudit\Tests\DataSetup\Constants\siteLanguages;
|
||
|
||
trait formValidationTrait
|
||
{
|
||
public function getCompulsoryKey(): string
|
||
{
|
||
return 'compulsory';
|
||
}
|
||
|
||
public function getTypeKey(): string
|
||
{
|
||
return 'type';
|
||
}
|
||
|
||
public function getTypeText(): string
|
||
{
|
||
return 'text';
|
||
}
|
||
|
||
public function getTypeEmail(): string
|
||
{
|
||
return 'email';
|
||
}
|
||
|
||
public function getTypePhone(): string
|
||
{
|
||
return 'phone';
|
||
}
|
||
|
||
public function getTypeNumber(): string
|
||
{
|
||
return 'number';
|
||
}
|
||
|
||
public function getTypeDate(): string
|
||
{
|
||
return 'date';
|
||
}
|
||
|
||
public function getTypeSelect(): string
|
||
{
|
||
return 'select';
|
||
}
|
||
|
||
public function assertFieldErrorValidations(string $id, array $field, string $langCode): void
|
||
{
|
||
// Assert compulsory field error is shown after leaving the field empty.
|
||
if ($field[$this->getCompulsoryKey()]) {
|
||
if ($field[$this->getTypeKey()] == $this->getTypeSelect()) {
|
||
$this->setDropdownValueByIndexWithJquery($id, 0);
|
||
} else {
|
||
$this->sendKeysAndTriggerValidation($id, '');
|
||
}
|
||
|
||
$this->assertFieldHasCompulsoryError($id, $langCode);
|
||
}
|
||
|
||
switch ($field[$this->getTypeKey()]) {
|
||
case $this->getTypeDate():
|
||
// Assert invalid date error is shown after entering invalid date.
|
||
if ($field[$this->getCompulsoryKey()]) {
|
||
$this->sendKeysAndTriggerValidation($id, 'test');
|
||
$this->assertFieldHasCompulsoryError($id, $langCode);
|
||
}
|
||
|
||
$this->sendKeysAndTriggerValidation($id, '123');
|
||
$this->assertInvalidDateError($id, $langCode);
|
||
|
||
$this->sendKeysAndTriggerValidation($id, date($this->PUBDateFormat . ' ' . $this->PUBTime));
|
||
$this->assertInvalidDateError($id, $langCode);
|
||
break;
|
||
case $this->getTypeNumber():
|
||
$this->sendKeysAndTriggerValidation($id, 'asd');
|
||
$this->assertFieldHasNotValidNumberError($id, $langCode);
|
||
break;
|
||
case $this->getTypeEmail():
|
||
$this->sendKeysAndTriggerValidation($id, 'test');
|
||
$this->assertInvalidEmailError($id, $langCode);
|
||
break;
|
||
case $this->getTypePhone():
|
||
$this->sendKeysAndTriggerValidation($id, 'test');
|
||
$this->assertInvalidPhoneError($id, $langCode);
|
||
break;
|
||
case $this->getTypeText():
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function fillingInDefaultRequiredFieldValue(string $fieldType, string $id): void
|
||
{
|
||
if ($fieldType === $this->getTypeDate()) {
|
||
$this->sendKeysAndTriggerValidation($id, date($this->PUBDateFormat));
|
||
} elseif ($fieldType === $this->getTypeSelect()) {
|
||
$this->setDropdownValueByIndexWithJquery($id, 1);
|
||
} elseif ($fieldType === $this->getTypeNumber()) {
|
||
$this->sendKeysAndTriggerValidation($id, 0);
|
||
} elseif ($fieldType === $this->getTypePhone()) {
|
||
$this->sendKeysAndTriggerValidation($id, '+371123456789');
|
||
} elseif ($fieldType === $this->getTypeEmail()) {
|
||
$this->sendKeysAndTriggerValidation($id, 'test@zutenis.lv');
|
||
} else {
|
||
$this->sendKeysAndTriggerValidation($id, 'default value');
|
||
}
|
||
}
|
||
|
||
public function assertCompulsoryFields(array $compulsoryFields, string $langCode): void
|
||
{
|
||
// Assert the right amount of compulsory error is displayed in the sticky status bar
|
||
$allCompErrors = $this->elementsByCssSelector("#custom-sticky-status-cnt > div > div > div.cdrop > div");
|
||
$this->assertCount(count($compulsoryFields), $allCompErrors);
|
||
|
||
$compErrors = [];
|
||
foreach ($allCompErrors as $remoteWebElement) {
|
||
$compErrors[$remoteWebElement->getAttribute('data-id')]
|
||
= $remoteWebElement->findElement(WebDriverBy::cssSelector('span.emsg'))->getText();
|
||
}
|
||
|
||
foreach ($compulsoryFields as $id) {
|
||
$this->assertFieldHasCompulsoryError($id, $langCode);
|
||
$this->assertSame($compErrors[$id], $this->getFieldErrorMessage($id));
|
||
}
|
||
}
|
||
|
||
public function assertFieldsGeneralError(array $fields): void
|
||
{
|
||
// Assert the right amount of compulsory error is displayed in the sticky status bar
|
||
$allCompErrors = $this->elementsByCssSelector("#custom-sticky-status-cnt > div > div > div.cdrop > div");
|
||
$compErrors = [];
|
||
foreach ($allCompErrors as $remoteWebElement) {
|
||
$compErrors[$remoteWebElement->getAttribute('data-id')]
|
||
= $remoteWebElement->findElement(WebDriverBy::cssSelector('span.emsg'))->getText();
|
||
}
|
||
|
||
foreach ($fields as $field => $expected) {
|
||
$err = "On field: $field, expected: $expected, got: {$compErrors[$field]}";
|
||
$this->assertSame($compErrors[$field], $expected, $err);
|
||
}
|
||
}
|
||
|
||
public function assertFieldHasNotValidNumberError(string $id, string $lang = ''): void
|
||
{
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertFieldHasError($id, 'Norādīts nekorekts cipars!');
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
$this->assertFieldHasError($id, 'Указан неправильно цифра!');
|
||
break;
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertFieldHasError($id, 'Not a valid number specified!');
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function assertInvalidDateError(string $id, string $lang = ''): void
|
||
{
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertFieldHasError($id, 'Ievadīts nekorekts datums!');
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertFieldHasError($id, 'Invalid date specified!');
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function assertInvalidEmailError(string $id, string $lang = ''): void
|
||
{
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertFieldHasError($id, 'Ievadīta nekorekta e-pasta adrese!');
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
$this->assertFieldhasError($id, 'Не указан правильный адрес электронной почты!');
|
||
break;
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertFieldHasError($id, 'Not a valid email address specified!');
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function assertInvalidPhoneError(string $id, string $lang = ''): void
|
||
{
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertFieldHasError($id, 'Norādīts nepareizs tālrunis!');
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
$this->assertFieldhasError($id, 'Указан неверный телефон!');
|
||
break;
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertFieldHasError($id, 'Invalid telephone specified!');
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function assertPartnerDocNrInUse(string $id, string $lang = ''): void
|
||
{
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertFieldHasError($id, 'Partnera dokuments ar šo numuru jau ievadīts!');
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
$this->assertFieldhasError($id, 'Партнерский документ с этим номером уже введен!');
|
||
break;
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertFieldHasError($id, 'Partner has already document with this number entered!');
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function assertFieldHasCompulsoryError(string $id, $lang = ''): void
|
||
{
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertFieldHasError($id, 'Lūdzu aizpildiet lauku!');
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
$this->assertFieldHasError($id, 'Пожалуйста, заполните поле!');
|
||
break;
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertFieldHasError($id, 'Please fill in the field!');
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function assertErrorWhileSavingForm($lang = null): void
|
||
{
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertFormErrorMessage(
|
||
'Saglabājot Dokumentu, Tika Atrastas Dažas Kļūdas',
|
||
'Lai turpinātu, izlabojiet norādītās kļūdas. Uz katras kļūdas variet noklikšķināt, tādējādi ātri nokļūstot uz izvēlēto kļūdaino lauku formā!'
|
||
);
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
$this->assertFormErrorMessage(
|
||
'При Сохранении Документа Обнаружены Ошибки',
|
||
'Пожалуйста, исправьте эти ошибки, прежде чем продолжить. Вы можете щелкнуть каждое поле, чтобы быстро перейти к полю ошибки!'
|
||
);
|
||
break;
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertFormErrorMessage(
|
||
'Some Errors Were Found While Saving Document',
|
||
'Please correct these mistakes before continuing, you may click on each if the field to quickly get to error field!'
|
||
);
|
||
break;
|
||
}
|
||
}
|
||
|
||
public function getFieldValidateContainerXpath(string $selector, string $selectorType = self::ID): string
|
||
{
|
||
$element = $this->getRemoteWebElement($selector, $selectorType);
|
||
$id = $element->getAttribute('id');
|
||
return "//div[contains(@class, 'validate') and .//@id='$id']";
|
||
}
|
||
|
||
public function getFieldValidateErrorContainerXpath(string $id): string
|
||
{
|
||
return "//div[contains(@class, 'validate') and contains(@class, 'v-error') and .//@id='$id']";
|
||
}
|
||
|
||
public function getFieldErrorMessage(string $id): string
|
||
{
|
||
return $this->byXPath($this->getFieldValidateErrorContainerXpath($id) . "//div[contains(@class, 'errMsg')]")->getText();
|
||
}
|
||
|
||
public function moveOnFieldValidateContainer(string $id): void
|
||
{
|
||
$containerXPath = $this->getFieldValidateErrorContainerXpath($id);
|
||
$this->elementWait($containerXPath, self::XPATH);
|
||
$this->webDriver->action()->moveToElement($this->byXPath($containerXPath))->perform();
|
||
}
|
||
|
||
public function assertFieldHasError(string $id, string $expectedMessage): void
|
||
{
|
||
$errorXPath = $this->getFieldValidateErrorContainerXpath($id) . "//div[contains(@class, 'errMsg')]";
|
||
$actualMessage = '';
|
||
try {
|
||
$this->moveOnFieldValidateContainer($id);
|
||
|
||
// Wait for the error message element to be present and visible
|
||
$this->elementWait($errorXPath, self::XPATH, true, true, true, false);
|
||
|
||
$actualMessage = $this->byXPath($errorXPath)->getText();
|
||
$this->assertSame($expectedMessage, $actualMessage); // TODO: Varbūt vajag gaidīt kamēr parādas teksts.
|
||
} catch (\Exception $exception) {
|
||
$msg = "Failed on error XPath: $errorXPath" . PHP_EOL . "With the message: {$exception->getMessage()}";
|
||
$msg .= PHP_EOL . "Expected message '$expectedMessage', got '$actualMessage'";
|
||
$this->fail($msg);
|
||
}
|
||
}
|
||
|
||
public function assertFieldIsOk(string $id): void
|
||
{
|
||
// Use XPath to find the .validate container with v-ok class for the specific field
|
||
$containerXPath = "//div[contains(@class, 'validate') and contains(@class, 'v-ok') and .//@id='$id']";
|
||
$this->assertTrue($this->elementExists($containerXPath, self::XPATH, true), "Xpath '$containerXPath'");
|
||
}
|
||
|
||
public function assertFormErrorMessage(string $messageTitle, string $messageDescription): void
|
||
{
|
||
$validatorCustomerMsg = '#custom-sticky-status-cnt > div > div.validator-custom-msg';
|
||
$selector = $validatorCustomerMsg . '.err-show > h3';
|
||
$descSelector = $validatorCustomerMsg . '.err-show > div.desc > p';
|
||
|
||
$this->scrollElementIntoView($selector, self::CSS_SELECTOR);
|
||
$this->assertElementTextContainsByCss($selector, $messageTitle);
|
||
$this->assertElementTextContainsByCss($descSelector, $messageDescription);
|
||
}
|
||
|
||
public function assertFormSuccessfullySavedMessage(string $lang = ''): void
|
||
{
|
||
$selector = '#custom-sticky-status-cnt > div > div > h3';
|
||
$this->scrollElementIntoView($selector, self::CSS_SELECTOR);
|
||
switch ($lang) {
|
||
case siteLanguages::LANG_LV:
|
||
$this->assertElementTextContainsByCss($selector, "Dati Veiksmīgi Saglabāti!");
|
||
break;
|
||
case siteLanguages::LANG_RU:
|
||
$this->assertElementTextContainsByCss($selector, "Данные Были Успешно Сохранены!");
|
||
break;
|
||
case siteLanguages::LANG_EN:
|
||
default:
|
||
$this->assertElementTextContainsByCss($selector, "Data Has Been Successfully Saved!");
|
||
break;
|
||
}
|
||
}
|
||
}
|