Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/bundle/Resources/config/services/test/pages.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,6 @@ services:
Ibexa\AdminUi\Behat\Page\UserSettingsPage: ~

Ibexa\AdminUi\Behat\Page\UserProfilePage: ~

Ibexa\AdminUi\Behat\Page\NotificationsViewAllPage: ~

120 changes: 119 additions & 1 deletion src/lib/Behat/BrowserContext/UserNotificationContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Behat\Gherkin\Node\TableNode;
use Ibexa\AdminUi\Behat\Component\UpperMenu;
use Ibexa\AdminUi\Behat\Component\UserNotificationPopup;
use Ibexa\AdminUi\Behat\Page\NotificationsViewAllPage;
use PHPUnit\Framework\Assert;

class UserNotificationContext implements Context
Expand All @@ -22,10 +23,13 @@ class UserNotificationContext implements Context
/** @var \Ibexa\AdminUi\Behat\Component\UserNotificationPopup */
private $userNotificationPopup;

public function __construct(UpperMenu $upperMenu, UserNotificationPopup $userNotificationPopup)
private NotificationsViewAllPage $notificationsViewAllPage;

public function __construct(UpperMenu $upperMenu, UserNotificationPopup $userNotificationPopup, NotificationsViewAllPage $notificationsViewAllPage)
{
$this->upperMenu = $upperMenu;
$this->userNotificationPopup = $userNotificationPopup;
$this->notificationsViewAllPage = $notificationsViewAllPage;
}

/**
Expand All @@ -47,4 +51,118 @@ public function iGoToUserNotificationWithDetails(TableNode $notificationDetails)
$this->userNotificationPopup->verifyIsLoaded();
$this->userNotificationPopup->clickNotification($type, $description);
}

/**
* @Then the notification appears with details:
*/
public function thereIsNotificationAppearsWithDetails(TableNode $notificationDetails): void
{
$type = $notificationDetails->getHash()[0]['Type'];
$author = $notificationDetails->getHash()[0]['Author'];
$description = $notificationDetails->getHash()[0]['Description'];
$date = $notificationDetails->getHash()[0]['Date'];

$this->userNotificationPopup->verifyIsLoaded();
$this->userNotificationPopup->verifyNotification($type, $author, $description, $date, true);
}

/**
* @When I open notification menu with description :description
*/
public function iOpenNotificationMenu(string $description): void
{
$this->userNotificationPopup->verifyIsLoaded();
$this->userNotificationPopup->openNotificationMenu($description);
}

/**
* @When I click :action action
*/
public function iClickActionButton(string $action): void
{
$this->userNotificationPopup->clickActionButton($action);
}

/**
* @Then the notification action should be :expectedAction
*/
public function verifyNotificationAction(string $expectedAction): void
{
$this->userNotificationPopup->getActionButton($expectedAction);
}

/**
* @When I click mark all as read button
*/
public function iClickButton(): void
{
$this->userNotificationPopup->verifyIsLoaded();
$this->userNotificationPopup->clickOnMarkAllAsReadButton();
}

/**
* @When I click view all notifications button
*/
public function iClickViewAllNotificationsButton(): void
{
$this->userNotificationPopup->verifyIsLoaded();
$this->userNotificationPopup->clickViewAllNotificationsButton();
}

/**
* @Then there is :notificationTitle notification on list
*/
public function thereIsNotificationOnList(string $notificationTitle): void
{
$this->notificationsViewAllPage->verifyIsLoaded();
$this->notificationsViewAllPage->verifyNotificationIsOnList($notificationTitle);
}

/**
* @When I mark notification as unread with title :notificationTitle
*/
public function iMarkNotificationAsUnread(string $notificationTitle): void
{
$this->notificationsViewAllPage->markAsUnread($notificationTitle);
}

/**
* @Then the notification with title :notificationTitle has status :notificationStatus
*/
public function verifyNotificationStatus(string $notificationTitle, string $notificationStatus): void
{
Assert::assertEquals($notificationStatus, $this->notificationsViewAllPage->getStatusForNotification($notificationTitle));
}

/**
* @When I go to content of notification with title :notificationTitle
*/
public function iGoToContent(string $notificationTitle): void
{
$this->notificationsViewAllPage->goToContent($notificationTitle);
}

/**
* @When I delete notification with title :notificationTitle
*/
public function iDeleteNotification(string $notificationTitle): void
{
$this->notificationsViewAllPage->deleteNotification($notificationTitle);
}

/**
* @Then I should see the text :text in the notifications popup
*/
public function iShouldSeeTextInNotificationsPopup(string $expectedMessage): void
{
$this->userNotificationPopup->verifyNoNotificationsMessage($expectedMessage);
}

/**
* @Then I should see the text :text in the All Notifications view
*/
public function iShouldSeeTextInAllNotificationsView(string $expectedMessage): void
{
$this->notificationsViewAllPage->verifyNoNotificationsMessage($expectedMessage);
}
}
151 changes: 151 additions & 0 deletions src/lib/Behat/Component/UserNotificationPopup.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@

use Exception;
use Ibexa\Behat\Browser\Component\Component;
use Ibexa\Behat\Browser\Element\Condition\ElementExistsCondition;
use Ibexa\Behat\Browser\Element\Condition\ElementNotExistsCondition;
use Ibexa\Behat\Browser\Element\Criterion\ChildElementTextCriterion;
use Ibexa\Behat\Browser\Element\Criterion\ElementTextCriterion;
use Ibexa\Behat\Browser\Element\ElementInterface;
use Ibexa\Behat\Browser\Locator\VisibleCSSLocator;

