View source  
  <?php
namespace Drupal\Tests\file\Functional;
use Drupal\node\Entity\Node;
use Drupal\user\RoleInterface;
use Drupal\file\Entity\File;
class FileFieldAnonymousSubmissionTest extends FileFieldTestBase {
  
  protected $defaultTheme = 'stark';
  
  protected function setUp() {
    parent::setUp();
    
    user_role_change_permissions(RoleInterface::ANONYMOUS_ID, [
      'create article content' => TRUE,
      'access content' => TRUE,
    ]);
  }
  
  public function testAnonymousNode() {
    $bundle_label = 'Article';
    $node_title = 'test page';
    
    $this
      ->drupalLogout();
    $this
      ->drupalGet('node/add/article');
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $this
      ->assertText(strip_tags(t('Create @name', [
      '@name' => $bundle_label,
    ])));
    $edit = [
      'title[0][value]' => $node_title,
      'body[0][value]' => 'Test article',
    ];
    $this
      ->drupalPostForm(NULL, $edit, 'Save');
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $t_args = [
      '@type' => $bundle_label,
      '%title' => $node_title,
    ];
    $this
      ->assertText(strip_tags(t('@type %title has been created.', $t_args)), 'The node was created.');
    $matches = [];
    if (preg_match('@node/(\\d+)$@', $this
      ->getUrl(), $matches)) {
      $nid = end($matches);
      $this
        ->assertNotEqual($nid, 0, 'The node ID was extracted from the URL.');
      $node = Node::load($nid);
      $this
        ->assertNotEqual($node, NULL, 'The node was loaded successfully.');
    }
  }
  
  public function testAnonymousNodeWithFile() {
    $bundle_label = 'Article';
    $node_title = 'Test page';
    $this
      ->createFileField('field_image', 'node', 'article', [], [
      'file_extensions' => 'txt png',
    ]);
    
    $this
      ->drupalLogout();
    $this
      ->drupalGet('node/add/article');
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $this
      ->assertText(strip_tags(t('Create @name', [
      '@name' => $bundle_label,
    ])));
    
    $image = $this
      ->getTestFile('image');
    
    $edit = [
      'title[0][value]' => $node_title,
      'body[0][value]' => 'Test article',
      'files[field_image_0]' => $this->container
        ->get('file_system')
        ->realpath($image
        ->getFileUri()),
    ];
    $this
      ->drupalPostForm(NULL, $edit, 'Save');
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $t_args = [
      '@type' => $bundle_label,
      '%title' => $node_title,
    ];
    $this
      ->assertText(strip_tags(t('@type %title has been created.', $t_args)), 'The node was created.');
    $matches = [];
    if (preg_match('@node/(\\d+)$@', $this
      ->getUrl(), $matches)) {
      $nid = end($matches);
      $this
        ->assertNotEqual($nid, 0, 'The node ID was extracted from the URL.');
      $node = Node::load($nid);
      $this
        ->assertNotEqual($node, NULL, 'The node was loaded successfully.');
      $this
        ->assertFileExists(File::load($node->field_image->target_id)
        ->getFileUri());
    }
  }
  
  public function testAnonymousNodeWithFileWithoutTitle() {
    $this
      ->drupalLogout();
    $this
      ->doTestNodeWithFileWithoutTitle();
  }
  
  public function testAuthenticatedNodeWithFileWithoutTitle() {
    $admin_user = $this
      ->drupalCreateUser([
      'bypass node access',
      'access content overview',
      'administer nodes',
    ]);
    $this
      ->drupalLogin($admin_user);
    $this
      ->doTestNodeWithFileWithoutTitle();
  }
  
  protected function doTestNodeWithFileWithoutTitle() {
    $bundle_label = 'Article';
    $node_title = 'Test page';
    $this
      ->createFileField('field_image', 'node', 'article', [], [
      'file_extensions' => 'txt png',
    ]);
    
    $this
      ->drupalGet('node/add/article');
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $this
      ->assertText(strip_tags(t('Create @name', [
      '@name' => $bundle_label,
    ])));
    
    $image = $this
      ->getTestFile('image');
    
    $edit = [
      'body[0][value]' => 'Test article',
      'files[field_image_0]' => $this->container
        ->get('file_system')
        ->realpath($image
        ->getFileUri()),
    ];
    if (!$this->loggedInUser) {
      $label = 'Save';
    }
    else {
      $label = 'Save';
    }
    $this
      ->drupalPostForm(NULL, $edit, $label);
    $this
      ->assertSession()
      ->statusCodeEquals(200);
    $t_args = [
      '@type' => $bundle_label,
      '%title' => $node_title,
    ];
    $this
      ->assertNoText(strip_tags(t('@type %title has been created.', $t_args)), 'The node was created.');
    $this
      ->assertText('Title field is required.');
    
    $edit = [
      'title[0][value]' => $node_title,
    ];
    $this
      ->drupalPostForm(NULL, $edit, $label);
    
    $t_args = [
      '@type' => $bundle_label,
      '%title' => $node_title,
    ];
    $this
      ->assertText(strip_tags(t('@type %title has been created.', $t_args)), 'The node was created.');
    $matches = [];
    if (preg_match('@node/(\\d+)$@', $this
      ->getUrl(), $matches)) {
      $nid = end($matches);
      $this
        ->assertNotEqual($nid, 0, 'The node ID was extracted from the URL.');
      $node = Node::load($nid);
      $this
        ->assertNotEqual($node, NULL, 'The node was loaded successfully.');
      $this
        ->assertFileExists(File::load($node->field_image->target_id)
        ->getFileUri());
    }
  }
}