message_notify-8.x-1.x-dev/tests/src/Kernel/MessageNotifyTest.php

tests/src/Kernel/MessageNotifyTest.php
<?php

namespace Drupal\Tests\message_notify\Kernel;

use Drupal\KernelTests\KernelTestBase;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\message\Entity\Message;
use Drupal\message\Entity\MessageTemplate;
use Drupal\message_notify\Exception\MessageNotifyException;
use Drupal\user\Entity\User;

/**
 * Test the Message notifier plugins handling.
 *
 * @group message_notify
 */
class MessageNotifyTest extends KernelTestBase {

  /**
   * Testing message template.
   *
   * @var \Drupal\message\MessageTemplateInterface
   */
  protected $messageTemplate;

  /**
   * The message notification service.
   *
   * @var \Drupal\message_notify\MessageNotifyInterface
   */
  protected $messageNotify;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'message_notify_test',
    'message_notify',
    'message',
    'user',
    'system',
    'field',
    'text',
    'filter',
    'filter_test',
  ];

  /**
   * {@inheritdoc}
   */
  public function setUp(): void {
    parent::setUp();

    $this->installEntitySchema('user');
    $this->installEntitySchema('message');
    $this->installConfig([
      'message',
      'message_notify',
      'message_notify_test',
      'filter_test',
    ]);
    $this->installSchema('system', ['sequences']);

    $this->messageTemplate = MessageTemplate::load('message_notify_test');

    $this->messageNotify = $this->container->get('message_notify.sender');
  }

  /**
   * Test send method.
   *
   * Check the correct info is sent to delivery.
   */
  public function testDeliver() {
    $message = Message::create(['template' => $this->messageTemplate->id()]);
    $message->message_text_another = 'another field';
    $this->messageNotify->send($message, [], 'test');

    // The test notifier added the output to the message.
    $output = $message->output;
    $text = $message->getText();
    $this->assertStringContainsString((string) $text[1], (string) $output['foo']);
    $this->assertStringContainsString('another field', (string) $output['foo']);
    $this->assertStringContainsString((string) $text[0], (string) $output['bar']);
    $this->assertStringNotContainsString('another field', (string) $output['bar']);
  }

  /**
   * Test Message save on delivery.
   */
  public function testPostSendMessageSave() {
    $account = User::create(['name' => $this->randomMachineName()]);
    $account->save();
    $message = Message::create(['template' => $this->messageTemplate->id(), 'uid' => $account->id()]);
    $message->fail = FALSE;
    $this->messageNotify->send($message, [], 'test');
    $this->assertNotNull($message->id(), 'Message saved after successful delivery.');

    $message = Message::create(['template' => $this->messageTemplate->id(), 'uid' => $account->id()]);
    $message->fail = TRUE;
    $this->messageNotify->send($message, [], 'test');
    $this->assertNull($message->id(), 'Message not saved after unsuccessful delivery.');

    // Disable saving Message on delivery.
    $options = [
      'save on fail' => FALSE,
      'save on success' => FALSE,
    ];

    $message = Message::create(['template' => $this->messageTemplate->id(), 'uid' => $account->id()]);
    // @todo See above.
    $message->fail = FALSE;
    $this->messageNotify->send($message, $options, 'test');
    $this->assertTrue($message->isNew(), 'Message not saved after successful delivery.');

    $message = Message::create(['template' => $this->messageTemplate->id(), 'uid' => $account->id()]);
    $message->fail = TRUE;
    $this->messageNotify->send($message, $options, 'test');
    $this->assertTrue($message->isNew(), 'Message not saved after unsuccessful delivery.');
  }

  /**
   * Test populating the rendered output to fields.
   *
   * @dataProvider providerPostSendRenderedField
   */
  public function testPostSendRenderedField(array $options, bool $exception) {
    $this->attachRenderedFields();

    $message = Message::create(['template' => $this->messageTemplate->id()]);

    if ($exception) {
      $this->expectException(MessageNotifyException::class);
    }

    $this->messageNotify->send($message, $options, 'test');

    if (!$exception) {
      $this->assertArrayHasKey('rendered fields', $options);
      $fields = array_values($options['rendered fields']);
      $this->assertNotEmpty($fields);
      foreach ($fields as $field) {
        $this->assertNotEmpty($message->{$field}->value, 'The message field ' . $field . ' was not rendered.');
      }
    }
  }

  /**
   * Data provider for ::testPostSendRenderedField.
   *
   * @return array
   *   The test cases.
   */
  public static function providerPostSendRenderedField():array {
    $cases = [];

    $cases['plain fields'] = [
      [
        'rendered fields' => [
          'foo' => 'rendered_foo',
          'bar' => 'rendered_bar',
        ],
      ],
      FALSE,
    ];

    $cases['field with text-processing'] = [
      [
        'rendered fields' => [
          'foo' => 'rendered_baz',
          'bar' => 'rendered_bar',
        ],
      ],
      FALSE,
    ];

    $cases['missing view mode key in rendered fields'] = [
      [
        'rendered fields' => [
          'foo' => 'rendered_foo',
          // No "bar" field.
        ],
      ],
      TRUE,
    ];

    $cases['invalid field name'] = [
      [
        'rendered fields' => [
          'foo' => 'wrong_field',
          'bar' => 'rendered_bar',
        ],
      ],
      TRUE,
    ];

    return $cases;
  }

  /**
   * Helper function to attach rendered fields.
   *
   * @see MessageNotifyTest::testPostSendRenderedField()
   */
  protected function attachRenderedFields() {
    foreach (['rendered_foo', 'rendered_bar', 'rendered_baz'] as $field_name) {
      // Use formatted text for `baz`, plain for others.
      $config = [
        'field_name' => $field_name,
        'type' => 'string_long',
        'entity_type' => 'message',
      ];
      if ($field_name == 'rendered_baz') {
        $config['type'] = 'text_long';
      }
      $field_storage = FieldStorageConfig::create($config);
      $field_storage->save();

      $field = FieldConfig::create([
        'field_name' => $field_name,
        'bundle' => $this->messageTemplate->id(),
        'entity_type' => 'message',
        'label' => $field_name,
      ]);

      $field->save();
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc