3 namespace Drupal\Tests\layout_builder\FunctionalJavascript;
5 use Drupal\field\Entity\FieldConfig;
6 use Drupal\field\Entity\FieldStorageConfig;
7 use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
10 * @coversDefaultClass \Drupal\layout_builder\Plugin\Block\FieldBlock
14 class FieldBlockTest extends JavascriptTestBase {
19 public static $modules = ['block', 'datetime', 'layout_builder', 'user'];
24 protected function setUp() {
27 $field_storage = FieldStorageConfig::create([
28 'field_name' => 'field_date',
29 'entity_type' => 'user',
32 $field_storage->save();
33 $field = FieldConfig::create([
34 'field_storage' => $field_storage,
36 'label' => 'Date field',
40 $user = $this->drupalCreateUser([
42 'access administration pages',
44 $user->field_date = '1978-11-19T05:00:00';
46 $this->drupalLogin($user);
50 * Tests configuring a field block for a user field.
52 public function testFieldBlock() {
53 $page = $this->getSession()->getPage();
54 $assert_session = $this->assertSession();
56 // Assert that the field value is not displayed.
57 $this->drupalGet('admin');
58 $assert_session->pageTextNotContains('Sunday, November 19, 1978 - 16:00');
60 $this->drupalGet('admin/structure/block');
61 $this->clickLink('Place block');
62 $assert_session->assertWaitOnAjaxRequest();
64 // Ensure that fields without any formatters are not available.
65 $assert_session->pageTextNotContains('Password');
66 // Ensure that non-display-configurable fields are not available.
67 $assert_session->pageTextNotContains('Initial email');
69 $assert_session->pageTextContains('Date field');
70 $block_url = 'admin/structure/block/add/field_block%3Auser%3Auser%3Afield_date/classy';
71 $assert_session->linkByHrefExists($block_url);
73 $this->drupalGet($block_url);
74 $page->fillField('region', 'content');
76 // Assert the default formatter configuration.
77 $assert_session->fieldValueEquals('settings[formatter][type]', 'datetime_default');
78 $assert_session->fieldValueEquals('settings[formatter][settings][format_type]', 'medium');
80 // Change the formatter.
81 $page->selectFieldOption('settings[formatter][type]', 'datetime_time_ago');
82 $assert_session->assertWaitOnAjaxRequest();
83 // Changing the formatter removes the old settings and introduces new ones.
84 $assert_session->fieldNotExists('settings[formatter][settings][format_type]');
85 $assert_session->fieldExists('settings[formatter][settings][granularity]');
86 $page->pressButton('Save block');
87 $assert_session->pageTextContains('The block configuration has been saved.');
89 // Configure the block and change the formatter again.
90 $this->clickLink('Configure');
91 $page->selectFieldOption('settings[formatter][type]', 'datetime_default');
92 $assert_session->assertWaitOnAjaxRequest();
93 $assert_session->fieldValueEquals('settings[formatter][settings][format_type]', 'medium');
94 $page->selectFieldOption('settings[formatter][settings][format_type]', 'long');
96 $page->pressButton('Save block');
97 $assert_session->pageTextContains('The block configuration has been saved.');
99 // Assert that the field value is updated.
100 $this->clickLink('Configure');
101 $assert_session->fieldValueEquals('settings[formatter][settings][format_type]', 'long');
103 // Assert that the field block is configured as expected.
106 'type' => 'datetime_default',
108 'format_type' => 'long',
109 'timezone_override' => '',
111 'third_party_settings' => [],
113 $config = $this->container->get('config.factory')->get('block.block.datefield');
114 $this->assertEquals($expected, $config->get('settings.formatter'));
115 $this->assertEquals(['field.field.user.user.field_date'], $config->get('dependencies.config'));
117 // Assert that the block is displaying the user field.
118 $this->drupalGet('admin');
119 $assert_session->pageTextContains('Sunday, November 19, 1978 - 16:00');