purge_users-8.x-2.0/tests/src/Kernel/PurgeConditionTest.php

tests/src/Kernel/PurgeConditionTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\purge_users\Kernel;

use Drupal\Tests\purge_users\Traits\ChangedUsersTrait;

/**
 * Covers settings that control which users get purged, and when.
 *
 * @group purge_users
 */
class PurgeConditionTest extends KernelTestBase {

  use ChangedUsersTrait;

  /**
   * Tests the effect of the 'purge_on_cron' setting.
   *
   * @param string $mode
   *   One of 'form' or 'cron'.
   * @param bool $purge_on_cron
   *   TRUE, to enable the 'purge_on_cron' setting.
   * @param string[] $expected
   *   Expected user state changes with the given dataset.
   *   Format: $[$name] = 'deleted'.
   *
   * @testWith ["cron", true, {"created3y": "deleted"}]
   *           ["cron", false, []]
   *           ["form", true, {"created3y": "deleted"}]
   *           ["form", false, {"created3y": "deleted"}]
   */
  public function testPurgeOnCron(string $mode, bool $purge_on_cron, array $expected): void {
    $this->config('purge_users.settings')
      // Set a purge condition.
      ->set('user_never_lastlogin_value', '2')
      ->set('user_never_lastlogin_period', 'year')
      ->set('enabled_never_loggedin_users', TRUE)
      // Set purge method.
      ->set('purge_user_cancel_method', 'user_cancel_delete')
      // Set purge on cron.
      ->set('purge_on_cron', $purge_on_cron)
      ->save();

    // Don't call strtotime repeatedly within the loop.
    $one_year_ago = strtotime('-1 year');
    $three_years_ago = strtotime('-3 year');

    $user_values = [
      'created3y' => ['created' => $three_years_ago],
      'created1y' => ['created' => $one_year_ago],
    ];

    // Create users.
    $original_users = [];
    foreach ($user_values as $name => $values) {
      $values['login'] = 0;
      $original_users[$name] = clone $this->createUser(
        [],
        $name,
        FALSE,
        $values);
    }

    $this->runPurgeOperation($mode);

    $actual = $this->getUserStateChanges($original_users);

    self::assertSame($expected, $actual);
  }

  /**
   * Tests conditions that are based on user roles.
   *
   * @param string $mode
   *   One of 'form' or 'cron'.
   *
   * @testWith ["cron"]
   *           ["form"]
   */
  public function testRoleConditions(string $mode): void {
    $this->config('purge_users.settings')
      // @todo Test roles with all condition types.
      ->set('user_never_lastlogin_value', '2')
      ->set('user_never_lastlogin_period', 'year')
      ->set('enabled_never_loggedin_users', TRUE)
      // Include some roles, exclude others.
      ->set('purge_excluded_users_roles', ['administrator', 'moderator'])
      ->set('purge_included_users_roles', ['authenticated', 'contributor'])
      // Set purge method.
      ->set('purge_user_cancel_method', 'user_cancel_delete')
      ->save();

    $this->createRole([], 'moderator', 'Moderator');
    $this->createRole([], 'contributor', 'Contributor');

    // Don't call strtotime repeatedly within the loop.
    $one_year_ago = strtotime('-1 year');
    $three_years_ago = strtotime('-3 year');

    // phpcs:disable
    // Keep these values on single lines, to compare them more easily.
    $user_values = [
      'uBasic_created1y' =>                ['created' => $one_year_ago,    'roles' => []],
      'uModerator_created1y' =>            ['created' => $one_year_ago,    'roles' => ['moderator']],
      'uContributor_created1y' =>          ['created' => $one_year_ago,    'roles' => ['contributor']],
      'uContributorModerator_created1y' => ['created' => $one_year_ago,    'roles' => ['moderator', 'contributor']],
      'uBasic_created3y' =>                ['created' => $three_years_ago, 'roles' => []],
      'uModerator_created3y' =>            ['created' => $three_years_ago, 'roles' => ['moderator']],
      'uContributor_created3y' =>          ['created' => $three_years_ago, 'roles' => ['contributor']],
      'uContributorModerator_created3y' => ['created' => $three_years_ago, 'roles' => ['moderator', 'contributor']],
    ];
    // phpcs:enable

    // Create users.
    $original_users = [];
    foreach ($user_values as $name => $values) {
      $roles = $values['roles'];
      unset($values['roles']);
      $values['login'] = 0;
      $user = $this->createUser([], $name, FALSE, $values);
      foreach ($roles as $role) {
        $user->addRole($role);
      }
      $user->save();
      $original_users[$name] = clone $user;
    }

    $this->runPurgeOperation($mode);

    $actual = $this->getUserStateChanges($original_users);

    $expected = [
      'uBasic_created3y' => 'deleted',
      'uContributor_created3y' => 'deleted',
    ];

    self::assertSame($expected, $actual);
  }

