You are here

public function WebformAttachmentTest::testWebformAttachment in Webform 8.5

Same name and namespace in other branches
  1. 6.x modules/webform_attachment/tests/src/Functional/WebformAttachmentTest.php \Drupal\Tests\webform_attachment\Functional\WebformAttachmentTest::testWebformAttachment()

Tests webform attachment.

File

modules/webform_attachment/tests/src/Functional/WebformAttachmentTest.php, line 27

Class

WebformAttachmentTest
Tests for webform example element.

Namespace

Drupal\Tests\webform_attachment\Functional

Code

public function testWebformAttachment() {
  global $base_url;
  $this
    ->drupalLogin($this->rootUser);

  /**************************************************************************/

  // Email.

  /**************************************************************************/
  $webform_id = 'test_attachment_email';
  $webform_attachment_email = Webform::load($webform_id);
  $attachment_date = date('Y-m-d');

  // Check that the attachment is added to the sent email.
  $sid = $this
    ->postSubmission($webform_attachment_email);
  $sent_email = $this
    ->getLastEmail();
  $this
    ->assertEqual($sent_email['params']['attachments'][0]['filename'], "attachment_token-{$attachment_date}.xml", "The attachment's file name");
  $this
    ->assertEqual($sent_email['params']['attachments'][0]['filemime'], 'application/xml', "The attachment's file mime type");
  $this
    ->assertEqual($sent_email['params']['attachments'][0]['filecontent'], "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<asx:abap xmlns:asx=\"http://www.sap.com/abapxml\" version=\"1.0\">\n   <asx:values>\n      <VERSION>1.0</VERSION>\n      <SENDER>johnsmith@example.com</SENDER>\n      <WEBFORM_ID>test_attachment_email</WEBFORM_ID>\n      <SOURCE>\n         <o2PARAVALU>\n            <NAME>Lastname</NAME>\n            <VALUE>Smith</VALUE>\n         </o2PARAVALU>\n         <o2PARAVALU>\n            <NAME>Firstname</NAME>\n            <VALUE>John</VALUE>\n         </o2PARAVALU>\n         <o2PARAVALU>\n            <NAME>Emailaddress</NAME>\n            <VALUE>johnsmith@example.com</VALUE>\n         </o2PARAVALU>\n      </SOURCE>\n   </asx:values>\n</asx:abap>", "The attachment's file content");

  // Check access to the attachment.
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/attachment_token/attachment_token-{$attachment_date}.xml");
  $this
    ->assertResponse(200, 'Access allowed to the attachment');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/attachment_token/any-file-name.text");
  $this
    ->assertResponse(200, 'Access allowed to the attachment with any file name,');
  $this
    ->drupalGet("/webform/not_a_webform/submissions/{$sid}/attachment/attachment/any-file-name.text");
  $this
    ->assertResponse(404, 'Page not found to not a webform');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/email/attachment-{$attachment_date}.xml");
  $this
    ->assertResponse(404, 'Page not found when not an attachment element is specified');

  /**************************************************************************/

  // Token.

  /**************************************************************************/
  $webform_id = 'test_attachment_token';
  $webform_attachment_token = Webform::load('test_attachment_token');
  $sid = $this
    ->postSubmissionTest($webform_attachment_token, [
    'textfield' => 'Some text',
  ]);

  // Check that both attachments are displayed on the results page.
  $this
    ->drupalGet('/admin/structure/webform/manage/test_attachment_token/results/submissions');
  $this
    ->assertRaw('<td><a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_token/test_token.txt">test_token.txt</a></td>');
  $this
    ->assertRaw('<td><a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_token_download/test_token.txt">Download</a></td>');

  // Check that only the download attachment is displayed on
  // the submission page.
  $this
    ->drupalGet("/admin/structure/webform/manage/test_attachment_token/submission/{$sid}");
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_token/test_token.txt">test_token.txt</a>');
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_token_download/test_token.txt">Download</a>');

  // Check the attachment's content.
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/webform_attachment_token_download/test_token.txt");
  $this
    ->assertRaw('textfield: Some text');

  /**************************************************************************/

  // Twig.

  /**************************************************************************/
  $webform_id = 'test_attachment_twig';
  $webform_attachment_twig = Webform::load('test_attachment_twig');
  $sid = $this
    ->postSubmissionTest($webform_attachment_twig, [
    'textfield' => 'Some text',
  ]);

  // Check that both attachments are displayed on the results page.
  $this
    ->drupalGet('/admin/structure/webform/manage/test_attachment_twig/results/submissions');
  $this
    ->assertRaw('<td><a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_twig/test_twig.xml">test_twig.xml</a></td>');
  $this
    ->assertRaw('<td><a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_twig_download/test_twig.xml">Download</a></td>');

  // Check that only the download attachment is displayed on
  // the submission page.
  $this
    ->drupalGet("/admin/structure/webform/manage/test_attachment_twig/submission/{$sid}");
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_twig/test_twig.txt">test_twig.xml</a>');
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_twig_download/test_twig.xml">Download</a>');

  // Check the attachment's content.
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/webform_attachment_twig_download/test_twig.xml");
  $this
    ->assertRaw('<?xml version="1.0"?>
<textfield>Some text</textfield>');

  /**************************************************************************/

  // URL.

  /**************************************************************************/
  $webform_id = 'test_attachment_url';
  $webform_attachment_url = Webform::load('test_attachment_url');
  $sid = $this
    ->postSubmissionTest($webform_attachment_url);

  // Check that both attachments are displayed on the results page.
  $this
    ->drupalGet('/admin/structure/webform/manage/test_attachment_url/results/submissions');
  $this
    ->assertRaw('<td><a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_url/MAINTAINERS.txt">MAINTAINERS.txt</a></td>');
  $this
    ->assertRaw('<td><a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_path/durpalicon.png">durpalicon.png</a></td>');
  $this
    ->assertRaw('<td><a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_url_download/MAINTAINERS.txt">Download</a></td>');

  // Check that only the download attachment is displayed on
  // the submission page.
  $this
    ->drupalGet("/admin/structure/webform/manage/test_attachment_url/submission/{$sid}");
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_url/MAINTAINERS.txt">MAINTAINERS.txt</a>');
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_path/durpalicon.png">durpalicon.png</a>');
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_url_download/MAINTAINERS.txt">Download</a>');
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_url/MAINTAINERS.txt">MAINTAINERS.txt</a>');
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/webform_attachment_url_download/MAINTAINERS.txt">Download</a>');

  // Check the attachment's content.
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/webform_attachment_url_download/MAINTAINERS.txt");
  $this
    ->assertRaw('https://www.drupal.org/contribute');

  /**************************************************************************/

  // Access.

  /**************************************************************************/

  // Switch to anonymous user.
  $this
    ->drupalLogout();
  $webform_id = 'test_attachment_access';
  $webform_attachment_access = Webform::load('test_attachment_access');
  $sid = $this
    ->postSubmission($webform_attachment_access);
  $webform_submission = WebformSubmission::load($sid);

  // Check access to anonymous attachment allowed via $element access rules.
  $this
    ->drupalGet("/admin/structure/webform/manage/test_attachment_url/submission/{$sid}");
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/anonymous/anonymous.txt">anonymous.txt</a>');
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/authenticated/authenticated.txt">authenticated.txt</a>');
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/private/private.txt">private.txt</a>');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/anonymous/anonymous.txt");
  $this
    ->assertResponse(200, 'Access allowed to anonymous.txt');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/authenticated/authenticated.txt");
  $this
    ->assertResponse(403, 'Access denied to authenticated.txt');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/private/private.txt");
  $this
    ->assertResponse(403, 'Access denied to private.txt');

  // Switch to authenticated user and set user as the submission's owner.
  $account = $this
    ->createUser();
  $webform_submission
    ->setOwnerId($account
    ->id())
    ->save();
  $this
    ->drupalLogin($account);

  // Check access to authenticated attachment allowed via $element access rules.
  $this
    ->drupalGet("/admin/structure/webform/manage/test_attachment_url/submission/{$sid}");
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/anonymous/anonymous.txt">anonymous.txt</a>');
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/authenticated/authenticated.txt">authenticated.txt</a>');
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/private/private.txt">private.txt</a>');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/anonymous/anonymous.txt");
  $this
    ->assertResponse(403, 'Access denied to anonymous.txt');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/authenticated/authenticated.txt");
  $this
    ->assertResponse(200, 'Access allow to authenticated.txt');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/private/private.txt");
  $this
    ->assertResponse(403, 'Access denied to private.txt');

  // Switch to admin user.
  $this
    ->drupalLogin($this->rootUser);

  // Check access to all attachment allowed for admin.
  $this
    ->drupalGet("/admin/structure/webform/manage/test_attachment_url/submission/{$sid}");
  $this
    ->assertNoRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/anonymous/anonymous.txt">anonymous.txt</a>');
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/authenticated/authenticated.txt">authenticated.txt</a>');
  $this
    ->assertRaw('<a href="' . $base_url . '/webform/' . $webform_id . '/submissions/' . $sid . '/attachment/private/private.txt">private.txt</a>');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/anonymous/anonymous.txt");
  $this
    ->assertResponse(403, 'Access denied to anonymous.txt');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/authenticated/authenticated.txt");
  $this
    ->assertResponse(200, 'Access allowed to authenticated.txt');
  $this
    ->drupalGet("/webform/{$webform_id}/submissions/{$sid}/attachment/private/private.txt");
  $this
    ->assertResponse(200, 'Access allowed to private.txt');

  /**************************************************************************/

  // Sanitize.

  /**************************************************************************/
  $webform_attachment_santize = Webform::load('test_attachment_sanitize');
  $sid = $this
    ->postSubmissionTest($webform_attachment_santize, [
    'textfield' => 'Some text!@#$%^&*)',
  ]);
  $webform_submission = WebformSubmission::load($sid);
  $element = $webform_attachment_santize
    ->getElement('webform_attachment_token');
  $this
    ->assertEqual(WebformAttachmentToken::getFileName($element, $webform_submission), 'some-text.txt');

  /**************************************************************************/

  // States (enabled/disabled).

  /**************************************************************************/
  $webform_id = 'test_attachment_states';
  $webform_attachment_states = Webform::load($webform_id);

  // Check that attachment is enabled.
  $this
    ->postSubmission($webform_attachment_states, [
    'attach' => TRUE,
  ]);
  $sent_email = $this
    ->getLastEmail();
  $this
    ->assert(isset($sent_email['params']['attachments'][0]), 'Attachment enabled via #states');

  // Check that attachment is disabled.
  $this
    ->postSubmission($webform_attachment_states, [
    'attach' => FALSE,
  ]);
  $sent_email = $this
    ->getLastEmail();
  $this
    ->assert(!isset($sent_email['params']['attachments'][0]), 'Attachment disabled via #states');
}