class SimplenewsSubscribeTest in Simplenews 8
(un)subscription of anonymous and authenticated users.
Subscription via block, subscription page and account page
@group simplenews
Hierarchy
- class \Drupal\simpletest\TestBase uses TestSetupTrait, AssertHelperTrait, ConfigTestTrait, RandomGeneratorTrait, GeneratePermutationsTrait
- class \Drupal\simpletest\WebTestBase uses AssertMailTrait, FunctionalTestSetupTrait, AssertContentTrait, AssertPageCacheContextsAndTagsTrait, BlockCreationTrait, EntityViewTrait, ContentTypeCreationTrait, NodeCreationTrait, TestFileCreationTrait, CronRunTrait, UserCreationTrait, XdebugRequestTrait
- class \Drupal\simplenews\Tests\SimplenewsTestBase
- class \Drupal\simplenews\Tests\SimplenewsSubscribeTest
- class \Drupal\simplenews\Tests\SimplenewsTestBase
- class \Drupal\simpletest\WebTestBase uses AssertMailTrait, FunctionalTestSetupTrait, AssertContentTrait, AssertPageCacheContextsAndTagsTrait, BlockCreationTrait, EntityViewTrait, ContentTypeCreationTrait, NodeCreationTrait, TestFileCreationTrait, CronRunTrait, UserCreationTrait, XdebugRequestTrait
Expanded class hierarchy of SimplenewsSubscribeTest
File
- src/
Tests/ SimplenewsSubscribeTest.php, line 21 - Simplenews subscribe test functions.
Namespace
Drupal\simplenews\TestsView source
class SimplenewsSubscribeTest extends SimplenewsTestBase {
/**
* Subscribe to multiple newsletters at the same time.
*/
function testSubscribeMultiple() {
$admin_user = $this
->drupalCreateUser(array(
'administer blocks',
'administer content types',
'administer nodes',
'access administration pages',
'administer permissions',
'administer newsletters',
'administer simplenews subscriptions',
));
$this
->drupalLogin($admin_user);
$this
->drupalGet('admin/config/services/simplenews');
for ($i = 0; $i < 5; $i++) {
$this
->clickLink(t('Add newsletter'));
$name = $this
->randomMachineName();
$edit = array(
'name' => $name,
'id' => strtolower($name),
'description' => $this
->randomString(20),
'opt_inout' => 'double',
);
$this
->drupalPostForm(NULL, $edit, t('Save'));
}
$newsletters = simplenews_newsletter_get_all();
$this
->drupalLogout();
$enable = array_rand($newsletters, 3);
$mail = $this
->randomEmail(8);
$edit = array(
'mail[0][value]' => $mail,
);
foreach ($enable as $newsletter_id) {
$edit['subscriptions[' . $newsletter_id . ']'] = TRUE;
}
$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.'), t('Subscription confirmation e-mail sent.'));
// Verify listed changes.
foreach ($newsletters as $newsletter_id => $newsletter) {
$this
->assertMailText(t('Subscribe to @name', array(
'@name' => $newsletter->name,
)), 0, in_array($newsletter_id, $enable));
}
$mails = $this
->drupalGetMails();
$this
->assertEqual($mails[0]['from'], 'simpletest@example.com');
$this
->assertEqual($mails[0]['headers']['From'], '"Drupal" <simpletest@example.com>');
$confirm_url = $this
->extractConfirmationLink($this
->getMail(0));
$this
->drupalGet($confirm_url);
$this
->assertRaw(t('Are you sure you want to confirm the following subscription changes for %user?', array(
'%user' => simplenews_mask_mail($mail),
)), t('Subscription confirmation found.'));
// Verify listed changes.
foreach ($newsletters as $newsletter_id => $newsletter) {
if (in_array($newsletter_id, $enable)) {
$this
->assertText(t('Subscribe to @name', array(
'@name' => $newsletter->name,
)));
}
else {
$this
->assertNoText(t('Subscribe to @name', array(
'@name' => $newsletter->name,
)));
}
}
$this
->drupalPostForm($confirm_url, array(), t('Confirm'));
$this
->assertRaw(t('Subscription changes confirmed for %user.', array(
'%user' => $mail,
)), t('Anonymous subscriber added to newsletter'));
/** @var \Drupal\simplenews\Subscription\SubscriptionManagerInterface $subscription_manager */
$subscription_manager = \Drupal::service('simplenews.subscription_manager');
$subscription_manager
->reset();
$subscriber_storage = \Drupal::entityTypeManager()
->getStorage('simplenews_subscriber');
$subscriber_storage
->resetCache();
// Verify subscription changes.
foreach ($newsletters as $newsletter_id => $newsletter) {
$is_subscribed = $subscription_manager
->isSubscribed($mail, $newsletter_id);
$subscription_newsletter = $subscriber_storage
->getSubscriptionsByNewsletter($newsletter_id);
if (in_array($newsletter_id, $enable)) {
$this
->assertTrue($is_subscribed);
$this
->assertEqual(1, count($subscription_newsletter));
}
else {
$this
->assertFalse($is_subscribed);
$this
->assertEqual(0, count($subscription_newsletter));
}
}
// Go to the manage page and submit without changes.
$subscriber = simplenews_subscriber_load_by_mail($mail);
$hash = simplenews_generate_hash($subscriber
->getMail(), 'manage');
$this
->drupalPostForm('newsletter/subscriptions/' . $subscriber
->id() . '/' . REQUEST_TIME . '/' . $hash, array(), t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $mail,
)));
$this
->assertEqual(1, count($this
->drupalGetMails()), t('No confirmation mails have been sent.'));
// Unsubscribe from two of the three enabled newsletters.
$disable = array_rand(array_flip($enable), 2);
$edit = array(
'mail[0][value]' => $mail,
);
foreach ($disable as $newsletter_id) {
$edit['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.'), t('Subscription confirmation e-mail sent.'));
// Unsubscribe with no confirmed email.
$subscription_manager = \Drupal::service('simplenews.subscription_manager');
try {
$subscription_manager
->unsubscribe('new@email.com', $newsletter_id, FALSE);
$this
->fail('Exception not thrown.');
} catch (\Exception $e) {
$this
->assertEqual($e
->getMessage(), 'The subscriber does not exist.');
}
// Verify listed changes.
foreach ($newsletters as $newsletter_id => $newsletter) {
$this
->assertMailText(t('Unsubscribe from @name', array(
'@name' => $newsletter->name,
)), 1, in_array($newsletter_id, $disable));
}
$confirm_url = $this
->extractConfirmationLink($this
->getMail(1));
$this
->drupalGet($confirm_url);
$this
->assertRaw(t('Are you sure you want to confirm the following subscription changes for %user?', array(
'%user' => simplenews_mask_mail($mail),
)), t('Subscription confirmation found.'));
// Verify listed changes.
foreach ($newsletters as $newsletter_id => $newsletter) {
if (in_array($newsletter_id, $disable)) {
$this
->assertText(t('Unsubscribe from @name', array(
'@name' => $newsletter->name,
)));
}
else {
$this
->assertNoText(t('Unsubscribe from @name', array(
'@name' => $newsletter->name,
)));
}
}
$this
->drupalPostForm($confirm_url, array(), t('Confirm'));
$this
->assertRaw(t('Subscription changes confirmed for %user.', array(
'%user' => $mail,
)), t('Anonymous subscriber added to newsletter'));
// Verify subscription changes.
$subscriber_storage
->resetCache();
$subscription_manager
->reset();
$still_enabled = array_diff($enable, $disable);
foreach ($newsletters as $newsletter_id => $newsletter) {
$is_subscribed = $subscription_manager
->isSubscribed($mail, $newsletter_id);
if (in_array($newsletter_id, $still_enabled)) {
$this
->assertTrue($is_subscribed);
}
else {
$this
->assertFalse($is_subscribed);
}
}
// Make sure that a single change results in a non-multi confirmation mail.
$newsletter_id = reset($disable);
$edit = array(
'mail[0][value]' => $mail,
'subscriptions[' . $newsletter_id . ']' => TRUE,
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Subscribe'));
$this
->getMail(2);
// Load simplenews settings config object.
$config = $this
->config('simplenews.settings');
// Change behavior to always use combined mails.
$config
->set('subscription.use_combined', 'always');
$config
->save();
$edit = array(
'mail[0][value]' => $mail,
'subscriptions[' . $newsletter_id . ']' => TRUE,
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Subscribe'));
$this
->getMail(3);
// Change behavior to never, should send two separate mails.
$config
->set('subscription.use_combined', 'never');
$config
->save();
$edit = array(
'mail[0][value]' => $mail,
);
foreach ($disable as $newsletter_id) {
$edit['subscriptions[' . $newsletter_id . ']'] = TRUE;
}
$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.'), t('Subscription confirmation e-mail sent.'));
$this
->extractConfirmationLink($this
->getMail(4));
$this
->extractConfirmationLink($this
->getMail(5));
// Make sure that the /ok suffix works, unsubscribe from everything.
$config
->set('subscription.use_combined', 'multiple');
$config
->save();
$edit = array(
'mail[0][value]' => $mail,
);
foreach (array_keys($newsletters) as $newsletter_id) {
$edit['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.'));
$confirm_url = $this
->extractConfirmationLink($this
->getMail(6));
$this
->drupalGet($confirm_url);
$this
->drupalGet($confirm_url . '/ok');
$this
->assertRaw(t('Subscription changes confirmed for %user.', array(
'%user' => $mail,
)), t('Confirmation message displayed.'));
// Verify subscription changes.
$subscriber_storage
->resetCache();
$subscription_manager
->reset();
foreach (array_keys($newsletters) as $newsletter_id) {
$this
->assertFalse($subscription_manager
->isSubscribed($mail, $newsletter_id));
}
// Call confirmation url after it is allready used.
// Using direct url.
$this
->drupalGet($confirm_url . '/ok');
$this
->assertNoResponse(404, 'Redirected after calling confirmation url more than once.');
$this
->assertRaw(t('All changes to your subscriptions where already applied. No changes made.'));
// Using confirmation page.
$this
->drupalGet($confirm_url);
$this
->assertNoResponse(404, 'Redirected after calling confirmation url more than once.');
$this
->assertRaw(t('All changes to your subscriptions where already applied. No changes made.'));
// Test expired confirmation links.
$enable = array_rand($newsletters, 3);
$mail = $this
->randomEmail(8);
$edit = array(
'mail[0][value]' => $mail,
);
foreach ($enable as $newsletter_id) {
$edit['subscriptions[' . $newsletter_id . ']'] = TRUE;
}
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Subscribe'));
$subscriber = simplenews_subscriber_load_by_mail($mail);
$expired_timestamp = REQUEST_TIME - 86401;
$changes = $subscriber
->getChanges();
$hash = simplenews_generate_hash($subscriber
->getMail(), 'combined' . serialize($subscriber
->getChanges()), $expired_timestamp);
$url = 'newsletter/confirm/combined/' . $subscriber
->id() . '/' . $expired_timestamp . '/' . $hash;
$this
->drupalGet($url);
$this
->assertText(t('This link has expired.'));
$this
->drupalPostForm(NULL, array(), t('Request new confirmation mail'));
$confirm_url = $this
->extractConfirmationLink($this
->getMail(8));
// Verify listed changes.
foreach ($newsletters as $newsletter_id => $newsletter) {
$this
->assertMailText(t('Subscribe to @name', array(
'@name' => $newsletter->name,
)), 8, in_array($newsletter_id, $enable));
}
$this
->drupalGet($confirm_url);
$this
->assertRaw(t('Are you sure you want to confirm the following subscription changes for %user?', array(
'%user' => simplenews_mask_mail($mail),
)), t('Subscription confirmation found.'));
// Verify listed changes.
foreach ($newsletters as $newsletter_id => $newsletter) {
if (in_array($newsletter_id, $enable)) {
$this
->assertText(t('Subscribe to @name', array(
'@name' => $newsletter->name,
)));
}
else {
$this
->assertNoText(t('Subscribe to @name', array(
'@name' => $newsletter->name,
)));
}
}
$this
->drupalPostForm($confirm_url, array(), t('Confirm'));
$this
->assertRaw(t('Subscription changes confirmed for %user.', array(
'%user' => $mail,
)), t('Anonymous subscriber added to newsletter'));
}
/**
* Extract a confirmation link from a mail body.
*/
function extractConfirmationLink($body) {
$pattern = '@newsletter/confirm/.+@';
preg_match($pattern, $body, $match);
$found = preg_match($pattern, $body, $match);
if (!$found) {
$this
->fail('Confirmation URL found.');
return FALSE;
}
$confirm_url = $match[0];
$this
->pass(t('Confirmation URL found: @url', array(
'@url' => $confirm_url,
)));
return $confirm_url;
}
/**
* testSubscribeAnonymous
*
* Steps performed:
* 0. Preparation
* 1. Subscribe anonymous via block
* 2. Subscribe anonymous via subscription page
* 3. Subscribe anonymous via multi block
*/
function testSubscribeAnonymous() {
// 0. Preparation
// Login admin
// Set permission for anonymous to subscribe
// Enable newsletter block
// Logout admin
$admin_user = $this
->drupalCreateUser(array(
'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 = array(
'name' => $name,
'id' => strtolower($name),
'description' => $this
->randomString(20),
'opt_inout' => 'double',
);
$this
->drupalPostForm(NULL, $edit, t('Save'));
}
$newsletter_id = $this
->getRandomNewsletter();
$this
->drupalLogout();
//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 = array(
'newsletters' => array(
$newsletter_id,
),
'message' => $this
->randomMachineName(4),
);
$single_block = $this
->setupSubscriptionBlock($block_settings);
// Testing invalid email error message.
$mail = '@example.com';
$edit = array(
'mail[0][value]' => $mail,
);
$this
->drupalPostForm('', $edit, t('Subscribe'));
$this
->assertText(t("The email address {$mail} is not valid"), t("Invalid email shows error."));
// Now with valid email.
$mail = $this
->randomEmail(8);
$edit = array(
'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.'), t('Subscription confirmation e-mail sent.'));
$subscriber = simplenews_subscriber_load_by_mail($mail);
$this
->assertNotNull($subscriber, 'New subscriber entity successfully loaded.');
$subscription = $subscriber
->getSubscription($newsletter_id);
$this
->assertEqual(SIMPLENEWS_SUBSCRIPTION_STATUS_UNCONFIRMED, $subscription->status, t('Subscription is unconfirmed'));
$confirm_url = $this
->extractConfirmationLink($this
->getMail(0));
$this
->drupalGet($confirm_url);
$newsletter = simplenews_newsletter_load($newsletter_id);
$this
->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', array(
'%user' => simplenews_mask_mail($mail),
'%newsletter' => $newsletter->name,
)), t('Subscription confirmation found.'));
$this
->drupalPostForm(NULL, array(), t('Subscribe'));
$this
->assertRaw(t('%user was added to the %newsletter mailing list.', array(
'%user' => $mail,
'%newsletter' => $newsletter->name,
)), t('Anonymous subscriber added to newsletter'));
$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();
$edit = array(
'name' => $this
->randomMachineName(),
'mail' => $mail,
'pass[pass1]' => $pass = $this
->randomMachineName(),
'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 = simplenews_subscriber_load_by_mail($mail);
$account = user_load_by_mail($mail);
$this
->assertEqual($subscriber
->getUserId(), $account
->id());
$this
->assertEqual($account
->getUsername(), $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 = array(
"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.'), t('Subscription confirmation e-mail sent.'));
$confirm_url = $this
->extractConfirmationLink($this
->getMail(2));
$this
->drupalGet($confirm_url);
$newsletter = simplenews_newsletter_load($newsletter_id);
$this
->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', array(
'%user' => simplenews_mask_mail($mail),
'%newsletter' => $newsletter->name,
)), t('Subscription confirmation found.'));
$this
->drupalPostForm($confirm_url, array(), t('Subscribe'));
$this
->assertRaw(t('%user was added to the %newsletter mailing list.', array(
'%user' => $mail,
'%newsletter' => $newsletter->name,
)), t('Anonymous subscriber added to newsletter'));
// 3. Subscribe anonymous via multi block
// Setup subscription block with subscription form.
$block_settings = array(
'newsletters' => array_keys(simplenews_newsletter_get_all()),
'message' => $this
->randomMachineName(4),
);
$multi_block = $this
->setupSubscriptionBlock($block_settings);
// Try to submit multi-signup form without selecting a newsletter.
$mail = $this
->randomEmail(8);
$edit = array(
'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 = array(
'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 = simplenews_newsletter_load($newsletter_id);
$this
->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', array(
'%user' => simplenews_mask_mail($mail),
'%newsletter' => $newsletter->name,
)), t('Subscription confirmation found.'));
$this
->drupalPostForm($confirm_url, array(), t('Subscribe'));
$this
->assertRaw(t('%user was added to the %newsletter mailing list.', array(
'%user' => $mail,
'%newsletter' => $newsletter->name,
)), t('Anonymous subscriber added to newsletter'));
// Try to subscribe again, this should not re-set the status to unconfirmed.
$edit = array(
'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 = simplenews_subscriber_load_by_mail($mail);
$this
->assertNotEqual($subscriber, FALSE, 'New subscriber entity successfully loaded.');
$subscription = $subscriber
->getSubscription($newsletter_id);
$this
->assertEqual(SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, $subscription->status);
// Now the same with the newsletter/subscriptions page.
$mail = $this
->randomEmail(8);
$edit = array(
'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 = array(
'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 = simplenews_newsletter_load($newsletter_id);
$this
->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', array(
'%user' => simplenews_mask_mail($mail),
'%newsletter' => $newsletter->name,
)), t('Subscription confirmation found.'));
$this
->drupalPostForm($confirm_url, array(), t('Subscribe'));
$this
->assertRaw(t('%user was added to the %newsletter mailing list.', array(
'%user' => $mail,
'%newsletter' => $newsletter->name,
)), t('Anonymous subscriber added to newsletter'));
// Test unsubscribe on newsletter/subscriptions page.
$edit = array(
'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 = array(
'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', array(
'@mail' => $mail,
)), 6);
$confirm_url = $this
->extractConfirmationLink($this
->getMail(6));
$mails = $this
->drupalGetMails();
$this
->assertEqual($mails[0]['from'], 'simpletest@example.com');
$this
->assertEqual($mails[0]['headers']['From'], '"Drupal" <simpletest@example.com>');
$this
->drupalGet($confirm_url);
$newsletter = simplenews_newsletter_load($newsletter_id);
$this
->assertRaw(t('Are you sure you want to remove %user from the %newsletter mailing list?', array(
'%user' => simplenews_mask_mail($mail),
'%newsletter' => $newsletter->name,
)), t('Subscription confirmation found.'));
$this
->drupalPostForm($confirm_url, array(), t('Unsubscribe'));
$this
->assertRaw(t('%user was unsubscribed from the %newsletter mailing list.', array(
'%user' => $mail,
'%newsletter' => $newsletter->name,
)), t('Anonymous subscriber removed from newsletter'));
// Visit the newsletter/subscriptions page with the hash.
$subscriber = simplenews_subscriber_load_by_mail($mail);
$hash = simplenews_generate_hash($subscriber
->getMail(), 'manage');
$this
->drupalGet('newsletter/subscriptions/' . $subscriber
->id() . '/' . REQUEST_TIME . '/' . $hash);
$this
->assertText(t('Subscriptions for @mail', array(
'@mail' => $mail,
)));
$edit = array(
'subscriptions[' . $newsletter_id . ']' => TRUE,
);
$this
->drupalPostForm(NULL, $edit, t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $mail,
)));
// Make sure the subscription is confirmed.
\Drupal::entityTypeManager()
->getStorage('simplenews_subscriber')
->resetCache();
$subscriber = simplenews_subscriber_load_by_mail($mail);
$this
->assertTrue($subscriber
->isSubscribed($newsletter_id));
$subscription = $subscriber
->getSubscription($newsletter_id);
$this
->assertEqual(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 = array(
'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 = array(
'mail[0][value]' => $mail,
'subscriptions[' . $newsletter_id . ']' => TRUE,
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Subscribe'));
$subscriber = simplenews_subscriber_load_by_mail($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, array(), t('Request new confirmation mail'));
$confirm_url = $this
->extractConfirmationLink($this
->getMail(9));
$this
->drupalGet($confirm_url);
$newsletter = simplenews_newsletter_load($newsletter_id);
$this
->assertRaw(t('Are you sure you want to add %user to the %newsletter mailing list?', array(
'%user' => simplenews_mask_mail($mail),
'%newsletter' => $newsletter->name,
)), t('Subscription confirmation found.'));
$this
->drupalPostForm($confirm_url, array(), t('Subscribe'));
$this
->assertRaw(t('%user was added to the %newsletter mailing list.', array(
'%user' => $mail,
'%newsletter' => $newsletter->name,
)), t('Anonymous subscriber added to newsletter'));
// Make sure the subscription is confirmed now.
\Drupal::entityTypeManager()
->getStorage('simplenews_subscriber')
->resetCache();
$subscriber = simplenews_subscriber_load_by_mail($mail);
$this
->assertTrue($subscriber
->isSubscribed($newsletter_id));
$subscription = $subscriber
->getSubscription($newsletter_id);
$this
->assertEqual(SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, $subscription->status);
}
/**
* Test anonymous subscription with single opt in.
*
* Steps performed:
* 0. Preparation
* 1. Subscribe anonymous via block
*/
function testSubscribeAnonymousSingle() {
// 0. Preparation
// Login admin
// Create single opt in newsletter.
// Set permission for anonymous to subscribe
// Enable newsletter block
// Logout admin
$admin_user = $this
->drupalCreateUser(array(
'administer blocks',
'administer content types',
'administer nodes',
'access administration pages',
'administer permissions',
'administer newsletters',
));
$this
->drupalLogin($admin_user);
$this
->drupalGet('admin/config/services/simplenews');
$this
->clickLink(t('Add newsletter'));
$name = $this
->randomMachineName();
$edit = array(
'name' => $name,
'id' => strtolower($name),
'description' => $this
->randomString(20),
'opt_inout' => 'single',
);
$this
->drupalPostForm(NULL, $edit, t('Save'));
$this
->drupalLogout();
$newsletter_id = $edit['id'];
// Setup subscription block with subscription form.
$block_settings = array(
'newsletters' => array(
$newsletter_id,
),
'message' => $this
->randomMachineName(4),
);
$block = $this
->setupSubscriptionBlock($block_settings);
// 1. Subscribe anonymous via block
// Subscribe + submit
// Assert confirmation message
// Verify subscription state.
$mail = $this
->randomEmail(8);
$edit = array(
'mail[0][value]' => $mail,
);
$this
->drupalPostForm('', $edit, t('Subscribe'));
$this
->assertText(t('You have been subscribed.'), t('Anonymous subscriber added to newsletter'));
$subscriber = simplenews_subscriber_load_by_mail($mail);
$subscription = $subscriber
->getSubscription($newsletter_id);
$this
->assertEqual(SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED, $subscription->status);
// Unsubscribe again.
$edit = array(
'mail[0][value]' => $mail,
'subscriptions[' . $newsletter_id . ']' => TRUE,
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Unsubscribe'));
\Drupal::entityTypeManager()
->getStorage('simplenews_subscriber')
->resetCache();
$subscriber = simplenews_subscriber_load_by_mail($mail);
$subscription = $subscriber
->getSubscription($newsletter_id);
$this
->assertEqual(SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED, $subscription->status);
}
/**
* testSubscribeAuthenticated
*
* Steps performed:
* 0. Preparation
* 1. Subscribe authenticated via block
* 2. Unsubscribe authenticated via subscription page
* 3. Subscribe authenticated via subscription page
* 4. Unsubscribe authenticated via account page
* 5. Subscribe authenticated via account page
* 6. Subscribe authenticated via multi block
*/
function testSubscribeAuthenticated() {
// 0. Preparation
// Login admin
// Set permission for anonymous to subscribe
// Enable newsletter block
// Logout admin
// Login Subscriber
$admin_user = $this
->drupalCreateUser(array(
'administer blocks',
'administer content types',
'administer nodes',
'access administration pages',
'administer permissions',
'administer newsletters',
));
$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 = array(
'name' => $name,
'id' => strtolower($name),
'description' => $this
->randomString(20),
'opt_inout' => 'double',
);
$this
->drupalPostForm(NULL, $edit, t('Save'));
}
$newsletter_id = $this
->getRandomNewsletter();
$this
->drupalLogout();
// Setup subscription block with subscription form.
$block_settings = array(
'newsletters' => array(
$newsletter_id,
),
'message' => $this
->randomMachineName(4),
);
$single_block = $this
->setupSubscriptionBlock($block_settings);
$subscriber_user = $this
->drupalCreateUser(array(
'subscribe to newsletters',
));
$this
->drupalLogin($subscriber_user);
$this
->assertEqual($this
->countSubscribers(), 0);
// 1. Subscribe authenticated via block
// Subscribe + submit
// Assert confirmation message
$this
->drupalPostForm(NULL, [], t('Subscribe'));
$this
->assertText(t('You have been subscribed.'), t('Authenticated user subscribed using the subscription block.'));
$this
->assertEqual($this
->countSubscribers(), 1);
// 2. Unsubscribe authenticated via subscription page
// Unsubscribe + submit
// Assert confirmation message
$edit = array(
"subscriptions[{$newsletter_id}]" => 0,
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Update'));
$this
->assertRaw(t('The newsletter subscriptions for %mail have been updated.', array(
'%mail' => $subscriber_user
->getEmail(),
)), t('Authenticated user unsubscribed on the subscriptions page.'));
// 3. Subscribe authenticated via subscription page
// Subscribe + submit
// Assert confirmation message
$this
->resetSubscribers();
$edit = array(
"subscriptions[{$newsletter_id}]" => '1',
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Update'));
$this
->assertRaw(t('The newsletter subscriptions for %mail have been updated.', array(
'%mail' => $subscriber_user
->getEmail(),
)), t('Authenticated user subscribed on the subscriptions page.'));
$this
->assertEqual($this
->countSubscribers(), 1);
// 4. Unsubscribe authenticated via account page
// Unsubscribe + submit
// Assert confirmation message
$edit = array(
"subscriptions[{$newsletter_id}]" => FALSE,
);
$url = 'user/' . $subscriber_user
->id() . '/simplenews';
$this
->drupalPostForm($url, $edit, t('Save'));
$this
->assertRaw(t('Your newsletter subscriptions have been updated.', array(
'%mail' => $subscriber_user
->getEmail(),
)), t('Authenticated user unsubscribed on the account page.'));
$subscriber = simplenews_subscriber_load_by_mail($subscriber_user
->getEmail());
$subscription = $subscriber
->getSubscription($newsletter_id);
$this
->assertEqual(SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED, $subscription->status, t('Subscription is unsubscribed'));
// 5. Subscribe authenticated via account page
// Subscribe + submit
// Assert confirmation message
$this
->resetSubscribers();
$edit = array(
"subscriptions[{$newsletter_id}]" => '1',
);
$url = 'user/' . $subscriber_user
->id() . '/simplenews';
$this
->drupalPostForm($url, $edit, t('Save'));
$this
->assertRaw(t('Your newsletter subscriptions have been updated.', array(
'%mail' => $subscriber_user
->getEmail(),
)), t('Authenticated user unsubscribed on the account page.'));
$count = 1;
$this
->assertEqual($this
->countSubscribers(), $count);
// Disable the newsletter block.
$single_block
->delete();
// Setup subscription block with subscription form.
$block_settings = array(
'newsletters' => array_keys(simplenews_newsletter_get_all()),
'message' => $this
->randomMachineName(4),
);
$multi_block = $this
->setupSubscriptionBlock($block_settings);
// Try to submit multi-signup form without selecting a newsletter.
$subscriber_user2 = $this
->drupalCreateUser(array(
'subscribe to newsletters',
));
$this
->drupalLogin($subscriber_user2);
// Check that the user has only access to his own subscriptions page.
$this
->drupalGet('user/' . $subscriber_user
->id() . '/simplenews');
$this
->assertResponse(403);
$this
->drupalGet('user/' . $subscriber_user2
->id() . '/simplenews');
$this
->assertResponse(200);
$this
->assertNoField('mail[0][value]');
$this
->drupalPostForm(NULL, array(), t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $subscriber_user2
->getEmail(),
)));
// Nothing should have happened to subscriptions but this does create a subscriber.
$this
->assertNoFieldChecked('edit-subscriptions-' . $newsletter_id);
$count++;
$this
->assertEqual($this
->countSubscribers(), $count);
// Now fill out the form and try again.
$edit = array(
'subscriptions[' . $newsletter_id . ']' => TRUE,
);
$this
->drupalPostForm(NULL, $edit, t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $subscriber_user2
->getEmail(),
)));
$this
->assertEqual($this
->countSubscribers(), $count);
$this
->assertFieldChecked('edit-subscriptions-' . $newsletter_id);
// Unsubscribe.
$edit = array(
'subscriptions[' . $newsletter_id . ']' => FALSE,
);
$this
->drupalPostForm(NULL, $edit, t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $subscriber_user2
->getEmail(),
)));
$this
->assertNoFieldChecked('edit-subscriptions-' . $newsletter_id);
// And now the same for the newsletter/subscriptions page.
$subscriber_user3 = $this
->drupalCreateUser(array(
'subscribe to newsletters',
));
$this
->drupalLogin($subscriber_user3);
$this
->assertNoField('mail[0][value]');
$this
->drupalPostForm('newsletter/subscriptions', array(), t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $subscriber_user3
->getEmail(),
)));
// Nothing should have happened to subscriptions but this does create a subscriber.
$this
->assertNoFieldChecked('edit-subscriptions-' . $newsletter_id);
$count++;
$this
->assertEqual($this
->countSubscribers(), $count);
// Now fill out the form and try again.
$edit = array(
'subscriptions[' . $newsletter_id . ']' => TRUE,
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $subscriber_user3
->getEmail(),
)));
$this
->assertEqual($this
->countSubscribers(), $count);
$this
->assertFieldChecked('edit-subscriptions-' . $newsletter_id);
// Unsubscribe.
$edit = array(
'subscriptions[' . $newsletter_id . ']' => FALSE,
);
$this
->drupalPostForm('newsletter/subscriptions', $edit, t('Update'));
$this
->assertText(t('The newsletter subscriptions for @mail have been updated.', array(
'@mail' => $subscriber_user3
->getEmail(),
)));
$this
->assertNoFieldChecked('edit-subscriptions-' . $newsletter_id);
}
/**
* Tests Creation of Simplenews Subscription block.
*/
public function testSimplenewsSubscriptionBlock() {
$admin_user = $this
->drupalCreateUser(array(
'administer blocks',
));
$this
->drupalLogin($admin_user);
$this
->drupalGet('/admin/structure/block/add/simplenews_subscription_block/classy');
// Check for Unique ID field.
$this
->assertText('Unique ID');
$edit = array(
'settings[unique_id]' => 'test_simplenews_123',
'settings[newsletters][default]' => TRUE,
'region' => 'header',
);
$this
->drupalPostForm(NULL, $edit, t('Save block'));
$this
->drupalGet('');
// Provided Unique ID is used as form_id.
$this
->assertFieldByXPath("//*[@id=\"simplenews-subscriptions-block-test-simplenews-123\"]", NULL, 'Form ID found and contains expected value.');
}
/**
* Gets the number of subscribers entities.
*/
protected function countSubscribers() {
return \Drupal::entityQuery('simplenews_subscriber')
->count()
->execute();
}
/**
* Delete all subscriber entities ready for the next test.
*/
protected function resetSubscribers() {
$storage = \Drupal::entityTypeManager()
->getStorage('simplenews_subscriber');
$storage
->delete($storage
->loadMultiple());
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
AssertContentTrait:: |
protected | property | The current raw content. | |
AssertContentTrait:: |
protected | property | The drupalSettings value from the current raw $content. | |
AssertContentTrait:: |
protected | property | The XML structure parsed from the current raw $content. | 1 |
AssertContentTrait:: |
protected | property | The plain-text content of raw $content (text nodes). | |
AssertContentTrait:: |
protected | function | Passes if the raw text IS found escaped on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists with the given name or ID. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists with the given ID and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists with the given name and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists in the current page by the given XPath. | |
AssertContentTrait:: |
protected | function | Asserts that a checkbox field in the current page is checked. | |
AssertContentTrait:: |
protected | function | Asserts that a field exists in the current page with a given Xpath result. | |
AssertContentTrait:: |
protected | function | Passes if a link with the specified label is found. | |
AssertContentTrait:: |
protected | function | Passes if a link containing a given href (part) is found. | |
AssertContentTrait:: |
protected | function | Asserts that each HTML ID is used for just a single element. | |
AssertContentTrait:: |
protected | function | Passes if the raw text IS NOT found escaped on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist with the given name or ID. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist with the given ID and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist with the given name and value. | |
AssertContentTrait:: |
protected | function | Asserts that a field does not exist or its value does not match, by XPath. | |
AssertContentTrait:: |
protected | function | Asserts that a checkbox field in the current page is not checked. | |
AssertContentTrait:: |
protected | function | Passes if a link with the specified label is not found. | |
AssertContentTrait:: |
protected | function | Passes if a link containing a given href (part) is not found. | |
AssertContentTrait:: |
protected | function | Passes if a link containing a given href is not found in the main region. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page does not exist. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page is not checked. | |
AssertContentTrait:: |
protected | function | Triggers a pass if the perl regex pattern is not found in raw content. | |
AssertContentTrait:: |
protected | function | Passes if the raw text is NOT found on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Passes if the page (with HTML stripped) does not contains the text. | |
AssertContentTrait:: |
protected | function | Pass if the page title is not the given string. | |
AssertContentTrait:: |
protected | function | Passes if the text is found MORE THAN ONCE on the text version of the page. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page exists. | |
AssertContentTrait:: |
protected | function | Asserts that a select option with the visible text exists. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page is checked. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page is checked. | |
AssertContentTrait:: |
protected | function | Asserts that a select option in the current page exists. | |
AssertContentTrait:: |
protected | function | Triggers a pass if the Perl regex pattern is found in the raw content. | |
AssertContentTrait:: |
protected | function | Passes if the raw text IS found on the loaded page, fail otherwise. | |
AssertContentTrait:: |
protected | function | Passes if the page (with HTML stripped) contains the text. | |
AssertContentTrait:: |
protected | function | Helper for assertText and assertNoText. | |
AssertContentTrait:: |
protected | function | Asserts that a Perl regex pattern is found in the plain-text content. | |
AssertContentTrait:: |
protected | function | Asserts themed output. | |
AssertContentTrait:: |
protected | function | Pass if the page title is the given string. | |
AssertContentTrait:: |
protected | function | Passes if the text is found ONLY ONCE on the text version of the page. | |
AssertContentTrait:: |
protected | function | Helper for assertUniqueText and assertNoUniqueText. | |
AssertContentTrait:: |
protected | function | Builds an XPath query. | |
AssertContentTrait:: |
protected | function | Helper: Constructs an XPath for the given set of attributes and value. | |
AssertContentTrait:: |
protected | function | Searches elements using a CSS selector in the raw content. | |
AssertContentTrait:: |
protected | function | Get all option elements, including nested options, in a select. | |
AssertContentTrait:: |
protected | function | Gets the value of drupalSettings for the currently-loaded page. | |
AssertContentTrait:: |
protected | function | Gets the current raw content. | |
AssertContentTrait:: |
protected | function | Get the selected value from a select field. | |
AssertContentTrait:: |
protected | function | Retrieves the plain-text content from the current raw content. | |
AssertContentTrait:: |
protected | function | Get the current URL from the cURL handler. | 1 |
AssertContentTrait:: |
protected | function | Parse content returned from curlExec using DOM and SimpleXML. | |
AssertContentTrait:: |
protected | function | Removes all white-space between HTML tags from the raw content. | |
AssertContentTrait:: |
protected | function | Sets the value of drupalSettings for the currently-loaded page. | |
AssertContentTrait:: |
protected | function | Sets the raw content (e.g. HTML). | |
AssertContentTrait:: |
protected | function | Performs an xpath search on the contents of the internal browser. | |
AssertHelperTrait:: |
protected static | function | Casts MarkupInterface objects into strings. | |
AssertMailTrait:: |
protected | function | Asserts that the most recently sent email message has the given value. | |
AssertMailTrait:: |
protected | function | Asserts that the most recently sent email message has the pattern in it. | |
AssertMailTrait:: |
protected | function | Asserts that the most recently sent email message has the string in it. | |
AssertMailTrait:: |
protected | function | Gets an array containing all emails sent during this test case. Aliased as: drupalGetMails | |
AssertMailTrait:: |
protected | function | Outputs to verbose the most recent $count emails sent. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Asserts whether an expected cache context was present in the last response. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Ensures that some cache contexts are present in the current response. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Asserts the max age header. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Ensures that some cache tags are present in the current response. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Asserts that a cache context was not present in the last response. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Asserts page cache miss, then hit for the given URL; checks cache headers. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Provides debug information for cache tags. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Enables page caching. | |
AssertPageCacheContextsAndTagsTrait:: |
protected | function | Gets a specific header value as array. | |
BlockCreationTrait:: |
protected | function | Creates a block instance based on default settings. Aliased as: drupalPlaceBlock | |
ConfigTestTrait:: |
protected | function | Returns a ConfigImporter object to import test configuration. | |
ConfigTestTrait:: |
protected | function | Copies configuration objects from source storage to target storage. | |
ContentTypeCreationTrait:: |
protected | function | Creates a custom content type based on default settings. Aliased as: drupalCreateContentType | 1 |
CronRunTrait:: |
protected | function | Runs cron on the test site. | |
EntityViewTrait:: |
protected | function | Builds the renderable view of an entity. Aliased as: drupalBuildEntityView | |
FunctionalTestSetupTrait:: |
protected | property | The flag to set 'apcu_ensure_unique_prefix' setting. | 1 |
FunctionalTestSetupTrait:: |
protected | property | The class loader to use for installation and initialization of setup. | |
FunctionalTestSetupTrait:: |
protected | property | The config directories used in this test. | |
FunctionalTestSetupTrait:: |
protected | property | The "#1" admin user. | |
FunctionalTestSetupTrait:: |
protected | function | Execute the non-interactive installer. | 1 |
FunctionalTestSetupTrait:: |
protected | function | Returns all supported database driver installer objects. | |
FunctionalTestSetupTrait:: |
protected | function | Initialize various configurations post-installation. | 2 |
FunctionalTestSetupTrait:: |
protected | function | Initializes the kernel after installation. | |
FunctionalTestSetupTrait:: |
protected | function | Initialize settings created during install. | |
FunctionalTestSetupTrait:: |
protected | function | Initializes user 1 for the site to be installed. | |
FunctionalTestSetupTrait:: |
protected | function | Installs the default theme defined by `static::$defaultTheme` when needed. | |
FunctionalTestSetupTrait:: |
protected | function | Install modules defined by `static::$modules`. | 1 |
FunctionalTestSetupTrait:: |
protected | function | Returns the parameters that will be used when Simpletest installs Drupal. | 9 |
FunctionalTestSetupTrait:: |
protected | function | Prepares the current environment for running the test. | 23 |
FunctionalTestSetupTrait:: |
protected | function | Creates a mock request and sets it on the generator. | |
FunctionalTestSetupTrait:: |
protected | function | Prepares site settings and services before installation. | 2 |
FunctionalTestSetupTrait:: |
protected | function | Resets and rebuilds the environment after setup. | |
FunctionalTestSetupTrait:: |
protected | function | Rebuilds \Drupal::getContainer(). | |
FunctionalTestSetupTrait:: |
protected | function | Resets all data structures after having enabled new modules. | |
FunctionalTestSetupTrait:: |
protected | function | Changes parameters in the services.yml file. | |
FunctionalTestSetupTrait:: |
protected | function | Sets up the base URL based upon the environment variable. | |
FunctionalTestSetupTrait:: |
protected | function | Rewrites the settings.php file of the test site. | |
GeneratePermutationsTrait:: |
public static | function | Converts a list of possible parameters into a stack of permutations. | |
NodeCreationTrait:: |
protected | function | Creates a node based on default settings. Aliased as: drupalCreateNode | |
NodeCreationTrait:: |
public | function | Get a node from the database based on its title. Aliased as: drupalGetNodeByTitle | |
RandomGeneratorTrait:: |
protected | property | The random generator. | |
RandomGeneratorTrait:: |
protected | function | Gets the random generator for the utility methods. | |
RandomGeneratorTrait:: |
protected | function | Generates a unique random string containing letters and numbers. | 1 |
RandomGeneratorTrait:: |
public | function | Generates a random PHP object. | |
RandomGeneratorTrait:: |
public | function | Generates a pseudo-random string of ASCII characters of codes 32 to 126. | |
RandomGeneratorTrait:: |
public | function | Callback for random string validation. | |
RefreshVariablesTrait:: |
protected | function | Refreshes in-memory configuration and state information. | 3 |
SessionTestTrait:: |
protected | property | The name of the session cookie. | |
SessionTestTrait:: |
protected | function | Generates a session cookie name. | |
SessionTestTrait:: |
protected | function | Returns the session name in use on the child site. | |
SimplenewsSubscribeTest:: |
protected | function | Gets the number of subscribers entities. | |
SimplenewsSubscribeTest:: |
function | Extract a confirmation link from a mail body. | ||
SimplenewsSubscribeTest:: |
protected | function | Delete all subscriber entities ready for the next test. | |
SimplenewsSubscribeTest:: |
public | function | Tests Creation of Simplenews Subscription block. | |
SimplenewsSubscribeTest:: |
function | testSubscribeAnonymous | ||
SimplenewsSubscribeTest:: |
function | Test anonymous subscription with single opt in. | ||
SimplenewsSubscribeTest:: |
function | testSubscribeAuthenticated | ||
SimplenewsSubscribeTest:: |
function | Subscribe to multiple newsletters at the same time. | ||
SimplenewsTestBase:: |
protected | property | The Simplenews settings config object. | |
SimplenewsTestBase:: |
public static | property | Modules to enable. | 4 |
SimplenewsTestBase:: |
protected | function | Creates and saves a field storage and instance. | |
SimplenewsTestBase:: |
protected | function | Checks if a string is found in the latest sent mail. | |
SimplenewsTestBase:: |
protected | function | Returns the last created Subscriber. | |
SimplenewsTestBase:: |
protected | function | Returns the body content of mail that has been sent. | |
SimplenewsTestBase:: |
function | Select randomly one of the available newsletters. | ||
SimplenewsTestBase:: |
function | Generates a random email address. | ||
SimplenewsTestBase:: |
protected | function | Visits and submits the user registration form. | |
SimplenewsTestBase:: |
protected | function | Login a user, resetting their password. | |
SimplenewsTestBase:: |
public | function |
Sets up a Drupal site for running functional and integration tests. Overrides WebTestBase:: |
8 |
SimplenewsTestBase:: |
function | |||
SimplenewsTestBase:: |
function | Enable newsletter subscription block. | ||
SimplenewsTestBase:: |
protected | function | Visits and submits a newsletter management form. | |
StorageCopyTrait:: |
protected static | function | Copy the configuration from one storage to another and remove stale items. | |
TestBase:: |
protected | property | Assertions thrown in that test case. | |
TestBase:: |
protected | property | The config importer that can used in a test. | |
TestBase:: |
protected | property | The database prefix of this test run. | |
TestBase:: |
public | property | Whether to die in case any test assertion fails. | |
TestBase:: |
protected | property | HTTP authentication credentials (<username>:<password>). | |
TestBase:: |
protected | property | HTTP authentication method (specified as a CURLAUTH_* constant). | |
TestBase:: |
protected | property | The original configuration (variables), if available. | |
TestBase:: |
protected | property | The original configuration (variables). | |
TestBase:: |
protected | property | The original configuration directories. | |
TestBase:: |
protected | property | The original container. | |
TestBase:: |
protected | property | The original file directory, before it was changed for testing purposes. | |
TestBase:: |
protected | property | The original language. | |
TestBase:: |
protected | property | The original database prefix when running inside Simpletest. | |
TestBase:: |
protected | property | The name of the session cookie of the test-runner. | |
TestBase:: |
protected | property | The settings array. | |
TestBase:: |
public | property | Current results of this test case. | |
TestBase:: |
protected | property | This class is skipped when looking for the source of an assertion. | |
TestBase:: |
protected | property | Time limit for the test. | |
TestBase:: |
protected | property | The translation file directory for the test environment. | |
TestBase:: |
public | property | TRUE if verbose debugging is enabled. | |
TestBase:: |
protected | property | Safe class name for use in verbose output filenames. | |
TestBase:: |
protected | property | Directory where verbose output files are put. | |
TestBase:: |
protected | property | URL to the verbose output file directory. | |
TestBase:: |
protected | property | Incrementing identifier for verbose output filenames. | |
TestBase:: |
protected | function | Internal helper: stores the assert. | |
TestBase:: |
protected | function | Check to see if two values are equal. | |
TestBase:: |
protected | function | Asserts that a specific error has been logged to the PHP error log. | |
TestBase:: |
protected | function | Check to see if a value is false. | |
TestBase:: |
protected | function | Check to see if two values are identical. | |
TestBase:: |
protected | function | Checks to see if two objects are identical. | |
TestBase:: |
protected | function | Asserts that no errors have been logged to the PHP error.log thus far. | |
TestBase:: |
protected | function | Check to see if two values are not equal. | |
TestBase:: |
protected | function | Check to see if two values are not identical. | |
TestBase:: |
protected | function | Check to see if a value is not NULL. | |
TestBase:: |
protected | function | Check to see if a value is NULL. | |
TestBase:: |
protected | function | Check to see if a value is not false. | |
TestBase:: |
protected | function | Act on global state information before the environment is altered for a test. | 1 |
TestBase:: |
protected | function | Checks the matching requirements for Test. | 1 |
TestBase:: |
public | function | Fail the test if it belongs to a PHPUnit-based framework. | |
TestBase:: |
protected | function | Configuration accessor for tests. Returns non-overridden configuration. | |
TestBase:: |
public static | function | Delete an assertion record by message ID. | |
TestBase:: |
protected | function | Fire an error assertion. | 1 |
TestBase:: |
public | function | Handle errors during test runs. | |
TestBase:: |
protected | function | Handle exceptions. | |
TestBase:: |
protected | function | Fire an assertion that is always negative. | |
TestBase:: |
public static | function | Ensures test files are deletable. | |
TestBase:: |
protected | function | Cycles through backtrace until the first non-assertion method is found. | |
TestBase:: |
public | function | Gets the database prefix. | |
TestBase:: |
public | function | Gets the temporary files directory. | |
TestBase:: |
public static | function | Store an assertion from outside the testing context. | 1 |
TestBase:: |
protected | function | Fire an assertion that is always positive. | |
TestBase:: |
private | function |
Generates a database prefix for running tests. Overrides TestSetupTrait:: |
|
TestBase:: |
private | function | Cleans up the test environment and restores the original environment. | |
TestBase:: |
public | function | Run all tests in this class. | 2 |
TestBase:: |
protected | function | Changes in memory settings. | |
TestBase:: |
protected | function | Helper method to store an assertion record in the configured database. | 1 |
TestBase:: |
protected | function | Logs a verbose message in a text file. | |
TestFileCreationTrait:: |
protected | property | Whether the files were copied to the test files directory. | |
TestFileCreationTrait:: |
protected | function | Compares two files based on size and file name. Aliased as: drupalCompareFiles | |
TestFileCreationTrait:: |
public static | function | Generates a test file. | |
TestFileCreationTrait:: |
protected | function | Gets a list of files that can be used in tests. Aliased as: drupalGetTestFiles | |
TestSetupTrait:: |
protected static | property | An array of config object names that are excluded from schema checking. | |
TestSetupTrait:: |
protected | property | The dependency injection container used in the test. | |
TestSetupTrait:: |
protected | property | The DrupalKernel instance used in the test. | |
TestSetupTrait:: |
protected | property | The site directory of the original parent site. | |
TestSetupTrait:: |
protected | property | The private file directory for the test environment. | |
TestSetupTrait:: |
protected | property | The public file directory for the test environment. | |
TestSetupTrait:: |
protected | property | The site directory of this test run. | |
TestSetupTrait:: |
protected | property | Set to TRUE to strict check all configuration saved. | 2 |
TestSetupTrait:: |
protected | property | The temporary file directory for the test environment. | |
TestSetupTrait:: |
protected | property | The test run ID. | |
TestSetupTrait:: |
protected | function | Changes the database connection to the prefixed one. | |
TestSetupTrait:: |
protected | function | Gets the config schema exclusions for this test. | |
TestSetupTrait:: |
public static | function | Returns the database connection to the site running Simpletest. | |
UserCreationTrait:: |
protected | function | Checks whether a given list of permission names is valid. | |
UserCreationTrait:: |
protected | function | Creates an administrative role. Aliased as: drupalCreateAdminRole | |
UserCreationTrait:: |
protected | function | Creates a role with specified permissions. Aliased as: drupalCreateRole | |
UserCreationTrait:: |
protected | function | Create a user with a given set of permissions. Aliased as: drupalCreateUser | |
UserCreationTrait:: |
protected | function | Grant permissions to a user role. | |
UserCreationTrait:: |
protected | function | Switch the current logged in user. | |
UserCreationTrait:: |
protected | function | Creates a random user account and sets it as current user. | |
WebTestBase:: |
protected | property | Additional cURL options. | |
WebTestBase:: |
protected | property | Whether or not to assert the presence of the X-Drupal-Ajax-Token. | |
WebTestBase:: |
protected | property | The current cookie file used by cURL. | |
WebTestBase:: |
protected | property | The cookies of the page currently loaded in the internal browser. | |
WebTestBase:: |
protected | property | Cookies to set on curl requests. | |
WebTestBase:: |
protected | property | The handle of the current cURL connection. | |
WebTestBase:: |
protected | property | An array of custom translations suitable for drupal_rewrite_settings(). | |
WebTestBase:: |
protected | property | Indicates that headers should be dumped if verbose output is enabled. | 1 |
WebTestBase:: |
protected | property | The headers of the page currently loaded in the internal browser. | |
WebTestBase:: |
protected | property | The current user logged in using the internal browser. | |
WebTestBase:: |
protected | property | The number of meta refresh redirects to follow, or NULL if unlimited. | |
WebTestBase:: |
protected | property | The maximum number of redirects to follow when handling responses. | |
WebTestBase:: |
protected | property | The number of meta refresh redirects followed during ::drupalGet(). | |
WebTestBase:: |
protected | property | The original batch, before it was changed for testing purposes. | |
WebTestBase:: |
protected | property |
The original shutdown handlers array, before it was cleaned for testing. Overrides TestBase:: |
|
WebTestBase:: |
protected | property |
The original user, before it was changed to a clean uid = 1 for testing. Overrides TestBase:: |
|
WebTestBase:: |
protected | property | The profile to install as a basis for testing. | 2 |
WebTestBase:: |
protected | property | The number of redirects followed during the handling of a request. | |
WebTestBase:: |
protected | property | The current session ID, if available. | |
WebTestBase:: |
protected | property | The URL currently loaded in the internal browser. | |
WebTestBase:: |
protected | function | Queues custom translations to be written to settings.php. | |
WebTestBase:: |
protected | function | Checks to see whether a block appears on the page. | |
WebTestBase:: |
protected | function | Asserts whether an expected cache tag was present in the last response. | |
WebTestBase:: |
protected | function | Check if a HTTP response header exists and has the expected value. | |
WebTestBase:: |
protected | function | Checks to see whether a block does not appears on the page. | |
WebTestBase:: |
protected | function | Asserts whether an expected cache tag was absent in the last response. | |
WebTestBase:: |
protected | function | Asserts the page did not return the specified response code. | |
WebTestBase:: |
protected | function | Asserts the page responds with the specified response code. | 1 |
WebTestBase:: |
protected | function | Passes if the internal browser's URL matches the given path. | |
WebTestBase:: |
protected | function | Builds an a absolute URL from a system path or a URL object. | |
WebTestBase:: |
protected | function | Checks for meta refresh tag and if found call drupalGet() recursively. | |
WebTestBase:: |
protected | function | Follows a link by complete name. | |
WebTestBase:: |
protected | function | Provides a helper for ::clickLink() and ::clickLinkPartialName(). | |
WebTestBase:: |
protected | function | Follows a link by partial name. | |
WebTestBase:: |
protected | function | Close the cURL handler and unset the handler. | |
WebTestBase:: |
protected | function | Initializes and executes a cURL request. | 1 |
WebTestBase:: |
protected | function | Reads headers and registers errors received from the tested site. | |
WebTestBase:: |
protected | function | Initializes the cURL connection. | |
WebTestBase:: |
protected | function | Retrieves a Drupal path or an absolute path. | 1 |
WebTestBase:: |
protected | function | Requests a path or URL in drupal_ajax format and JSON-decodes the response. | |
WebTestBase:: |
protected | function | Gets the value of an HTTP response header. | 1 |
WebTestBase:: |
protected | function | Gets the HTTP response headers of the requested page. | 1 |
WebTestBase:: |
protected | function | Retrieves a Drupal path or an absolute path and JSON decodes the result. | |
WebTestBase:: |
protected | function | Retrieves a Drupal path or an absolute path for a given format. | |
WebTestBase:: |
protected | function | Requests a Drupal path or an absolute path as if it is a XMLHttpRequest. | |
WebTestBase:: |
protected | function | Retrieves only the headers for a Drupal path or an absolute path. | |
WebTestBase:: |
protected | function | Log in a user with the internal browser. | |
WebTestBase:: |
protected | function | Logs a user out of the internal browser and confirms. | |
WebTestBase:: |
protected | function | Perform a POST HTTP request. | |
WebTestBase:: |
protected | function | Executes an Ajax form submission. | |
WebTestBase:: |
protected | function | Executes a form submission. | |
WebTestBase:: |
protected | function | Performs a POST HTTP request with a specific format. | |
WebTestBase:: |
protected | function | Processes an AJAX response into current content. | |
WebTestBase:: |
protected | function | Returns whether a given user account is logged in. | |
WebTestBase:: |
protected | function | Find a block instance on the page. | |
WebTestBase:: |
protected | function | Takes a path and returns an absolute path. | |
WebTestBase:: |
protected | function | Get the Ajax page state from drupalSettings and prepare it for POSTing. | |
WebTestBase:: |
protected | function | Handles form input related to drupalPostForm(). | |
WebTestBase:: |
protected | function | Returns whether the test is being executed from within a test site. | |
WebTestBase:: |
protected | function | Restore the original batch. | |
WebTestBase:: |
protected | function | Serialize POST HTTP request values. | |
WebTestBase:: |
protected | function | Preserve the original batch, and instantiate the test batch. | |
WebTestBase:: |
protected | function | Enables/disables the cacheability headers. | |
WebTestBase:: |
protected | function |
Cleans up after testing. Overrides TestBase:: |
1 |
WebTestBase:: |
protected | function | Transforms a nested array into a flat array suitable for WebTestBase::drupalPostForm(). | |
WebTestBase:: |
protected | function | Writes custom translations to the test site's settings.php. | |
WebTestBase:: |
public | function |
Constructor for \Drupal\simpletest\WebTestBase. Overrides TestBase:: |
1 |
XdebugRequestTrait:: |
protected | function | Adds xdebug cookies, from request setup. |