You are here

public function MailchimpListsBasicTestCase::testMailchimpListSubscriptionWorkflow in Mailchimp 7.2

Tests subscription workflows.

The core test function runs through a series of subscription requests and with different settings enabled and verifies that users are subscribed, or not, correctly.

Return value

bool Returns TRUE on completion.

File

modules/mailchimp_lists/tests/mailchimp_lists.test, line 70
Test class and methods for the Mailchimp Lists module.

Class

MailchimpListsBasicTestCase
@file Test class and methods for the Mailchimp Lists module.

Code

public function testMailchimpListSubscriptionWorkflow() {

  // *************************************************************************
  // 1. Test basic subscription adds for each user type and list type
  // *************************************************************************
  $this
    ->pass('--== Commencing Basic Subscription Adds ==--', 'Subscriptions');
  $anon_email = $this
    ->subscribeUser('anonymous');
  $this
    ->confirmSubscriptionStatus(TRUE, $anon_email, MAILCHIMP_TESTLIST_ANONYMOUS, 'Subscriptions: Anonymous');
  $auth_uid = $this
    ->subscribeUser('authenticated');
  $auth_user = user_load($auth_uid);
  $this
    ->confirmSubscriptionStatus(TRUE, $auth_user->mail, MAILCHIMP_TESTLIST_OPTIONAL, 'Subscriptions: Optional');
  $req_uid = $this
    ->subscribeUser('required');
  $req_user = user_load($req_uid);
  $this
    ->confirmSubscriptionStatus(TRUE, $req_user->mail, MAILCHIMP_TESTLIST_REQUIRED, 'Subscriptions: Required');

  // *************************************************************************
  // 2. Test deletion of an Authenticated User removes the user from optional
  // list.
  // *************************************************************************
  $this
    ->pass('--== Commencing Basic User Deletion Triggers ==--', 'Subscriptions');
  $auth_email = $auth_user->mail;
  user_delete($auth_user->uid);
  $this
    ->confirmSubscriptionStatus(FALSE, $auth_email, MAILCHIMP_TESTLIST_OPTIONAL, 'Subscriptions: Optional', " after account deletion");

  // *************************************************************************
  // 3. Test deletion of an Authenticated User removes the user from required
  // list.
  // *************************************************************************
  $req_email = $req_user->mail;
  user_delete($req_user->uid);
  $this
    ->confirmSubscriptionStatus(FALSE, $req_email, MAILCHIMP_TESTLIST_REQUIRED, 'Subscriptions: Required', " after account deletion");

  // *************************************************************************
  // 4. Test basic subscription adds for each user type and list type with
  // cron enabled for the lists.
  // *************************************************************************
  $this
    ->pass('--== Commencing Cron Subscription Adds ==--', 'Cron Subs');
  $this
    ->setListsCron(TRUE);

  // Since Cron is active, none of these new subs should be active
  // immediately after creation:
  $anon_email = $this
    ->subscribeUser('anonymous');
  $this
    ->confirmSubscriptionStatus(FALSE, $anon_email, MAILCHIMP_TESTLIST_ANONYMOUS, 'Cron Subs: Anonymous', " BEFORE cron is run");
  $auth_uid = $this
    ->subscribeUser('authenticated');
  $auth_user = user_load($auth_uid);
  $auth_email = $auth_user->mail;
  $this
    ->confirmSubscriptionStatus(FALSE, $auth_email, MAILCHIMP_TESTLIST_OPTIONAL, 'Cron Subs: Optional', " BEFORE cron is run");
  $req_uid = $this
    ->subscribeUser('required');
  $req_user = user_load($req_uid);
  $req_email = $req_user->mail;
  $this
    ->confirmSubscriptionStatus(FALSE, $req_email, MAILCHIMP_TESTLIST_REQUIRED, 'Cron Subs: Required', " BEFORE cron is run");

  // Now we run cron and confirm that subscriptions have become active:
  $this
    ->cronRun();
  $this
    ->confirmSubscriptionStatus(TRUE, $anon_email, MAILCHIMP_TESTLIST_ANONYMOUS, 'Cron Subs: Anonymous', " AFTER cron is run");
  $this
    ->confirmSubscriptionStatus(TRUE, $auth_email, MAILCHIMP_TESTLIST_OPTIONAL, 'Cron Subs: Optional', " AFTER cron is run");
  $this
    ->confirmSubscriptionStatus(TRUE, $req_email, MAILCHIMP_TESTLIST_REQUIRED, 'Cron Subs: Required', " AFTER cron is run");

  // *************************************************************************
  // 5. Test basic subscription deletes for each user type and list type with
  // cron enabled for the lists. We use the subscriptions from the previous
  // section.
  // *************************************************************************
  $this
    ->pass($message = '--== Commencing Cron Subscription Deletes ==--', $group = 'Cron Subs');
  user_delete($auth_user->uid);
  $this
    ->confirmSubscriptionStatus(TRUE, $auth_email, MAILCHIMP_TESTLIST_OPTIONAL, 'Cron Subs: Optional', " after account deletion, BEFORE cron");
  user_delete($req_user->uid);

  // We work in a test for cron being disabled with items still in the queue:
  $this
    ->setListsCron(FALSE);
  $this
    ->confirmSubscriptionStatus(TRUE, $req_email, MAILCHIMP_TESTLIST_REQUIRED, 'Cron Subs: Required', " after account deletion & queuing disabled, BEFORE cron");

  // Now we run cron, and confirm that subscriptions have been cancelled:
  $this
    ->cronRun();
  $this
    ->confirmSubscriptionStatus(FALSE, $auth_email, MAILCHIMP_TESTLIST_OPTIONAL, 'Cron Subs: Optional', " after account deletion, AFTER cron");
  $this
    ->confirmSubscriptionStatus(FALSE, $req_email, MAILCHIMP_TESTLIST_REQUIRED, 'Cron Subs: Required', " after account deletion, AFTER cron");

  // *************************************************************************
  // 6. Test for appropriate attention to role changes on required and
  // optional lists.
  // *************************************************************************
  $this
    ->pass('--== Commencing Role-based Subscription Behavior ==--', 'Roles Subs');
  $roles_test_uid = $this
    ->subscribeUser('authenticated');

  // We should now have a user added to the optional list AND the required
  // list, because the required list is REQUIRED. We take advantage of this
  // implication in this test.
  $roles_test_user = user_load($roles_test_uid);
  $this
    ->confirmSubscriptionStatus(TRUE, $roles_test_user->mail, MAILCHIMP_TESTLIST_OPTIONAL, 'Roles Subs: Optional', " user with correct roles opted in");
  $this
    ->confirmSubscriptionStatus(TRUE, $roles_test_user->mail, MAILCHIMP_TESTLIST_REQUIRED, 'Roles Subs: Required', " user with correct roles created");

  // Now we create our "exclusive" role:
  $role = new stdClass();
  $role->name = 'exclusive';
  user_role_save($role);
  $exclusive_role = user_role_load_by_name('exclusive');
  $exclusive_role_id = $exclusive_role->rid;

  // Now we configure our lists to allow only users with this role:
  $lists = array();
  $lists['optional'] = mailchimp_lists_load_multiple_by_name('optional_test_list');
  $lists['required'] = mailchimp_lists_load_multiple_by_name('required_test_list');
  foreach ($lists as $list) {
    $list->settings['roles'] = array(
      $exclusive_role_id => $exclusive_role_id,
    );
    mailchimp_lists_save($list);

    // Queue the updates to the list (normally triggered in the form):
    mailchimp_lists_queue_existing($list, TRUE);
  }

  // The user no longer has the appropriate roles. Check that they have been
  // removed from the now-exclusive lists once Cron is run:
  $this
    ->cronRun();
  $this
    ->confirmSubscriptionStatus(FALSE, $roles_test_user->mail, MAILCHIMP_TESTLIST_OPTIONAL, 'Roles Subs: Optional', " after list role changed to be exclusive");
  $this
    ->confirmSubscriptionStatus(FALSE, $roles_test_user->mail, MAILCHIMP_TESTLIST_REQUIRED, 'Roles Subs: Required', " after list role changed to be exclusive");

  // Now let's give the user the appropriate role (and trigger subscription.)
  $new_roles = $roles_test_user->roles;
  $new_roles[$exclusive_role_id] = $exclusive_role->name;
  $roles_test_user = user_save($roles_test_user, array(
    'roles' => $new_roles,
  ));

  // We should now be subscribed to the required list, but not the optional:
  $this
    ->confirmSubscriptionStatus(FALSE, $roles_test_user->mail, MAILCHIMP_TESTLIST_OPTIONAL, 'Roles Subs: Optional', " after adding exclusive role");
  $this
    ->confirmSubscriptionStatus(TRUE, $roles_test_user->mail, MAILCHIMP_TESTLIST_REQUIRED, 'Roles Subs: Required', " after adding exclusive role");

  // Reset the optional list role permissions:
  $authenticated_role = user_role_load_by_name('authenticated user');
  $authenticated_role_id = $authenticated_role->rid;
  $list_optional = mailchimp_lists_load_multiple_by_name('optional_test_list');
  $list_optional->settings['roles'] = array(
    $authenticated_role_id => $authenticated_role_id,
  );
  mailchimp_lists_save($list_optional);

  // *************************************************************************
  // 7. Test the "queue existing" function for new required lists in cron mode
  // *************************************************************************
  $this
    ->pass('--== Commencing Queue-Existing Subscription Adds ==--', 'Queue Existing Subscriptions');
  $this
    ->setListsCron(TRUE);

  // Alter our required list to require the exclusive role:
  $req_list = mailchimp_lists_load_multiple_by_name('required_test_list');
  $req_list->settings['roles'] = array(
    $exclusive_role_id => $exclusive_role_id,
  );
  mailchimp_lists_save($req_list);

  // Create a new role for our list and user to get matched up later:
  $role = new stdClass();
  $role->name = 'queued';
  user_role_save($role);
  $queued_role = user_role_load_by_name('queued');
  $queued_role_id = $queued_role->rid;

  // Create a user who doesn't have the exclusive role:
  $queued_uid = $this
    ->subscribeUser('authenticated');
  $queued_user = user_load($queued_uid);

  // Add the queued role to the user so he'll match the list when it gets
  // this role:
  $new_roles = $queued_user->roles;
  $new_roles[$queued_role_id] = $queued_role->name;
  $queued_user = user_save($queued_user, array(
    'roles' => $new_roles,
  ));

  // Add the queued role to the MC list so the user now belongs on the list:
  $req_list->settings['roles'] = array(
    $queued_role_id => $queued_role_id,
  );
  mailchimp_lists_save($req_list);

  // Confirm that the user is not currently on the list:
  $this
    ->confirmSubscriptionStatus(FALSE, $queued_user->mail, MAILCHIMP_TESTLIST_REQUIRED, 'Queue Existing Subscriptions', " after roles match, before 'queue existing'");

  // Run the queue existing function, then trigger cron:
  mailchimp_lists_queue_existing($req_list);
  $this
    ->cronRun();

  // Confirm that the user has been added:
  $this
    ->confirmSubscriptionStatus(TRUE, $queued_user->mail, MAILCHIMP_TESTLIST_REQUIRED, 'Queue Existing Subscriptions', " after 'queue existing' and cron run");

  // Reset list settings to normal:
  $req_list->settings['roles'] = array(
    DRUPAL_AUTHENTICATED_RID => DRUPAL_AUTHENTICATED_RID,
  );
  mailchimp_lists_save($req_list);

  // *************************************************************************
  // 8. Test new users aren't inappropriately added to optional lists on cron
  // runs.
  // *************************************************************************
  $this
    ->pass('--== Commencing User-creation Tests for Proper Default Subscriptions ==--', 'New User Subs');
  $this
    ->setListsCron(TRUE);
  $req_only_uid = $this
    ->subscribeUser('required');
  $req_only_user = user_load($req_only_uid);
  $this
    ->cronRun();

  // User should now be subscribed to the required list, but not the optional:
  $this
    ->confirmSubscriptionStatus(TRUE, $req_only_user->mail, MAILCHIMP_TESTLIST_REQUIRED, 'New Users Subs: Required', " to Required after 'user creation' and cron run");
  $this
    ->confirmSubscriptionStatus(FALSE, $req_only_user->mail, MAILCHIMP_TESTLIST_OPTIONAL, 'New Users Subs: Optional', " to Optional without Opt-in after 'user creation' and cron run");

  // Debugging lines follow: uncomment to display the test subscription table.
  // $subtable = variable_get('mailchimp_test_list_data');
  // $this->pass(print_r($subtable, TRUE), "Final Sub Pattern");
  return TRUE;
}