3 namespace Drupal\inline_entity_form\Tests;
5 use Drupal\Core\Field\FieldStorageDefinitionInterface;
8 * IEF complex field widget containing an IEF simple field widget tests.
10 * @group inline_entity_form
12 class ComplexSimpleWidgetTest extends InlineEntityFormTestBase {
19 public static $modules = [
20 'inline_entity_form_test',
25 protected function setUp() {
28 $this->user = $this->createUser([
29 'create ief_complex_simple content',
30 'create ief_simple_single content',
31 'create ief_test_custom content',
32 'view own unpublished content',
34 $this->drupalLogin($this->user);
35 $this->fieldConfigStorage = $this->container->get('entity_type.manager')->getStorage('field_config');
39 * Test a Simple IEF widget inside of Complex IEF widget.
41 public function testSimpleInComplex() {
42 $outer_required_options = [
46 $cardinality_options = [
49 FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED => 3,
51 /** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
52 $field_storage = $this->fieldStorageConfigStorage->load('node.ief_complex_outer');
53 /** @var \Drupal\Core\Field\FieldConfigInterface $field_config */
54 $field_config = $this->fieldConfigStorage->load('node.ief_complex_simple.ief_complex_outer');
55 foreach ($outer_required_options as $outer_required_option) {
57 $field_config->setRequired($outer_required_option);
58 $field_config->save();
59 foreach ($cardinality_options as $cardinality => $limit) {
60 $field_storage->setCardinality($cardinality);
61 $field_storage->save();
63 $this->drupalGet('node/add/ief_complex_simple');
64 $outer_title_field = 'ief_complex_outer[form][inline_entity_form][title][0][value]';
65 $inner_title_field = 'ief_complex_outer[form][inline_entity_form][single][0][inline_entity_form][title][0][value]';
66 if (!$outer_required_option) {
67 $this->assertText('Complex Outer', 'Complex Inline entity field widget title found.');
68 // Field should not be available before ajax submit.
69 $this->assertNoFieldByName($outer_title_field, NULL);
70 $this->drupalPostAjaxForm(NULL, [], $this->getButtonName('//input[@type="submit" and @value="Add new node" and @data-drupal-selector="edit-ief-complex-outer-actions-ief-add"]'));
72 $this->assertFieldByName($outer_title_field, NULL);
73 // Simple widget is required so should always show up. No need for add submit.
74 $this->assertFieldByName($inner_title_field, NULL);
76 $edit[$outer_title_field] = $outer_title = $this->randomMachineName(8);
77 $edit[$inner_title_field] = $inner_title = $this->randomMachineName(8);
78 $create_outer_button_selector = '//input[@type="submit" and @value="Create node" and @data-drupal-selector="edit-ief-complex-outer-form-inline-entity-form-actions-ief-add-save"]';
79 $this->drupalPostAjaxForm(NULL, $edit, $this->getButtonName($create_outer_button_selector));
80 // After ajax submit the ief title fields should be gone.
81 $this->assertNoFieldByName($outer_title_field, NULL);
82 $this->assertNoFieldByName($inner_title_field, NULL);
83 $this->assertEqual('', $this->getButtonName($create_outer_button_selector), 'Create node button not found after Ajax submit.');
85 // The nodes should not actually be saved at this point
86 $this->assertNoNodeByTitle($outer_title, 'Outer node was not created when widget submitted.');
87 $this->assertNoNodeByTitle($inner_title, 'Inner node was not created when widget submitted.');
89 $host_title = $this->randomMachineName(8);
90 $edit = ['title[0][value]' => $host_title];
91 $this->drupalPostForm(NULL, $edit, t('Save'));
92 $this->assertText("$host_title has been created.");
93 $this->assertText($outer_title);
95 // Check the nodes were created correctly.
96 $host_node = $this->drupalGetNodeByTitle($host_title);
97 if ($this->assertNotNull($host_node->ief_complex_outer->entity, 'Outer node was created.')) {
98 $outer_node = $host_node->ief_complex_outer->entity;
99 $this->assertEqual($outer_title, $outer_node->label(), "Outer node's title looks correct.");
100 $this->assertEqual('ief_simple_single', $outer_node->bundle(), "Outer node's type looks correct.");
101 if ($this->assertNotNull($outer_node->single->entity, 'Inner node was created')) {
102 $inner_node = $outer_node->single->entity;
103 $this->assertEqual($inner_title, $inner_node->label(), "Inner node's title looks correct.");
104 $this->assertEqual('ief_test_custom', $inner_node->bundle(), "Inner node's type looks correct.");