public function SimplenewsSubscribeTest::testSubscribeAnonymous in Simplenews 8.2
Same name and namespace in other branches
- 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\FunctionalCode
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);
}