function FileOnTranslatedEntityTest::testSyncedFiles

Tests synced file fields on translated nodes.

File

core/modules/file/tests/src/Functional/FileOnTranslatedEntityTest.php, line 87

Class

FileOnTranslatedEntityTest
Uploads files to translated nodes.

Namespace

Drupal\Tests\file\Functional

Code

public function testSyncedFiles() {
  // Verify that the file field on the "Basic page" node type is translatable.
  $definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'page');
  $this->assertTrue($definitions[$this->fieldName]
    ->isTranslatable(), 'Node file field is translatable.');
  // Create a default language node.
  $default_language_node = $this->drupalCreateNode([
    'type' => 'page',
    'title' => 'Lost in translation',
  ]);
  // Edit the node to upload a file.
  $edit = [];
  $name = 'files[' . $this->fieldName . '_0]';
  $edit[$name] = \Drupal::service('file_system')->realpath($this->drupalGetTestFiles('text')[0]->uri);
  $this->drupalPostForm('node/' . $default_language_node->id() . '/edit', $edit, t('Save'));
  $first_fid = $this->getLastFileId();
  // Translate the node into French: remove the existing file.
  $this->drupalPostForm('node/' . $default_language_node->id() . '/translations/add/en/fr', [], t('Remove'));
  // Upload a different file.
  $edit = [];
  $edit['title[0][value]'] = 'Bill Murray';
  $name = 'files[' . $this->fieldName . '_0]';
  $edit[$name] = \Drupal::service('file_system')->realpath($this->drupalGetTestFiles('text')[1]->uri);
  $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
  // This inspects the HTML after the post of the translation, the file
  // should be displayed on the original node.
  $this->assertRaw('file--mime-text-plain');
  $second_fid = $this->getLastFileId();
  \Drupal::entityTypeManager()->getStorage('file')
    ->resetCache();
  /* @var $file \Drupal\file\FileInterface */
  // Ensure the file status of the first file permanent.
  $file = File::load($first_fid);
  $this->assertTrue($file->isPermanent());
  // Ensure the file status of the second file is permanent.
  $file = File::load($second_fid);
  $this->assertTrue($file->isPermanent());
  // Translate the node into dutch: remove the existing file.
  $this->drupalPostForm('node/' . $default_language_node->id() . '/translations/add/en/nl', [], t('Remove'));
  // Upload a different file.
  $edit = [];
  $edit['title[0][value]'] = 'Scarlett Johansson';
  $name = 'files[' . $this->fieldName . '_0]';
  $edit[$name] = \Drupal::service('file_system')->realpath($this->drupalGetTestFiles('text')[2]->uri);
  $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
  $third_fid = $this->getLastFileId();
  \Drupal::entityTypeManager()->getStorage('file')
    ->resetCache();
  // Ensure the first file is untouched.
  $file = File::load($first_fid);
  $this->assertTrue($file->isPermanent(), 'First file still exists and is permanent.');
  // This inspects the HTML after the post of the translation, the file
  // should be displayed on the original node.
  $this->assertRaw('file--mime-text-plain');
  // Ensure the file status of the second file is permanent.
  $file = File::load($second_fid);
  $this->assertTrue($file->isPermanent());
  // Ensure the file status of the third file is permanent.
  $file = File::load($third_fid);
  $this->assertTrue($file->isPermanent());
  // Edit the second translation: remove the existing file.
  $this->drupalPostForm('fr/node/' . $default_language_node->id() . '/edit', [], t('Remove'));
  // Upload a different file.
  $edit = [];
  $edit['title[0][value]'] = 'David Bowie';
  $name = 'files[' . $this->fieldName . '_0]';
  $edit[$name] = \Drupal::service('file_system')->realpath($this->drupalGetTestFiles('text')[3]->uri);
  $this->drupalPostForm(NULL, $edit, t('Save (this translation)'));
  $replaced_second_fid = $this->getLastFileId();
  \Drupal::entityTypeManager()->getStorage('file')
    ->resetCache();
  // Ensure the first and third files are untouched.
  $file = File::load($first_fid);
  $this->assertTrue($file->isPermanent(), 'First file still exists and is permanent.');
  $file = File::load($third_fid);
  $this->assertTrue($file->isPermanent());
  // Ensure the file status of the replaced second file is permanent.
  $file = File::load($replaced_second_fid);
  $this->assertTrue($file->isPermanent());
  // Delete the third translation.
  $this->drupalPostForm('nl/node/' . $default_language_node->id() . '/delete', [], t('Delete Dutch translation'));
  \Drupal::entityTypeManager()->getStorage('file')
    ->resetCache();
  // Ensure the first and replaced second files are untouched.
  $file = File::load($first_fid);
  $this->assertTrue($file->isPermanent(), 'First file still exists and is permanent.');
  $file = File::load($replaced_second_fid);
  $this->assertTrue($file->isPermanent());
  // Ensure the file status of the third file is now temporary.
  $file = File::load($third_fid);
  $this->assertTrue($file->isTemporary());
  // Delete the all translations.
  $this->drupalPostForm('node/' . $default_language_node->id() . '/delete', [], t('Delete all translations'));
  \Drupal::entityTypeManager()->getStorage('file')
    ->resetCache();
  // Ensure the file status of the all files are now temporary.
  $file = File::load($first_fid);
  $this->assertTrue($file->isTemporary(), 'First file still exists and is temporary.');
  $file = File::load($replaced_second_fid);
  $this->assertTrue($file->isTemporary());
}

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