class UserNotificationPopup extends Component
Expand Down Expand Up @@ -41,6 +46,145 @@ public function clickNotification(string $expectedType, string $expectedDescript
throw new Exception(sprintf('Notification of type: %s with description: %d not found', $expectedType, $expectedDescription));
}

public function verifyNotification(string $expectedType, string $expectedAuthor, string $expectedDescription, ?string $expectedDate = null, bool $shouldExist = true): void
{
$notifications = $this->getHTMLPage()->setTimeout(5)->findAll($this->getLocator('notificationItem'));

foreach ($notifications as $notification) {
$criteria = [
new ChildElementTextCriterion($this->getLocator('notificationType'), $expectedType),
new ChildElementTextCriterion($this->getLocator('notificationDescriptionTitle'), $expectedAuthor),
new ChildElementTextCriterion($this->getLocator('notificationDescriptionText'), $expectedDescription),
];

if ($expectedDate !== null && $expectedDate !== 'XXXX-XX-XX') {
$criteria[] = new ChildElementTextCriterion($this->getLocator('notificationDate'), $expectedDate);
}

foreach ($criteria as $criterion) {
if (!$criterion->matches($notification)) {
continue 2; // go to next notification
}
}

if ($shouldExist) {
return; // matching notification found
} else {
throw new \Exception(sprintf(
'Notification of type "%s" with author "%s" and description "%s" should not exist, but was found.',
$expectedType,
$expectedAuthor,
$expectedDescription
));
}
}

if ($shouldExist) {
throw new \Exception(sprintf(
'Notification of type "%s" with author "%s" and description "%s" was not found.',
$expectedType,
$expectedAuthor,
$expectedDescription
));
}
}

public function openNotificationMenu(string $expectedDescription): void
{
$this->getHTMLPage()
->setTimeout(10)
->waitUntilCondition(
new ElementExistsCondition(
$this->getHTMLPage(),
$this->getLocator('notificationDescriptionText')
)
);

$notifications = $this->getHTMLPage()->setTimeout(5)->findAll($this->getLocator('notificationItem'))
->filterBy(new ChildElementTextCriterion($this->getLocator('notificationDescriptionText'), $expectedDescription));

$menuButton = $notifications->first()->find($this->getLocator('notificationMenuButton'));
$menuButton->click();

$this->getHTMLPage()
->setTimeout(10)
->waitUntilCondition(
new ElementExistsCondition(
$this->getHTMLPage(),
$this->getLocator('notificationActionsPopup'),
)
);
}

public function clickActionButton(string $buttonText): void
{
$this->getHTMLPage()
->setTimeout(10)
->waitUntilCondition(
new ElementExistsCondition(
$this->getHTMLPage(),
$this->getLocator('notificationActionsPopup')
)
);

$buttons = $this->getHTMLPage()
->setTimeout(10)
->findAll($this->getLocator('notificationMenuItemContent'))
->filterBy(new ElementTextCriterion($buttonText))
->first();

$buttons->click();

$this->getHTMLPage()
->setTimeout(10)
->waitUntilCondition(
new ElementNotExistsCondition(
$this->getHTMLPage(),
$this->getLocator('notificationActionsPopup')
)
);
}

public function getActionButton(string $buttonText): ?ElementInterface
{
$this->getHTMLPage()
->setTimeout(10)
->waitUntilCondition(
new ElementExistsCondition(
$this->getHTMLPage(),
$this->getLocator('notificationMenuItemContent')
)
);

return $this->getHTMLPage()
->setTimeout(10)
->findAll($this->getLocator('notificationMenuItemContent'))
->filterBy(new ElementTextCriterion($buttonText))
->first();
}

public function verifyNoNotificationsMessage(string $expectedMessage): void
{
$this->getHTMLPage()->setTimeout(20)->waitUntilCondition(
new ElementExistsCondition(
$this->getHTMLPage(),
$this->getLocator('notificationsEmptyText')
)
);

$this->getHTMLPage()->find($this->getLocator('notificationsEmptyText'))->assert()->textEquals($expectedMessage);
}

public function clickOnMarkAllAsReadButton(): void
{
$this->getHTMLPage()->setTimeout(5)->find($this->getLocator('markAllAsReadButton'))->click();
}

public function clickViewAllNotificationsButton(): void
{
$this->getHTMLPage()->setTimeout(3)->find($this->getLocator('viewAllNotificationsButton'))->click();
}

public function verifyIsLoaded(): void
{
$this->getHTMLPage()
Expand All @@ -57,6 +201,13 @@ protected function specifyLocators(): array
new VisibleCSSLocator('notificationType', '.ibexa-notifications-modal__type-content .type__text'),
new VisibleCSSLocator('notificationDescriptionTitle', '.ibexa-notifications-modal__description .description__title'),
new VisibleCSSLocator('notificationDescriptionText', '.ibexa-notifications-modal__type-content .description__text'),
new VisibleCSSLocator('notificationDate', '.ibexa-notifications-modal__item--date'),
new VisibleCSSLocator('notificationMenuButton', '.ibexa-notifications-modal__actions'),
new VisibleCSSLocator('notificationMenuItemContent', '.ibexa-popup-menu__item-content.ibexa-multilevel-popup-menu__item-content'),
new VisibleCSSLocator('markAllAsReadButton', '.ibexa-notifications-modal__mark-all-read-btn'),
new VisibleCSSLocator('viewAllNotificationsButton', '.ibexa-notifications-modal__view-all-btn'),
new VisibleCSSLocator('notificationActionsPopup', '.ibexa-notification-actions-popup-menu:not(.ibexa-popup-menu--hidden)'),
new VisibleCSSLocator('notificationsEmptyText', '.ibexa-notifications-modal__empty-text'),
];
}
}
Loading
Loading