  /**
   * Tests conditions that are based on created, status and login fields.
   *
   * @param string[] $expected
   *   Format: $[$key] = 'deleted'|'blocked'|'unblocked'|...
   *   Only contains entries that differ from the original state.
   * @param array $settings
   *   Settings within 'purge_users.settings'.
   * @param string $mode
   *   One of 'cron' or 'form'.
   *
   * @dataProvider userConditionsProvider
   */
  public function testUserConditions(array $expected, array $settings, string $mode): void {
    $config = $this->config('purge_users.settings');
    $config->set('purge_user_cancel_method', 'user_cancel_delete');
    foreach ($settings as $k => $v) {
      $config->set($k, $v);
    }
    $config->save();

    // Don't call strtotime repeatedly.
    $one_year_ago = strtotime('-1 year');
    $three_years_ago = strtotime('-3 year');

    // phpcs:disable
    // Keep these values on single lines, to compare them more easily.
    // Note that some permutations are excluded, because the created date must
    // always be earlier or equal to the last login date.
    $user_values = [
      'created3y_loginNever_blocked' => ['created' => $three_years_ago, 'login' => 0,                'status' => 0],
      'created3y_loginNever' =>         ['created' => $three_years_ago, 'login' => 0,                'status' => 1],
      'created3y_login3y_blocked' =>    ['created' => $three_years_ago, 'login' => $three_years_ago, 'status' => 0],
      'created3y_login3y' =>            ['created' => $three_years_ago, 'login' => $three_years_ago, 'status' => 1],
      'created3y_login1y_blocked' =>    ['created' => $three_years_ago, 'login' => $one_year_ago,    'status' => 0],
      'created3y_login1y' =>            ['created' => $three_years_ago, 'login' => $one_year_ago,    'status' => 1],
      'created1y_loginNever_blocked' => ['created' => $one_year_ago,    'login' => 0,                'status' => 0],
      'created1y_loginNever' =>         ['created' => $one_year_ago,    'login' => 0,                'status' => 1],
      'created1y_login1y_blocked' =>    ['created' => $one_year_ago,    'login' => $one_year_ago,    'status' => 0],
      'created1y_login1y' =>            ['created' => $one_year_ago,    'login' => $one_year_ago,    'status' => 1],
    ];
    // phpcs:enable

    // Create users.
    $original_user_objects = [];
    foreach ($user_values as $name => $values) {
      $original_user_objects[$name] = clone $this->createUser(
        [],
        $name,
        FALSE,
        $values);
    }

    $this->runPurgeOperation($mode);

    $actual = $this->getUserStateChanges($original_user_objects);

    self::assertSame($expected, $actual);
  }

