You are here

public function SimplenewsSubscribeTest::testSubscribeAnonymous in Simplenews 8.2

Same name and namespace in other branches
  1. 3.x tests/src/Functional/SimplenewsSubscribeTest.php \Drupal\Tests\simplenews\Functional\SimplenewsSubscribeTest::testSubscribeAnonymous()

TestSubscribeAnonymous.

Steps performed: 0. Preparation 1. Subscribe anonymous via block 2. Subscribe anonymous via subscription page 3. Subscribe anonymous via multi block.

File

tests/src/Functional/SimplenewsSubscribeTest.php, line 317

Class

SimplenewsSubscribeTest
Un/subscription of anonymous and authenticated users.

Namespace

Drupal\Tests\simplenews\Functional

Code

public function testSubscribeAnonymous() {

  // 0. Preparation
  // Login admin
  // Set permission for anonymous to subscribe
  // Enable newsletter block
  // Logout admin.
  $admin_user = $this
    ->drupalCreateUser([
    'administer blocks',
    'administer content types',
    'administer nodes',
    'access administration pages',
    'administer newsletters',
    'administer permissions',
  ]);
  $this
    ->drupalLogin($admin_user);

  // Create some newsletters for multi-sign up block.
  $this
    ->drupalGet('admin/config/services/simplenews');
  for ($i = 0; $i < 5; $i++) {
    $this
      ->clickLink(t('Add newsletter'));
    $name = $this
      ->randomMachineName();
    $edit = [
      'name' => $name,
      'id' => strtolower($name),
      'description' => $this
        ->randomString(20),
      'opt_inout' => 'double',
    ];
    $this
      ->drupalPostForm(NULL, $edit, t('Save'));
  }
  $newsletter_id = $this
    ->getRandomNewsletter();
  $this
    ->drupalLogout();

  // @codingStandardsIgnoreLine

  //file_put_contents('output.html', $this->drupalGetContent());

  // 1. Subscribe anonymous via block
  // Subscribe + submit
  // Assert confirmation message
  // Assert outgoing email
  //
  // Confirm using mail link
  // Confirm using mail link
  // Assert confirmation message
  // Setup subscription block with subscription form.
  $block_settings = [
    'newsletters' => [
      $newsletter_id,
    ],
    'message' => $this
      ->randomMachineName(4),
  ];
  $single_block = $this
    ->setupSubscriptionBlock($block_settings);

  // Testing invalid email error message.
  $mail = '@example.com';
  $edit = [
    'mail[0][value]' => $mail,
  ];
  $this
    ->drupalPostForm('', $edit, t('Subscribe'));
  $this
    ->assertText(t('The email address @mail is not valid', [
    '@mail' => $mail,
  ]));

  // Now with valid email.
  $mail = $this
    ->randomEmail(8);
  $edit = [
    'mail[0][value]' => $mail,
  ];
  $this
    ->drupalPostForm('', $edit, t('Subscribe'));
  $this
    ->assertText(t('You will receive a confirmation e-mail shortly containing further instructions on how to complete your subscription.'));
  $subscriber = Subscriber::loadByMail($mail);
  $this
    ->assertNotNull($subscriber, 'New subscriber entity successfully loaded.');
  $subscription = $subscriber
    ->getSubscription($newsletter_id);
  $this
    ->assertEquals(SIMPLENEWS_SUBSCRIPTION_STATUS_UNCONFIRMED, $subscription->status, t('Subscription is unconfirmed'));
  $confirm_url = $this
    ->extractConfirmationLink($this
    ->getMail(0));
  $this
    ->drupalGet($confirm_url);
  $newsletter = Newsletter::load($newsletter_id);
  $this
    ->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', [
    '%user' => simplenews_mask_mail($mail),
    '%newsletter' => $newsletter->name,
  ]));
  $this
    ->drupalPostForm(NULL, [], t('Subscribe'));
  $this
    ->assertRaw(t('%user was added to the %newsletter mailing list.', [
    '%user' => $mail,
    '%newsletter' => $newsletter->name,
  ]));
  $this
    ->assertUrl(new Url('<front>'));

  // Test that it is possible to register with a mail address that is already
  // a subscriber.
  $site_config = $this
    ->config('user.settings');
  $site_config
    ->set('register', 'visitors');
  $site_config
    ->set('verify_mail', FALSE);
  $site_config
    ->save();
  $pass = $this
    ->randomMachineName();
  $edit = [
    'name' => $this
      ->randomMachineName(),
    'mail' => $mail,
    'pass[pass1]' => $pass,
    'pass[pass2]' => $pass,
  ];
  $this
    ->drupalPostForm('user/register', $edit, t('Create new account'));

  // Verify confirmation messages.
  $this
    ->assertText(t('Registration successful. You are now logged in.'));

  // Verify that the subscriber has been updated and references to the correct
  // user.
  \Drupal::entityTypeManager()
    ->getStorage('simplenews_subscriber')
    ->resetCache();
  $subscriber = Subscriber::loadByMail($mail);
  $account = user_load_by_mail($mail);
  $this
    ->assertEqual($subscriber
    ->getUserId(), $account
    ->id());
  $this
    ->assertEqual($account
    ->getDisplayName(), $edit['name']);
  $this
    ->drupalLogout();

  // Disable the newsletter block.
  $single_block
    ->delete();

  // 2. Subscribe anonymous via subscription page
  // Subscribe + submit
  // Assert confirmation message
  // Assert outgoing email
  //
  // Confirm using mail link
  // Confirm using mail link
  // Assert confirmation message.
  $mail = $this
    ->randomEmail(8);
  $edit = [
    "subscriptions[{$newsletter_id}]" => '1',
    'mail[0][value]' => $mail,
  ];
  $this
    ->drupalPostForm('newsletter/subscriptions', $edit, t('Subscribe'));
  $this
    ->assertText(t('You will receive a confirmation e-mail shortly containing further instructions on how to complete your subscription.'));
  $confirm_url = $this
    ->extractConfirmationLink($this
    ->getMail(2));
  $this
    ->drupalGet($confirm_url);
  $newsletter = Newsletter::load($newsletter_id);
  $this
    ->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', [
    '%user' => simplenews_mask_mail($mail),
    '%newsletter' => $newsletter->name,
  ]));
  $this
    ->drupalPostForm($confirm_url, [], t('Subscribe'));
  $this
    ->assertRaw(t('%user was added to the %newsletter mailing list.', [
    '%user' => $mail,
    '%newsletter' => $newsletter->name,
  ]));

  // 3. Subscribe anonymous via multi block.
  // Setup subscription block with subscription form.
  $block_settings = [
    'newsletters' => array_keys(simplenews_newsletter_get_all()),
    'message' => $this
      ->randomMachineName(4),
  ];
  $this
    ->setupSubscriptionBlock($block_settings);

  // Try to submit multi-signup form without selecting a newsletter.
  $mail = $this
    ->randomEmail(8);
  $edit = [
    'mail[0][value]' => $mail,
  ];
  $this
    ->drupalPostForm('', $edit, t('Subscribe'));
  $this
    ->assertText(t('You must select at least one newsletter.'));

  // Now fill out the form and try again. The e-mail should still be listed.
  $edit = [
    'subscriptions[' . $newsletter_id . ']' => TRUE,
  ];
  $this
    ->drupalPostForm(NULL, $edit, t('Subscribe'));
  $this
    ->assertText(t('You will receive a confirmation e-mail shortly containing further instructions on how to complete your subscription.'));
  $confirm_url = $this
    ->extractConfirmationLink($this
    ->getMail(3));
  $this
    ->drupalGet($confirm_url);
  $newsletter = Newsletter::load($newsletter_id);
  $this
    ->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', [
    '%user' => simplenews_mask_mail($mail),
    '%newsletter' => $newsletter->name,
  ]));
  $this
    ->drupalPostForm($confirm_url, [], t('Subscribe'));
  $this
    ->assertRaw(t('%user was added to the %newsletter mailing list.', [
    '%user' => $mail,
    '%newsletter' => $newsletter->name,
  ]));

  // Try to subscribe again, this should not re-set the status to unconfirmed.
  $edit = [
    'mail[0][value]' => $mail,
    'subscriptions[' . $newsletter_id . ']' => TRUE,
  ];
  $this
    ->drupalPostForm(NULL, $edit, t('Subscribe'));
  $this
    ->assertText(t('You will receive a confirmation e-mail shortly containing further instructions on how to complete your subscription.'));
  $subscriber = Subscriber::loadByMail($mail);
  $this
    ->assertNotEqual($subscriber, FALSE, 'New subscriber entity successfully loaded.');
  $subscription = $subscriber
    ->getSubscription($newsletter_id);
  $this
    ->assertEquals(SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, $subscription->status);

  // Now the same with the newsletter/subscriptions page.
  $mail = $this
    ->randomEmail(8);
  $edit = [
    'mail[0][value]' => $mail,
  ];
  $this
    ->drupalPostForm('newsletter/subscriptions', $edit, t('Subscribe'));
  $this
    ->assertText(t('You must select at least one newsletter.'));

  // Now fill out the form and try again.
  $edit = [
    'subscriptions[' . $newsletter_id . ']' => TRUE,
  ];
  $this
    ->drupalPostForm(NULL, $edit, t('Subscribe'));
  $this
    ->assertText(t('You will receive a confirmation e-mail shortly containing further instructions on how to complete your subscription.'));
  $confirm_url = $this
    ->extractConfirmationLink($this
    ->getMail(5));
  $this
    ->drupalGet($confirm_url);
  $newsletter = Newsletter::load($newsletter_id);
  $this
    ->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', [
    '%user' => simplenews_mask_mail($mail),
    '%newsletter' => $newsletter->name,
  ]));
  $this
    ->drupalPostForm($confirm_url, [], t('Subscribe'));
  $this
    ->assertRaw(t('%user was added to the %newsletter mailing list.', [
    '%user' => $mail,
    '%newsletter' => $newsletter->name,
  ]));

  // Test unsubscribe on newsletter/subscriptions page.
  $edit = [
    'mail[0][value]' => $mail,
  ];
  $this
    ->drupalPostForm('newsletter/subscriptions', $edit, t('Unsubscribe'));
  $this
    ->assertText(t('You must select at least one newsletter.'));

  // Now fill out the form and try again.
  $edit = [
    'subscriptions[' . $newsletter_id . ']' => TRUE,
  ];
  $this
    ->drupalPostForm(NULL, $edit, t('Unsubscribe'));
  $this
    ->assertText(t('You will receive a confirmation e-mail shortly containing further instructions on how to cancel your subscription.'));
  $this
    ->assertMailText(t('We have received a request to remove the @mail', [
    '@mail' => $mail,
  ]), 6);
  $confirm_url = $this
    ->extractConfirmationLink($this
    ->getMail(6));
  $mails = $this
    ->getMails();
  $this
    ->assertEqual($mails[0]['from'], 'simpletest@example.com');
  $this
    ->assertEqual($mails[0]['headers']['From'], '"Drupal" <simpletest@example.com>');
  $this
    ->drupalGet($confirm_url);
  $newsletter = Newsletter::load($newsletter_id);
  $this
    ->assertRaw(t('Are you sure you want to remove %user from the %newsletter mailing list?', [
    '%user' => simplenews_mask_mail($mail),
    '%newsletter' => $newsletter->name,
  ]));
  $this
    ->drupalPostForm($confirm_url, [], t('Unsubscribe'));
  $this
    ->assertRaw(t('%user was unsubscribed from the %newsletter mailing list.', [
    '%user' => $mail,
    '%newsletter' => $newsletter->name,
  ]));

  // Visit the newsletter/subscriptions page with the hash.
  $subscriber = Subscriber::loadByMail($mail);
  $hash = simplenews_generate_hash($subscriber
    ->getMail(), 'manage');
  $this
    ->drupalGet('newsletter/subscriptions/' . $subscriber
    ->id() . '/' . REQUEST_TIME . '/' . $hash);
  $this
    ->assertText(t('Subscriptions for @mail', [
    '@mail' => $mail,
  ]));
  $edit = [
    'subscriptions[' . $newsletter_id . ']' => TRUE,
  ];
  $this
    ->drupalPostForm(NULL, $edit, t('Update'));
  $this
    ->assertText(t('The newsletter subscriptions for @mail have been updated.', [
    '@mail' => $mail,
  ]));

  // Make sure the subscription is confirmed.
  \Drupal::entityTypeManager()
    ->getStorage('simplenews_subscriber')
    ->resetCache();
  $subscriber = Subscriber::loadByMail($mail);
  $this
    ->assertTrue($subscriber
    ->isSubscribed($newsletter_id));
  $subscription = $subscriber
    ->getSubscription($newsletter_id);
  $this
    ->assertEquals(SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, $subscription->status);

  // Attempt to fetch the page using a wrong hash but correct format.
  $hash = simplenews_generate_hash($subscriber
    ->getMail() . 'a', 'manage');
  $this
    ->drupalGet('newsletter/subscriptions/' . $subscriber
    ->id() . '/' . REQUEST_TIME . '/' . $hash);
  $this
    ->assertResponse(404);

  // Attempt to unsubscribe a non-existing subscriber.
  $mail = $this
    ->randomEmail();
  $edit = [
    'mail[0][value]' => $mail,
    'subscriptions[' . $newsletter_id . ']' => TRUE,
  ];
  $this
    ->drupalPostForm('newsletter/subscriptions', $edit, t('Unsubscribe'));
  $this
    ->assertText(t('You will receive a confirmation e-mail shortly containing further instructions on how to cancel your subscription.'));
  $this
    ->assertMailText('is not subscribed to this mailing list', 7);

  // Test expired confirmation links.
  $edit = [
    'mail[0][value]' => $mail,
    'subscriptions[' . $newsletter_id . ']' => TRUE,
  ];
  $this
    ->drupalPostForm('newsletter/subscriptions', $edit, t('Subscribe'));
  $subscriber = Subscriber::loadByMail($mail);
  $expired_timestamp = REQUEST_TIME - 86401;
  $hash = simplenews_generate_hash($subscriber
    ->getMail(), 'add', $expired_timestamp);
  $url = 'newsletter/confirm/add/' . $subscriber
    ->id() . '/' . $newsletter_id . '/' . $expired_timestamp . '/' . $hash;
  $this
    ->drupalGet($url);
  $this
    ->assertText(t('This link has expired.'));
  $this
    ->drupalPostForm(NULL, [], t('Request new confirmation mail'));
  $confirm_url = $this
    ->extractConfirmationLink($this
    ->getMail(9));
  $this
    ->drupalGet($confirm_url);
  $newsletter = Newsletter::load($newsletter_id);
  $this
    ->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', [
    '%user' => simplenews_mask_mail($mail),
    '%newsletter' => $newsletter->name,
  ]));
  $this
    ->drupalPostForm($confirm_url, [], t('Subscribe'));
  $this
    ->assertRaw(t('%user was added to the %newsletter mailing list.', [
    '%user' => $mail,
    '%newsletter' => $newsletter->name,
  ]));

  // Make sure the subscription is confirmed now.
  \Drupal::entityTypeManager()
    ->getStorage('simplenews_subscriber')
    ->resetCache();
  $subscriber = Subscriber::loadByMail($mail);
  $this
    ->assertTrue($subscriber
    ->isSubscribed($newsletter_id));
  $subscription = $subscriber
    ->getSubscription($newsletter_id);
  $this
    ->assertEquals(SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, $subscription->status);
}