farm-2.x-dev/modules/core/data_stream/modules/notification/tests/src/Kernel/EmailDeliveryTest.php
modules/core/data_stream/modules/notification/tests/src/Kernel/EmailDeliveryTest.php
<?php namespace Drupal\Tests\data_stream_notification\Kernel; use Drupal\Component\Serialization\Json; use Drupal\Core\Test\AssertMailTrait; use Drupal\data_stream_notification\Entity\DataStreamNotification; use Drupal\Tests\data_stream\Kernel\DataStreamTestBase; use Drupal\Tests\data_stream\Traits\DataStreamCreationTrait; use Symfony\Component\HttpFoundation\Request; /** * Tests email notification delivery. * * @group farm */ class EmailDeliveryTest extends DataStreamTestBase { use AssertMailTrait; use DataStreamCreationTrait; /** * The notification delivery manager interface. * * @var \Drupal\data_stream_notification\NotificationDeliveryManagerInterface */ protected $deliveryManager; /** * A basic data stream. * * @var \Drupal\data_stream\Entity\DataStreamInterface */ protected $dataStream; /** * The data stream notification. * * @var \Drupal\data_stream_notification\Entity\DataStreamNotification */ protected $dataStreamNotification; /** * {@inheritdoc} */ protected static $modules = [ 'asset', 'data_stream', 'data_stream_notification', ]; /** * {@inheritdoc} */ public function setUp(): void { parent::setUp(); // Get the notification delivery manager. $this->deliveryManager = $this->container->get('plugin.manager.data_stream_notification_delivery'); // Create a basic data stream for testing. $this->dataStream = $this->createDataStreamEntity([ 'type' => 'basic', 'private_key' => hash('md5', mt_rand()), 'public' => FALSE, ]); $this->dataStreamNotification = DataStreamNotification::create([ 'id' => 'test', 'label' => 'Test', 'data_stream' => $this->dataStream->id(), 'activation_threshold' => 1, 'deactivation_threshold' => 1, 'condition_operator' => 'and', 'condition' => [ [ 'type' => 'numeric', 'condition' => '>', 'threshold' => 0, ], [ 'type' => 'numeric', 'condition' => '<', 'threshold' => 20, ], ], 'delivery_interval' => 1, 'delivery' => [ [ 'type' => 'email', 'email' => [ 'test@test.com', ], ], ], ]); $this->dataStreamNotification->save(); } /** * Tests the email delivery plugin in isolation. */ public function testEmailDeliveryPlugin() { // Get the first configured email delivery plugin. $collections = $this->dataStreamNotification->getPluginCollections(); $email_delivery = $collections['delivery']->get(0); // Build a list of condition summaries to test against. $condition_summaries = array_map(function ($condition) { return $condition->summary(); }, iterator_to_array($collections['condition'])); // Test with valid values. $email_delivery->setContextValue('value', 5); $email_delivery->setContextValue('data_stream', $this->dataStream); $email_delivery->setContextValue('data_stream_notification', $this->dataStreamNotification); $email_delivery->setContextValue('condition_summaries', $condition_summaries); $this->assertTrue($email_delivery->execute()); // Ensure that there is one email in the captured emails array. $this->assertCount(1, $this->getmails(), 'One email was captured.'); $subject = $this->dataStreamNotification->label() . ' notification for data stream: ' . $this->dataStream->label(); $this->assertMail('subject', $subject); $this->assertMailString('body', $this->dataStream->toUrl()->setAbsolute()->toString(), 1); $this->assertMailString('body', $this->dataStream->label(), 1); $this->assertMailString('body', "Actual value: 5", 1); // Assert that each summary was included. foreach ($condition_summaries as $summary) { $this->assertMailString('body', $summary, 1); } // Test when value is non-numeric. $email_delivery->setContextValue('value', 'string'); $email_delivery->setContextValue('data_stream', $this->dataStream); $email_delivery->setContextValue('data_stream_notification', $this->dataStreamNotification); $email_delivery->setContextValue('condition_summaries', $condition_summaries); $this->assertFalse($email_delivery->execute()); $this->assertCount(1, $this->getmails(), 'One email was captured.'); // Test when there is no "value" in the context. $email_delivery->setContextValue('value', NULL); $email_delivery->setContextValue('data_stream', $this->dataStream); $email_delivery->setContextValue('data_stream_notification', $this->dataStreamNotification); $email_delivery->setContextValue('condition_summaries', $condition_summaries); $this->assertFalse($email_delivery->execute()); $this->assertCount(1, $this->getmails(), 'One email was captured.'); } /** * Integration test of the email delivery plugin. */ public function testEmailDeliveryIntegration() { // Get the first configured email delivery plugin. $collections = $this->dataStreamNotification->getPluginCollections(); // Build a list of condition summaries to test against. $condition_summaries = array_map(function ($condition) { return $condition->summary(); }, iterator_to_array($collections['condition'])); // Build the path. $uuid = $this->dataStream->uuid(); $uri = "/api/data_stream/$uuid/data"; // Get the correct name for test data. $name = $this->dataStream->label(); // Post data within the condition threshold. $test_data = [$name => 10]; $request = Request::create($uri, 'POST', ['private_key' => $this->dataStream->getPrivateKey()], [], [], [], Json::encode($test_data)); $response = $this->processRequest($request); $this->assertEquals(201, $response->getStatusCode()); // Ensure that there is one email in the captured emails array. $this->assertCount(1, $this->getmails(), 'One email was captured.'); $subject = $this->dataStreamNotification->label() . ' notification for data stream: ' . $this->dataStream->label(); $this->assertMail('subject', $subject); $this->assertMailString('body', $this->dataStream->toUrl()->setAbsolute()->toString(), 1); $this->assertMailString('body', $this->dataStream->label(), 1); $this->assertMailString('body', "Actual value: 10", 1); // Assert that each summary was included. foreach ($condition_summaries as $summary) { $this->assertMailString('body', $summary, 1); } } }