  /**
   * Data provider.
   *
   * @return array[]
   *   Format: $[$dataset_name] = [
   *     $expected_user_state_changes,
   *     $purge_users_config,
   *     'cron'|'form',
   *   ].
   */
  public static function userConditionsProvider(): array {
    $value = 2;
    $period = 'year';
    return static::duplicateAndAppendPurgeMode([
      'purge_none' => [
        [
          // No users are purged.
        ],
        [
          // No purge conditions are enabled.
        ],
      ],
      'purge_all' => [
        [
          // All users are purged.
          // This dataset proves that all users were properly created.
          'created3y_loginNever_blocked' => 'deleted',
          'created3y_loginNever' => 'deleted',
          'created3y_login3y_blocked' => 'deleted',
          'created3y_login3y' => 'deleted',
          'created3y_login1y_blocked' => 'deleted',
          'created3y_login1y' => 'deleted',
          'created1y_loginNever_blocked' => 'deleted',
          'created1y_loginNever' => 'deleted',
          'created1y_login1y_blocked' => 'deleted',
          'created1y_login1y' => 'deleted',
        ],
        [
          // Enable a combination of purge conditions, with short timespan.
          'enabled_never_loggedin_users' => TRUE,
          'user_never_lastlogin_value' => 2,
          'user_never_lastlogin_period' => 'day',
          'enabled_loggedin_users' => TRUE,
          'user_lastlogin_value' => 2,
          'user_lastlogin_period' => 'day',
        ],
      ],
      'purge_all_methods' => [
        [
          // All users are purged, like above.
          'created3y_loginNever_blocked' => 'deleted',
          'created3y_loginNever' => 'deleted',
          'created3y_login3y_blocked' => 'deleted',
          'created3y_login3y' => 'deleted',
          'created3y_login1y_blocked' => 'deleted',
          'created3y_login1y' => 'deleted',
          'created1y_loginNever_blocked' => 'deleted',
          'created1y_loginNever' => 'deleted',
          'created1y_login1y_blocked' => 'deleted',
          'created1y_login1y' => 'deleted',
        ],
        [
          // All purge methods are enabled, with short timespan.
          // This used to be broken in previous versions, but now it works.
          'enabled_never_loggedin_users' => TRUE,
          'user_never_lastlogin_value' => 2,
          'user_never_lastlogin_period' => 'day',
          'enabled_loggedin_users' => TRUE,
          'user_lastlogin_value' => 2,
          'user_lastlogin_period' => 'day',
          'enabled_inactive_users' => TRUE,
          'user_inactive_value' => 2,
          'user_inactive_period' => 'day',
          'enabled_blocked_users' => TRUE,
          'user_blocked_value' => 2,
          'user_blocked_period' => 'day',
        ],
      ],
      'never_logged_in' => [
        [
          'created3y_loginNever_blocked' => 'deleted',
          'created3y_loginNever' => 'deleted',
        ],
        [
          'enabled_never_loggedin_users' => TRUE,
          'user_never_lastlogin_value' => $value,
          'user_never_lastlogin_period' => $period,
        ],
      ],
      'not_been_active_for' => [
        [
          'created3y_loginNever_blocked' => 'deleted',
        ],
        [
          'enabled_inactive_users' => TRUE,
          'user_inactive_value' => $value,
          'user_inactive_period' => $period,
        ],
      ],
      'blocked_for' => [
        [
          'created3y_login3y_blocked' => 'deleted',
        ],
        [
          'enabled_blocked_users' => TRUE,
          'user_blocked_value' => $value,
          'user_blocked_period' => $period,
        ],
      ],
      'not_logged_in_for' => [
        [
          'created3y_login3y_blocked' => 'deleted',
          'created3y_login3y' => 'deleted',
        ],
        [
          'enabled_loggedin_users' => TRUE,
          'user_lastlogin_value' => $value,
          'user_lastlogin_period' => $period,
        ],
      ],
      'not_logged_in_for.disregard_blocked' => [
        [
          'created3y_login3y' => 'deleted',
        ],
        [
          'enabled_loggedin_users' => TRUE,
          'user_lastlogin_value' => $value,
          'user_lastlogin_period' => $period,
          'disregard_blocked_users' => TRUE,
        ],
      ],
      'not_logged_in_for.block_on_purge' => [
        [
          'created3y_login3y' => 'blocked',
        ],
        [
          'enabled_loggedin_users' => TRUE,
          'user_lastlogin_value' => $value,
          'user_lastlogin_period' => $period,
          'purge_user_cancel_method' => 'user_cancel_block',
        ],
      ],
      'not_logged_in_for.disregard_blocked.block_on_purge' => [
        [
          'created3y_login3y' => 'blocked',
        ],
        [
          'enabled_loggedin_users' => TRUE,
          'user_lastlogin_value' => $value,
          'user_lastlogin_period' => $period,
          'disregard_blocked_users' => TRUE,
          'purge_user_cancel_method' => 'user_cancel_block',
        ],
      ],
    ]);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc