From afa533d37a6348955753a55b04eddf5d5c3f981b Mon Sep 17 00:00:00 2001 From: Andreas Hennings Date: Tue, 29 Oct 2024 02:30:10 +0100 Subject: [PATCH 1/6] Issue #28: Create media type in the local demo. --- ...ty_form_display.media.document.default.yml | 52 +++++++++++++++++++ ...ty_view_display.media.document.default.yml | 25 +++++++++ ....field.media.document.field_media_file.yml | 26 ++++++++++ .../field.storage.media.field_media_file.yml | 22 ++++++++ demo-config/media.type.document.yml | 13 +++++ 5 files changed, 138 insertions(+) create mode 100644 demo-config/core.entity_form_display.media.document.default.yml create mode 100644 demo-config/core.entity_view_display.media.document.default.yml create mode 100644 demo-config/field.field.media.document.field_media_file.yml create mode 100644 demo-config/field.storage.media.field_media_file.yml create mode 100644 demo-config/media.type.document.yml diff --git a/demo-config/core.entity_form_display.media.document.default.yml b/demo-config/core.entity_form_display.media.document.default.yml new file mode 100644 index 00000000..9b6598c2 --- /dev/null +++ b/demo-config/core.entity_form_display.media.document.default.yml @@ -0,0 +1,52 @@ +langcode: en +status: true +dependencies: + config: + - field.field.media.document.field_media_file + - media.type.document + module: + - file +id: media.document.default +targetEntityType: media +bundle: document +mode: default +content: + created: + type: datetime_timestamp + weight: 10 + region: content + settings: { } + third_party_settings: { } + field_media_file: + type: file_generic + weight: 0 + region: content + settings: + progress_indicator: throbber + third_party_settings: { } + name: + type: string_textfield + weight: -5 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + status: + type: boolean_checkbox + weight: 100 + region: content + settings: + display_label: true + third_party_settings: { } + uid: + type: entity_reference_autocomplete + weight: 5 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } +hidden: { } diff --git a/demo-config/core.entity_view_display.media.document.default.yml b/demo-config/core.entity_view_display.media.document.default.yml new file mode 100644 index 00000000..a5c4a52e --- /dev/null +++ b/demo-config/core.entity_view_display.media.document.default.yml @@ -0,0 +1,25 @@ +langcode: en +status: true +dependencies: + config: + - field.field.media.document.field_media_file + - media.type.document + module: + - collabora_online +id: media.document.default +targetEntityType: media +bundle: document +mode: default +content: + field_media_file: + type: collabora_preview + label: hidden + settings: { } + third_party_settings: { } + weight: 0 + region: content +hidden: + created: true + name: true + thumbnail: true + uid: true diff --git a/demo-config/field.field.media.document.field_media_file.yml b/demo-config/field.field.media.document.field_media_file.yml new file mode 100644 index 00000000..a2870695 --- /dev/null +++ b/demo-config/field.field.media.document.field_media_file.yml @@ -0,0 +1,26 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.media.field_media_file + - media.type.document + module: + - file +id: media.document.field_media_file +field_name: field_media_file +entity_type: media +bundle: document +label: File +description: '' +required: true +translatable: true +default_value: { } +default_value_callback: '' +settings: + handler: 'default:file' + handler_settings: { } + file_directory: '[date:custom:Y]-[date:custom:m]' + file_extensions: 'txt doc docx pdf' + max_filesize: '' + description_field: false +field_type: file diff --git a/demo-config/field.storage.media.field_media_file.yml b/demo-config/field.storage.media.field_media_file.yml new file mode 100644 index 00000000..e1d2fbec --- /dev/null +++ b/demo-config/field.storage.media.field_media_file.yml @@ -0,0 +1,22 @@ +langcode: en +status: true +dependencies: + module: + - file + - media +id: media.field_media_file +field_name: field_media_file +entity_type: media +type: file +settings: + target_type: file + display_field: false + display_default: false + uri_scheme: public +module: file +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/demo-config/media.type.document.yml b/demo-config/media.type.document.yml new file mode 100644 index 00000000..f897d383 --- /dev/null +++ b/demo-config/media.type.document.yml @@ -0,0 +1,13 @@ +langcode: en +status: true +dependencies: { } +id: document +label: Document +description: '' +source: file +queue_thumbnail_downloads: false +new_revision: false +source_configuration: + source_field: field_media_file +field_map: + name: name From 9e4a1e31cd3f9358f086a675b7e0e10d082b7f63 Mon Sep 17 00:00:00 2001 From: Andreas Hennings Date: Tue, 29 Oct 2024 14:57:24 +0100 Subject: [PATCH 2/6] Issue #28: Move media type configuration into a test module. --- ...ty_form_display.media.document.default.yml | 52 ------------------- ...ty_view_display.media.document.default.yml | 25 --------- ....field.media.document.field_media_file.yml | 26 ---------- .../field.storage.media.field_media_file.yml | 22 -------- demo-config/media.type.document.yml | 13 ----- 5 files changed, 138 deletions(-) delete mode 100644 demo-config/core.entity_form_display.media.document.default.yml delete mode 100644 demo-config/core.entity_view_display.media.document.default.yml delete mode 100644 demo-config/field.field.media.document.field_media_file.yml delete mode 100644 demo-config/field.storage.media.field_media_file.yml delete mode 100644 demo-config/media.type.document.yml diff --git a/demo-config/core.entity_form_display.media.document.default.yml b/demo-config/core.entity_form_display.media.document.default.yml deleted file mode 100644 index 9b6598c2..00000000 --- a/demo-config/core.entity_form_display.media.document.default.yml +++ /dev/null @@ -1,52 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.field.media.document.field_media_file - - media.type.document - module: - - file -id: media.document.default -targetEntityType: media -bundle: document -mode: default -content: - created: - type: datetime_timestamp - weight: 10 - region: content - settings: { } - third_party_settings: { } - field_media_file: - type: file_generic - weight: 0 - region: content - settings: - progress_indicator: throbber - third_party_settings: { } - name: - type: string_textfield - weight: -5 - region: content - settings: - size: 60 - placeholder: '' - third_party_settings: { } - status: - type: boolean_checkbox - weight: 100 - region: content - settings: - display_label: true - third_party_settings: { } - uid: - type: entity_reference_autocomplete - weight: 5 - region: content - settings: - match_operator: CONTAINS - match_limit: 10 - size: 60 - placeholder: '' - third_party_settings: { } -hidden: { } diff --git a/demo-config/core.entity_view_display.media.document.default.yml b/demo-config/core.entity_view_display.media.document.default.yml deleted file mode 100644 index a5c4a52e..00000000 --- a/demo-config/core.entity_view_display.media.document.default.yml +++ /dev/null @@ -1,25 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.field.media.document.field_media_file - - media.type.document - module: - - collabora_online -id: media.document.default -targetEntityType: media -bundle: document -mode: default -content: - field_media_file: - type: collabora_preview - label: hidden - settings: { } - third_party_settings: { } - weight: 0 - region: content -hidden: - created: true - name: true - thumbnail: true - uid: true diff --git a/demo-config/field.field.media.document.field_media_file.yml b/demo-config/field.field.media.document.field_media_file.yml deleted file mode 100644 index a2870695..00000000 --- a/demo-config/field.field.media.document.field_media_file.yml +++ /dev/null @@ -1,26 +0,0 @@ -langcode: en -status: true -dependencies: - config: - - field.storage.media.field_media_file - - media.type.document - module: - - file -id: media.document.field_media_file -field_name: field_media_file -entity_type: media -bundle: document -label: File -description: '' -required: true -translatable: true -default_value: { } -default_value_callback: '' -settings: - handler: 'default:file' - handler_settings: { } - file_directory: '[date:custom:Y]-[date:custom:m]' - file_extensions: 'txt doc docx pdf' - max_filesize: '' - description_field: false -field_type: file diff --git a/demo-config/field.storage.media.field_media_file.yml b/demo-config/field.storage.media.field_media_file.yml deleted file mode 100644 index e1d2fbec..00000000 --- a/demo-config/field.storage.media.field_media_file.yml +++ /dev/null @@ -1,22 +0,0 @@ -langcode: en -status: true -dependencies: - module: - - file - - media -id: media.field_media_file -field_name: field_media_file -entity_type: media -type: file -settings: - target_type: file - display_field: false - display_default: false - uri_scheme: public -module: file -locked: false -cardinality: 1 -translatable: true -indexes: { } -persist_with_no_fields: false -custom_storage: false diff --git a/demo-config/media.type.document.yml b/demo-config/media.type.document.yml deleted file mode 100644 index f897d383..00000000 --- a/demo-config/media.type.document.yml +++ /dev/null @@ -1,13 +0,0 @@ -langcode: en -status: true -dependencies: { } -id: document -label: Document -description: '' -source: file -queue_thumbnail_downloads: false -new_revision: false -source_configuration: - source_field: field_media_file -field_map: - name: name From 34562523e221d5e01eee4f17aa78af202f28b807 Mon Sep 17 00:00:00 2001 From: Andreas Hennings Date: Wed, 30 Oct 2024 15:32:57 +0100 Subject: [PATCH 3/6] Issue #28: Replace the sleep() in the test with new waitForRequiredElement() method. --- .../CollaboraIntegrationTest.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php index 2ae06bdb..7a07daa7 100644 --- a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php +++ b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php @@ -4,6 +4,8 @@ namespace Drupal\Tests\collabora_online\ExistingSiteJavascript; +use Behat\Mink\Element\Element; +use Behat\Mink\Element\NodeElement; use Drupal\file\Entity\File; use Drupal\media\Entity\Media; use Drupal\media\MediaInterface; @@ -88,4 +90,22 @@ protected function createDocumentMedia(string $media_name, string $file_basename return $media; } + /** + * Waits for an element to appear, and asserts its existence. + * + * @param string $selector + * Selector type, e.g. 'css'. + * @param string $locator + * Selector string. + * @param string $timeout + * (Optional) Timeout in milliseconds, defaults to 10000. + * + * @return \Behat\Mink\Element\NodeElement + * The element found for the selector. + */ + protected function waitForRequiredElement($selector, $locator, $timeout = 10000): NodeElement { + $this->assertSession()->waitForElement($selector, $locator, $timeout); + return $this->assertSession()->elementExists($selector, $locator); + } + } From ec0cef8aeced89bb2eab6fd949e50da8cea32ea7 Mon Sep 17 00:00:00 2001 From: Andreas Hennings Date: Wed, 30 Oct 2024 18:57:36 +0100 Subject: [PATCH 4/6] Issue #28: Rewrite the wait logic in the test with new waitUntilNoMessage() method. --- .../CollaboraIntegrationTest.php | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php index 7a07daa7..6bfe7fee 100644 --- a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php +++ b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php @@ -4,8 +4,6 @@ namespace Drupal\Tests\collabora_online\ExistingSiteJavascript; -use Behat\Mink\Element\Element; -use Behat\Mink\Element\NodeElement; use Drupal\file\Entity\File; use Drupal\media\Entity\Media; use Drupal\media\MediaInterface; @@ -91,21 +89,27 @@ protected function createDocumentMedia(string $media_name, string $file_basename } /** - * Waits for an element to appear, and asserts its existence. + * Waits until a callback returns NULL. * - * @param string $selector - * Selector type, e.g. 'css'. - * @param string $locator - * Selector string. - * @param string $timeout - * (Optional) Timeout in milliseconds, defaults to 10000. - * - * @return \Behat\Mink\Element\NodeElement - * The element found for the selector. + * @param callable(): (string|null) $callback + * Callback that is called in each iteration. + * It should return NULL to wait no longer, or a string message to wait + * and start another iteration. + * @param int|float $max_seconds + * Maximum seconds of wait time. */ - protected function waitForRequiredElement($selector, $locator, $timeout = 10000): NodeElement { - $this->assertSession()->waitForElement($selector, $locator, $timeout); - return $this->assertSession()->elementExists($selector, $locator); + protected function waitUntilNoMessage(callable $callback, int|float $max_seconds = 10): void { + $start = microtime(TRUE); + $end = $start + $max_seconds; + do { + $message = $callback(); + if ($message === NULL) { + return; + } + usleep(10000); + } while (microtime(TRUE) < $end); + + $this->fail('Timeout: ' . $message); } } From b01434a0330e6f4b92837ed9ff44a12df0e084aa Mon Sep 17 00:00:00 2001 From: Andreas Hennings Date: Thu, 31 Oct 2024 00:23:48 +0100 Subject: [PATCH 5/6] Issue #28: Retry on StaleElementReference exception. --- .../CollaboraIntegrationTest.php | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php index 6bfe7fee..ae6e4514 100644 --- a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php +++ b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php @@ -7,6 +7,7 @@ use Drupal\file\Entity\File; use Drupal\media\Entity\Media; use Drupal\media\MediaInterface; +use WebDriver\Exception\StaleElementReference; use weitzman\DrupalTestTraits\ExistingSiteSelenium2DriverTestBase; /** @@ -88,6 +89,32 @@ protected function createDocumentMedia(string $media_name, string $file_basename return $media; } + /** + * Calls a callback until it does not throw a StaleElementReference. + * + * @template T + * + * @param callable(): T $callback + * Callback to call and retry. + * @param int $max_calls + * Maximum number of times the callback should be called. + * + * @return T + * Return value from the last call to the callback. + */ + protected function retryIfStaleElement(callable $callback, int $max_calls = 10): mixed { + for ($i = 1; $i < $max_calls; ++$i) { + try { + return $callback(); + } + catch (StaleElementReference) { + // Next iteration. + } + } + // Call it one more time, without try/catch. + return $callback(); + } + /** * Waits until a callback returns NULL. * From ac2d04e405a537a902129cd52f4d616385777811 Mon Sep 17 00:00:00 2001 From: Francesco Sardara Date: Thu, 31 Oct 2024 18:14:55 +0100 Subject: [PATCH 6/6] Issue #28: Use waitFor() from Drupal core to avoid stale element reference. This is a combination of 4 commits by Francesco: - Attempt to run tests without stale checks. - Add messages for each failed assertion. - The word count is an element and not an input. And one commit to remove the older code. --- .../CollaboraIntegrationTest.php | 50 ------------------- 1 file changed, 50 deletions(-) diff --git a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php index ae6e4514..0dbce66c 100644 --- a/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php +++ b/tests/src/ExistingSiteJavascript/CollaboraIntegrationTest.php @@ -89,54 +89,4 @@ protected function createDocumentMedia(string $media_name, string $file_basename return $media; } - /** - * Calls a callback until it does not throw a StaleElementReference. - * - * @template T - * - * @param callable(): T $callback - * Callback to call and retry. - * @param int $max_calls - * Maximum number of times the callback should be called. - * - * @return T - * Return value from the last call to the callback. - */ - protected function retryIfStaleElement(callable $callback, int $max_calls = 10): mixed { - for ($i = 1; $i < $max_calls; ++$i) { - try { - return $callback(); - } - catch (StaleElementReference) { - // Next iteration. - } - } - // Call it one more time, without try/catch. - return $callback(); - } - - /** - * Waits until a callback returns NULL. - * - * @param callable(): (string|null) $callback - * Callback that is called in each iteration. - * It should return NULL to wait no longer, or a string message to wait - * and start another iteration. - * @param int|float $max_seconds - * Maximum seconds of wait time. - */ - protected function waitUntilNoMessage(callable $callback, int|float $max_seconds = 10): void { - $start = microtime(TRUE); - $end = $start + $max_seconds; - do { - $message = $callback(); - if ($message === NULL) { - return; - } - usleep(10000); - } while (microtime(TRUE) < $end); - - $this->fail('Timeout: ' . $message); - } - }