diff --git a/modules/ui_patterns_blocks/tests/fixtures/config/core.entity_view_display.node.page.full.layout_builder.classic.yml b/modules/ui_patterns_blocks/tests/fixtures/config/core.entity_view_display.node.page.full.layout_builder.classic.yml new file mode 100644 index 0000000000000000000000000000000000000000..9acf3e111ad70b713c698af1a3a6c51170f147e5 --- /dev/null +++ b/modules/ui_patterns_blocks/tests/fixtures/config/core.entity_view_display.node.page.full.layout_builder.classic.yml @@ -0,0 +1,143 @@ +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_blocks + - ui_patterns_test + - user +third_party_settings: + layout_builder: + enabled: true + allow_custom: false + sections: + - + layout_id: layout_onecol + layout_settings: + label: '' + context_mapping: { } + components: + e35dd171-c69c-451f-a035-88dcb7a80af5: + uuid: e35dd171-c69c-451f-a035-88dcb7a80af5 + region: content + configuration: + id: 'ui_patterns_entity:ui_patterns_test:test-component' + label: 'UI Patterns Test component' + label_display: '0' + provider: ui_patterns_blocks + context_mapping: + entity: layout_builder.entity + ui_patterns: + component_id: null + variant_id: + source_id: select + source: + value: '' + slots: + slot: + sources: + - + source: + derivable_context: 'field:node:page:title' + 'field:node:page:title': + value: + sources: + - + source_id: 'field_property:node:title:value' + _weight: '0' + source_id: entity_field + _weight: '0' + props: + attributes: + source_id: class_attribute + source: + value: '' + string: + source_id: context_exists + source: + context_type: entity + integer: + source_id: number + source: + value: '' + number: + source_id: number + source: + value: '' + url: + source_id: url + source: + value: '' + identifier: + source_id: textfield + source: + value: '' + boolean: + source_id: checkbox + links: + source_id: menu + source: + menu: '' + level: '1' + depth: '0' + enum_integer: + source_id: select + source: + value: '' + enum_string: + source_id: select + source: + value: '' + enum_list: + source_id: selects + source: + value: + - '' + enum_list_multiple: + source_id: selects + source: + value: + - '' + - '' + - '' + enum_set: + source_id: checkboxes + list_string: + source_id: list_textarea + source: + value: '' + list_integer: + source_id: list_textarea + source: + value: '' + list_mixed: + source_id: list_textarea + source: + value: '' + attributes_implicit: + source_id: class_attribute + source: + value: '' + attributes_ui_patterns: + source_id: class_attribute + source: + value: '' + attributes_class: + source_id: class_attribute + source: + value: '' + weight: 0 + additional: { } + third_party_settings: { } +id: node.page.full +targetEntityType: node +bundle: page +mode: full +content: {} diff --git a/modules/ui_patterns_blocks/tests/src/Functional/LayoutBuilderBlockRenderTest.php b/modules/ui_patterns_blocks/tests/src/Functional/LayoutBuilderBlockRenderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..1bb3089677fcea1c6c8b163ea81c692edffe3cf2 --- /dev/null +++ b/modules/ui_patterns_blocks/tests/src/Functional/LayoutBuilderBlockRenderTest.php @@ -0,0 +1,71 @@ +<?php + +namespace Drupal\Tests\ui_patterns_blocks\Functional; + +use Drupal\Tests\ui_patterns\Functional\UiPatternsFunctionalTestBase; +use Drupal\Tests\ui_patterns\Traits\TestDataTrait; + +/** + * Test component rendering with Layout Builder. + * + * @group ui_patterns_blocks + */ +class LayoutBuilderBlockRenderTest extends UiPatternsFunctionalTestBase { + + use TestDataTrait; + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'node', + 'ui_patterns', + 'ui_patterns_test', + 'ui_patterns_blocks', + 'field_ui', + 'layout_builder', + 'block', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp(): void { + parent::setUp(); + if ($this->user) { + $this->drupalCreateRole(['configure any layout'], 'custom_role'); + $this->user->addRole('custom_role'); + $this->user->save(); + } + } + + /** + * Test the form and the existence of the. + */ + public function testContextInFormAndRender(): void { + $this->createTestContentContentType(); + $assert_session = $this->assertSession(); + $config_import = $this->loadConfigFixture(__DIR__ . '/../../fixtures/config/core.entity_view_display.node.page.full.layout_builder.classic.yml'); + $ui_patterns_config = &$config_import['third_party_settings']['layout_builder']['sections'][0]['components']['e35dd171-c69c-451f-a035-88dcb7a80af5']['configuration']['formatter']['settings']['ui_patterns']; + $test_data = $this->loadTestDataFixture(); + $test_set = $test_data->getTestSet('context_exists_default'); + $ui_patterns_config = $this->buildUiPatternsConfig($test_set); + $this->importConfigFixture( + 'core.entity_view_display.node.page.full', + $config_import + ); + $this->drupalGet('layout_builder/update/block/defaults/node.page.full/0/wrapper/e35dd171-c69c-451f-a035-88dcb7a80af5'); + $assert_session->elementTextEquals('css', '.context-exists', $test_set['output']['props']['string']['value']); + // --- + $node = $this->createTestContentNode('page', $test_set['entity'] ?? []); + $this->drupalGet('node/' . $node->id()); + $status_code = $this->getSession()->getStatusCode(); + $this->assertTrue($status_code === 200, sprintf('Status code is $status_code for test %s. %s', $test_set['name'], $this->getSession()->getPage()->getContent())); + $assert_session->statusCodeEquals(200); + $this->validateRenderedComponent($test_set); + if (isset($test_set["assertSession"])) { + $this->assertSessionObject($test_set["assertSession"]); + } + } + +} diff --git a/modules/ui_patterns_blocks/tests/src/Kernel/SourcesDeriverTest.php b/modules/ui_patterns_blocks/tests/src/Kernel/SourcesDeriverTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a2e1e3c4eb7ca4aa096a1512144b6fa35d06be96 --- /dev/null +++ b/modules/ui_patterns_blocks/tests/src/Kernel/SourcesDeriverTest.php @@ -0,0 +1,78 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\Tests\ui_patterns_blocks\Kernel; + +use Drupal\Tests\ui_patterns\Kernel\SourcePluginsTestBase; +use Drupal\ui_patterns_blocks\Plugin\Block\ComponentBlock; +use Drupal\ui_patterns_blocks\Plugin\Block\EntityComponentBlock; + +/** + * Tests UI patterns block plugin deriver. + * + * @group ui_patterns_blocks + */ +class SourcesDeriverTest extends SourcePluginsTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = ['ui_patterns', 'ui_patterns_test', 'ui_patterns_blocks']; + + /** + * {@inheritdoc} + */ + protected $strictConfigSchema = FALSE; + + /** + * The layout plugin manager. + * + * @var \Drupal\Core\Block\BlockManagerInterface + */ + protected $blockManager; + + /** + * The component plugin manager. + * + * @var \Drupal\Core\Theme\ComponentPluginManager + */ + protected $componentManager; + + /** + * {@inheritdoc} + */ + protected function setUp(): void { + parent::setUp(); + + $this->blockManager = $this->container->get('plugin.manager.block'); + $this->componentManager = $this->container->get('plugin.manager.sdc'); + } + + /** + * Tests creating fields of all types on a content type. + */ + public function testDerivedPluginPerComponent() { + /* @phpstan-ignore method.notFound */ + $components = $this->componentManager->getSortedDefinitions(); + foreach ($components as $component) { + $id = (string) $component['id']; + $block_plugin_id = sprintf('ui_patterns:%s', $id); + $block = $this->blockManager->createInstance($block_plugin_id); + $this->assertNotNull($block, "Block for component {$component['id']} is missing"); + $this->assertInstanceOf(ComponentBlock::class, $block, + get_class($block) . " " . $component['id'] . " " . print_r($this->blockManager->getDefinitions(), TRUE)); + $block_plugin_id = sprintf('ui_patterns_entity:%s', $id); + $block = $this->blockManager->createInstance($block_plugin_id); + $this->assertNotNull($block, "Block with entity context for component {$component['id']} is missing"); + $this->assertInstanceOf(EntityComponentBlock::class, $block); + $plugin_definition = $block->getPluginDefinition() ?? []; + if (!is_array($plugin_definition)) { + $plugin_definition = []; + } + $context_definitions = $plugin_definition['context_definitions'] ?? []; + $this->assertArrayHasKey('entity', $context_definitions); + } + } + +} diff --git a/tests/fixtures/TestDataSet.yml b/tests/fixtures/TestDataSet.yml index 3669b5ecfe77e10101b303b31b6635935936f39d..178a8b5d7356da0c798dab04aa302de25d92c3c6 100644 --- a/tests/fixtures/TestDataSet.yml +++ b/tests/fixtures/TestDataSet.yml @@ -280,6 +280,11 @@ context_exists_default: string: value: 'entity exists: 1' entity: {} + assertSession: + elementExists: + - [ 'css', '.ui-patterns-test-component' ] + elementTextEquals: + - [ 'xpath', "//div[@class='ui-patterns-props-string']/text()",'entity exists: 1' ] checkboxes_1: component: