diff --git a/tests/src/FunctionalJavascript/GeneralLmsTest.php b/tests/src/FunctionalJavascript/GeneralLmsTest.php index 11521897e1cf8c1d490db79954a5244508df893b..0179d5d2ac29261455e88d3f97b7f63e266d3de9 100644 --- a/tests/src/FunctionalJavascript/GeneralLmsTest.php +++ b/tests/src/FunctionalJavascript/GeneralLmsTest.php @@ -138,10 +138,10 @@ final class GeneralLmsTest extends WebDriverTestBase { foreach ($definitions as $definition) { $page->clickLink('Add activity type'); $this->setFormElementValue('input', 'name', $definition['name']); - $page->pressButton('Edit'); + $this->pressButton('Edit'); $this->setFormElementValue('input', 'id', $definition['id']); $this->setFormElementValue('select', 'pluginId', $definition['id']); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); } foreach ($definitions as $definition) { $assert_session->pageTextContains($definition['name']); @@ -157,7 +157,7 @@ final class GeneralLmsTest extends WebDriverTestBase { foreach ($item['values'] as $field => $value) { $this->setEntityFormField($field, $value); } - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); } $this->drupalGet(Url::fromRoute('entity.lms_activity.collection')); @@ -189,7 +189,7 @@ final class GeneralLmsTest extends WebDriverTestBase { foreach ($item['values'] as $field => $value) { $this->setEntityFormField($field, $value); } - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); } $this->drupalGet(Url::fromRoute('entity.lms_activity.collection')); @@ -222,7 +222,7 @@ final class GeneralLmsTest extends WebDriverTestBase { $this->setEntityFormField($field, $value); } $this->setLmsReferenceField('activities', $item['activities']); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); } $this->drupalGet(Url::fromRoute('entity.lms_lesson.collection')); @@ -241,7 +241,7 @@ final class GeneralLmsTest extends WebDriverTestBase { $this->setEntityFormField($field, $value); } $this->setLmsReferenceField('lessons', $item['lessons']); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); } $this->drupalGet(Url::fromRoute('entity.group.collection')); @@ -260,7 +260,6 @@ final class GeneralLmsTest extends WebDriverTestBase { * Test entity constraints. */ private function testLmsEntityConstraints(): void { - $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); $this->drupalLogin($this->users['teacher']); @@ -270,7 +269,7 @@ final class GeneralLmsTest extends WebDriverTestBase { 'lms_lesson' => $tested_lesson_id, ])); $this->setEntityFormField('status', FALSE); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); $course_labels = []; foreach ($this->courseData as $course_item) { foreach ($course_item['lessons'] as $lesson_item) { @@ -295,7 +294,7 @@ final class GeneralLmsTest extends WebDriverTestBase { ])); $this->setEntityFormField('name', $unpublished_activity_name); $this->setEntityFormField('status', FALSE); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); $activity = $this->getEntityByProperties('lms_activity', ['name' => $unpublished_activity_name]); $key = \count($this->activityData) + 1; $this->activityData[$key] = [ @@ -306,7 +305,7 @@ final class GeneralLmsTest extends WebDriverTestBase { 'lms_lesson' => $tested_lesson_id, ])); $this->setLmsReferenceField('activities', [['target_uuid' => $activity->uuid()]]); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); $assert_session->pageTextContains(\sprintf('The "%s" activity cannot be referenced. Either publish it first or unpublish the parent (this) lesson.', $unpublished_activity_name)); // Cleanup changes. @@ -329,7 +328,7 @@ final class GeneralLmsTest extends WebDriverTestBase { 'group' => $course_id, ])); $page->clickLink('Enroll'); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); $page->clickLink('Start'); foreach ($this->courseData[1]['lessons'] as $lesson_delta => $course_lesson_item) { @@ -478,7 +477,7 @@ final class GeneralLmsTest extends WebDriverTestBase { 'group' => $course_id, ])); $page->clickLink('Enroll'); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); $page->clickLink('Start'); // Try to go to an arbitrary activity. @@ -517,9 +516,9 @@ final class GeneralLmsTest extends WebDriverTestBase { // test method - go back if allowed and resubmit. $back_button = $page->findButton('edit-back'); if ($back_button !== NULL) { - $back_button->press(); + $this->pressButton('edit-back'); $back_nav_count++; - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); } $this->answerActivity($activity_item, (int) $lesson_activity_item['max_score'], $this->users['student']->id(), $course_id); @@ -541,7 +540,7 @@ final class GeneralLmsTest extends WebDriverTestBase { // Travel all the way back to the first activity. for ($i = $activity_count; $i > 1; $i--) { - $page->pressButton('edit-back'); + $this->pressButton('edit-back'); } $assert_session->pageTextContains($first_title); @@ -566,7 +565,7 @@ final class GeneralLmsTest extends WebDriverTestBase { 'group' => $course_id, ])); $page->clickLink('Enroll'); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); $start_time = \time(); $page->clickLink('Start'); @@ -628,7 +627,7 @@ final class GeneralLmsTest extends WebDriverTestBase { \assert($assert_session instanceof JSWebAssert); // Add an existing lesson. - $page->pressButton('Reference lessons'); + $this->pressButton('Reference lessons'); $modal_selector = '[role="dialog"].modal-view-lessons-selection'; $modal = $assert_session->waitForElementVisible('css', $modal_selector); $lesson = $this->getEntityByProperties('lms_lesson', [ @@ -645,7 +644,7 @@ final class GeneralLmsTest extends WebDriverTestBase { $assert_session->waitForElementRemoved('css', $modal_selector); // Create a new lesson. - $page->pressButton('Create lesson'); + $this->pressButton('Create lesson'); $lesson_modal_selector = '[role="dialog"].modal-entity-lms-lesson'; $lesson_modal = $assert_session->waitForElementVisible('css', $lesson_modal_selector); // Create 2 activities in a nested modal. @@ -695,7 +694,7 @@ final class GeneralLmsTest extends WebDriverTestBase { $assert_session->waitForElementRemoved('css', $parameters_modal_selector); // Save course, verify data. - $page->find('css', '[data-drupal-selector="group-lms-course-add-form"] #edit-submit')->click(); + $this->pressButton('[data-drupal-selector="group-lms-course-add-form"] #edit-submit', 'css'); $assert_session->pageTextContains(\sprintf('Course %s has been created', $course_name)); $course = $this->getEntityByProperties('group', [ 'label' => $course_name, @@ -785,7 +784,7 @@ final class GeneralLmsTest extends WebDriverTestBase { $activity_remove_selector = '[name="remove-lms_activity-' . $activity->id() . '"]'; $page->find('css', $activity_remove_selector)->click(); $assert_session->waitForElementRemoved('css', $activity_remove_selector); - $page->find('css', '[data-drupal-selector="edit-submit"]')->click(); + $this->pressButton('[data-drupal-selector="edit-submit"]', 'css'); $assert_session->pageTextContains(\sprintf('Lesson %s has been updated', $lesson_names[$last_lesson_key])); $this->drupalGet(Url::fromRoute('entity.lms_lesson.edit_form', [ 'lms_lesson' => $lesson_id, @@ -846,7 +845,7 @@ final class GeneralLmsTest extends WebDriverTestBase { 'group' => $course_id, ])); $page->clickLink('Enroll'); - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); $page->clickLink('Start'); $this->drupalGet(Url::fromRoute('entity.group.edit_form', [ 'group' => $course_id, diff --git a/tests/src/LmsTestHelperTrait.php b/tests/src/LmsTestHelperTrait.php index af42bea24b56f17aa6045c99a34a9861153ab0e7..91bc4f5ae9663527a3ff8c6b73c2efbe97c75859 100644 --- a/tests/src/LmsTestHelperTrait.php +++ b/tests/src/LmsTestHelperTrait.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Drupal\Tests\lms; +use Behat\Mink\Element\DocumentElement; use Behat\Mink\Element\NodeElement; use Drupal\Component\Render\FormattableMarkup; use Drupal\Component\Serialization\Yaml; @@ -80,7 +81,7 @@ trait LmsTestHelperTrait { \assert($assert_session instanceof JSWebAssert); foreach ($values as $item) { - $this->getSession()->getPage()->pressButton(\sprintf('Reference %s', $field_name)); + $this->pressButton(\sprintf('Reference %s', $field_name)); $modal = $assert_session->waitForElementVisible('css', $modal_view_selector); $entity = $this->getEntityByProperties($entity_type, [ 'name' => $this->getItemByUuid($item['target_uuid'], $bag, 'name'), @@ -216,9 +217,10 @@ trait LmsTestHelperTrait { } $current++; if ($current < $count) { - $this->getSession()->getPage()->pressButton('Add another item'); + $this->pressButton('Add another item'); $assert_session = $this->assertSession(); \assert($assert_session instanceof JSWebAssert); + $assert_session->assertExpectedAjaxRequest($current); $assert_session->waitForElementVisible('css', '[name="' . $field . '_' . $current . '_remove_button"]'); } } @@ -284,7 +286,6 @@ trait LmsTestHelperTrait { * Answer an activity. */ private function answerActivity(array $activity_item, int $max_score, string $student_id, string $course_id): void { - $page = $this->getSession()->getPage(); $uuid = $activity_item['uuid']; // Long answer. @@ -390,7 +391,7 @@ trait LmsTestHelperTrait { ]; } - $page->pressButton('edit-submit'); + $this->pressButton('edit-submit'); } /** @@ -492,7 +493,7 @@ trait LmsTestHelperTrait { $answer_data['score'] = (string) \mt_rand(0, $max_score); $page->fillField('score', $answer_data['score']); $page->fillField('comment[comment_body][0][value]', \sprintf('Teacher comment to %s', $activity_item['uuid'])); - $page->pressButton('Evaluate'); + $this->pressButton('Evaluate'); } /** @@ -665,4 +666,22 @@ trait LmsTestHelperTrait { self::assertEmpty($messages, \implode(\PHP_EOL, $messages)); } + /** + * Checking. + */ + private function pressButton(string $selector, string $type = 'default'): void { + $page = $this->getSession()->getPage(); + $page->pressButton($selector, $type); + $assert_session = $this->assertSession(); + // Wait for a very short time to allow page state to update after clicking. + usleep(5000); + $this->waitForHelper(10000, fn () => + $this->getSession()->evaluateScript('document.readyState === "complete"') + ); + } + + private function waitForHelper($timeout, $callback) { + return $this->getSession()->getPage()->waitFor($timeout / 1000, $callback); + } + }