ww_publish-8.x-1.x-dev/tests/src/Kernel/WwPublishEventTest.php

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

namespace Drupal\Tests\ww_publish\Kernel;

use Aws\Sns\Message;
use Drupal\Core\Logger\RfcLogLevel;
use Drupal\node\Entity\Node;
use Drupal\ww_publish\Entity\SnsMessageEntity;
use Drupal\ww_publish\Entity\SnsMessageEntityInterface;
use Symfony\Component\ErrorHandler\BufferingLogger;

/**
 * Tests Woodwing Publish SNS event functionality.
 *
 * @group ww_publish
 */
class WwPublishEventTest extends WwPublishTestBase {

  /**
   * Tests successful messages.
   */
  public function testAcceptedMessages() {

    $logger = new BufferingLogger();
    $this->container->get('logger.factory')->addLogger($logger);
    $data = [
      'MessageId' => '1',
      'Timestamp' => '',
      'TopicArn' => 'test:ecs-export-topic:test',
      'Type' => 'Notification',
      'Signature' => '',
      'SigningCertURL' => '',
      'SignatureVersion' => '',
      'Message' => \json_encode([
        'id' => '1',
        'name' => 'name',
        'url' => $this->getFixturePath('test_article', 'article.zip'),
        'metadataUrl' => $this->getFixturePath('test_article', 'metadata.json'),
        'articleJsonUrl' => $this->getFixturePath('test_article', 'article.json'),
        'tenantId' => '1',
        'brand' => 'test',
      ])
    ];

    $message = new Message($data);
    \Drupal::service('amazon_sns.message_dispatcher')->dispatch($message);
    $logs = $logger->cleanLogs();

    $this->assertEquals(RfcLogLevel::WARNING, $logs[0][0]);
    $this->assertEquals('Accepted unconfirmed sns message from TopicArn @topicarn.', $logs[0][1]);
    $this->assertEquals('test:ecs-export-topic:test', $logs[0][2]['@topicarn']);

    /** @var \Drupal\ww_publish\Entity\SnsMessageEntityInterface $message */
    $message_entity = SnsMessageEntity::load(1);
    $this->assertEquals('name', $message_entity->label());
    $this->assertEquals('test', $message_entity->getBrand());
    $this->assertEquals('1', $message_entity->getTenantId());
    $this->assertFalse($message_entity->isExecuted());
    $this->assertStringContainsString('test_article/article.zip', $message_entity->getZipUrl());
    $this->assertStringContainsString('test_article/metadata.json', $message_entity->getMetadataUrl());
    $this->assertStringContainsString('test_article/article.json', $message_entity->getArticleJsonUrl());

    // Simulate that the message has been processed.
    $message_entity->set('status', SnsMessageEntityInterface::IMPORTED);
    $message_entity->save();
    $this->assertTrue($message_entity->isExecuted());

    // Set the explicit topic ARN and simulate an event for the same ID.
    $this->config('ww_publish.settings')
      ->set('topic_arn', ['test:ecs-export-topic:test'])
      ->save();

    $data = [
      'MessageId' => '1',
      'Timestamp' => '',
      'TopicArn' => 'test:ecs-export-topic:test',
      'Type' => 'Notification',
      'Signature' => '',
      'SigningCertURL' => '',
      'SignatureVersion' => '',
      'Message' => \json_encode([
        'id' => '1',
        'name' => 'name update',
        'url' => $this->getFixturePath('test_article2', 'article.zip'),
        'metadataUrl' => $this->getFixturePath('test_article2', 'metadata.json'),
        'articleJsonUrl' => $this->getFixturePath('test_article2', 'article.json'),
        'tenantId' => '2',
        'brand' => 'test update',
      ])
    ];
    $message = new Message($data);
    \Drupal::service('amazon_sns.message_dispatcher')->dispatch($message);
    \Drupal::service('ww_publish.notification_logger_subscriber')->destruct();
    $this->assertEmpty(Node::loadMultiple());

    $logs = $logger->cleanLogs();
    $this->assertCount(0, $logs);

    $message_entity = SnsMessageEntity::load(1);
    $this->assertEquals('name update', $message_entity->label());
    $this->assertEquals('test update', $message_entity->getBrand());
    $this->assertEquals('2', $message_entity->getTenantId());
    $this->assertFalse($message_entity->isExecuted());
    $this->assertStringContainsString('test_article2/article.zip', $message_entity->getZipUrl());
    $this->assertStringContainsString('test_article2/metadata.json', $message_entity->getMetadataUrl());
    $this->assertStringContainsString('test_article2/article.json', $message_entity->getArticleJsonUrl());
  }

  /**
   * Tests invalid messages.
   */
  public function testInvalidMessages() {

    $logger = new BufferingLogger();
    $this->container->get('logger.factory')->addLogger($logger);
    $data = [
      'MessageId' => '1',
      'Timestamp' => '',
      'TopicArn' => 'unknown-topic-arn',
      'Type' => 'Notification',
      'Signature' => '',
      'SigningCertURL' => '',
      'SignatureVersion' => '',
      'Message' => \json_encode([
        'id' => '1',
        'name' => 'name',
        'url' => $this->getFixturePath('test_article', 'article.zip'),
        'metadataUrl' => $this->getFixturePath('test_article', 'metadata.json'),
        'articleJsonUrl' => $this->getFixturePath('test_article', 'article.json'),
        'tenantId' => '1',
        'brand' => 'test',
      ])
    ];

    $message = new Message($data);
    \Drupal::service('amazon_sns.message_dispatcher')->dispatch($message);
    $logs = $logger->cleanLogs();

    $this->assertEquals(RfcLogLevel::ERROR, $logs[0][0]);
    $this->assertEquals('Not processing Amazon SNS message with TopicArn @topicarn.', $logs[0][1]);
    $this->assertEquals('unknown-topic-arn', $logs[0][2]['@topicarn']);

    $this->assertCount(0, SnsMessageEntity::loadMultiple());

    // Set the explicit topic ARN and simulate an event for a different
    $this->config('ww_publish.settings')
      ->set('topic_arn', ['test:ecs-export-topic:test'])
      ->save();

    $data = [
      'MessageId' => '1',
      'Timestamp' => '',
      'TopicArn' => 'notatest:ecs-export-topic:test',
      'Type' => 'Notification',
      'Signature' => '',
      'SigningCertURL' => '',
      'SignatureVersion' => '',
      'Message' => \json_encode([
        'id' => '1',
        'name' => 'name',
        'url' => $this->getFixturePath('test_article', 'article.zip'),
        'metadataUrl' => $this->getFixturePath('test_article', 'metadata.json'),
        'articleJsonUrl' => $this->getFixturePath('test_article', 'article.json'),
        'tenantId' => '1',
        'brand' => 'test',
      ])
    ];
    $message = new Message($data);
    \Drupal::service('amazon_sns.message_dispatcher')->dispatch($message);

    $logs = $logger->cleanLogs();
    $this->assertEquals(RfcLogLevel::ERROR, $logs[0][0]);
    $this->assertEquals('Not processing Amazon SNS message with TopicArn @topicarn.', $logs[0][1]);
    $this->assertEquals('notatest:ecs-export-topic:test', $logs[0][2]['@topicarn']);
    $this->assertCount(0, SnsMessageEntity::loadMultiple());
  }

}

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

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