View source
<?php
namespace Drupal\Tests\scheduler\Functional;
use Drupal\commerce_product\Entity\ProductType;
use Drupal\node\Entity\NodeType;
use Drupal\media\Entity\MediaType;
class SchedulerHooksTest extends SchedulerBrowserTestBase {
protected static $modules = [
'scheduler_api_test',
'menu_ui',
'path',
];
protected function setUp() : void {
parent::setUp();
$customNodeName = 'scheduler_api_node_test';
$customNodetype = NodeType::load($customNodeName);
$this
->assertNotNull($customNodetype, "Custom node type {$customNodeName} failed to load during setUp");
$customMediaName = 'scheduler_api_media_test';
$customMediatype = MediaType::load($customMediaName);
$this
->assertNotNull($customMediatype, "Custom media type {$customMediaName} failed to load during setUp");
$customProductName = 'scheduler_api_product_test';
$customProductType = ProductType::load($customProductName);
$this
->assertNotNull($customProductType, "Custom product type {$customProductName} failed to load during setUp");
$this->webUser = $this
->drupalCreateUser([
"create {$customNodeName} content",
"edit any {$customNodeName} content",
'schedule publishing of nodes',
"create {$customMediaName} media",
"edit any {$customMediaName} media",
'schedule publishing of media',
"create {$customProductName} commerce_product",
"update any {$customProductName} commerce_product",
'schedule publishing of commerce_product',
'administer commerce_store',
]);
$this->webUser
->set('name', 'Wenlock the Web user')
->save();
}
public function dataCustomEntityTypes() {
$data = [
'#node' => [
'node',
'scheduler_api_node_test',
],
'#media' => [
'media',
'scheduler_api_media_test',
],
'#commerce_product' => [
'commerce_product',
'scheduler_api_product_test',
],
];
return $data;
}
public function testList($entityTypeId, $bundle) {
$storage = $this
->entityStorageObject($entityTypeId);
$this
->drupalLogin($this->schedulerUser);
$entity1 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Pink {$entityTypeId} list publish me",
]);
$entity2 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Purple {$entityTypeId} list publish me",
]);
$entity3 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Pink {$entityTypeId} list unpublish me",
]);
$entity4 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Purple {$entityTypeId} list unpublish me",
]);
$this
->assertFalse($entity1
->isPublished(), "Before cron, {$entityTypeId} 1 '{$entity1->label()}' should be unpublished.");
$this
->assertFalse($entity2
->isPublished(), "Before cron, {$entityTypeId} 2 '{$entity2->label()}' should be unpublished.");
$this
->assertTrue($entity3
->isPublished(), "Before cron, {$entityTypeId} 3 '{$entity3->label()}' should be published.");
$this
->assertTrue($entity4
->isPublished(), "Before cron, {$entityTypeId} 4 '{$entity4->label()}' should be published.");
scheduler_cron();
$storage
->resetCache();
for ($i = 1; $i <= 4; $i++) {
${"entity{$i}"} = $storage
->load(${"entity{$i}"}
->id());
}
$this
->assertTrue($entity1
->isPublished(), "After cron, {$entityTypeId} 1 '{$entity1->label()}' should be published.");
$this
->assertTrue($entity2
->isPublished(), "After cron, {$entityTypeId} 2 '{$entity2->label()}' should be published.");
$this
->assertFalse($entity3
->isPublished(), "After cron, {$entityTypeId} 3 '{$entity3->label()}' should be unpublished.");
$this
->assertFalse($entity4
->isPublished(), "After cron, {$entityTypeId} 4 '{$entity4->label()}' should be unpublished.");
}
public function testListAlter($entityTypeId, $bundle) {
$storage = $this
->entityStorageObject($entityTypeId);
$this
->drupalLogin($this->schedulerUser);
$entity1 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Pink {$entityTypeId} list_alter do not publish me",
'publish_on' => strtotime('-1 day'),
]);
$entity2 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Purple {$entityTypeId} list_alter do not publish me",
'publish_on' => strtotime('-1 day'),
]);
$entity3 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Pink {$entityTypeId} list_alter publish me",
]);
$entity4 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Purple {$entityTypeId} list_alter publish me",
]);
$entity5 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Pink {$entityTypeId} list_alter do not unpublish me",
'unpublish_on' => strtotime('-1 day'),
]);
$entity6 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Purple {$entityTypeId} list_alter do not unpublish me",
'unpublish_on' => strtotime('-1 day'),
]);
$entity7 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Pink {$entityTypeId} list_alter unpublish me",
]);
$entity8 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Purple {$entityTypeId} list_alter unpublish me",
]);
$this
->assertFalse($entity1
->isPublished(), "Before cron, {$entityTypeId} 1 '{$entity1->label()}' should be unpublished.");
$this
->assertFalse($entity2
->isPublished(), "Before cron, {$entityTypeId} 2 '{$entity2->label()}' should be unpublished.");
$this
->assertFalse($entity3
->isPublished(), "Before cron, {$entityTypeId} 3 '{$entity3->label()}' should be unpublished.");
$this
->assertFalse($entity4
->isPublished(), "Before cron, {$entityTypeId} 4 '{$entity4->label()}' should be unpublished.");
$this
->assertTrue($entity5
->isPublished(), "Before cron, {$entityTypeId} 5 '{$entity5->label()}' should be published.");
$this
->assertTrue($entity6
->isPublished(), "Before cron, {$entityTypeId} 6 '{$entity6->label()}' should be published.");
$this
->assertTrue($entity7
->isPublished(), "Before cron, {$entityTypeId} 7 '{$entity7->label()}' should be published.");
$this
->assertTrue($entity8
->isPublished(), "Before cron, {$entityTypeId} 8 '{$entity8->label()}' should be published.");
scheduler_cron();
$storage
->resetCache();
for ($i = 1; $i <= 8; $i++) {
${"entity{$i}"} = $storage
->load(${"entity{$i}"}
->id());
}
$this
->assertFalse($entity1
->isPublished(), "After cron, {$entityTypeId} 1 '{$entity1->label()}' should be unpublished.");
$this
->assertFalse($entity2
->isPublished(), "After cron, {$entityTypeId} 2 '{$entity2->label()}' should be unpublished.");
$this
->assertTrue($entity3
->isPublished(), "After cron, {$entityTypeId} 3 '{$entity3->label()}' should be published.");
$this
->assertTrue($entity4
->isPublished(), "After cron, {$entityTypeId} 4 '{$entity4->label()}' should be published.");
$this
->assertTrue($entity5
->isPublished(), "After cron, {$entityTypeId} 5 '{$entity5->label()}' should be published.");
$this
->assertTrue($entity6
->isPublished(), "After cron, {$entityTypeId} 6 '{$entity6->label()}' should be published.");
$this
->assertFalse($entity7
->isPublished(), "After cron, {$entityTypeId} 7 '{$entity7->label()}' should be unpublished.");
$this
->assertFalse($entity8
->isPublished(), "After cron, {$entityTypeId} 8 '{$entity8->label()}' should be unpublished.");
}
public function testPublishingAllowed($entityTypeId, $bundle) {
$storage = $this
->entityStorageObject($entityTypeId);
$titleField = $entityTypeId == 'media' ? 'name' : 'title';
$this
->drupalLogin($this->webUser);
$this
->drupalGet($this
->entityAddUrl($entityTypeId, $bundle));
$this
->assertSession()
->fieldExists('edit-field-approved-publishing-value');
$edit = [
"{$titleField}[0][value]" => "Blue {$entityTypeId} - Set publish-on date without approval",
'publish_on[0][value][date]' => date('Y-m-d', time() + 3),
'publish_on[0][value][time]' => date('H:i:s', time() + 3),
];
$this
->submitForm($edit, 'Save');
$this
->assertSession()
->pageTextMatches('/is scheduled for publishing.* but will not be published until approved/');
$entity = $this
->createUnapprovedEntity($entityTypeId, $bundle, 'publish_on');
scheduler_cron();
$storage
->resetCache([
$entity
->id(),
]);
$entity = $storage
->load($entity
->id());
$this
->assertFalse($entity
->isPublished(), "Unapproved '{$entity->label()}' should not be published during cron processing.");
$entity = $this
->createUnapprovedEntity($entityTypeId, $bundle, 'publish_on');
$this
->approveEntity($entityTypeId, $entity
->id(), 'field_approved_publishing');
$this
->assertFalse($entity
->isPublished(), "New approved '{$entity->label()}' should not be initially published.");
scheduler_cron();
$storage
->resetCache([
$entity
->id(),
]);
$entity = $storage
->load($entity
->id());
$this
->assertTrue($entity
->isPublished(), "Approved '{$entity->label()}' should be published during cron processing.");
$bundle_field_name = $entity
->getEntityType()
->get('entity_keys')['bundle'];
$entity->{$bundle_field_name}->entity
->setThirdPartySetting('scheduler', 'publish_past_date', 'publish')
->save();
$entity = $this
->createUnapprovedEntity($entityTypeId, $bundle, 'publish_on');
$this
->assertFalse($entity
->isPublished(), "New unapproved '{$entity->label()}' with a date in the past should not be published immediately after saving.");
$this
->approveEntity($entityTypeId, $entity
->id(), 'field_approved_publishing');
$storage
->resetCache([
$entity
->id(),
]);
$entity = $storage
->load($entity
->id());
$this
->assertTrue($entity
->isPublished(), "New approved '{$entity->label()}' with a date in the past should be published immediately when created programatically.");
$entity = $this
->createUnapprovedEntity($entityTypeId, $bundle, 'publish_on');
$this
->drupalGet($entity
->toUrl('edit-form'));
$this
->submitForm([
'field_approved_publishing[value]' => '1',
], 'Save');
$storage
->resetCache([
$entity
->id(),
]);
$entity = $storage
->load($entity
->id());
$this
->assertTrue($entity
->isPublished(), "Approved '{$entity->label()}' with a date in the past is published immediately after saving via edit form.");
}
public function testUnpublishingAllowed($entityTypeId, $bundle) {
$storage = $this
->entityStorageObject($entityTypeId);
$titleField = $entityTypeId == 'media' ? 'name' : 'title';
$this
->drupalLogin($this->webUser);
$this
->drupalGet($this
->entityAddUrl($entityTypeId, $bundle));
$this
->assertSession()
->fieldExists('edit-field-approved-unpublishing-value');
$edit = [
"{$titleField}[0][value]" => "Red {$entityTypeId} - Set unpublish-on date without approval",
'unpublish_on[0][value][date]' => date('Y-m-d', time() + 3),
'unpublish_on[0][value][time]' => date('H:i:s', time() + 3),
];
$this
->submitForm($edit, 'Save');
$this
->assertSession()
->pageTextMatches('/is scheduled for unpublishing.* but will not be unpublished until approved/');
$entity = $this
->createUnapprovedEntity($entityTypeId, $bundle, 'unpublish_on');
scheduler_cron();
$storage
->resetCache([
$entity
->id(),
]);
$entity = $storage
->load($entity
->id());
$this
->assertTrue($entity
->isPublished(), "Unapproved '{$entity->label()}' should not be unpublished during cron processing.");
$entity = $this
->createUnapprovedEntity($entityTypeId, $bundle, 'unpublish_on');
$this
->approveEntity($entityTypeId, $entity
->id(), 'field_approved_unpublishing');
$this
->assertTrue($entity
->isPublished(), "New approved '{$entity->label()}' should initially remain published.");
scheduler_cron();
$storage
->resetCache([
$entity
->id(),
]);
$entity = $storage
->load($entity
->id());
$this
->assertFalse($entity
->isPublished(), "Approved '{$entity->label()}' should be unpublished during cron processing.");
}
protected function createUnapprovedEntity($entityTypeId, $bundle, $date_field) {
$settings = [
'title' => ($date_field == 'publish_on' ? 'Blue' : 'Red') . " {$entityTypeId} {$this->randomMachineName(10)}",
'status' => $date_field == 'unpublish_on',
$date_field => strtotime('-1 day'),
'field_approved_publishing' => 0,
'field_approved_unpublishing' => 0,
];
return $this
->createEntity($entityTypeId, $bundle, $settings);
}
protected function approveEntity($entityTypeId, $id, $field_name) {
$storage = $this
->entityStorageObject($entityTypeId);
$storage
->resetCache([
$id,
]);
$entity = $storage
->load($id);
$entity
->set($field_name, TRUE);
$label_field = $entity
->getEntityType()
->get('entity_keys')['label'];
$entity
->set($label_field, $entity
->label() . " - approved for publishing: {$entity->field_approved_publishing->value}, for unpublishing: {$entity->field_approved_unpublishing->value}")
->save();
}
public function testHideDateField($entityTypeId, $bundle) {
$this
->drupalLogin($this->schedulerUser);
$entity1 = $this
->createEntity($entityTypeId, $bundle, [
'title' => "Red {$entityTypeId} will have neither field hidden",
]);
$entity2 = $this
->createEntity($entityTypeId, $bundle, [
'title' => "Orange {$entityTypeId} will have the publish-on field hidden",
]);
$entity3 = $this
->createEntity($entityTypeId, $bundle, [
'title' => "Yellow {$entityTypeId} will have the unpublish-on field hidden",
]);
$entity4 = $this
->createEntity($entityTypeId, $bundle, [
'title' => "Green {$entityTypeId} will have both Scheduler fields hidden",
]);
$bundle_field_name = $entity1
->getEntityType()
->get('entity_keys')['bundle'];
$entity1->{$bundle_field_name}->entity
->setThirdPartySetting('scheduler', 'expand_fieldset', 'always')
->save();
$assert = $this
->assertSession();
$this
->drupalGet($entity1
->toUrl('edit-form'));
$assert
->ElementExists('xpath', '//input[@id = "edit-publish-on-0-value-date"]');
$assert
->ElementExists('xpath', '//input[@id = "edit-unpublish-on-0-value-date"]');
$this
->drupalGet($entity2
->toUrl('edit-form'));
$assert
->ElementNotExists('xpath', '//input[@id = "edit-publish-on-0-value-date"]');
$assert
->ElementExists('xpath', '//input[@id = "edit-unpublish-on-0-value-date"]');
$this
->drupalGet($entity3
->toUrl('edit-form'));
$assert
->ElementExists('xpath', '//input[@id = "edit-publish-on-0-value-date"]');
$assert
->ElementNotExists('xpath', '//input[@id = "edit-unpublish-on-0-value-date"]');
$this
->drupalGet($entity4
->toUrl('edit-form'));
$assert
->ElementNotExists('xpath', '//input[@id = "edit-publish-on-0-value-date"]');
$assert
->ElementNotExists('xpath', '//input[@id = "edit-unpublish-on-0-value-date"]');
}
public function testPublishUnpublishProcess($entityTypeId, $bundle) {
$storage = $this
->entityStorageObject($entityTypeId);
$entity1 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Red {$entityTypeId} will cause a failure on publishing",
'publish_on' => strtotime('-1 day'),
]);
$entity2 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Orange {$entityTypeId} will be unpublished by the API test module not Scheduler",
'unpublish_on' => strtotime('-1 day'),
]);
$entity3 = $this
->createEntity($entityTypeId, $bundle, [
'status' => FALSE,
'title' => "Yellow {$entityTypeId} will be published by the API test module not Scheduler",
'publish_on' => strtotime('-1 day'),
]);
$entity4 = $this
->createEntity($entityTypeId, $bundle, [
'status' => TRUE,
'title' => "Blue {$entityTypeId} will cause a failure on unpublishing",
'unpublish_on' => strtotime('-1 day'),
]);
scheduler_cron();
$storage
->resetCache([
$entity1
->id(),
]);
$entity1 = $storage
->load($entity1
->id());
$this
->assertFalse($entity1
->isPublished(), 'Red should remain unpublished.');
$this
->assertNotEmpty($entity1->publish_on->value, 'Red should still have a publish-on date.');
$storage
->resetCache([
$entity2
->id(),
]);
$entity2 = $storage
->load($entity2
->id());
$this
->assertFalse($entity2
->isPublished(), 'Orange should be unpublished.');
$this
->assertStringContainsString('unpublishing processed by API test module', $entity2
->label(), 'Orange should be processed by the API test module.');
$this
->assertEmpty($entity2->unpublish_on->value, 'Orange should not have an unpublish-on date.');
$storage
->resetCache([
$entity3
->id(),
]);
$entity3 = $storage
->load($entity3
->id());
$this
->assertTrue($entity3
->isPublished(), 'Yellow should be published.');
$this
->assertStringContainsString('publishing processed by API test module', $entity3
->label(), 'Yellow should be processed by the API test module.');
$this
->assertEmpty($entity3->publish_on->value, 'Yellow should not have a publish-on date.');
$storage
->resetCache([
$entity4
->id(),
]);
$entity4 = $storage
->load($entity4
->id());
$this
->assertTrue($entity4
->isPublished(), 'Blue should remain published.');
$this
->assertNotEmpty($entity4->unpublish_on->value, 'Blue should still have an unpublish-on date.');
}
}