You are here

public function SchedulerRulesConditionsTest::testEntityIsScheduledConditions in Scheduler 2.x

Tests the conditions for whether an entity is scheduled.

@dataProvider dataStandardEntityTypes()

File

tests/src/Functional/SchedulerRulesConditionsTest.php, line 161

Class

SchedulerRulesConditionsTest
Tests the four conditions that Scheduler provides for use in Rules module.

Namespace

Drupal\Tests\scheduler\Functional

Code

public function testEntityIsScheduledConditions($entityTypeId, $bundle) {

  // The legacy rules condition ids for nodes remain as:
  // -  scheduler_condition_node_scheduled_for_publishing
  // -  scheduler_condition_node_scheduled_for_unpublishing
  // For all other entity types the new derived condition ids are of the form:
  // -  scheduler_entity_is_scheduled_for_publishing:{type}
  // -  scheduler_entity_is_scheduled_for_unpublishing:{type}
  // .
  $condition_prefix = $entityTypeId == 'node' ? 'scheduler_condition_node_' : 'scheduler_entity_is_';
  $condition_suffix = $entityTypeId == 'node' ? '' : ":{$entityTypeId}";
  $assert = $this
    ->assertSession();

  // Create a reaction rule to display a message when an entity is updated and
  // is not scheduled for publishing.
  $rule5 = $this->expressionManager
    ->createRule();
  $rule5
    ->addCondition("{$condition_prefix}scheduled_for_publishing{$condition_suffix}", ContextConfig::create()
    ->map("{$entityTypeId}", "{$entityTypeId}")
    ->negateResult());
  $message5 = 'RULES message 5. This content is not scheduled for publishing.';
  $rule5
    ->addAction('rules_system_message', ContextConfig::create()
    ->setValue('message', $message5)
    ->setValue('type', 'status'));
  $config_entity = $this->rulesStorage
    ->create([
    'id' => 'rule5',
    'events' => [
      [
        'event_name' => "rules_entity_update:{$entityTypeId}",
      ],
    ],
    'expression' => $rule5
      ->getConfiguration(),
  ]);
  $config_entity
    ->save();

  // Create a reaction rule to display a message when an entity is updated and
  // is not scheduled for unpublishing.
  $rule6 = $this->expressionManager
    ->createRule();
  $rule6
    ->addCondition("{$condition_prefix}scheduled_for_unpublishing{$condition_suffix}", ContextConfig::create()
    ->map("{$entityTypeId}", "{$entityTypeId}")
    ->negateResult());
  $message6 = 'RULES message 6. This content is not scheduled for unpublishing.';
  $rule6
    ->addAction('rules_system_message', ContextConfig::create()
    ->setValue('message', $message6)
    ->setValue('type', 'status'));
  $config_entity = $this->rulesStorage
    ->create([
    'id' => 'rule6',
    'events' => [
      [
        'event_name' => "rules_entity_update:{$entityTypeId}",
      ],
    ],
    'expression' => $rule6
      ->getConfiguration(),
  ]);
  $config_entity
    ->save();

  // Create a reaction rule to display a message when an entity is updated and
  // is scheduled for publishing.
  $rule7 = $this->expressionManager
    ->createRule();
  $rule7
    ->addCondition("{$condition_prefix}scheduled_for_publishing{$condition_suffix}", ContextConfig::create()
    ->map("{$entityTypeId}", "{$entityTypeId}"));
  $message7 = 'RULES message 7. This content is scheduled for publishing.';
  $rule7
    ->addAction('rules_system_message', ContextConfig::create()
    ->setValue('message', $message7)
    ->setValue('type', 'status'));
  $config_entity = $this->rulesStorage
    ->create([
    'id' => 'rule7',
    'events' => [
      [
        'event_name' => "rules_entity_update:{$entityTypeId}",
      ],
    ],
    'expression' => $rule7
      ->getConfiguration(),
  ]);
  $config_entity
    ->save();

  // Create a reaction rule to display a message when an entity is updated and
  // is scheduled for unpublishing.
  $rule8 = $this->expressionManager
    ->createRule();
  $rule8
    ->addCondition("{$condition_prefix}scheduled_for_unpublishing{$condition_suffix}", ContextConfig::create()
    ->map("{$entityTypeId}", "{$entityTypeId}"));
  $message8 = 'RULES message 8. This content is scheduled for unpublishing.';
  $rule8
    ->addAction('rules_system_message', ContextConfig::create()
    ->setValue('message', $message8)
    ->setValue('type', 'status'));
  $config_entity = $this->rulesStorage
    ->create([
    'id' => 'rule8',
    'events' => [
      [
        'event_name' => "rules_entity_update:{$entityTypeId}",
      ],
    ],
    'expression' => $rule8
      ->getConfiguration(),
  ]);
  $config_entity
    ->save();
  $this
    ->drupalLogin($this->schedulerUser);

  // Create a published entity.
  $entity = $this
    ->createEntity($entityTypeId, $bundle, [
    'title' => "Scheduled Conditions - {$entityTypeId} {$bundle}",
    'uid' => $this->schedulerUser
      ->id(),
    'status' => TRUE,
  ]);

  // Edit the entity but do not enter any scheduling dates, and check that
  // only messages 5 and 6 are shown.
  $this
    ->drupalGet($entity
    ->toUrl('edit-form'));
  $this
    ->submitForm([], 'Save');
  $assert
    ->pageTextContains($message5);
  $assert
    ->pageTextContains($message6);
  $assert
    ->pageTextNotContains($message7);
  $assert
    ->pageTextNotContains($message8);

  // Edit the entity, set a publish_on date, and check that message 5 is now
  // not shown and we get message 7 instead.
  $edit = [
    'publish_on[0][value][date]' => date('Y-m-d', strtotime('+1 day', $this->requestTime)),
    'publish_on[0][value][time]' => date('H:i:s', strtotime('+1 day', $this->requestTime)),
  ];
  $this
    ->drupalGet($entity
    ->toUrl('edit-form'));
  $this
    ->submitForm($edit, 'Save');
  $assert
    ->pageTextNotContains($message5);
  $assert
    ->pageTextContains($message6);
  $assert
    ->pageTextContains($message7);
  $assert
    ->pageTextNotContains($message8);

  // Edit the entity again, set an unpublish_on date, and check that message 6
  // is now not shown and we get message 8 instead.
  $edit = [
    'unpublish_on[0][value][date]' => date('Y-m-d', strtotime('+2 day', $this->requestTime)),
    'unpublish_on[0][value][time]' => date('H:i:s', strtotime('+2 day', $this->requestTime)),
  ];
  $this
    ->drupalGet($entity
    ->toUrl('edit-form'));
  $this
    ->submitForm($edit, 'Save');
  $assert
    ->pageTextNotContains($message5);
  $assert
    ->pageTextNotContains($message6);
  $assert
    ->pageTextContains($message7);
  $assert
    ->pageTextContains($message8);
}