You are here

public function FileFieldDisplayTest::testNodeDisplay in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/file/tests/src/Functional/FileFieldDisplayTest.php \Drupal\Tests\file\Functional\FileFieldDisplayTest::testNodeDisplay()

Tests normal formatter display on node display.

File

core/modules/file/tests/src/Functional/FileFieldDisplayTest.php, line 25

Class

FileFieldDisplayTest
Tests the display of file fields in node and views.

Namespace

Drupal\Tests\file\Functional

Code

public function testNodeDisplay() {
  $field_name = strtolower($this
    ->randomMachineName());
  $type_name = 'article';
  $field_storage_settings = [
    'display_field' => '1',
    'display_default' => '1',
    'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
  ];
  $field_settings = [
    'description_field' => '1',
  ];
  $widget_settings = [];
  $this
    ->createFileField($field_name, 'node', $type_name, $field_storage_settings, $field_settings, $widget_settings);

  // Create a new node *without* the file field set, and check that the field
  // is not shown for each node display.
  $node = $this
    ->drupalCreateNode([
    'type' => $type_name,
  ]);

  // Check file_default last as the assertions below assume that this is the
  // case.
  $file_formatters = [
    'file_table',
    'file_url_plain',
    'hidden',
    'file_default',
  ];
  foreach ($file_formatters as $formatter) {
    if ($formatter === 'hidden') {
      $edit = [
        "fields[{$field_name}][region]" => 'hidden',
      ];
    }
    else {
      $edit = [
        "fields[{$field_name}][type]" => $formatter,
        "fields[{$field_name}][region]" => 'content',
      ];
    }
    $this
      ->drupalPostForm("admin/structure/types/manage/{$type_name}/display", $edit, t('Save'));
    $this
      ->drupalGet('node/' . $node
      ->id());
    $this
      ->assertNoText($field_name, new FormattableMarkup('Field label is hidden when no file attached for formatter %formatter', [
      '%formatter' => $formatter,
    ]));
  }
  $this
    ->generateFile('escaped-&-text', 64, 10, 'text');
  $test_file = File::create([
    'uri' => 'public://escaped-&-text.txt',
    'name' => 'escaped-&-text',
    'filesize' => filesize('public://escaped-&-text.txt'),
  ]);

  // Create a new node with the uploaded file.
  $nid = $this
    ->uploadNodeFile($test_file, $field_name, $type_name);

  // Check that the default formatter is displaying with the file name.
  $node_storage = $this->container
    ->get('entity_type.manager')
    ->getStorage('node');
  $node_storage
    ->resetCache([
    $nid,
  ]);
  $node = $node_storage
    ->load($nid);
  $node_file = File::load($node->{$field_name}->target_id);
  $file_link = [
    '#theme' => 'file_link',
    '#file' => $node_file,
  ];
  $default_output = \Drupal::service('renderer')
    ->renderRoot($file_link);
  $this
    ->assertRaw($default_output, 'Default formatter displaying correctly on full node view.');

  // Turn the "display" option off and check that the file is no longer displayed.
  $edit = [
    $field_name . '[0][display]' => FALSE,
  ];
  $this
    ->drupalPostForm('node/' . $nid . '/edit', $edit, t('Save'));
  $this
    ->assertNoRaw($default_output, 'Field is hidden when "display" option is unchecked.');

  // Add a description and make sure that it is displayed.
  $description = $this
    ->randomMachineName();
  $edit = [
    $field_name . '[0][description]' => $description,
    $field_name . '[0][display]' => TRUE,
  ];
  $this
    ->drupalPostForm('node/' . $nid . '/edit', $edit, t('Save'));
  $this
    ->assertText($description);

  // Ensure the filename in the link's title attribute is escaped.
  $this
    ->assertRaw('title="escaped-&-text.txt"');

  // Test that fields appear as expected after during the preview.
  // Add a second file.
  $name = 'files[' . $field_name . '_1][]';
  $edit_upload[$name] = \Drupal::service('file_system')
    ->realpath($test_file
    ->getFileUri());
  $this
    ->drupalPostForm("node/{$nid}/edit", $edit_upload, t('Upload'));

  // Uncheck the display checkboxes and go to the preview.
  $edit[$field_name . '[0][display]'] = FALSE;
  $edit[$field_name . '[1][display]'] = FALSE;
  $this
    ->drupalPostForm(NULL, $edit, t('Preview'));
  $this
    ->clickLink(t('Back to content editing'));
  $this
    ->assertRaw($field_name . '[0][display]', 'First file appears as expected.');
  $this
    ->assertRaw($field_name . '[1][display]', 'Second file appears as expected.');
  $this
    ->assertSession()
    ->responseContains($field_name . '[1][description]', 'Description of second file appears as expected.');

  // Check that the file fields don't contain duplicate HTML IDs.
  $this
    ->assertNoDuplicateIds();
}