data_pipelines-1.x-dev/tests/src/Kernel/Form/DatasetBatchOperationsTest.php

tests/src/Kernel/Form/DatasetBatchOperationsTest.php
<?php

declare(strict_types=1);

namespace Drupal\Tests\data_pipelines\Kernel\Form;

use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Tests\data_pipelines\Kernel\DatasetKernelTestBase;
use Drupal\data_pipelines\Entity\DatasetInterface;
use Drupal\data_pipelines\Form\DatasetBatchContext;
use Drupal\data_pipelines\Form\DatasetBatchOperations;

/**
 * Defines a class for testing DatasetBatchOperations.
 *
 * @group data_pipelines
 *
 * @covers \Drupal\data_pipelines\Form\DatasetBatchOperations
 */
class DatasetBatchOperationsTest extends DatasetKernelTestBase {

  /**
   * Tests batch builder.
   */
  public function testBatchForDataset(): void {
    $dataset = $this->createTestDataset();
    $batch = DatasetBatchOperations::batchForDataset($dataset);
    $this->assertEquals([
      [[DatasetBatchOperations::class, 'operationQueueItem'], [$dataset->id()]],
      [[DatasetBatchOperations::class, 'operationProcess'], [$dataset->id()]],
    ], $batch['operations']);
  }

  /**
   * Tests validation operation.
   */
  public function testValidation(): void {
    $dataset = $this->createTestDataset();
    $dataset->setPendingProcessing();
    $context = [
      'results' => [],
      'sandbox' => [],
      'finished' => 0,
    ];
    $dataset->queueProcessing(\Drupal::queue($dataset->getProcessingQueueId()), new DatasetBatchContext($dataset->getBatchSize()));
    while ($context['finished'] !== 1) {
      DatasetBatchOperations::operationProcess((int) $dataset->id(), $context);
    }
    $this->assertEquals('Processed dataset.', (string) $context['message']);
    $csv = <<<CSV
should_we,firstname,lastname
Y,jo,bloggs
N,betty,bloggs
CSV;
    $dataset = $this->createTestDataset([
      'csv_text' => $csv,
    ]);
    $dataset->setPendingProcessing();
    $context = [
      'results' => [],
      'sandbox' => [],
      'finished' => 0,
    ];
    $dataset->queueProcessing(\Drupal::queue($dataset->getProcessingQueueId()), new DatasetBatchContext($dataset->getBatchSize()));
    while ($context['finished'] !== 1) {
      DatasetBatchOperations::operationProcess((int) $dataset->id(), $context);
    }
    $dataset = $this->reloadDataset($dataset);
    $logs = $dataset->getLogs();
    $this->assertCount(1, $logs);
    $this->assertEquals([
      'Validation error in row 1: Firstname should be at least 3 characters',
    ], $logs);
    $this->assertFalse($dataset->isPendingValidation());
  }

  /**
   * Tests process operation with failed validation.
   */
  public function testProcessingWhenInvalid(): void {
    $dataset = $this->createTestDataset();
    $context = [
      'results' => [],
    ];
    DatasetBatchOperations::operationProcess((int) $dataset->id(), $context);
    $this->assertEquals('Skipped processing dataset, validation errors exist.', (string) $context['message']);
  }

  /**
   * Tests queue operation.
   */
  public function testQueuingValid(): void {
    $dataset = $this->createTestDataset([
      'status' => DatasetInterface::STATUS_PENDING_PROCESSING,
    ]);
    $queue = \Drupal::queue($dataset->getProcessingQueueId());
    // Clear any previous operations.
    $queue->deleteQueue();
    $context = [
      'results' => [],
      'sandbox' => [],
    ];
    DatasetBatchOperations::operationQueueItem((int) $dataset->id(), $context);
    $this->assertEquals('Data is successfully queued for processing.', (string) $context['message']);
    // 1 for begin, 1 for end, 1 for each row (state destination has a chunk
    // size of 1).
    $this->assertEquals(4, $queue->numberOfItems());
  }

  /**
   * Tests process operation.
   */
  public function testProcessingValid(): void {
    $dataset = $this->createTestDataset([
      'status' => DatasetInterface::STATUS_PENDING_PROCESSING,
    ]);
    $queue = \Drupal::queue($dataset->getProcessingQueueId());
    $dataset->queueProcessing($queue, new DatasetBatchContext($dataset->getBatchSize()));
    $this->assertEquals(4, $queue->numberOfItems());
    $context = [
      'results' => [],
      'finished' => 0,
    ];
    while ($context['finished'] !== 1) {
      DatasetBatchOperations::operationProcess((int) $dataset->id(), $context);
    }
    $this->assertEquals('Processed dataset.', (string) $context['message']);
    $this->assertEquals(0, $queue->numberOfItems());
  }

  /**
   * Tests finished with success.
   */
  public function testFinishedSuccess(): void {
    $dataset = $this->createTestDataset([
      'status' => DatasetInterface::STATUS_PENDING_PROCESSING,
    ]);
    $context = [
      'results' => [
        'dataset_id' => $dataset->id(),
      ],
      'sandbox' => [],
      'finished' => 0,
    ];
    while ($context['finished'] !== 1) {
      DatasetBatchOperations::operationProcess((int) $dataset->id(), $context);
    }
    DatasetBatchOperations::finished(TRUE, $context['results']);
    $this->assertEquals([new TranslatableMarkup('Dataset %name was successfully processed.', [
      '%name' => $dataset->label(),
    ]),
    ], \Drupal::messenger()->messagesByType(MessengerInterface::TYPE_STATUS));
  }

  /**
   * Tests finished without processing.
   */
  public function testFinishedWithoutProcessing(): void {
    $dataset = $this->createTestDataset([
      'status' => DatasetInterface::STATUS_PENDING_PROCESSING,
    ]);
    $context = [
      'results' => [
        'dataset_id' => $dataset->id(),
      ],
    ];
    DatasetBatchOperations::finished(TRUE, $context['results']);
    $this->assertEquals([new TranslatableMarkup('Dataset %name was processed but some rows failed validation or skipped and were not processed. Please check <a href=":url">the logs</a>.', [
      ':url' => $dataset->toUrl()->toString(),
      '%name' => $dataset->label(),
    ]),
    ], \Drupal::messenger()->messagesByType(MessengerInterface::TYPE_ERROR));
  }

  /**
   * Tests finished with error.
   */
  public function testFinishedWithError(): void {
    $context = [
      'results' => [],
    ];
    DatasetBatchOperations::finished(TRUE, $context['results']);
    $this->assertEquals([new TranslatableMarkup('The validation and processing operation did not complete.')], \Drupal::messenger()->messagesByType(MessengerInterface::TYPE_ERROR));
  }

}

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

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