View source
<?php
namespace Drupal\Tests\lightning_scheduler\Functional;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\lightning_scheduler\Traits\SchedulerUiTrait;
use Drupal\Tests\Traits\Core\CronRunTrait;
class ScheduledTransitionTest extends BrowserTestBase {
use CronRunTrait;
use SchedulerUiTrait;
protected static $modules = [
'lightning_scheduler',
'node',
];
protected function setUp() {
parent::setUp();
$this
->drupalCreateContentType([
'type' => 'page',
]);
node_access_rebuild();
$workflow = $this
->createEditorialWorkflow();
$workflow
->getTypePlugin()
->addEntityTypeAndBundle('node', 'page');
$workflow
->save();
$account = $this
->drupalCreateUser([
'create page content',
'edit own page content',
'view own unpublished content',
'view latest version',
'use editorial transition create_new_draft',
'use editorial transition publish',
'use editorial transition archive',
'schedule editorial transition publish',
'schedule editorial transition archive',
]);
$this
->drupalLogin($account);
}
public function providerSingleTransition() {
return [
'draft to published in future' => [
10,
'published',
'Published',
],
'draft to archived in future' => [
10,
'archived',
'Draft',
],
'draft to published in past' => [
-10,
'published',
'Published',
],
'draft to archived in past' => [
-10,
'archived',
'Draft',
],
];
}
public function testSingleTransition($offset, $to_state, $expected_state_label) {
$assert_session = $this
->assertSession();
$page = $this
->getSession()
->getPage();
$now = time();
$this
->drupalGet('/node/add/page');
$assert_session
->statusCodeEquals(200);
$page
->fillField('Title', 'Schedule This');
$this
->setTransitionData('moderation_state[0][scheduled_transitions][data]', [
[
'when' => $now + $offset,
'state' => $to_state,
],
]);
$page
->pressButton('Save');
$assert_session
->addressMatches('/^\\/node\\/[0-9]+$/');
$edit_url = $this
->getUrl() . '/edit';
if ($offset > 0) {
$this
->setRequestTime($now + $offset + 2);
}
$this
->cronRun();
$this
->drupalGet($edit_url);
$assert_session
->statusCodeEquals(200);
$assert_session
->pageTextContains("Current state {$expected_state_label}");
}
public function testFutureSequence() {
$assert_session = $this
->assertSession();
$page = $this
->getSession()
->getPage();
$now = time();
$this
->drupalGet('/node/add/page');
$assert_session
->statusCodeEquals(200);
$page
->fillField('Title', 'Schedule This');
$this
->setTransitionData('moderation_state[0][scheduled_transitions][data]', [
[
'when' => $now + 10,
'state' => 'published',
],
[
'when' => $now + 20,
'state' => 'archived',
],
]);
$page
->pressButton('Save');
$assert_session
->addressMatches('/^\\/node\\/[0-9]+$/');
$edit_url = $this
->getUrl() . '/edit';
$this
->setRequestTime($now + 12);
$this
->cronRun();
$this
->setRequestTime($now + 24);
$this
->cronRun();
$this
->drupalGet($edit_url);
$assert_session
->statusCodeEquals(200);
$assert_session
->pageTextContains("Current state Archived");
}
public function testInvalidPastSequence() {
$assert_session = $this
->assertSession();
$page = $this
->getSession()
->getPage();
$this
->drupalGet('/node/add/page');
$assert_session
->statusCodeEquals(200);
$page
->fillField('Title', 'Schedule This');
$this
->setTransitionData('moderation_state[0][scheduled_transitions][data]', [
[
'when' => time() - 20,
'state' => 'published',
],
[
'when' => time() - 10,
'state' => 'archived',
],
]);
$page
->pressButton('Save');
$assert_session
->addressMatches('/^\\/node\\/[0-9]+$/');
$edit_url = $this
->getUrl() . '/edit';
$this
->cronRun();
$this
->drupalGet($edit_url);
$assert_session
->statusCodeEquals(200);
$assert_session
->pageTextContains("Current state Draft");
}
public function testSingleTransitionWithPendingRevision() {
$assert_session = $this
->assertSession();
$page = $this
->getSession()
->getPage();
$now = time();
$this
->drupalGet('/node/add/page');
$assert_session
->statusCodeEquals(200);
$page
->fillField('Title', 'Schedule This');
$page
->selectFieldOption('moderation_state[0][state]', 'Published');
$page
->pressButton('Save');
$assert_session
->addressMatches('/^\\/node\\/[0-9]+$/');
$edit_url = $this
->getUrl() . '/edit';
$this
->drupalGet($edit_url);
$page
->fillField('Title', 'MC Hammer');
$page
->selectFieldOption('moderation_state[0][state]', 'Draft');
$this
->setTransitionData('moderation_state[0][scheduled_transitions][data]', [
[
'when' => $now + 10,
'state' => 'published',
],
]);
$page
->pressButton('Save');
$this
->setRequestTime($now + 12);
$this
->cronRun();
$this
->drupalGet($edit_url);
$assert_session
->statusCodeEquals(200);
$assert_session
->fieldValueEquals('Title', 'MC Hammer');
}
}