danse_moderation_notifications-1.0.x-dev/tests/src/Kernel/TokenNotificationsTest.php
tests/src/Kernel/TokenNotificationsTest.php
<?php namespace Drupal\Tests\content_moderation_notifications\Kernel; use Drupal\Component\Render\PlainTextOutput; use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\Tests\node\Traits\ContentTypeCreationTrait; use Drupal\Tests\node\Traits\NodeCreationTrait; use Drupal\workflows\Entity\Workflow; /** * Tests with the contrib token module enabled. * * @group content_moderation_notifications * * @requires module token */ class TokenNotificationsTest extends NotificationsTest { use ContentModerationNotificationTestTrait; use ContentTypeCreationTrait; use NodeCreationTrait; /** * {@inheritdoc} */ protected static $modules = ['field', 'node', 'text', 'token', 'system']; /** * {@inheritdoc} */ protected function setUp():void { parent::setUp(); $this->installEntitySchema('node'); $this->installSchema('node', ['node_access']); $this->installConfig(['filter', 'node', 'system']); $this->createContentType(['type' => 'article']); // Setup site email. $this->config('system.site')->set('mail', 'admin@example.com')->save(); $this->enableModeration('node', 'article'); /** @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = Workflow::load('editorial'); $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'article'); $workflow->save(); } /** * Test token functionality. */ public function testTokens() { // Add a notification. $notification = $this->createNotification([ 'emails' => 'foo@example.com, bar@example.com', 'transitions' => [ 'create_new_draft' => 'create_new_draft', 'publish' => 'publish', 'archived_published' => 'archived_published', ], 'body' => [ 'value' => 'Test token replacement [node:title]. [content_moderation_notifications:from-state] | [content_moderation_notifications:workflow] | [content_moderation_notifications:to-state]!', 'format' => 'filtered_html', ], ]); $entity = $this->createNode(['type' => 'article']); $this->assertMail('to', 'admin@example.com'); // The foo@example.com user does not have permission to see this. $this->assertBccRecipients('bar@example.com'); $this->assertMail('id', 'content_moderation_notifications_content_moderation_notification'); $this->assertMail('subject', PlainTextOutput::renderFromHtml($notification->getSubject())); $this->assertCount(1, $this->getMails()); // Verify token replacement. $mail = $this->getMails()[0]; $this->assertEquals('Test token replacement ' . $entity->label() . ". Draft | Editorial | Draft!\n", $mail['body']); // Publish. $this->container->get('state')->set('system.test_mail_collector', []); $entity->moderation_state = 'published'; $entity->save(); $mail = $this->getMails()[0]; $this->assertEquals('Test token replacement ' . $entity->label() . ". Draft | Editorial | Published!\n", $mail['body']); } /** * Test Twig functionality. */ public function testTwig() { // Add a text field to the 'article' content type for adhoc email address. $field_storage = FieldStorageConfig::create([ 'field_name' => 'adhoc_email', 'entity_type' => 'node', 'type' => 'text', ]); $field_storage->save(); $field = FieldConfig::create([ 'field_name' => 'adhoc_email', 'entity_type' => 'node', 'bundle' => 'article', 'label' => 'Adhoc email', ]); $field->save(); // Add a notification. $notification = $this->createNotification([ 'emails' => 'foo@example.com, bar@example.com, {{ entity.adhoc_email.value }}', 'transitions' => [ 'create_new_draft' => 'create_new_draft', 'publish' => 'publish', 'archived_published' => 'archived_published', ], 'body' => [ 'value' => 'Test Twig replacement {{ entity.title.value }}. [content_moderation_notifications:from-state] | [content_moderation_notifications:workflow] | [content_moderation_notifications:to-state]!', 'format' => 'filtered_html', ], 'subject' => '{{ entity.bundle|title }} with ID {{ entity.id }} Needs review', ]); // Create admin user with adhoc email address so mail is sent. $this->createUser([], NULL, TRUE, ['mail' => 'adhoc1@example.com']); $entity = $this->createNode( [ 'type' => 'article', 'adhoc_email' => 'adhoc1@example.com', ] ); $this->assertMail('to', 'admin@example.com'); // The foo@example.com user will not have access to this entity. $this->assertBccRecipients('bar@example.com,adhoc1@example.com'); $this->assertMail('id', 'content_moderation_notifications_content_moderation_notification'); $this->assertMail('subject', 'Article with ID ' . $entity->id() . ' Needs review'); $this->assertCount(1, $this->getMails()); // Verify token and Twig replacement in the message body. $mail = $this->getMails()[0]; $this->assertEquals('Test Twig replacement ' . $entity->label() . ". Draft | Editorial | Draft!\n", $mail['body']); // Publish. $this->container->get('state')->set('system.test_mail_collector', []); $entity->moderation_state = 'published'; $entity->save(); $mail = $this->getMails()[0]; $this->assertEquals('Test Twig replacement ' . $entity->label() . ". Draft | Editorial | Published!\n", $mail['body']); } }