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' => t('Test Node'), ]); $this->drupalGet('quickedit/image/info/node/' . $node->id() . '/' . $this->fieldName . '/' . $node->language()->getId() . '/default'); $this->assertResponse('403'); $this->drupalPost('quickedit/image/upload/node/' . $node->id() . '/' . $this->fieldName . '/' . $node->language()->getId() . '/default', 'application/json', []); $this->assertResponse('403'); } /** * Tests that the field info route returns expected data. */ public function testFieldInfo() { // Create a test Node. $node = $this->drupalCreateNode([ 'type' => 'article', 'title' => t('Test Node'), ]); $info = $this->drupalGetJSON('quickedit/image/info/node/' . $node->id() . '/' . $this->fieldName . '/' . $node->language()->getId() . '/default'); // 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' => t('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->assertTrue($valid_image); $this->uploadImage($valid_image, $node->id(), $this->fieldName, $node->language()->getId()); $this->assertText('fid', t('Valid upload completed successfully.')); } /** * Tests that uploading a invalid image does not work. */ public function testInvalidUpload() { // Create a test Node. $node = $this->drupalCreateNode([ 'type' => 'article', 'title' => t('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->assertTrue($invalid_image); $this->uploadImage($invalid_image, $node->id(), $this->fieldName, $node->language()->getId()); $this->assertText('main_error', t('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. * * @return mixed * The content returned from the call to $this->curlExec(). */ public function uploadImage($image, $nid, $field_name, $langcode) { $filepath = $this->container->get('file_system')->realpath($image->uri); $data = [ 'files[image]' => curl_file_create($filepath), ]; $path = 'quickedit/image/upload/node/' . $nid . '/' . $field_name . '/' . $langcode . '/default'; // We assemble the curl request ourselves as drupalPost cannot process file // uploads, and drupalPostForm only works with typical Drupal forms. return $this->curlExec([ CURLOPT_URL => $this->buildUrl($path, []), CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => $data, CURLOPT_HTTPHEADER => [ 'Accept: application/json', 'Content-Type: multipart/form-data', ], ]); } }