OverrideSectionsTest.php

Same filename in other branches
  1. 8.9.x core/modules/layout_builder/tests/src/Functional/Rest/OverrideSectionsTest.php
  2. 10 core/modules/layout_builder/tests/src/Functional/Rest/OverrideSectionsTest.php
  3. 11.x core/modules/layout_builder/tests/src/Functional/Rest/OverrideSectionsTest.php

Namespace

Drupal\Tests\layout_builder\Functional\Rest

File

core/modules/layout_builder/tests/src/Functional/Rest/OverrideSectionsTest.php

View source
<?php

namespace Drupal\Tests\layout_builder\Functional\Rest;

use Drupal\Core\Url;
use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage;
use Drupal\node\Entity\Node;
use GuzzleHttp\RequestOptions;

/**
 * Tests that override layout sections are not exposed via the REST API.
 *
 * @group layout_builder
 * @group rest
 */
class OverrideSectionsTest extends LayoutRestTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $resourceConfigId = 'entity.node';
    
    /**
     * {@inheritdoc}
     */
    protected $defaultTheme = 'stark';
    
    /**
     * {@inheritdoc}
     */
    public function setUp() : void {
        parent::setUp();
        // @todo Figure why field definitions have to cleared in
        //   https://www.drupal.org/project/drupal/issues/2985882.
        $this->container
            ->get('entity_field.manager')
            ->clearCachedFieldDefinitions();
    }
    
    /**
     * Tests that the layout override field is not normalized.
     */
    public function testOverrideField() {
        $this->assertCount(1, $this->node
            ->get(OverridesSectionStorage::FIELD_NAME));
        // Make a GET request and ensure override field is not included.
        $response = $this->request('GET', Url::fromRoute('rest.entity.node.GET', [
            'node' => $this->node
                ->id(),
        ]));
        $this->assertResourceResponse(200, FALSE, $response, [
            'config:filter.format.plain_text',
            'config:rest.resource.entity.node',
            'http_response',
            'node:1',
        ], [
            'languages:language_interface',
            'theme',
            'url.site',
            'user.permissions',
        ], FALSE, 'MISS');
        $get_data = $this->getDecodedContents($response);
        $this->assertSame('A node at rest will stay at rest.', $get_data['title'][0]['value']);
        $this->assertArrayNotHasKey('layout_builder__layout', $get_data);
        // Make a POST request without the override field.
        $new_node = [
            'type' => [
                [
                    'target_id' => 'bundle_with_section_field',
                ],
            ],
            'title' => [
                [
                    'value' => 'On with the rest of the test.',
                ],
            ],
        ];
        $response = $this->request('POST', Url::fromRoute('rest.entity.node.POST'), [
            RequestOptions::BODY => $this->serializer
                ->encode($new_node, static::$format),
        ]);
        $this->assertResourceResponse(201, FALSE, $response);
        $posted_node = $this->nodeStorage
            ->load(2);
        $this->assertEquals('On with the rest of the test.', $posted_node->getTitle());
        // Make a POST request with override field.
        $new_node['layout_builder__layout'] = [];
        $post_contents = $this->serializer
            ->encode($new_node, static::$format);
        $response = $this->request('POST', Url::fromRoute('rest.entity.node.POST'), [
            RequestOptions::BODY => $post_contents,
        ]);
        $this->assertResourceErrorResponse(403, 'Access denied on creating field \'layout_builder__layout\'.', $response);
        // Make a PATCH request without the override field.
        $patch_data = [
            'title' => [
                [
                    'value' => 'New and improved title',
                ],
            ],
            'type' => [
                [
                    'target_id' => 'bundle_with_section_field',
                ],
            ],
        ];
        $response = $this->request('PATCH', Url::fromRoute('rest.entity.node.PATCH', [
            'node' => 1,
        ]), [
            RequestOptions::BODY => $this->serializer
                ->encode($patch_data, static::$format),
        ]);
        $this->assertResourceResponse(200, FALSE, $response);
        $this->nodeStorage
            ->resetCache([
            1,
        ]);
        $this->node = $this->nodeStorage
            ->load(1);
        $this->assertEquals('New and improved title', $this->node
            ->getTitle());
        // Make a PATCH request with the override field.
        $patch_data['title'][0]['value'] = 'This title will not save.';
        $patch_data['layout_builder__layout'] = [];
        $response = $this->request('PATCH', Url::fromRoute('rest.entity.node.PATCH', [
            'node' => 1,
        ]), [
            RequestOptions::BODY => $this->serializer
                ->encode($patch_data, static::$format),
        ]);
        $this->assertResourceErrorResponse(403, 'Access denied on updating field \'layout_builder__layout\'.', $response);
        // Ensure the title has not changed.
        $this->assertEquals('New and improved title', Node::load(1)->getTitle());
    }

}

Classes

Title Deprecated Summary
OverrideSectionsTest Tests that override layout sections are not exposed via the REST API.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.