From 929f937e4f1c542c8b55a10a87c52b783e7b0876 Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Fri, 16 Feb 2024 15:01:50 -0800 Subject: [PATCH 01/11] minor adjustments to tests --- .../src/Plugin/Field/FieldWidget/JsonFormWidget.php | 2 +- .../json_form_widget/tests/src/Unit/ArrayHelperTest.php | 4 ++++ .../tests/src/Unit/JsonFormBuilderTest.php | 4 ++++ .../tests/src/Unit/SchemaUiHandlerTest.php | 4 ++++ .../json_form_widget/tests/src/Unit/StringHelperTest.php | 4 ++++ .../json_form_widget/tests/src/Unit/ValueHandlerTest.php | 4 ++++ phpunit.xml | 7 +++++++ 7 files changed, 28 insertions(+), 1 deletion(-) diff --git a/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php b/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php index 6e8ae9824d..57a632e976 100644 --- a/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php +++ b/modules/json_form_widget/src/Plugin/Field/FieldWidget/JsonFormWidget.php @@ -55,7 +55,7 @@ class JsonFormWidget extends WidgetBase { protected ?string $schema; /** - * Constructs a WidgetBase object. + * Constructs a JsonFormWidget object. * * @param string $plugin_id * The plugin_id for the widget. diff --git a/modules/json_form_widget/tests/src/Unit/ArrayHelperTest.php b/modules/json_form_widget/tests/src/Unit/ArrayHelperTest.php index 3d91fd9b10..41866d4752 100644 --- a/modules/json_form_widget/tests/src/Unit/ArrayHelperTest.php +++ b/modules/json_form_widget/tests/src/Unit/ArrayHelperTest.php @@ -19,6 +19,10 @@ /** * Test class for ArrayHelper. + * + * @group dkan + * @group json_form_widget + * @group unit */ class ArrayHelperTest extends TestCase { diff --git a/modules/json_form_widget/tests/src/Unit/JsonFormBuilderTest.php b/modules/json_form_widget/tests/src/Unit/JsonFormBuilderTest.php index 1fdab5d1ff..97dabca550 100644 --- a/modules/json_form_widget/tests/src/Unit/JsonFormBuilderTest.php +++ b/modules/json_form_widget/tests/src/Unit/JsonFormBuilderTest.php @@ -22,6 +22,10 @@ /** * Test class for JsonFormWidget. + * + * @group dkan + * @group json_form_widget + * @group unit */ class JsonFormBuilderTest extends TestCase { diff --git a/modules/json_form_widget/tests/src/Unit/SchemaUiHandlerTest.php b/modules/json_form_widget/tests/src/Unit/SchemaUiHandlerTest.php index c6b2008eea..4f39051a03 100644 --- a/modules/json_form_widget/tests/src/Unit/SchemaUiHandlerTest.php +++ b/modules/json_form_widget/tests/src/Unit/SchemaUiHandlerTest.php @@ -21,6 +21,10 @@ /** * Test class for SchemaUiHandlerTest. + * + * @group dkan + * @group json_form_widget + * @group unit */ class SchemaUiHandlerTest extends TestCase { diff --git a/modules/json_form_widget/tests/src/Unit/StringHelperTest.php b/modules/json_form_widget/tests/src/Unit/StringHelperTest.php index a3473e5bf0..3b553b1fd9 100644 --- a/modules/json_form_widget/tests/src/Unit/StringHelperTest.php +++ b/modules/json_form_widget/tests/src/Unit/StringHelperTest.php @@ -13,6 +13,10 @@ /** * Test class for StringHelper. + * + * @group dkan + * @group json_form_widget + * @group unit */ class StringHelperTest extends TestCase { diff --git a/modules/json_form_widget/tests/src/Unit/ValueHandlerTest.php b/modules/json_form_widget/tests/src/Unit/ValueHandlerTest.php index 95f79e1b0b..09495e3679 100644 --- a/modules/json_form_widget/tests/src/Unit/ValueHandlerTest.php +++ b/modules/json_form_widget/tests/src/Unit/ValueHandlerTest.php @@ -13,6 +13,10 @@ /** * Test class for ValueHandlerTest. + * + * @group dkan + * @group json_form_widget + * @group unit */ class ValueHandlerTest extends TestCase { diff --git a/phpunit.xml b/phpunit.xml index 37a226bd18..17acb65c91 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,14 +8,21 @@ . + . rector.php tests modules/common/tests modules/datastore/tests + modules/datastore/modules/datastore_mysql_import/tests modules/dkan_js_frontend/tests + modules/frontend/tests + modules/harvest/tests + modules/json_form_widget/tests modules/metastore/tests + modules/metastore/modules/metastore_admin/tests + modules/metastore/modules/metastore_search/tests modules/sample_content ./ From 032c4bc60526b2d89229ed7702d329962b5b48e6 Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Mon, 19 Feb 2024 09:51:51 -0800 Subject: [PATCH 02/11] all the coverage --- .../src/Element/DateRange.php | 1 - .../src/Element/FlexibleDateTime.php | 1 - .../src/Element/UploadOrLink.php | 5 - .../src/Entity/RemoteFile.php | 1 - .../json_form_widget/src/FieldTypeRouter.php | 2 - .../Functional/AdminDatasetJsonFormTest.php | 103 ++++++++++++++++++ 6 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php diff --git a/modules/json_form_widget/src/Element/DateRange.php b/modules/json_form_widget/src/Element/DateRange.php index 38d74c5f88..eb45416849 100644 --- a/modules/json_form_widget/src/Element/DateRange.php +++ b/modules/json_form_widget/src/Element/DateRange.php @@ -12,7 +12,6 @@ * Provides a date_range element. * * @FormElement("date_range") - * @codeCoverageIgnore */ class DateRange extends Datetime { diff --git a/modules/json_form_widget/src/Element/FlexibleDateTime.php b/modules/json_form_widget/src/Element/FlexibleDateTime.php index c2b1a635d9..f26b580bf6 100644 --- a/modules/json_form_widget/src/Element/FlexibleDateTime.php +++ b/modules/json_form_widget/src/Element/FlexibleDateTime.php @@ -9,7 +9,6 @@ * Provides a flexible_datetime element. * * @FormElement("flexible_datetime") - * @codeCoverageIgnore */ class FlexibleDateTime extends Datetime { diff --git a/modules/json_form_widget/src/Element/UploadOrLink.php b/modules/json_form_widget/src/Element/UploadOrLink.php index b95b646c4d..aa987b7f28 100644 --- a/modules/json_form_widget/src/Element/UploadOrLink.php +++ b/modules/json_form_widget/src/Element/UploadOrLink.php @@ -13,7 +13,6 @@ * Provides a new Element for uploading or linking to files. * * @FormElement("upload_or_link") - * @codeCoverageIgnore */ class UploadOrLink extends ManagedFile { @@ -28,11 +27,7 @@ class UploadOrLink extends ManagedFile { const TYPE_REMOTE = 'remote'; /** - * Inherited. - * * {@inheritDoc} - * - * @codeCoverageIgnore */ public function getInfo() { $class = get_class($this); diff --git a/modules/json_form_widget/src/Entity/RemoteFile.php b/modules/json_form_widget/src/Entity/RemoteFile.php index b1860a1a7b..8f91e7c317 100644 --- a/modules/json_form_widget/src/Entity/RemoteFile.php +++ b/modules/json_form_widget/src/Entity/RemoteFile.php @@ -24,7 +24,6 @@ * "uuid" = "uuid" * } * ) - * @codeCoverageIgnore */ class RemoteFile extends File { diff --git a/modules/json_form_widget/src/FieldTypeRouter.php b/modules/json_form_widget/src/FieldTypeRouter.php index ff2e7d99be..9ccd062ef7 100644 --- a/modules/json_form_widget/src/FieldTypeRouter.php +++ b/modules/json_form_widget/src/FieldTypeRouter.php @@ -78,8 +78,6 @@ public function __construct(StringHelper $string_helper, ObjectHelper $object_he /** * Set schema. - * - * @codeCoverageIgnore */ public function setSchema($schema) { $this->schema = $schema; diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php new file mode 100644 index 0000000000..72992c1d6a --- /dev/null +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php @@ -0,0 +1,103 @@ +drupalLogin( + // @todo Figure out least possible admin permissions. + $this->drupalCreateUser(['bypass node access']) + ); + $assert = $this->assertSession(); + + $this->drupalGet('node/add/data'); + $assert->statusCodeEquals(200); + + $node_title = 'dkan data title'; + + $this->submitForm([ + 'edit-field-json-metadata-0-value-title' => $node_title, + 'edit-field-json-metadata-0-value-description' => 'description', + 'edit-field-json-metadata-0-value-modified-date' => '2024-02-18', + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-fn' => 'contact name', + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail' => 'foo@example.com', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-remote' => 'https://demo.getdkan.org/sites/default/files/distribution/cedcd327-4e5d-43f9-8eb1-c11850fa7c55/Bike_Lane.csv', + ], 'Save', 'node-data-form'); + + $this->assertNotEmpty($node = $this->drupalGetNodeByTitle($node_title)); + $this->assertEquals($node_title, $node->get('label')->getValue()); + } + + public function testAdminDatasetJsonForm() { + $this->drupalLogin( + // @todo Figure out least possible admin permissions. + $this->drupalCreateUser([], NULL, TRUE) + ); + $assert = $this->assertSession(); + + // 07_admin_dataset_json_form.spec.js : The dataset form has the correct + // required fields. + $this->drupalGet('node/add/data'); + $assert->statusCodeEquals(200); + + $page = $this->getSession()->getPage(); + + // These fields should be marked as required. + foreach ([ + '#edit-field-json-metadata-0-value-title', + '#edit-field-json-metadata-0-value-description', + '#edit-field-json-metadata-0-value-accesslevel', + '#edit-field-json-metadata-0-value-modified-date', + '#edit-field-json-metadata-0-value-publisher-publisher-name', + '#edit-field-json-metadata-0-value-contactpoint-contactpoint-fn', + '#edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail', + ] as $locator) { + $this->assertEquals( + 'required', + $page->find('css', $locator)->getAttribute('required') + ); + } + + // 07_admin_dataset_json_form.spec.js : License and format fields are + // select_or_other elements in dataset form. + // These select elements have an '- Other -' option. + foreach ([ + "#edit-field-json-metadata-0-value-license-select option[value='select_or_other']", + "#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select option[value='select_or_other']", + ] as $locator) { + $item = $page->find('css', $locator); + $this->assertEquals('select_or_other', $item->getValue()); + } + // Assert the existence of the 'other' text element for select_or_other + // fields. + foreach ([ + '#edit-field-json-metadata-0-value-license-other.form-url', + '#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-other.form-text', + ] as $locator) { + $this->assertNotNull($page->find('css', $locator)); + } + // More to do here. + } + +} From d24fec8fb29dabc062afed9daf795d4fce24083f Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Mon, 19 Feb 2024 10:55:16 -0800 Subject: [PATCH 03/11] adds tests --- .../tests/src/Functional/AdminDatasetJsonFormTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php index 72992c1d6a..f704d2e4a7 100644 --- a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php @@ -25,6 +25,7 @@ class AdminDatasetJsonFormTest extends BrowserTestBase { protected $defaultTheme = 'stark'; public function testEmptyForm() { + $this->markTestIncomplete('need to create tags and publishers to include in form submission.'); $this->drupalLogin( // @todo Figure out least possible admin permissions. $this->drupalCreateUser(['bypass node access']) From 020bebe9296c8756d5cbb60070f909f96fac0627 Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Mon, 19 Feb 2024 12:51:02 -0800 Subject: [PATCH 04/11] using get/set on form state, adds unit test --- .../json_form_widget.info.yml | 1 + .../json_form_widget/json_form_widget.module | 6 +- .../src/Element/UploadOrLink.php | 2 +- .../src/Unit/Element/UploadOrLinkTest.php | 73 +++++++++++++++++++ 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php diff --git a/modules/json_form_widget/json_form_widget.info.yml b/modules/json_form_widget/json_form_widget.info.yml index c4e2e83e05..99bf81e14d 100644 --- a/modules/json_form_widget/json_form_widget.info.yml +++ b/modules/json_form_widget/json_form_widget.info.yml @@ -4,6 +4,7 @@ package: DKAN type: module core_version_requirement: ^10 dependencies: + - file - select_or_other - select2 - dkan:metastore diff --git a/modules/json_form_widget/json_form_widget.module b/modules/json_form_widget/json_form_widget.module index 19c957a320..e119f2fade 100644 --- a/modules/json_form_widget/json_form_widget.module +++ b/modules/json_form_widget/json_form_widget.module @@ -76,7 +76,7 @@ function _json_form_widget_build_count_property(array $button_element): array { */ function json_form_widget_field_widget_complete_form_alter(&$field_widget_complete_form, FormStateInterface $form_state, $context) { if ($context['widget'] instanceof JsonFormWidget) { - $form_state->has_json_form_widget = TRUE; + $form_state->set('has_json_form_widget', TRUE); } } @@ -86,10 +86,10 @@ function json_form_widget_field_widget_complete_form_alter(&$field_widget_comple * Add custom submit handler to form if it contains an upload_or_link element. */ function json_form_widget_form_alter(&$form, FormStateInterface $form_state, $form_id) { - if (!isset($form['actions']['submit']) || !isset($form_state->has_json_form_widget)) { + if (!isset($form['actions']['submit']) || !($has_json_form_widget = $form_state->get('has_json_form_widget'))) { return; } - if ($form_state->has_json_form_widget) { + if ($has_json_form_widget) { $form['actions']['submit']['#submit'][] = 'json_form_widget_file_submit'; } } diff --git a/modules/json_form_widget/src/Element/UploadOrLink.php b/modules/json_form_widget/src/Element/UploadOrLink.php index aa987b7f28..8af33dfa08 100644 --- a/modules/json_form_widget/src/Element/UploadOrLink.php +++ b/modules/json_form_widget/src/Element/UploadOrLink.php @@ -132,7 +132,7 @@ private static function unsetFilesWhenRemoving($triggering_element, $element) { * Helper function to unsetFids. */ private static function unsetFids($element) { - foreach ($element['#value']['fids'] as $fid) { + foreach ($element['#value']['fids'] ?? [] as $fid) { unset($element['file_' . $fid]); } $element['#value']['fids'] = []; diff --git a/modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php b/modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php new file mode 100644 index 0000000000..5936a697de --- /dev/null +++ b/modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php @@ -0,0 +1,73 @@ + ['file_url_type' => 'file_url_type']]], + [UploadOrLink::TYPE_UPLOAD, ['#value' => ['fids' => ['some', 'fids']]]], + ]; + } + + /** + * @covers ::getUrlType + * @dataProvider provideGetUrlType + */ + public function testGetUrlType($expected, $element) { + $ref_get_url_type = new \ReflectionMethod(UploadOrLink::class, 'getUrlType'); + $ref_get_url_type->setAccessible(TRUE); + + $this->assertEquals($expected, + $ref_get_url_type->invokeArgs(NULL, [$element]) + ); + } + + /** + * @covers ::unsetFilesWhenRemoving + */ + public function testUnsetFilesWhenRemoving() { + $triggering_element = ['#array_parents' => ['remove_button']]; + $element['#files'] = ['a_file', 'b_file']; + + $ref_unset_files_when_removing = new \ReflectionMethod(UploadOrLink::class, 'unsetFilesWhenRemoving'); + $ref_unset_files_when_removing->setAccessible(TRUE); + + $unset = $ref_unset_files_when_removing->invokeArgs(NULL, [$triggering_element, $element]); + $this->assertArrayNotHasKey('#files', $unset); + } + + /** + * @covers ::unsetFids + */ + public function testUnsetFids() { + $fids = [1, 2, 3, 4]; + $element = ['#value' => ['fids' => $fids]]; + foreach ($fids as $fid) { + $element['file_' . $fid] = $fid; + } + + $ref_unset_fids = new \ReflectionMethod(UploadOrLink::class, 'unsetFids'); + $ref_unset_fids->setAccessible(TRUE); + + $unset = $ref_unset_fids->invokeArgs(NULL, [$element]); + $this->assertEmpty($unset['#value']['fids']); + foreach ($fids as $fid) { + $this->assertArrayNotHasKey('file_' . $fid, $unset); + } + } + +} From e63b0a5c78cacd6d7d25d13280f1c59d094180fc Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Mon, 19 Feb 2024 13:47:47 -0800 Subject: [PATCH 05/11] some reverts, configure phpunit to only include module file from json_form_widget --- .../json_form_widget/json_form_widget.module | 4 +-- .../src/Element/DateRange.php | 1 + .../src/Element/FlexibleDateTime.php | 1 + .../src/Entity/RemoteFile.php | 1 + .../json_form_widget/src/FieldTypeRouter.php | 2 ++ .../Functional/AdminDatasetJsonFormTest.php | 30 ++----------------- phpunit.xml | 2 +- 7 files changed, 10 insertions(+), 31 deletions(-) diff --git a/modules/json_form_widget/json_form_widget.module b/modules/json_form_widget/json_form_widget.module index e119f2fade..444a8d4849 100644 --- a/modules/json_form_widget/json_form_widget.module +++ b/modules/json_form_widget/json_form_widget.module @@ -86,10 +86,10 @@ function json_form_widget_field_widget_complete_form_alter(&$field_widget_comple * Add custom submit handler to form if it contains an upload_or_link element. */ function json_form_widget_form_alter(&$form, FormStateInterface $form_state, $form_id) { - if (!isset($form['actions']['submit']) || !($has_json_form_widget = $form_state->get('has_json_form_widget'))) { + if (!isset($form['actions']['submit'])) { return; } - if ($has_json_form_widget) { + if ($form_state->get('has_json_form_widget')) { $form['actions']['submit']['#submit'][] = 'json_form_widget_file_submit'; } } diff --git a/modules/json_form_widget/src/Element/DateRange.php b/modules/json_form_widget/src/Element/DateRange.php index eb45416849..38d74c5f88 100644 --- a/modules/json_form_widget/src/Element/DateRange.php +++ b/modules/json_form_widget/src/Element/DateRange.php @@ -12,6 +12,7 @@ * Provides a date_range element. * * @FormElement("date_range") + * @codeCoverageIgnore */ class DateRange extends Datetime { diff --git a/modules/json_form_widget/src/Element/FlexibleDateTime.php b/modules/json_form_widget/src/Element/FlexibleDateTime.php index f26b580bf6..c2b1a635d9 100644 --- a/modules/json_form_widget/src/Element/FlexibleDateTime.php +++ b/modules/json_form_widget/src/Element/FlexibleDateTime.php @@ -9,6 +9,7 @@ * Provides a flexible_datetime element. * * @FormElement("flexible_datetime") + * @codeCoverageIgnore */ class FlexibleDateTime extends Datetime { diff --git a/modules/json_form_widget/src/Entity/RemoteFile.php b/modules/json_form_widget/src/Entity/RemoteFile.php index 8f91e7c317..b1860a1a7b 100644 --- a/modules/json_form_widget/src/Entity/RemoteFile.php +++ b/modules/json_form_widget/src/Entity/RemoteFile.php @@ -24,6 +24,7 @@ * "uuid" = "uuid" * } * ) + * @codeCoverageIgnore */ class RemoteFile extends File { diff --git a/modules/json_form_widget/src/FieldTypeRouter.php b/modules/json_form_widget/src/FieldTypeRouter.php index 9ccd062ef7..ff2e7d99be 100644 --- a/modules/json_form_widget/src/FieldTypeRouter.php +++ b/modules/json_form_widget/src/FieldTypeRouter.php @@ -78,6 +78,8 @@ public function __construct(StringHelper $string_helper, ObjectHelper $object_he /** * Set schema. + * + * @codeCoverageIgnore */ public function setSchema($schema) { $this->schema = $schema; diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php index f704d2e4a7..8f1ec53ce7 100644 --- a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php @@ -7,7 +7,7 @@ /** * Test the json form widget. * - * This test replaces Cypress test: + * This test begins to replace Cypress test: * - 07_admin_dataset_json_form.spec.js * * @group dkan @@ -24,32 +24,6 @@ class AdminDatasetJsonFormTest extends BrowserTestBase { protected $defaultTheme = 'stark'; - public function testEmptyForm() { - $this->markTestIncomplete('need to create tags and publishers to include in form submission.'); - $this->drupalLogin( - // @todo Figure out least possible admin permissions. - $this->drupalCreateUser(['bypass node access']) - ); - $assert = $this->assertSession(); - - $this->drupalGet('node/add/data'); - $assert->statusCodeEquals(200); - - $node_title = 'dkan data title'; - - $this->submitForm([ - 'edit-field-json-metadata-0-value-title' => $node_title, - 'edit-field-json-metadata-0-value-description' => 'description', - 'edit-field-json-metadata-0-value-modified-date' => '2024-02-18', - 'edit-field-json-metadata-0-value-contactpoint-contactpoint-fn' => 'contact name', - 'edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail' => 'foo@example.com', - 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-remote' => 'https://demo.getdkan.org/sites/default/files/distribution/cedcd327-4e5d-43f9-8eb1-c11850fa7c55/Bike_Lane.csv', - ], 'Save', 'node-data-form'); - - $this->assertNotEmpty($node = $this->drupalGetNodeByTitle($node_title)); - $this->assertEquals($node_title, $node->get('label')->getValue()); - } - public function testAdminDatasetJsonForm() { $this->drupalLogin( // @todo Figure out least possible admin permissions. @@ -98,7 +72,7 @@ public function testAdminDatasetJsonForm() { ] as $locator) { $this->assertNotNull($page->find('css', $locator)); } - // More to do here. + // @todo Test more behavior from 07_admin_dataset_json_form.spec.js } } diff --git a/phpunit.xml b/phpunit.xml index 17acb65c91..ced9b693d9 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,7 +8,7 @@ . - . + modules/json_form_widget rector.php From 1f9bbd08ba933c4c5838c5ec32a2d5c1c5051d4c Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Mon, 19 Feb 2024 15:23:43 -0800 Subject: [PATCH 06/11] more reverts, todos --- .../src/Element/UploadOrLink.php | 7 +- .../Functional/AdminDatasetJsonFormTest.php | 3 +- .../src/Unit/Element/UploadOrLinkTest.php | 73 ------------------- phpunit.xml | 1 - 4 files changed, 8 insertions(+), 76 deletions(-) delete mode 100644 modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php diff --git a/modules/json_form_widget/src/Element/UploadOrLink.php b/modules/json_form_widget/src/Element/UploadOrLink.php index 8af33dfa08..b95b646c4d 100644 --- a/modules/json_form_widget/src/Element/UploadOrLink.php +++ b/modules/json_form_widget/src/Element/UploadOrLink.php @@ -13,6 +13,7 @@ * Provides a new Element for uploading or linking to files. * * @FormElement("upload_or_link") + * @codeCoverageIgnore */ class UploadOrLink extends ManagedFile { @@ -27,7 +28,11 @@ class UploadOrLink extends ManagedFile { const TYPE_REMOTE = 'remote'; /** + * Inherited. + * * {@inheritDoc} + * + * @codeCoverageIgnore */ public function getInfo() { $class = get_class($this); @@ -132,7 +137,7 @@ private static function unsetFilesWhenRemoving($triggering_element, $element) { * Helper function to unsetFids. */ private static function unsetFids($element) { - foreach ($element['#value']['fids'] ?? [] as $fid) { + foreach ($element['#value']['fids'] as $fid) { unset($element['file_' . $fid]); } $element['#value']['fids'] = []; diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php index 8f1ec53ce7..675206887f 100644 --- a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php @@ -72,7 +72,8 @@ public function testAdminDatasetJsonForm() { ] as $locator) { $this->assertNotNull($page->find('css', $locator)); } - // @todo Test more behavior from 07_admin_dataset_json_form.spec.js + // @todo Test more behavior from 07_admin_dataset_json_form.spec.js. + // Needs to be able to generate tags and publisher entities. } } diff --git a/modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php b/modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php deleted file mode 100644 index 5936a697de..0000000000 --- a/modules/json_form_widget/tests/src/Unit/Element/UploadOrLinkTest.php +++ /dev/null @@ -1,73 +0,0 @@ - ['file_url_type' => 'file_url_type']]], - [UploadOrLink::TYPE_UPLOAD, ['#value' => ['fids' => ['some', 'fids']]]], - ]; - } - - /** - * @covers ::getUrlType - * @dataProvider provideGetUrlType - */ - public function testGetUrlType($expected, $element) { - $ref_get_url_type = new \ReflectionMethod(UploadOrLink::class, 'getUrlType'); - $ref_get_url_type->setAccessible(TRUE); - - $this->assertEquals($expected, - $ref_get_url_type->invokeArgs(NULL, [$element]) - ); - } - - /** - * @covers ::unsetFilesWhenRemoving - */ - public function testUnsetFilesWhenRemoving() { - $triggering_element = ['#array_parents' => ['remove_button']]; - $element['#files'] = ['a_file', 'b_file']; - - $ref_unset_files_when_removing = new \ReflectionMethod(UploadOrLink::class, 'unsetFilesWhenRemoving'); - $ref_unset_files_when_removing->setAccessible(TRUE); - - $unset = $ref_unset_files_when_removing->invokeArgs(NULL, [$triggering_element, $element]); - $this->assertArrayNotHasKey('#files', $unset); - } - - /** - * @covers ::unsetFids - */ - public function testUnsetFids() { - $fids = [1, 2, 3, 4]; - $element = ['#value' => ['fids' => $fids]]; - foreach ($fids as $fid) { - $element['file_' . $fid] = $fid; - } - - $ref_unset_fids = new \ReflectionMethod(UploadOrLink::class, 'unsetFids'); - $ref_unset_fids->setAccessible(TRUE); - - $unset = $ref_unset_fids->invokeArgs(NULL, [$element]); - $this->assertEmpty($unset['#value']['fids']); - foreach ($fids as $fid) { - $this->assertArrayNotHasKey('file_' . $fid, $unset); - } - } - -} diff --git a/phpunit.xml b/phpunit.xml index ced9b693d9..01009b4f5b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,7 +8,6 @@ . - modules/json_form_widget rector.php From 69f68f1a5efe0f71f5fe9c7f00a259f99bc03f65 Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Tue, 20 Feb 2024 10:13:35 -0800 Subject: [PATCH 07/11] more work on functional test --- .../Functional/AdminDatasetJsonFormTest.php | 83 ++++++++++++++++++- modules/metastore/src/MetastoreService.php | 2 +- phpunit.xml | 3 +- 3 files changed, 84 insertions(+), 4 deletions(-) diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php index 675206887f..456b502d4a 100644 --- a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php @@ -25,6 +25,11 @@ class AdminDatasetJsonFormTest extends BrowserTestBase { protected $defaultTheme = 'stark'; public function testAdminDatasetJsonForm() { + /** @var \Drupal\metastore\MetastoreService $metastore_service */ + $metastore_service = $this->container->get('dkan.metastore.service'); + /** @var \Drupal\metastore\ValidMetadataFactory $metadata_factory */ + $metadata_factory = $this->container->get('dkan.metastore.valid_metadata'); + $this->drupalLogin( // @todo Figure out least possible admin permissions. $this->drupalCreateUser([], NULL, TRUE) @@ -72,8 +77,82 @@ public function testAdminDatasetJsonForm() { ] as $locator) { $this->assertNotNull($page->find('css', $locator)); } - // @todo Test more behavior from 07_admin_dataset_json_form.spec.js. - // Needs to be able to generate tags and publisher entities. + + // 07_admin_dataset_json_form.spec.js : User can create and edit a dataset + // with the json form UI. User can delete a dataset. + // We need a publisher. + $publisher_name = uniqid(); + $metastore_service->post('publisher', + $metastore_service->getValidMetadataFactory()->get( + json_encode((object) [ + 'identifier' => '9deadc2f-50e0-512a-af7c-4323697d530d', + 'data' => ['name' => $publisher_name], + ]), 'publisher', ['method' => 'POST']) + ); + // We need a keyword. + $keyword_data = uniqid(); + $metastore_service->post('keyword', + $metastore_service->getValidMetadataFactory()->get(json_encode((object) [ + 'identifier' => '05b2e74a-eb23-585b-9c1c-4d023e21e8a5', + 'data' => $keyword_data, + ]), 'keyword', ['method' => 'POST']) + ); + + // Use the form. + $this->drupalGet('node/add/data'); + $assert->statusCodeEquals(200); + $this->submitForm([ + 'edit-field-json-metadata-0-value-title' => 'DKANTEST dataset title', + 'edit-field-json-metadata-0-value-description' => 'DKANTEST dataset description.', + 'edit-field-json-metadata-0-value-accesslevel' => 'public', + 'edit-field-json-metadata-0-value-modified-date' => '2020-02-02', + 'edit-field-json-metadata-0-value-publisher-publisher-name' => $publisher_name, + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-fn' => 'DKANTEST Contact Name', + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail' => 'dkantest@test.com', + 'edit-field-json-metadata-0-value-keyword-keyword-0' => $keyword_data, + ], 'Save'); + $assert->statusCodeEquals(200); + $assert->pageTextContains('Data DKANTEST dataset title has been created.'); + + // Confirm the default dkan admin view is filtered to show only datasets. +// $this->drupalGet('admin/dkan/datasets'); + +// cy.visit(baseurl + "/admin/dkan/datasets") +// cy.get('tbody tr').each(($el) => { +// cy.wrap($el).within(() => { +// cy.get('td.views-field-field-data-type').should('contain', 'dataset') +// }) +// }) + + + + // Edit the dataset. +// $this->drupalGet('admin/dkan/datasets'); +// cy.get('#edit-title').type('DKANTEST dataset title', { force:true } ) +// cy.get('#edit-submit-dkan-dataset-content').click({ force:true }) +// cy.get('tbody > tr:first-of-type > .views-field-nothing > a').click({ force:true }) +// cy.wait(2000) +// cy.get('#edit-field-json-metadata-0-value-title').should('have.value','DKANTEST dataset title') +// cy.get('#edit-field-json-metadata-0-value-title').type('NEW dkantest dataset title',{ force:true }) +// cy.get('#edit-field-json-metadata-0-value-accrualperiodicity').select('Annual', { force:true }) +// cy.get('#edit-field-json-metadata-0-value-keyword-keyword-0 + .select2') +// .find('.select2-selection') +// .click({ force: true }); +// cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('testing{enter}') +// cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title').type('DKANTEST distribution title text', { force:true }) +// cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description').type('DKANTEST distribution description text', { force:true }) +// cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select').select('csv', { force:true }) +// cy.get('#edit-submit').click({ force:true }) +// cy.get('.button').contains('Yes').click({ force:true }); +// cy.get('.messages--status').should('contain','has been updated') + +// cy.visit(baseurl + "/admin/dkan/datasets") +// cy.wait(2000) +// cy.get('#edit-node-bulk-form-0').check({ force:true }) +// cy.get('#edit-action').select('Delete content',{ force: true }).should('have.value', 'node_delete_action') +// cy.get('#edit-submit').click({ force:true }) +// cy.get('input[value="Delete"]').click({ force:true }) +// cy.get('.messages__content').should('contain','Deleted 1 content item.') } } diff --git a/modules/metastore/src/MetastoreService.php b/modules/metastore/src/MetastoreService.php index 849d2dde1e..bd85aaa8e7 100644 --- a/modules/metastore/src/MetastoreService.php +++ b/modules/metastore/src/MetastoreService.php @@ -35,7 +35,7 @@ class MetastoreService implements ContainerInjectionInterface { /** * Storage factory. * - * @var \Drupal\metastore\Storage\MetastoreStorageFactoryInterface + * @var \Drupal\metastore\Storage\DataFactory */ private $storageFactory; diff --git a/phpunit.xml b/phpunit.xml index 01009b4f5b..a4273766c2 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -5,9 +5,10 @@ bootstrap="/var/www/html/vendor/weitzman/drupal-test-traits/src/bootstrap.php" colors="true" verbose="true"> - + . + . rector.php From ad542d168526d786cfbe677807ece17acd7fa5ac Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Tue, 20 Feb 2024 11:34:19 -0800 Subject: [PATCH 08/11] finished converting 07_admin_dataset_json_form.spec.js to BTB --- .../07_admin_dataset_json_form.spec.js | 90 ------------------- .../Functional/AdminDatasetJsonFormTest.php | 79 ++++++++-------- phpunit.xml | 2 +- 3 files changed, 43 insertions(+), 128 deletions(-) delete mode 100644 cypress/integration/07_admin_dataset_json_form.spec.js diff --git a/cypress/integration/07_admin_dataset_json_form.spec.js b/cypress/integration/07_admin_dataset_json_form.spec.js deleted file mode 100644 index 276b7cd427..0000000000 --- a/cypress/integration/07_admin_dataset_json_form.spec.js +++ /dev/null @@ -1,90 +0,0 @@ -context('Admin dataset json form', () => { - let baseurl = Cypress.config().baseUrl; - beforeEach(() => { - const user_credentials = Cypress.env('TEST_USER_CREDENTIALS') - cy.drupalLogin(user_credentials.user, user_credentials.pass) - }) - - it('The dataset form has the correct required fields.', () => { - cy.visit(baseurl + "/node/add/data") - cy.get('#edit-field-json-metadata-0-value-title').should('have.attr', 'required', 'required') - cy.get('#edit-field-json-metadata-0-value-description').should('have.attr', 'required', 'required') - cy.get('#edit-field-json-metadata-0-value-accesslevel').should('have.attr', 'required', 'required') - cy.get('#edit-field-json-metadata-0-value-modified-date').should('have.attr', 'required', 'required') - cy.get('#edit-field-json-metadata-0-value-publisher-publisher-name').should('have.attr', 'required', 'required') - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-fn').should('have.attr', 'required', 'required') - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail').should('have.attr', 'required', 'required') - }) - - it('License and format fields are select or other elements in dataset form', () => { - cy.visit(baseurl + '/node/add/data') - cy.get('#edit-field-json-metadata-0-value-license-select').select('select_or_other', { force: true }) - cy.get('#edit-field-json-metadata-0-value-license-other.form-url').should('be.visible') - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select').select('select_or_other', { force: true }) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-other.form-text').should('be.visible') - }) - - it('User can create and edit a dataset with the json form UI. User can delete a dataset.', () => { - cy.visit(baseurl + "/node/add/data") - cy.wait(2000) - cy.get('#edit-field-json-metadata-0-value-title').type('DKANTEST dataset title', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-description').type('DKANTEST dataset description.', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-accesslevel').select('public', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-modified-date').type('2020-02-02', { force:true } ) - // Fill select2 field for publisher. - cy.get('#edit-field-json-metadata-0-value-publisher-publisher-name + .select2') - .find('.select2-selection') - .click({ force:true }); - cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-publisher-publisher-name-results"]').type('DKANTEST Publisher{enter}') - // End filling up publisher. - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-fn').type('DKANTEST Contact Name', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail').type('dkantest@test.com', { force:true } ) - // Fill select2 field for keyword. - cy.get('#edit-field-json-metadata-0-value-keyword-keyword-0 + .select2') - .find('.select2-selection') - .click({ force: true }); - cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('open data{enter}') - // End filling up keyword. - cy.wait(2000) - cy.get('#edit-actions').within(() => { - cy.get('#edit-preview').should('exist') - }) - cy.get('#edit-submit').click({ force:true }) - cy.get('.button').contains('Yes').click({ force:true }); - cy.get('.messages--status').should('contain','has been created') - // Confirm the default dkan admin view is filtered to show only datasets. - cy.visit(baseurl + "/admin/dkan/datasets") - cy.get('tbody tr').each(($el) => { - cy.wrap($el).within(() => { - cy.get('td.views-field-field-data-type').should('contain', 'dataset') - }) - }) - // Edit the dataset. - cy.get('#edit-title').type('DKANTEST dataset title', { force:true } ) - cy.get('#edit-submit-dkan-dataset-content').click({ force:true }) - cy.get('tbody > tr:first-of-type > .views-field-nothing > a').click({ force:true }) - cy.wait(2000) - cy.get('#edit-field-json-metadata-0-value-title').should('have.value','DKANTEST dataset title') - cy.get('#edit-field-json-metadata-0-value-title').type('NEW dkantest dataset title',{ force:true }) - cy.get('#edit-field-json-metadata-0-value-accrualperiodicity').select('Annual', { force:true }) - cy.get('#edit-field-json-metadata-0-value-keyword-keyword-0 + .select2') - .find('.select2-selection') - .click({ force: true }); - cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('testing{enter}') - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title').type('DKANTEST distribution title text', { force:true }) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description').type('DKANTEST distribution description text', { force:true }) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select').select('csv', { force:true }) - cy.get('#edit-submit').click({ force:true }) - cy.get('.button').contains('Yes').click({ force:true }); - cy.get('.messages--status').should('contain','has been updated') - // Delete dataset. - cy.visit(baseurl + "/admin/dkan/datasets") - cy.wait(2000) - cy.get('#edit-node-bulk-form-0').check({ force:true }) - cy.get('#edit-action').select('Delete content',{ force: true }).should('have.value', 'node_delete_action') - cy.get('#edit-submit').click({ force:true }) - cy.get('input[value="Delete"]').click({ force:true }) - cy.get('.messages__content').should('contain','Deleted 1 content item.') - }) - -}) diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php index 456b502d4a..f2ab5647ca 100644 --- a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php @@ -80,7 +80,10 @@ public function testAdminDatasetJsonForm() { // 07_admin_dataset_json_form.spec.js : User can create and edit a dataset // with the json form UI. User can delete a dataset. - // We need a publisher. + // + // Since we don't have JavaScript, we can't use select2 or select_or_other + // to add publisher or keyword entities. We create them here with arbitrary + // UUIDs so that we can post the names to the form. $publisher_name = uniqid(); $metastore_service->post('publisher', $metastore_service->getValidMetadataFactory()->get( @@ -101,8 +104,9 @@ public function testAdminDatasetJsonForm() { // Use the form. $this->drupalGet('node/add/data'); $assert->statusCodeEquals(200); + $dataset_title = 'DKANTEST dataset title'; $this->submitForm([ - 'edit-field-json-metadata-0-value-title' => 'DKANTEST dataset title', + 'edit-field-json-metadata-0-value-title' => $dataset_title, 'edit-field-json-metadata-0-value-description' => 'DKANTEST dataset description.', 'edit-field-json-metadata-0-value-accesslevel' => 'public', 'edit-field-json-metadata-0-value-modified-date' => '2020-02-02', @@ -115,44 +119,45 @@ public function testAdminDatasetJsonForm() { $assert->pageTextContains('Data DKANTEST dataset title has been created.'); // Confirm the default dkan admin view is filtered to show only datasets. -// $this->drupalGet('admin/dkan/datasets'); - -// cy.visit(baseurl + "/admin/dkan/datasets") -// cy.get('tbody tr').each(($el) => { -// cy.wrap($el).within(() => { -// cy.get('td.views-field-field-data-type').should('contain', 'dataset') -// }) -// }) - + $this->drupalGet('admin/dkan/datasets'); + foreach ($page->findAll('css', 'tbody tr') as $row) { + $this->assertStringContainsString( + 'dataset', + $row->find('css', 'td.views-field-field-data-type')->getText() + ); + } + // Filter for our dataset. + $this->drupalGet('admin/dkan/datasets'); + $this->submitForm(['edit-title' => $dataset_title], 'Filter'); // Edit the dataset. -// $this->drupalGet('admin/dkan/datasets'); -// cy.get('#edit-title').type('DKANTEST dataset title', { force:true } ) -// cy.get('#edit-submit-dkan-dataset-content').click({ force:true }) -// cy.get('tbody > tr:first-of-type > .views-field-nothing > a').click({ force:true }) -// cy.wait(2000) -// cy.get('#edit-field-json-metadata-0-value-title').should('have.value','DKANTEST dataset title') -// cy.get('#edit-field-json-metadata-0-value-title').type('NEW dkantest dataset title',{ force:true }) -// cy.get('#edit-field-json-metadata-0-value-accrualperiodicity').select('Annual', { force:true }) -// cy.get('#edit-field-json-metadata-0-value-keyword-keyword-0 + .select2') -// .find('.select2-selection') -// .click({ force: true }); -// cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('testing{enter}') -// cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title').type('DKANTEST distribution title text', { force:true }) -// cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description').type('DKANTEST distribution description text', { force:true }) -// cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select').select('csv', { force:true }) -// cy.get('#edit-submit').click({ force:true }) -// cy.get('.button').contains('Yes').click({ force:true }); -// cy.get('.messages--status').should('contain','has been updated') - -// cy.visit(baseurl + "/admin/dkan/datasets") -// cy.wait(2000) -// cy.get('#edit-node-bulk-form-0').check({ force:true }) -// cy.get('#edit-action').select('Delete content',{ force: true }).should('have.value', 'node_delete_action') -// cy.get('#edit-submit').click({ force:true }) -// cy.get('input[value="Delete"]').click({ force:true }) -// cy.get('.messages__content').should('contain','Deleted 1 content item.') + $page->find('css', 'tbody > tr:first-of-type > .views-field-nothing > a')->click(); + $this->assertNotNull($page->find('css', '#edit-field-json-metadata-0-value-title')); + $assert->fieldValueEquals('edit-field-json-metadata-0-value-title', $dataset_title); + $dataset_new_title = 'NEW dkantest dataset title'; + // @todo cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('testing{enter}') + $this->submitForm([ + 'edit-field-json-metadata-0-value-title' => $dataset_new_title, + // R/P1Y means Annual. + 'edit-field-json-metadata-0-value-accrualperiodicity' => 'R/P1Y', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title' => 'DKANTEST distribution title text', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description' => 'DKANTEST distribution description text', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select' => 'csv', + ], 'Save'); + $assert->statusCodeEquals(200); + $assert->pageTextContains('Data ' . $dataset_new_title . ' has been updated.'); + + // User can delete the dataset. + $this->drupalGet('admin/dkan/datasets'); + $this->submitForm([ + 'edit-node-bulk-form-0' => TRUE, + 'edit-action' => 'node_delete_action', + ], 'Apply to selected items'); + $assert->statusCodeEquals(200); + // Are you sure? + $page->find('css', '#edit-submit')->click(); + $assert->pageTextContains('Deleted 1 content item.'); } } diff --git a/phpunit.xml b/phpunit.xml index a4273766c2..31d2c94c4a 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,7 +8,7 @@ . - . + modules/json_form_widget rector.php From 427a6d94ff7d3b0d647f883183545463f056fc9e Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Tue, 20 Feb 2024 14:58:05 -0800 Subject: [PATCH 09/11] more cypress conversions --- .../11_admin_dataset_file_upload.spec.js | 169 ----------- .../Functional/AdminDatasetFileUploadTest.php | 265 ++++++++++++++++++ .../Functional/AdminDatasetJsonFormTest.php | 3 +- 3 files changed, 266 insertions(+), 171 deletions(-) delete mode 100644 cypress/integration/11_admin_dataset_file_upload.spec.js create mode 100644 modules/json_form_widget/tests/src/Functional/AdminDatasetFileUploadTest.php diff --git a/cypress/integration/11_admin_dataset_file_upload.spec.js b/cypress/integration/11_admin_dataset_file_upload.spec.js deleted file mode 100644 index 5d3060095b..0000000000 --- a/cypress/integration/11_admin_dataset_file_upload.spec.js +++ /dev/null @@ -1,169 +0,0 @@ -import * as dkan from '../support/helpers/dkan' - -context('Admin dataset file upload', () => { - context('Create dataset with remote file', () => { - const fileUrl = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv' - const title = dkan.generateRandomString() - - beforeEach(() => { - const user_credentials = Cypress.env('TEST_USER_CREDENTIALS') - cy.drupalLogin(user_credentials.user, user_credentials.pass) - }) - - it('create the dataset', () => { - cy.visit('/node/add/data') - cy.wait(2000) - cy.get('#edit-field-json-metadata-0-value-title').type(title, { force:true } ) - cy.get('#edit-field-json-metadata-0-value-description').type('DKANTEST distribution description.', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-accesslevel').select('public', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-modified-date').type('2021-02-02', { force:true } ) - // Fill select2 field for publisher. - cy.get('#edit-field-json-metadata-0-value-publisher-publisher-name + .select2') - .find('.select2-selection') - .click({ force:true }) - cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-publisher-publisher-name-results"]').type('DKANTEST Publisher{enter}') - // End filling up publisher. - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-fn').type('DKANTEST Contact Name', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail').type('dkantest@test.com', { force:true } ) - // Fill select2 field for keyword. - cy.get('#edit-field-json-metadata-0-value-keyword-keyword-0 + .select2') - .find('.select2-selection') - .click({ force: true }) - cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('open data{enter}') - // End filling up keyword. - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title') - .type('distribution title test', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description') - .type('distribution description test', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select') - .select('csv', { force:true }) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-type-remote') - .click({ force:true }) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-remote') - .type(fileUrl, { force:true }) - cy.get('#edit-submit') - .click({ force:true }) - cy.get('.button').contains('Yes') - .click({ force:true }) - cy.get('.messages--status') - .should('contain','has been created') - }) - - it('can fill up the form with distribution and submit', () => { - // run cron to gather file. - cy.visit('/admin/config/system/cron') - cy.get('#edit-run') - .click({force: true}) - cy.contains('h1', 'Cron'); - cy.get('.messages--status', {timeout: 120000}) - .should('be.visible') - // run cron to perform data import. - cy.visit('/admin/config/system/cron') - cy.get('#edit-run') - .click({force: true}) - - // verify dataset was imported successfully - dkan.verifyFileImportedSuccessfully(fileUrl.split('/').pop()) - }) - - it('uploaded dataset files show remote link on edit', () => { - cy.visit('/admin/dkan/datasets') - cy.get('#edit-title').type(title) - cy.get('#edit-submit-dkan-dataset-content').click() - cy.get('.views-field-nothing > a').click() - cy.contains('h1', 'Edit Data'); - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl a') - .invoke('attr', 'href') - .should('eq', fileUrl) - }) - }) - - context('Create dataset with file upload', () => { - const fileName = 'example.csv' - const fileType = 'csv' - const title = dkan.generateRandomString() - // generate a separate upload file name to prevent name collisions across - // tests - const uploadedFileName = dkan.generateCSVFileName() - - beforeEach(() => { - const user_credentials = Cypress.env('TEST_USER_CREDENTIALS') - cy.drupalLogin(user_credentials.user, user_credentials.pass) - }) - - it('create the dataset', () => { - const selectorDist = '#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-upload' - cy.visit('/node/add/data') - cy.wait(2000) - cy.get('#edit-field-json-metadata-0-value-title').type(title, { force:true } ) - cy.get('#edit-field-json-metadata-0-value-description').type('DKANTEST distribution description.', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-accesslevel').select('public', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-modified-date').type('2021-02-02', { force:true } ) - // Fill select2 field for publisher. - cy.get('#edit-field-json-metadata-0-value-publisher-publisher-name + .select2') - .find('.select2-selection') - .click({ force:true }) - cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-publisher-publisher-name-results"]').type('DKANTEST Publisher{enter}') - // End filling up publisher. - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-fn').type('DKANTEST Contact Name', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail').type('dkantest@test.com', { force:true } ) - // Fill select2 field for keyword. - cy.get('#edit-field-json-metadata-0-value-keyword-keyword-0 + .select2') - .find('.select2-selection') - .click({ force: true }) - cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('open data{enter}') - // End filling up keyword. - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title') - .type('distribution title test', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description') - .type('distribution description test', { force:true } ) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select') - .select('csv', { force:true }) - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-type-upload') - .click({ force:true }) - - cy.get(selectorDist).uploadFile(fileName, fileType, uploadedFileName) - //wait for the file to be fully loaded - cy.get('.file--mime-text-csv', {timeout: 120000}) - .should('be.visible') - cy.get('#edit-submit') - .click({ force:true }) - cy.get('.button').contains('Yes') - .click({ force:true }) - cy.get('.messages--status') - .should('contain','has been created') - }) - - - it('can import dataset with uploaded file', () => { - // run cron to localize the file. - cy.visit('/admin/config/system/cron') - cy.get('#edit-run') - .click({force: true}) - cy.get('.messages--status', {timeout: 120000}) - .should('be.visible') - // run cron again to import new dataset. - cy.visit('/admin/config/system/cron') - cy.get('#edit-run') - .click({force: true}) - cy.get('.messages--status', {timeout: 120000}) - .should('be.visible') - - // verify dataset was imported successfully - dkan.verifyFileImportedSuccessfully(uploadedFileName) - }) - - it('uploaded dataset files show local link on edit', () => { - // validate URL of uploaded CSV file - cy.visit('/admin/dkan/datasets') - cy.get('#edit-title').type(title) - cy.get('#edit-submit-dkan-dataset-content').click() - cy.get('tbody > :nth-child(1) > .views-field-nothing > a').click({force: true}) - cy.get('h1').should('contain', 'Edit Data') - cy.get('#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl a') - .invoke('attr', 'href') - .should('contain', `uploaded_resources/${uploadedFileName}`) - }) - }) - -}) diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetFileUploadTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetFileUploadTest.php new file mode 100644 index 0000000000..493149fc68 --- /dev/null +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetFileUploadTest.php @@ -0,0 +1,265 @@ +container->get('plugin.manager.queue_worker'); + /** @var \Drupal\Core\Queue\QueueFactory $queueFactory */ + $queueFactory = $this->container->get('queue'); + foreach ($relevantQueues as $queueName) { + $worker = $queueWorkerManager->createInstance($queueName); + $queue = $queueFactory->get($queueName); + while ($item = $queue->claimItem()) { + $worker->processItem($item->data); + $queue->deleteItem($item); + } + } + } + + /** + * Test creating datasets. + * + * 11_admin_dataset_file_upload.spec.js : Admin dataset file upload : Create + * dataset with remote file. + */ + public function testCreateDatasetWithRemoteFile() { + /** @var \Drupal\metastore\MetastoreService $metastore_service */ + $metastore_service = $this->container->get('dkan.metastore.service'); + /** @var \Drupal\metastore\ValidMetadataFactory $metadata_factory */ + $metadata_factory = $this->container->get('dkan.metastore.valid_metadata'); + + $this->drupalLogin( + // @todo Figure out least possible admin permissions. + $this->drupalCreateUser([], NULL, TRUE) + ); + + // Since we don't have JavaScript, we can't use select2 or select_or_other + // to add publisher or keyword entities. We create them here with arbitrary + // UUIDs so that we can post the names to the form. + $publisher_name = uniqid(); + $metastore_service->post('publisher', + $metastore_service->getValidMetadataFactory()->get( + json_encode((object) [ + 'identifier' => '9deadc2f-50e0-512a-af7c-4323697d530d', + 'data' => ['name' => $publisher_name], + ]), 'publisher', ['method' => 'POST']) + ); + // We need a keyword. + $keyword_data = uniqid(); + $metastore_service->post('keyword', + $metastore_service->getValidMetadataFactory()->get(json_encode((object) [ + 'identifier' => '05b2e74a-eb23-585b-9c1c-4d023e21e8a5', + 'data' => $keyword_data, + ]), 'keyword', ['method' => 'POST']) + ); + + $dataset_title = uniqid(); + $file_url = 'https://dkan-default-content-files.s3.amazonaws.com/phpunit/district_centerpoints_small.csv'; + + $assert = $this->assertSession(); + + // 11_admin_dataset_file_upload.spec.js : Create dataset with remote file : + // create the dataset, can fill up the form with distribution and submit. + $this->drupalGet('node/add/data'); + $assert->statusCodeEquals(200); + + $page = $this->getSession()->getPage(); + + // Use the form. + $this->drupalGet('node/add/data'); + $assert->statusCodeEquals(200); + $this->submitForm([ + 'edit-field-json-metadata-0-value-title' => $dataset_title, + 'edit-field-json-metadata-0-value-description' => 'DKANTEST distribution description.', + 'edit-field-json-metadata-0-value-accesslevel' => 'public', + 'edit-field-json-metadata-0-value-modified-date' => '2020-02-02', + 'edit-field-json-metadata-0-value-publisher-publisher-name' => $publisher_name, + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-fn' => 'DKANTEST Contact Name', + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail' => 'dkantest@test.com', + 'edit-field-json-metadata-0-value-keyword-keyword-0' => $keyword_data, + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title' => 'distribution title test', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description' => 'distribution description test', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select' => 'csv', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-type-remote' => 'remote', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-remote' => $file_url, + ], 'Save'); + $assert->statusCodeEquals(200); + $assert->pageTextContains('Data ' . $dataset_title . ' has been created.'); + + // Queues to do import. + $this->runQueues(['localize_import', 'datastore_import']); + // Did our file import? + $this->assertDatasetWasImported($dataset_title); + + // 11_admin_dataset_file_upload.spec.js : Create dataset with remote file : + // uploaded dataset files show remote link on edit. + $this->drupalGet('admin/dkan/datasets'); + $this->submitForm([ + 'edit-title' => $dataset_title, + ], 'Filter'); + $assert->statusCodeEquals(200); + + $page->find('css', '.views-field-nothing > a')->click(); + $assert->statusCodeEquals(200); + + $assert->elementContains('css', 'h1', 'Edit Data'); + $assert->elementAttributeContains( + 'css', + '#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl a', + 'href', + $file_url + ); + } + + /** + * Test creating datasets. + * + * 11_admin_dataset_file_upload.spec.js : Admin dataset file upload : Create + * dataset with file upload. + */ + public function testCreateDatasetWithFileUpload() { + /** @var \Drupal\metastore\MetastoreService $metastore_service */ + $metastore_service = $this->container->get('dkan.metastore.service'); + /** @var \Drupal\metastore\ValidMetadataFactory $metadata_factory */ + $metadata_factory = $this->container->get('dkan.metastore.valid_metadata'); + + $this->drupalLogin( + // @todo Figure out least possible admin permissions. + $this->drupalCreateUser([], NULL, TRUE) + ); + + // Since we don't have JavaScript, we can't use select2 or select_or_other + // to add publisher or keyword entities. We create them here with arbitrary + // UUIDs so that we can post the names to the form. + $publisher_name = uniqid(); + $metastore_service->post('publisher', + $metastore_service->getValidMetadataFactory()->get( + json_encode((object) [ + 'identifier' => '9deadc2f-50e0-512a-af7c-4323697d530d', + 'data' => ['name' => $publisher_name], + ]), 'publisher', ['method' => 'POST']) + ); + // We need a keyword. + $keyword_data = uniqid(); + $metastore_service->post('keyword', + $metastore_service->getValidMetadataFactory()->get(json_encode((object) [ + 'identifier' => '05b2e74a-eb23-585b-9c1c-4d023e21e8a5', + 'data' => $keyword_data, + ]), 'keyword', ['method' => 'POST']) + ); + + // Title for our dataset. + $dataset_title = uniqid(); + // The file we'll upload. + $upload_file = realpath(dirname(__DIR__, 4) . '/datastore/tests/data/Bike_Lane.csv'); + + $assert = $this->assertSession(); + + // 11_admin_dataset_file_upload.spec.js : Create dataset with remote file : + // create the dataset, can fill up the form with distribution and submit. + $this->drupalGet('node/add/data'); + $assert->statusCodeEquals(200); + + $page = $this->getSession()->getPage(); + + // Use the form. + $this->drupalGet('node/add/data'); + $assert->statusCodeEquals(200); + // Add our file to the form. + $page->find('css', '#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-upload') + ->attachFile('file://' . $upload_file); + $this->submitForm([ + 'edit-field-json-metadata-0-value-title' => $dataset_title, + 'edit-field-json-metadata-0-value-description' => 'DKANTEST distribution description.', + 'edit-field-json-metadata-0-value-accesslevel' => 'public', + 'edit-field-json-metadata-0-value-modified-date' => '2020-02-02', + 'edit-field-json-metadata-0-value-publisher-publisher-name' => $publisher_name, + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-fn' => 'DKANTEST Contact Name', + 'edit-field-json-metadata-0-value-contactpoint-contactpoint-hasemail' => 'dkantest@test.com', + 'edit-field-json-metadata-0-value-keyword-keyword-0' => $keyword_data, + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-title' => 'distribution title test', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-description' => 'distribution description test', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-format-select' => 'csv', + 'edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl-file-url-type-upload' => 'upload', + ], 'Save'); + $assert->statusCodeEquals(200); + $assert->pageTextContains('Data ' . $dataset_title . ' has been created.'); + + // Queues to do import. + $this->runQueues(['localize_import', 'datastore_import']); + // Did our file import? + $this->assertDatasetWasImported($dataset_title); + + // 11_admin_dataset_file_upload.spec.js : Create dataset with remote file : + // uploaded dataset files show remote link on edit. + $this->drupalGet('admin/dkan/datasets'); + $this->submitForm([ + 'edit-title' => $dataset_title, + ], 'Filter'); + $assert->statusCodeEquals(200); + + // Click on 'edit'. + $page->find('css', '.views-field-nothing > a')->click(); + $assert->statusCodeEquals(200); + + // Find the URL. + $assert->elementContains('css', 'h1', 'Edit Data'); + $uploaded_file_url = $this->baseUrl . '/' . PublicStream::basePath() . '/uploaded_resources/' . basename($upload_file); + $assert->elementAttributeContains( + 'css', + '#edit-field-json-metadata-0-value-distribution-distribution-0-distribution-downloadurl a', + 'href', + $uploaded_file_url + ); + } + + protected function assertDatasetWasImported(string $dataset_title) { + // Get the UUID for the dataset title. + /** @var \Drupal\node\NodeStorage $node_storage */ + $node_storage = $this->container->get('entity_type.manager') + ->getStorage('node'); + $node_ids = $node_storage->getQuery() + ->condition('type', 'data') + ->condition('title', $dataset_title) + ->accessCheck(FALSE) + ->execute(); + $uuid = ($node_storage->load(reset($node_ids)))->uuid(); + + // Get the import status for the dataset. + /** @var \Drupal\common\DatasetInfo $info_service */ + $info_service = $this->container->get('dkan.common.dataset_info'); + $info = $info_service->gather($uuid); + $this->assertEquals( + 'done', + $info['latest_revision']['distributions'][0]['importer_status'] ?? 'not at all done' + ); + } + +} diff --git a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php index f2ab5647ca..897cf40770 100644 --- a/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php +++ b/modules/json_form_widget/tests/src/Functional/AdminDatasetJsonFormTest.php @@ -7,7 +7,7 @@ /** * Test the json form widget. * - * This test begins to replace Cypress test: + * This test replaces Cypress test: * - 07_admin_dataset_json_form.spec.js * * @group dkan @@ -136,7 +136,6 @@ public function testAdminDatasetJsonForm() { $this->assertNotNull($page->find('css', '#edit-field-json-metadata-0-value-title')); $assert->fieldValueEquals('edit-field-json-metadata-0-value-title', $dataset_title); $dataset_new_title = 'NEW dkantest dataset title'; - // @todo cy.get('input[aria-controls="select2-edit-field-json-metadata-0-value-keyword-keyword-0-results"]').type('testing{enter}') $this->submitForm([ 'edit-field-json-metadata-0-value-title' => $dataset_new_title, // R/P1Y means Annual. From a5019b55ff58d6f357e1f28155a798d33fb0b962 Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Tue, 20 Feb 2024 15:14:20 -0800 Subject: [PATCH 10/11] reconfig --- phpunit.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/phpunit.xml b/phpunit.xml index 31d2c94c4a..b09c22901b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -8,7 +8,6 @@ . - modules/json_form_widget rector.php From 80a94e582900aa4893a6587cae1ea65dd02dbee3 Mon Sep 17 00:00:00 2001 From: Paul Mitchum Date: Wed, 21 Feb 2024 10:30:43 -0800 Subject: [PATCH 11/11] some reverts --- modules/json_form_widget/json_form_widget.info.yml | 1 - modules/metastore/src/MetastoreService.php | 2 +- phpunit.xml | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/json_form_widget/json_form_widget.info.yml b/modules/json_form_widget/json_form_widget.info.yml index 99bf81e14d..c4e2e83e05 100644 --- a/modules/json_form_widget/json_form_widget.info.yml +++ b/modules/json_form_widget/json_form_widget.info.yml @@ -4,7 +4,6 @@ package: DKAN type: module core_version_requirement: ^10 dependencies: - - file - select_or_other - select2 - dkan:metastore diff --git a/modules/metastore/src/MetastoreService.php b/modules/metastore/src/MetastoreService.php index bd85aaa8e7..849d2dde1e 100644 --- a/modules/metastore/src/MetastoreService.php +++ b/modules/metastore/src/MetastoreService.php @@ -35,7 +35,7 @@ class MetastoreService implements ContainerInjectionInterface { /** * Storage factory. * - * @var \Drupal\metastore\Storage\DataFactory + * @var \Drupal\metastore\Storage\MetastoreStorageFactoryInterface */ private $storageFactory; diff --git a/phpunit.xml b/phpunit.xml index b09c22901b..01009b4f5b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -5,7 +5,7 @@ bootstrap="/var/www/html/vendor/weitzman/drupal-test-traits/src/bootstrap.php" colors="true" verbose="true"> - + .