diff --git a/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php b/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php index 27d915a8e1ed2c6a5637e6485df591536d94c85e..988b6e9abbd90797d4a69762d8135e5d7ddff5a4 100644 --- a/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php +++ b/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php @@ -46,7 +46,7 @@ class LayoutBuilderFieldFormatterRenderTest extends UiPatternsFunctionalTestBase public function testContextInForm(): void { $this->createTestContentContentType(); $assert_session = $this->assertSession(); - $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.yml'); + $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.layout_builder.yml'); $ui_patterns_config = &$config_import['third_party_settings']['layout_builder']['sections'][0]['components']['6d778a84-cdc2-4a00-af66-54dab3ea2bf7']['configuration']['formatter']['settings']['ui_patterns']; $test_data = $this->loadTestDataFixture(); $test_set = $test_data->getTestSet('context_exists_default'); @@ -64,7 +64,7 @@ class LayoutBuilderFieldFormatterRenderTest extends UiPatternsFunctionalTestBase */ public function testRender(): void { $assert_session = $this->assertSession(); - $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.yml'); + $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.layout_builder.yml'); $ui_patterns_config = &$config_import['third_party_settings']['layout_builder']['sections'][0]['components']['6d778a84-cdc2-4a00-af66-54dab3ea2bf7']['configuration']['formatter']['settings']['ui_patterns']; $test_data = $this->loadTestDataFixture(); $tests = [ diff --git a/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldFormatterSourceTest.php b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldFormatterSourceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..93bae0389d7419670ec2b714132a9b1fb7258b20 --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldFormatterSourceTest.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\Tests\ui_patterns_field_formatters\Kernel\Source; + +use Drupal\Tests\ui_patterns\Kernel\SourcePluginsTestBase; + +/** + * Test FieldFormatterSource. + * + * @coversDefaultClass \Drupal\ui_patterns_field_formatters\Plugin\UiPatterns\Source\FieldFormatterSource + * @group ui_patterns_field_formatters + */ +class FieldFormatterSourceTest extends SourcePluginsTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = ['ui_patterns_field_formatters']; + + /** + * Test Field Property Plugin. + */ + public function testPlugin(): void { + $testData = self::loadTestDataFixture(__DIR__ . "/../../fixtures/tests.yml"); + $testSets = $testData->getTestSets(); + foreach ($testSets as $test_set_name => $test_set) { + if (!str_starts_with($test_set_name, 'field_formatter_')) { + continue; + } + $this->runSourcePluginTest($test_set); + } + } + +} diff --git a/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldLabelSourceTest.php b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldLabelSourceTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4efafc2205a3512ce039d62971755c444771fd69 --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldLabelSourceTest.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\Tests\ui_patterns_field_formatters\Kernel\Source; + +use Drupal\Tests\ui_patterns\Kernel\SourcePluginsTestBase; + +/** + * Test FieldLabelSource. + * + * @coversDefaultClass \Drupal\ui_patterns_field_formatters\Plugin\UiPatterns\Source\FieldLabelSource + * @group ui_patterns_field_formatters + */ +class FieldLabelSourceTest extends SourcePluginsTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = ['ui_patterns_field_formatters']; + + /** + * Test Field Property Plugin. + */ + public function testPlugin(): void { + $testData = self::loadTestDataFixture(__DIR__ . "/../../fixtures/tests.yml"); + $testSets = $testData->getTestSets(); + foreach ($testSets as $test_set_name => $test_set) { + if (!str_starts_with($test_set_name, 'field_label_')) { + continue; + } + $this->runSourcePluginTest($test_set); + } + } + +} diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.classic.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.classic.yml new file mode 100644 index 0000000000000000000000000000000000000000..984f2dc88257b495c7adfd9e2e888b8b0af97996 --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.classic.yml @@ -0,0 +1,37 @@ +uuid: a9e67581-da30-4331-8fb0-397e185541f3 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.full + - field.field.node.page.body + - node.type.page + module: + - ui_patterns + - ui_patterns_field_formatters + - user +_core: + default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg +id: node.page.full +targetEntityType: node +bundle: page +mode: full +content: + body: + type: ui_patterns_component_per_item + label: hidden + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + region: content +hidden: + links: true diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.classic.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.classic.yml new file mode 100644 index 0000000000000000000000000000000000000000..5fbd562c71940f007a00e58fb58a2d80243cc88f --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.classic.yml @@ -0,0 +1,44 @@ +uuid: a9e67581-da30-4331-8fb0-397e185541f3 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.full + - field.field.node.page.body + - node.type.page + module: + - field_layout + - layout_discovery + - ui_patterns + - ui_patterns_field_formatters + - user +third_party_settings: + field_layout: + id: layout_onecol + settings: + label: '' +_core: + default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg +id: node.page.full +targetEntityType: node +bundle: page +mode: full +content: + body: + type: ui_patterns_component_per_item + label: hidden + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + region: content +hidden: + links: true diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.section_component.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.section_component.yml new file mode 100644 index 0000000000000000000000000000000000000000..4b0e4ffdfd3e1ddf305c396c9c26f05c7f87d26c --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.section_component.yml @@ -0,0 +1,53 @@ +uuid: a9e67581-da30-4331-8fb0-397e185541f3 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.full + - field.field.node.page.body + - node.type.page + module: + - field_layout + - ui_patterns + - ui_patterns_field_formatters + - ui_patterns_layouts + - user +third_party_settings: + field_layout: + id: 'ui_patterns:ui_patterns_test_tmp:slot_test' + settings: + label: '' + ui_patterns: + component_id: null + variant_id: null + slots: { } + props: + attributes: + source_id: attributes + source: + value: '' +_core: + default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg +id: node.page.full +targetEntityType: node +bundle: page +mode: full +content: + body: + type: ui_patterns_component_per_item + label: hidden + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + region: my_slot +hidden: + links: true diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.yml new file mode 100644 index 0000000000000000000000000000000000000000..8688ed4f73782488308c9b3ed40c56b0439f6c83 --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.yml @@ -0,0 +1,54 @@ +uuid: a9e67581-da30-4331-8fb0-397e185541f3 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.full + - field.field.node.page.body + - node.type.page + module: + - field_layout + - ui_patterns + - ui_patterns_field_formatters + - ui_patterns_layouts + - ui_patterns_test_tmp + - user +third_party_settings: + field_layout: + id: 'ui_patterns:ui_patterns_test_tmp:slot_test' + settings: + label: '' + ui_patterns: + component_id: null + variant_id: null + slots: { } + props: + attributes: + source_id: attributes + source: + value: '' +_core: + default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg +id: node.page.full +targetEntityType: node +bundle: page +mode: full +content: + body: + type: ui_patterns_component_per_item + label: hidden + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + region: my_slot +hidden: + links: true diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.classic.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.classic.yml new file mode 100644 index 0000000000000000000000000000000000000000..ac36d93e33d02a7c42893b65b5a0009a826cfe4b --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.classic.yml @@ -0,0 +1,78 @@ +uuid: a9e67581-da30-4331-8fb0-397e185541f3 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.full + - field.field.node.page.body + - node.type.page + module: + - layout_builder + - layout_discovery + - ui_patterns + - ui_patterns_field_formatters + - user +third_party_settings: + layout_builder: + enabled: true + allow_custom: false + sections: + - + layout_id: layout_onecol + layout_settings: + label: '' + context_mapping: { } + components: + b1fbf76f-1430-4a9c-8397-e060f3893142: + uuid: b1fbf76f-1430-4a9c-8397-e060f3893142 + region: content + configuration: + id: 'field_block:node:page:body' + label: Body + label_display: '0' + provider: layout_builder + context_mapping: + entity: layout_builder.entity + view_mode: view_mode + formatter: + type: ui_patterns_component_per_item + label: above + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + additional: { } + third_party_settings: { } +_core: + default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg +id: node.page.full +targetEntityType: node +bundle: page +mode: full +content: + body: + type: ui_patterns_component_per_item + label: hidden + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + region: my_slot +hidden: + links: true diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.section_component.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.section_component.yml new file mode 100644 index 0000000000000000000000000000000000000000..22a9aad88f7e495fb18a6927768e39fd80a3aff9 --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.section_component.yml @@ -0,0 +1,89 @@ +uuid: a9e67581-da30-4331-8fb0-397e185541f3 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.full + - field.field.node.page.body + - node.type.page + module: + - layout_builder + - ui_patterns + - ui_patterns_field_formatters + - ui_patterns_layouts + - ui_patterns_test_tmp + - user +third_party_settings: + layout_builder: + enabled: true + allow_custom: false + sections: + - + layout_id: 'ui_patterns:ui_patterns_test_tmp:slot_test' + layout_settings: + label: '' + context_mapping: + entity: layout_builder.entity + ui_patterns: + component_id: null + variant_id: null + slots: { } + props: + attributes: + source_id: attributes + source: + value: '' + components: + 2b7726dd-cf0a-4b6c-b2d6-3c7e9b3bab33: + uuid: 2b7726dd-cf0a-4b6c-b2d6-3c7e9b3bab33 + region: my_slot + configuration: + id: 'field_block:node:page:body' + label: Body + label_display: '0' + provider: layout_builder + context_mapping: + entity: layout_builder.entity + view_mode: view_mode + formatter: + type: ui_patterns_component_per_item + label: hidden + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + additional: { } + third_party_settings: { } +_core: + default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg +id: node.page.full +targetEntityType: node +bundle: page +mode: full +content: + body: + type: ui_patterns_component_per_item + label: hidden + settings: + ui_patterns: + component_id: 'ui_patterns_test_tmp:slot_test' + variant_id: null + props: + attributes: + source_id: attributes + source: + value: '' + slots: { } + third_party_settings: { } + weight: 0 + region: my_slot +hidden: + links: true diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.yml deleted file mode 100644 index 1cbc9c0dc92c47ddf2b18b8d0a5e861f8a2c8e20..0000000000000000000000000000000000000000 --- a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.yml +++ /dev/null @@ -1,51 +0,0 @@ -langcode: en -status: true -third_party_settings: - layout_builder: - enabled: true - allow_custom: false - sections: - - - layout_id: 'ui_patterns:ui_patterns_test:test_wrapper_component' - layout_settings: - label: '' - context_mapping: { } - ui_patterns: - component_id: null - variant_id: null - slots: { } - props: { } - components: - 6d778a84-cdc2-4a00-af66-54dab3ea2bf7: - uuid: 6d778a84-cdc2-4a00-af66-54dab3ea2bf7 - region: wrapper - configuration: - id: 'field_block:node:page:body' - label: Body - label_display: '0' - provider: layout_builder - context_mapping: - entity: layout_builder.entity - view_mode: view_mode - formatter: - type: ui_patterns_component_per_item - label: hidden - settings: - ui_patterns: - component_id: 'ui_patterns_test:test-component' - variant_id: null - slots: { } - props: { } - third_party_settings: { } - weight: 0 - additional: { } - third_party_settings: { } - entity_test: - foo: bar -id: node.page.full -targetEntityType: node -bundle: page -mode: full -content: {} -hidden: - layout_builder__layout: true diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/tests.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/tests.yml new file mode 100644 index 0000000000000000000000000000000000000000..dce185888d1eb80a08efe0f4b2fc1774589cfe48 --- /dev/null +++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/tests.yml @@ -0,0 +1,68 @@ +--- +field_formatter_default_1: + component: + component_id: ui_patterns_test:test-component + slots: + slot: + sources: + - + source_id: field_formatter:node:page:field_text_1 + source: + type: 'string' +# contexs: + #bundle: page + #field_name: 'field_text_1' + entity: + field_text_1: + value: 'value_text_1' + output: + slots: + slot: + - + rendered_value: "<p>value_text_1</p>" + rendered_value_plain: "value_text_1" +field_formatter_default_2: + component: + component_id: ui_patterns_test:test-component + props: + string: + source_id: field_formatter:node:page:field_text_1 + source: + type: 'string' + output: + props: + string: + rendered_value: "<p>value_text_2</p>" + rendered_value_plain: "value_text_2" + entity: + field_text_1: + value: 'value_text_2' +field_label_default_1: + component: + component_id: ui_patterns_test:test-component + slots: + slot: + sources: + - + source_id: field_label + contexts: + field_name: 'field_text_1' + entity: {} + output: + slots: + slot: + - + rendered_value: "Text (formatted)" +field_label_default_2: + component: + component_id: ui_patterns_test:test-component + props: + string: + source_id: field_label + contexts: + field_name: 'field_text_1' + entity: {} + output: + props: + string: + value: "Text (formatted)" diff --git a/tests/src/Traits/RunSourcePluginTestTrait.php b/tests/src/Traits/RunSourcePluginTestTrait.php index 25da2062700755b3d4c61425d48061d9712075c1..9159b50c1e88216b54302f49ae974a5094669b2b 100644 --- a/tests/src/Traits/RunSourcePluginTestTrait.php +++ b/tests/src/Traits/RunSourcePluginTestTrait.php @@ -144,9 +144,12 @@ trait RunSourcePluginTestTrait { } $plugin = $this->getSourcePluginForPropOrSlot($component, $prop_or_slot_id, $source_to_test, $source_to_test["source_id"], $contexts); assertTrue($plugin instanceof SourcePluginBase); - $message = sprintf("Test '%s' failed for prop/slot '%s' of component %s with source '%s' ", $test_set["name"] ?? "", $prop_or_slot_id, $component_id, $source_to_test["source_id"]); - $prop_value = $plugin->getPropValue(); + // getPropValue() returns the 'raw' value of the source compatible with the type declared. + // getValue() returns the value of the source converted to the type definition. + $prop_value = $plugin->getValue($plugin->getPropDefinition()["ui_patterns"]["type_definition"]); + $message = sprintf("Test '%s' failed for prop/slot '%s' of component %s with source '%s'", $test_set["name"] ?? "", $prop_or_slot_id, $component_id, $source_to_test["source_id"]); $this->assertExpectedOutput($expected_outputs_here[$index], $prop_value, $message); + } } } diff --git a/tests/src/Traits/TestDataTrait.php b/tests/src/Traits/TestDataTrait.php index 6eadf582d7e84af9741c29cb24b9fb809fca6b1e..33b4417ae4dcb3fc19439f312261cee38f1c0e9a 100644 --- a/tests/src/Traits/TestDataTrait.php +++ b/tests/src/Traits/TestDataTrait.php @@ -4,7 +4,9 @@ declare(strict_types=1); namespace Drupal\Tests\ui_patterns\Traits; +use Drupal\Component\Render\MarkupInterface; use Drupal\Component\Serialization\Yaml; +use Drupal\Component\Utility\Xss; /** * Trait to read fixtures that describe component test situations. @@ -51,20 +53,54 @@ trait TestDataTrait { * @throws \RuntimeException */ protected function assertExpectedOutput(array $expected_result, mixed $result, string $message = ''): void { + $assert_done = FALSE; if (isset($expected_result['value'])) { - $this->assertContains($expected_result['value'], [$result], $message); + $this->assertContains($expected_result['value'], [$result], sprintf("%s: '%s'", $message, print_r($result, TRUE))); + $assert_done = TRUE; } - elseif (isset($expected_result['same'])) { + if (isset($expected_result['value_normalized'])) { + $normalized_value = self::normalizeMarkupString($result); + $this->assertContains($expected_result['value'], [$normalized_value], sprintf("%s: '%s'", $message, $normalized_value)); + $assert_done = TRUE; + } + if (isset($expected_result['same'])) { $this->assertSame($expected_result['same'], $result, $message); + $assert_done = TRUE; } - elseif (isset($expected_result['regEx'])) { + if (isset($expected_result['regEx'])) { $this->assertTrue(preg_match($expected_result['regEx'], $result) === 1, $message); + $assert_done = TRUE; + } + if (isset($expected_result['rendered_value']) || isset($expected_result['rendered_value_plain']) || isset($expected_result['rendered_value_normalized'])) { + $rendered = \Drupal::service('renderer')->renderRoot($result); + // $rendered = is_array($result) ? \Drupal::service('renderer')->renderRoot($result) : $result; + if ($rendered instanceof MarkupInterface) { + $rendered = "" . $rendered; + } + $normalized_rendered = self::normalizeMarkupString($rendered); + if (isset($expected_result['rendered_value'])) { + $this->assertContains($expected_result['rendered_value'], [$normalized_rendered], sprintf("%s: '%s'", $message, $normalized_rendered)); + } + if (isset($expected_result['rendered_value_plain'])) { + $rendered_plain = Xss::filter($normalized_rendered); + $this->assertContains($expected_result['rendered_value_plain'], [$rendered_plain], sprintf("%s: '%s'", $message, $rendered_plain)); + } + $assert_done = TRUE; } - else { + if (!$assert_done) { throw new \RuntimeException(sprintf('Missing "value" or "regEx" in expected result %s', print_r($expected_result, TRUE))); } } + /** + * Normalize a string of markup for comparison. + */ + protected static function normalizeMarkupString(string $markup): string { + $markup = preg_replace('/\s*(<|>)\s*/', '$1', $markup); + $markup = trim($markup); + return $markup; + } + /** * Loads test dataset fixture. */