QuickEditImageControllerTest.php

Same filename in this branch
  1. 9 core/modules/image/tests/src/Kernel/QuickEditImageControllerTest.php
Same filename in other branches
  1. 8.9.x core/modules/image/tests/src/Functional/QuickEditImageControllerTest.php

Namespace

Drupal\Tests\quickedit\Functional

File

core/modules/quickedit/tests/src/Functional/QuickEditImageControllerTest.php

View source
<?php

namespace Drupal\Tests\quickedit\Functional;

use Drupal\Component\Serialization\Json;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\image\Kernel\ImageFieldCreationTrait;
use Drupal\Tests\TestFileCreationTrait;

/**
 * Tests the endpoints used by the "image" in-place editor.
 *
 * @group quickedit
 * @group legacy
 */
class QuickEditImageControllerTest extends BrowserTestBase {
    use ImageFieldCreationTrait;
    use TestFileCreationTrait {
        getTestFiles as drupalGetTestFiles;
    }
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'node',
        'image',
        'quickedit',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected $defaultTheme = 'stark';
    
    /**
     * The machine name of our image field.
     *
     * @var string
     */
    protected $fieldName;
    
    /**
     * A user with permissions to edit articles and use Quick Edit.
     *
     * @var \Drupal\user\UserInterface
     */
    protected $contentAuthorUser;
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        // Create the Article node type.
        $this->drupalCreateContentType([
            'type' => 'article',
            'name' => 'Article',
        ]);
        // Log in as a content author who can use Quick Edit and edit Articles.
        $this->contentAuthorUser = $this->drupalCreateUser([
            'access contextual links',
            'access in-place editing',
            'access content',
            'create article content',
            'edit any article content',
            'delete any article content',
        ]);
        $this->drupalLogin($this->contentAuthorUser);
        // Create a field with basic resolution validators.
        $this->fieldName = strtolower($this->randomMachineName());
        $field_settings = [
            'max_resolution' => '100x',
            'min_resolution' => '50x',
        ];
        $this->createImageField($this->fieldName, 'article', [], $field_settings);
    }
    
    /**
     * Tests that routes restrict access for un-privileged users.
     */
    public function testAccess() {
        // Create an anonymous user.
        $user = $this->createUser();
        $this->drupalLogin($user);
        // Create a test Node.
        $node = $this->drupalCreateNode([
            'type' => 'article',
            'title' => 'Test Node',
        ]);
        $this->drupalGet('quickedit/image/info/node/' . $node->id() . '/' . $this->fieldName . '/' . $node->language()
            ->getId() . '/default');
        $this->assertSession()
            ->statusCodeEquals(403);
        
        /** @var \Symfony\Component\BrowserKit\Client $client */
        $client = $this->getSession()
            ->getDriver()
            ->getClient();
        $client->request('POST', '/quickedit/image/upload/node/' . $node->id() . '/' . $this->fieldName . '/' . $node->language()
            ->getId() . '/default');
        $this->assertEquals('403', $client->getResponse()
            ->getStatusCode());
    }
    
    /**
     * Tests that the field info route returns expected data.
     */
    public function testFieldInfo() {
        // Create a test Node.
        $node = $this->drupalCreateNode([
            'type' => 'article',
            'title' => 'Test Node',
        ]);
        $json = $this->drupalGet('quickedit/image/info/node/' . $node->id() . '/' . $this->fieldName . '/' . $node->language()
            ->getId() . '/default', [
            'query' => [
                '_format' => 'json',
            ],
        ]);
        $info = Json::decode($json);
        // Assert that the default settings for our field are respected by our JSON
        // endpoint.
        $this->assertTrue($info['alt_field']);
        $this->assertFalse($info['title_field']);
    }
    
    /**
     * Tests that uploading a valid image works.
     */
    public function testValidImageUpload() {
        // Create a test Node.
        $node = $this->drupalCreateNode([
            'type' => 'article',
            'title' => 'Test Node',
        ]);
        // We want a test image that is a valid size.
        $valid_image = FALSE;
        $image_factory = $this->container
            ->get('image.factory');
        foreach ($this->drupalGetTestFiles('image') as $image) {
            $image_file = $image_factory->get($image->uri);
            if ($image_file->getWidth() > 50 && $image_file->getWidth() < 100) {
                $valid_image = $image;
                break;
            }
        }
        $this->assertNotFalse($valid_image);
        $this->drupalLogin($this->contentAuthorUser);
        $this->uploadImage($valid_image, $node->id(), $this->fieldName, $node->language()
            ->getId());
        $this->assertStringContainsString('"fid":"1"', $this->getSession()
            ->getPage()
            ->getContent(), 'Valid upload completed successfully.');
    }
    
    /**
     * Tests that uploading an invalid image does not work.
     */
    public function testInvalidUpload() {
        // Create a test Node.
        $node = $this->drupalCreateNode([
            'type' => 'article',
            'title' => 'Test Node',
        ]);
        // We want a test image that will fail validation.
        $invalid_image = FALSE;
        
        /** @var \Drupal\Core\Image\ImageFactory $image_factory */
        $image_factory = $this->container
            ->get('image.factory');
        foreach ($this->drupalGetTestFiles('image') as $image) {
            
            /** @var \Drupal\Core\Image\ImageInterface $image_file */
            $image_file = $image_factory->get($image->uri);
            if ($image_file->getWidth() < 50 || $image_file->getWidth() > 100) {
                $invalid_image = $image;
                break;
            }
        }
        $this->assertNotFalse($invalid_image);
        $this->drupalLogin($this->contentAuthorUser);
        $this->uploadImage($invalid_image, $node->id(), $this->fieldName, $node->language()
            ->getId());
        $this->assertStringContainsString('"main_error":"The image failed validation."', $this->getSession()
            ->getPage()
            ->getContent(), 'Invalid upload returned errors.');
    }
    
    /**
     * Uploads an image using the image module's Quick Edit route.
     *
     * @param object $image
     *   The image to upload.
     * @param int $nid
     *   The target node ID.
     * @param string $field_name
     *   The target field machine name.
     * @param string $langcode
     *   The langcode to use when setting the field's value.
     */
    public function uploadImage($image, $nid, $field_name, $langcode) {
        $filepath = $this->container
            ->get('file_system')
            ->realpath($image->uri);
        $path = 'quickedit/image/upload/node/' . $nid . '/' . $field_name . '/' . $langcode . '/default';
        $this->prepareRequest();
        $client = $this->getSession()
            ->getDriver()
            ->getClient();
        $client->request('POST', $this->buildUrl($path, []), [], [
            'files[image]' => $filepath,
        ]);
    }

}

Classes

Title Deprecated Summary
QuickEditImageControllerTest Tests the endpoints used by the "image" in-place editor.

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