function FileExampleTest::testFileExampleBasic

Test the basic File Example UI.

  • Create a directory to work with.
  • For each scheme create and read files using each of the three methods.

File

modules/file_example/tests/src/Functional/FileExampleTest.php, line 36

Class

FileExampleTest
Functional tests for the File Example module.

Namespace

Drupal\Tests\file_example\Functional

Code

public function testFileExampleBasic() {
  $assert = $this->assertSession();
  // Our test user needs to access some non-standard file types,
  // so we bless it accordingly.
  $permissions = [
    'use file example',
    'read private files',
    'read temporary files',
    'read session files',
  ];
  $priviledged_user = $this->drupalCreateUser($permissions);
  $this->drupalLogin($priviledged_user);
  $expected_text = [
    'Write managed file' => 'Saved managed file',
    'Write unmanaged file' => 'Saved file as',
    'Unmanaged using PHP' => 'Saved file as',
  ];
  // For each of the three buttons == three write types.
  $buttons = [
    'Write managed file',
    'Write unmanaged file',
    'Unmanaged using PHP',
  ];
  foreach ($buttons as $button) {
    // For each scheme supported by Drupal + the session:// wrapper,
    // which is defined in the stream_wrapper_exampnle.
    $schemes = [
      'public',
      'private',
      'temporary',
      'session',
    ];
    foreach ($schemes as $scheme) {
      // Create a directory for use.
      $dirname = $scheme . '://' . $this->randomMachineName(10);
      // Directory does not yet exist; assert that.
      $edit = [
        'directory_name' => $dirname,
      ];
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Check to see if directory exists');
      $assert->pageTextContains((string) new FormattableMarkup('Directory @dirname does not exist', [
        '@dirname' => $dirname,
      ]));
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Create directory');
      $assert->pageTextContains((string) new FormattableMarkup('Directory @dirname is ready for use', [
        '@dirname' => $dirname,
      ]));
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Check to see if directory exists');
      $assert->pageTextContains((string) new FormattableMarkup('Directory @dirname exists', [
        '@dirname' => $dirname,
      ]));
      // Create a file in the directory we created.
      $content = $this->randomMachineName(30);
      $filename = $dirname . '/' . $this->randomMachineName(30) . '.txt';
      // Assert that the file we're about to create does not yet exist.
      $edit = [
        'fileops_file' => $filename,
      ];
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Check to see if file exists');
      $assert->pageTextContains((string) new FormattableMarkup('The file @filename does not exist', [
        '@filename' => $filename,
      ]));
      dump("Processing button={$button}, scheme={$scheme}, dir={$dirname}, file={$filename}");
      $edit = [
        'write_contents' => $content,
        'destination' => $filename,
      ];
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, $button);
      dump($expected_text[$button]);
      $assert->pageTextContains($expected_text[$button]);
      // Capture the name of the output file, as it might have changed due
      // to file renaming.
      $element = $this->xpath('//span[@id="uri"]');
      $output_filename = (string) $element[0]->getText();
      dump($output_filename);
      // Click the link provided that is an easy way to get the data for
      // checking and make sure that the data we put in is what we get out.
      if (!in_array($scheme, [])) {
        $this->clickLink('this URL');
        $assert->statusCodeEquals(200);
        // assertText give sketchy answers when the content is *exactly* the
        // contents of the buffer, so let's do something less fragile.
        // $this->assertText($content);
        $buffer = $this->getSession()
          ->getPage()
          ->getContent();
        $this->assertEquals($content, $buffer);
      }
      // Verify that the file exists.
      $edit = [
        'fileops_file' => $filename,
      ];
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Check to see if file exists');
      $assert->pageTextContains("The file {$filename} exists");
      // Now read the file that got written above and verify that we can use
      // the writing tools.
      $edit = [
        'fileops_file' => $output_filename,
      ];
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Read the file and store it locally');
      $assert->pageTextContains('The file was read and copied');
      $edit = [
        'fileops_file' => $filename,
      ];
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Delete file');
      $assert->pageTextContains('Successfully deleted');
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Check to see if file exists');
      $assert->pageTextContains((string) new FormattableMarkup('The file @filename does not exist', [
        '@filename' => $filename,
      ]));
      $edit = [
        'directory_name' => $dirname,
      ];
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Delete directory');
      $this->drupalGet('examples/file_example');
      $this->submitForm($edit, 'Check to see if directory exists');
      $assert->pageTextContains((string) new FormattableMarkup('Directory @dirname does not exist', [
        '@dirname' => $dirname,
      ]));
    }
  }
}