ElixirVault/tests/DataSetup/Traits/App/Helpers/formValidationTrait.php

346 lines
14 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}
}