View source
<?php
namespace Drupal\Tests\inline_entity_form\FunctionalJavascript;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\node\Entity\Node;
use Drupal\node\NodeInterface;
class SimpleWidgetTest extends InlineEntityFormTestBase {
protected static $modules = [
'inline_entity_form_test',
];
protected function setUp() : void {
parent::setUp();
$this->user = $this
->createUser([
'create ief_simple_single content',
'create ief_test_custom content',
'edit any ief_simple_single content',
'edit own ief_test_custom content',
'view own unpublished content',
'create ief_simple_entity_no_bundle content',
'administer entity_test__without_bundle content',
]);
}
public function testSimpleCardinalityOptions() {
$title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 1);
$first_nested_title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 2);
$second_nested_title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 3);
$third_nested_title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 4);
$fourth_nested_title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 5);
$first_positive_int_field_xpath = $this
->getXpathForNthInputByLabelText('Positive int', 1);
$second_positive_int_field_xpath = $this
->getXpathForNthInputByLabelText('Positive int', 2);
$third_positive_int_field_xpath = $this
->getXpathForNthInputByLabelText('Positive int', 3);
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->drupalLogin($this->user);
$cardinality_options = [
1 => 1,
2 => 2,
FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED => 3,
];
$field_storage = $this->fieldStorageConfigStorage
->load('node.single');
foreach ($cardinality_options as $cardinality => $number_of_items) {
$field_storage
->setCardinality($cardinality);
$field_storage
->save();
$this
->drupalGet('node/add/ief_simple_single');
$assert_session
->elementTextContains('css', 'span.fieldset-legend', 'Single node');
$assert_session
->elementTextContains('css', 'div.description', 'Reference a single node.');
if ($cardinality === 1) {
$assert_session
->buttonNotExists('Add another item');
$assert_session
->elementExists('xpath', $title_field_xpath)
->setValue('Host node');
$assert_session
->elementExists('xpath', $first_nested_title_field_xpath)
->setValue('Nested single node');
$assert_session
->elementExists('xpath', $first_positive_int_field_xpath)
->setValue(42);
$page
->pressButton('Save');
$assert_session
->pageTextContains('IEF simple single Host node has been created.');
$host_node = $this
->getNodeByTitle('Host node');
}
elseif ($cardinality === 2) {
$assert_session
->buttonNotExists('Add another item');
$assert_session
->elementExists('xpath', $title_field_xpath)
->setValue('Host node 2');
$assert_session
->elementExists('xpath', $first_nested_title_field_xpath)
->setValue('Nested single node 2');
$assert_session
->elementExists('xpath', $first_positive_int_field_xpath)
->setValue(42);
$assert_session
->elementExists('xpath', $second_nested_title_field_xpath)
->setValue('Nested single node 3');
$assert_session
->elementExists('xpath', $second_positive_int_field_xpath)
->setValue(42);
$page
->pressButton('Save');
$assert_session
->pageTextContains('IEF simple single Host node 2 has been created.');
$host_node = $this
->getNodeByTitle('Host node 2');
}
elseif ($cardinality === FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
$assert_session
->elementExists('xpath', $title_field_xpath)
->setValue('Host node 3');
$assert_session
->elementExists('xpath', $first_nested_title_field_xpath)
->setValue('Nested single node 4');
$assert_session
->elementExists('xpath', $first_positive_int_field_xpath)
->setValue(42);
$assert_session
->elementNotExists('xpath', $second_positive_int_field_xpath);
$assert_session
->buttonExists('Add another item')
->press();
$this
->assertNotEmpty($assert_session
->waitForElement('xpath', $second_nested_title_field_xpath));
$assert_session
->elementNotExists('xpath', $third_nested_title_field_xpath);
$assert_session
->elementExists('xpath', $second_nested_title_field_xpath)
->setValue('Nested single node 5');
$assert_session
->elementExists('xpath', $second_positive_int_field_xpath)
->setValue(42);
$assert_session
->buttonExists('Add another item')
->press();
$this
->assertNotEmpty($assert_session
->waitForElement('xpath', $third_nested_title_field_xpath));
$assert_session
->elementNotExists('xpath', $fourth_nested_title_field_xpath);
$assert_session
->elementExists('xpath', $third_nested_title_field_xpath)
->setValue('Nested single node 6');
$assert_session
->elementExists('xpath', $third_positive_int_field_xpath)
->setValue(42);
$page
->pressButton('Save');
$assert_session
->pageTextContains('IEF simple single Host node 3 has been created.');
$host_node = $this
->getNodeByTitle('Host node 3');
}
$this
->checkEditAccess($host_node, $number_of_items, $cardinality);
}
}
public function testSimpleValidation() {
$title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 1);
$nested_title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 2);
$positive_int_field_xpath = $this
->getXpathForNthInputByLabelText('Positive int', 1);
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->drupalLogin($this->user);
$host_node_title = 'Host Validation Node';
$this
->drupalGet('node/add/ief_simple_single');
$assert_session
->pageTextContains('Single node');
$assert_session
->pageTextContains('Reference a single node.');
$assert_session
->pageTextContains('Positive int');
$assert_session
->elementExists('xpath', $title_field_xpath)
->setValue($host_node_title);
$page
->pressButton('Save');
$assert_session
->pageTextNotContains('IEF simple single Host Validation Node has been created.');
$this
->assertSession()
->addressEquals('node/add/ief_simple_single');
$child_title = 'Child node ' . $this
->randomString();
$assert_session
->elementExists('xpath', $nested_title_field_xpath)
->setValue($child_title);
$assert_session
->elementExists('xpath', $positive_int_field_xpath)
->setValue(-1);
$page
->pressButton('Save');
$assert_session
->pageTextNotContains('IEF simple single Host Validation Node has been created.');
$this
->assertSession()
->addressEquals('node/add/ief_simple_single');
$assert_session
->elementExists('xpath', $positive_int_field_xpath)
->setValue(1);
$page
->pressButton('Save');
$assert_session
->pageTextNotContains('Title field is required.');
$assert_session
->pageTextNotContains('Positive int must be higher than or equal to 1');
$assert_session
->pageTextContains('IEF simple single Host Validation Node has been created.');
$host_node = $this
->getNodeByTitle($host_node_title);
$this
->assertNotNull($host_node, 'Host node created.');
if (isset($host_node)) {
$this
->assertSession()
->addressEquals($host_node
->toUrl('canonical', [
'absolute' => TRUE,
])
->toString());
$child_node = $this
->getNodeByTitle($child_title);
$this
->assertNotNull($child_node);
if (isset($child_node)) {
$this
->assertSame($host_node->single[0]->target_id, $child_node
->id(), 'Child node is referenced');
$this
->assertSame($child_node->positive_int[0]->value, '1', 'Child node int field correct.');
$this
->assertSame($child_node
->bundle(), 'ief_test_custom', 'Child node is correct bundle.');
}
}
}
public function testSimpleCreateAccess() {
$nested_title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 2);
$assert_session = $this
->assertSession();
$this
->drupalLogin($this
->createUser([
'create ief_simple_single content',
]));
$this
->drupalGet('node/add/ief_simple_single');
$assert_session
->elementNotExists('xpath', $nested_title_field_xpath);
$this
->drupalLogin($this->user);
$this
->drupalGet('node/add/ief_simple_single');
$assert_session
->elementExists('xpath', $nested_title_field_xpath);
}
public function testEntityWithoutBundle() {
$title_field_xpath = $this
->getXpathForNthInputByLabelText('Title', 1);
$name_field_xpath = $this
->getXpathForNthInputByLabelText('Name', 1);
$assert_session = $this
->assertSession();
$page = $this
->getSession()
->getPage();
$this
->drupalLogin($this->user);
$this
->drupalGet('node/add/ief_simple_entity_no_bundle');
$assert_session
->elementExists('xpath', $title_field_xpath)
->setValue('Node title');
$assert_session
->elementExists('xpath', $name_field_xpath)
->setValue('Entity title');
$page
->pressButton('Save');
$assert_session
->pageTextContains('IEF simple entity no bundle Node title has been created.');
$this
->assertNodeByTitle('Node title', 'ief_simple_entity_no_bundle');
$this
->assertEntityByLabel('Entity title', 'entity_test__without_bundle');
}
protected function checkEditAccess(NodeInterface $host_node, int $number_of_items, int $cardinality) {
$assert_session = $this
->assertSession();
$page = $this
->getSession()
->getPage();
$other_user = $this
->createUser([
'edit own ief_test_custom content',
'edit any ief_simple_single content',
]);
$first_child_node = $host_node->single[0]->entity;
$first_child_node
->setOwner($other_user)
->save();
$this
->drupalGet("node/{$host_node->id()}/edit");
$assert_session
->pageTextContains($first_child_node
->label());
$assert_session
->fieldNotExists('single[0][inline_entity_form][title][0][value]');
$delta = 1;
while ($delta < $number_of_items) {
$child_node = $host_node->single[$delta]->entity;
$delta_field = $assert_session
->fieldExists("single[{$delta}][inline_entity_form][title][0][value]");
$this
->assertStringContainsString($child_node
->label(), $delta_field
->getValue());
$delta++;
}
$unexpected_item_number = $number_of_items;
$assert_session
->fieldNotExists("single[{$unexpected_item_number}][inline_entity_form][title][0][value]");
if ($cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
$next_item_number = $number_of_items;
$page
->pressButton('Add another item');
$this
->assertNotEmpty($assert_session
->waitForField("single[{$next_item_number}][inline_entity_form][title][0][value]"));
$unexpected_item_number = $next_item_number + 1;
$assert_session
->fieldNotExists("single[{$unexpected_item_number}][inline_entity_form][title][0][value]");
}
$delta = 1;
$new_titles = [];
$edit = [];
while ($delta < $number_of_items) {
$child_node = $host_node->single[$delta]->entity;
$new_titles[$delta] = $child_node
->label() . ' - updated';
$edit["single[{$delta}][inline_entity_form][title][0][value]"] = $new_titles[$delta];
$delta++;
}
if ($cardinality === FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
$new_titles[$delta] = 'Title for new child';
$edit["single[{$delta}][inline_entity_form][title][0][value]"] = $new_titles[$delta];
}
$this
->submitForm($edit, 'Save');
$assert_session
->pageTextContains("IEF simple single {$host_node->label()} has been updated.");
$node_ids = [
$host_node
->id(),
];
foreach ($host_node->single as $item) {
$node_ids[] = $item->entity
->id();
}
$this->container
->get('entity_type.manager')
->getStorage('node')
->resetCache($node_ids);
$host_node = Node::load($host_node
->id());
foreach ($new_titles as $delta => $new_title) {
$child_node = $host_node->single[$delta]->entity;
$this
->assertSame($new_title, $child_node
->label(), "Child {$delta} node title has been updated.");
}
}
}