preview_site-1.1.2/tests/src/Kernel/PreviewSiteBuilderTest.php

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

namespace Drupal\Tests\preview_site\Kernel;

use Drupal\entity_test\Entity\EntityTest;
use Drupal\preview_site\Entity\PreviewSiteBuild;
use Drupal\preview_site\Entity\PreviewSiteBuildInterface;
use Drupal\preview_site\PreviewSiteBuilder;
use Drupal\preview_site_test\EventSubscriber\AdditionalPaths;
use Drupal\preview_site_test\Plugin\PreviewSite\Generate\TestGenerate;

/**
 * Defines a test for preview site builder.
 *
 * @group preview_site
 *
 * @covers \Drupal\preview_site\PreviewSiteBuilder
 * @covers \Drupal\preview_site\Plugin\QueueWorker\Generate
 * @covers \Drupal\preview_site\Plugin\QueueWorker\Deploy
 * @covers \Drupal\preview_site\Plugin\QueueWorker\GenerateAssets
 */
class PreviewSiteBuilderTest extends PreviewSiteKernelTestBase {

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'entity_test',
  ];

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $this->installEntitySchema('entity_test');
  }

  /**
   * Tests getting the running build.
   */
  public function testGetRunningBuild(): void {
    $build = $this->createPreviewSiteBuild();
    $preview_site_builder = PreviewSiteBuilder::factory();
    $this->assertNull($preview_site_builder->getRunningBuild());
    $build->startDeployment(\Drupal::state());
    $this->assertEquals($build->uuid(), $preview_site_builder->getRunningBuild()->uuid());
  }

  /**
   * Tests queuing site generation.
   */
  public function testQueueSiteGeneration(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => [
        EntityTest::create(),
        EntityTest::create(),
        EntityTest::create(),
      ],
    ]);
    $asset_queue = \Drupal::queue('preview_site_assets:' . $build->id());
    $asset_queue->createItem(['dummy' => TRUE]);
    $this->assertEquals(1, $asset_queue->numberOfItems());
    $generate_queue = \Drupal::queue('preview_site_generate:' . $build->id());
    $generate_queue->createItem(['dummy' => TRUE]);
    $this->assertEquals(1, $generate_queue->numberOfItems());
    PreviewSiteBuilder::factory()->queueSiteGeneration($build);
    // There should be 3 items in the queue (3 entity test entities).
    $this->assertEquals(3, $generate_queue->numberOfItems());
  }

  /**
   * Tests processing site generation.
   */
  public function testProcessSiteGeneration(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => [
        EntityTest::create(),
        EntityTest::create(),
        EntityTest::create(),
      ],
      'artifacts' => NULL,
    ]);
    $generate_queue = \Drupal::queue('preview_site_generate:' . $build->id());
    $this->assertEquals(0, $generate_queue->numberOfItems());
    $this->assertTrue($build->get('artifacts')->isEmpty());
    $preview_site_builder = PreviewSiteBuilder::factory();
    $preview_site_builder->queueSiteGeneration($build);
    // There should be 3 items in the queue (3 entity test entities).
    $this->assertEquals(3, $generate_queue->numberOfItems());
    // Processing an item should reduce the count.
    $this->assertEquals(2, $preview_site_builder->processSiteGeneration($build));
    // And there should be artifacts.
    $this->assertFalse(PreviewSiteBuild::load($build->id())->get('artifacts')->isEmpty());
  }

  /**
   * Test processing an empty generation queue.
   */
  public function testProcessingAnEmptySiteGenerationQueue(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => NULL,
      'artifacts' => NULL,
    ]);
    $generate_queue = \Drupal::queue('preview_site_generate:' . $build->id());
    $this->assertEquals(0, $generate_queue->numberOfItems());
    $preview_site_builder = PreviewSiteBuilder::factory();
    $preview_site_builder->queueSiteGeneration($build);
    $this->assertEquals(0, $preview_site_builder->processSiteGeneration($build));
  }

  /**
   * Tests processing asset generation.
   */
  public function testProcessAssetGeneration(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => [
        EntityTest::create(),
      ],
      'artifacts' => NULL,
    ]);
    $asset_queue = \Drupal::queue('preview_site_assets:' . $build->id());
    $this->assertEquals(0, $asset_queue->numberOfItems());
    $preview_site_builder = PreviewSiteBuilder::factory();
    $preview_site_builder->queueSiteGeneration($build);
    // This will populate the asset queue.
    // @see \Drupal\preview_site_test\Plugin\PreviewSite\Generate\TestGenerate::generateBuildForItem
    $preview_site_builder->processSiteGeneration($build);
    $this->assertEquals(2, $asset_queue->numberOfItems());
    // Processing an item adds two more.
    // @see \Drupal\preview_site_test\Plugin\PreviewSite\Generate\TestGenerate::generateBuildForPath
    $this->assertEquals(3, $preview_site_builder->processAssetGeneration($build));
    $this->assertEquals(3, $asset_queue->numberOfItems());
  }

  /**
   * Tests queueing the site deployment.
   */
  public function testQueueSiteDeployment(): void {
    $image = $this->getTestFile('image');
    $build = $this->createPreviewSiteBuild([
      'contents' => NULL,
      'artifacts' => [
        $this->getTestFile(),
        $image,
      ],
      'paths' => [
        realpath($image->getFileUri()),
      ],
    ]);
    $deploy_queue = \Drupal::queue('preview_site_deploy:' . $build->id());
    $deploy_queue->createItem(['dummy' => TRUE]);
    $this->assertEquals(1, $deploy_queue->numberOfItems());
    $state = \Drupal::state();
    $this->assertNull($state->get(TestGenerate::COMPLETE_STEP));
    PreviewSiteBuilder::factory()->queueSiteDeployment($build);
    $this->assertEquals(3, $deploy_queue->numberOfItems());
    $this->assertTrue($state->get(TestGenerate::COMPLETE_STEP));
    $items = [];
    while ($item = $deploy_queue->claimItem()) {
      $items[] = $item->data;
    }
    $this->assertEquals([
      ['artifacts', 0],
      ['artifacts', 1],
      ['paths', 0],
    ], $items);
  }

  /**
   * Tests processing the site deployment.
   */
  public function testProcessSiteDeployment(): void {
    $file = $this->getTestFile();
    $build = $this->createPreviewSiteBuild([
      'contents' => NULL,
      'artifacts' => [
        $file,
        $this->getTestFile('image'),
      ],
    ]);
    $deploy_queue = \Drupal::queue('preview_site_deploy:' . $build->id());
    $preview_site_builder = PreviewSiteBuilder::factory();
    $preview_site_builder->queueSiteDeployment($build);
    $this->assertEquals(2, $deploy_queue->numberOfItems());
    $this->assertFalse(file_exists('public://preview-site-test/' . $file->getFilename()));
    $this->assertEquals(1, $preview_site_builder->processSiteDeployment($build));
    $this->assertEquals(1, $deploy_queue->numberOfItems());
    $this->assertTrue(file_exists('public://preview-site-test/' . parse_url($file->getFileUri(), \PHP_URL_PATH)));
  }

  /**
   * Tests batch building.
   */
  public function testPreviewSiteBuildBatch(): void {
    $build = $this->createPreviewSiteBuild();
    $batch = PreviewSiteBuilder::factory()->getPreviewSiteBuildBatch($build)->toArray();
    $this->assertEquals([
      [
        [PreviewSiteBuilder::class, 'operationMarkDeploymentStarted'],
        [$build->id()],
      ],
      [[PreviewSiteBuilder::class, 'operationQueueGenerate'], [$build->id()]],
      [[PreviewSiteBuilder::class, 'operationProcessGenerate'], [$build->id()]],
      [[PreviewSiteBuilder::class, 'operationQueueAdditionalPaths'], [$build->id()]],
      [[PreviewSiteBuilder::class, 'operationProcessAssets'], [$build->id()]],
      [[PreviewSiteBuilder::class, 'operationQueueDeploy'], [$build->id()]],
      [[PreviewSiteBuilder::class, 'operationProcessDeploy'], [$build->id()]],
      [
        [PreviewSiteBuilder::class, 'operationMarkDeploymentFinished'],
        [$build->id()],
      ],
    ], $batch['operations']);
  }

  /**
   * Tests mark deployment started operation.
   */
  public function testOperationMarkDeploymentStarted(): void {
    $build = $this->createPreviewSiteBuild();
    $context = [
      'finished' => 1,
      'sandbox' => [],
    ];
    PreviewSiteBuilder::operationMarkDeploymentStarted($build->id(), $context);
    $build = PreviewSiteBuild::load($build->id());
    $this->assertEquals(PreviewSiteBuildInterface::STATUS_BUILDING, $build->getStatus());
    $this->assertEquals($build->id(), $context['results']['build_id']);
    $this->assertEquals('Marked deployment as building', (string) $context['message']);
  }

  /**
   * Tests operation queue generate.
   */
  public function testOperationQueueGenerate(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => [
        EntityTest::create(),
        EntityTest::create(),
        EntityTest::create(),
      ],
    ]);
    $generate_queue = \Drupal::queue('preview_site_generate:' . $build->id());
    $this->assertEquals(0, $generate_queue->numberOfItems());
    PreviewSiteBuilder::operationQueueGenerate($build->id());
    $this->assertEquals(3, $generate_queue->numberOfItems());
  }

  /**
   * Tests operation process generate.
   */
  public function testOperationProcessGenerate(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => [
        EntityTest::create(),
        EntityTest::create(),
        EntityTest::create(),
      ],
      'artifacts' => NULL,
    ]);
    $generate_queue = \Drupal::queue('preview_site_generate:' . $build->id());
    $this->assertEquals(0, $generate_queue->numberOfItems());
    PreviewSiteBuilder::operationQueueGenerate($build->id());
    $this->assertEquals(3, $generate_queue->numberOfItems());
    $context = [
      'finished' => 1,
      'sandbox' => [],
    ];
    PreviewSiteBuilder::operationProcessGenerate($build->id(), $context);
    $this->assertEquals(2, $generate_queue->numberOfItems());
    $this->assertEquals(1 / 3, $context['finished']);
    $this->assertEquals(1, $context['results']['generated']);
    $this->assertFalse(PreviewSiteBuild::load($build->id())->get('artifacts')->isEmpty());
  }

  /**
   * Tests operation queue additional paths.
   */
  public function testOperationQueueAdditionalPaths(): void {
    $build = $this->createPreviewSiteBuild([
      'uuid' => AdditionalPaths::BUILD_UUID,
      'contents' => [
        EntityTest::create(),
        EntityTest::create(),
        EntityTest::create(),
      ],
      'artifacts' => NULL,
      'additional_paths' => ['internal:/core/misc/favicon.ico']
    ]);
    $assert_queue = \Drupal::queue('preview_site_assets:' . $build->id());
    $this->assertEquals(0, $assert_queue->numberOfItems());
    $context = [];
    PreviewSiteBuilder::operationQueueAdditionalPaths($build->id(), $context);
    $this->assertEquals(2, $assert_queue->numberOfItems());
  }

  /**
   * Tests processing asset generation.
   */
  public function testOperationProcessAssets(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => [
        EntityTest::create(),
      ],
      'artifacts' => NULL,
    ]);
    $asset_queue = \Drupal::queue('preview_site_assets:' . $build->id());
    $this->assertEquals(0, $asset_queue->numberOfItems());
    PreviewSiteBuilder::operationQueueGenerate($build->id());
    $context = [
      'finished' => 1,
      'sandbox' => [],
    ];
    $this->assertEquals(0, $asset_queue->numberOfItems());
    PreviewSiteBuilder::operationProcessGenerate($build->id(), $context);
    // @see \Drupal\preview_site_test\Plugin\PreviewSite\Generate\TestGenerate::generateBuildForItem
    $this->assertEquals(2, $asset_queue->numberOfItems());
    $context = [
      'finished' => 1,
      'sandbox' => [],
    ];
    $count = PreviewSiteBuild::load($build->id())->get('artifacts')->count();
    PreviewSiteBuilder::operationProcessAssets($build->id(), $context);
    // @see \Drupal\preview_site_test\Plugin\PreviewSite\Generate\TestGenerate::generateBuildForPath
    $this->assertEquals(3, $asset_queue->numberOfItems());
    $this->assertEquals(1 / 4, $context['finished']);
    $this->assertEquals(1, $context['results']['assets']);
    // @see \Drupal\preview_site_test\Plugin\PreviewSite\Generate\TestGenerate::generateBuildForPath
    $this->assertEquals($count + 2, PreviewSiteBuild::load($build->id())->get('artifacts')->count());
  }

  /**
   * Tests queueing the site deployment.
   */
  public function testOperationQueueDeployment(): void {
    $build = $this->createPreviewSiteBuild([
      'contents' => NULL,
      'artifacts' => [
        $this->getTestFile(),
        $this->getTestFile('image'),
      ],
    ]);
    $deploy_queue = \Drupal::queue('preview_site_deploy:' . $build->id());
    $this->assertEquals(0, $deploy_queue->numberOfItems());
    $state = \Drupal::state();
    $this->assertNull($state->get(TestGenerate::COMPLETE_STEP));
    PreviewSiteBuilder::operationQueueDeploy($build->id());
    $this->assertEquals(2, $deploy_queue->numberOfItems());
    $this->assertTrue($state->get(TestGenerate::COMPLETE_STEP));
  }

  /**
   * Tests processing the site deployment.
   */
  public function testOperationProcessDeployment(): void {
    $file = $this->getTestFile();
    $build = $this->createPreviewSiteBuild([
      'contents' => NULL,
      'artifacts' => [
        $file,
        $this->getTestFile('image'),
      ],
    ]);
    $deploy_queue = \Drupal::queue('preview_site_deploy:' . $build->id());
    PreviewSiteBuilder::operationQueueDeploy($build->id());
    $this->assertEquals(2, $deploy_queue->numberOfItems());
    $context = [
      'finished' => 1,
      'sandbox' => [],
    ];
    $this->assertFalse(file_exists('public://preview-site-test/' . $file->getFilename()));
    PreviewSiteBuilder::operationProcessDeploy($build->id(), $context);
    $this->assertEquals(1, $deploy_queue->numberOfItems());
    $this->assertEquals(1 / 2, $context['finished']);
    $this->assertEquals(1, $context['results']['deployed']);
    $this->assertTrue(file_exists('public://preview-site-test/' . parse_url($file->getFileUri(), \PHP_URL_PATH)));
  }

  /**
   * Tests operation mark deployment finished.
   */
  public function testOperationMarkDeploymentFinished(): void {
    $file1 = $this->getTestFile();
    $file2 = $this->getTestFile('image');
    $build = $this->createPreviewSiteBuild([
      'artifacts' => [
        $file1,
        $file2,
      ],
    ]);
    $this->assertEquals(PreviewSiteBuildInterface::STATUS_PENDING, $build->getStatus());
    $context = [
      'finished' => 1,
      'sandbox' => [],
    ];
    PreviewSiteBuilder::operationMarkDeploymentFinished($build->id(), $context);
    $this->assertEquals(PreviewSiteBuildInterface::STATUS_BUILT, PreviewSiteBuild::load($build->id())->getStatus());
    $this->assertEquals(1, $context['finished']);
    $this->assertEquals(2, $context['sandbox']['total']);
    $this->assertTrue(empty($context['results']['generate_errors']));
  }

  /**
   * Tests operation mark deployment finished with failure.
   */
  public function testOperationMarkDeploymentFinishedWithFailure(): void {
    $build = $this->createPreviewSiteBuild([
      'status' => PreviewSiteBuildInterface::STATUS_FAILED,
    ]);
    $this->assertEquals(PreviewSiteBuildInterface::STATUS_FAILED, $build->getStatus());
    $context = [
      'finished' => 1,
      'sandbox' => [],
    ];
    PreviewSiteBuilder::operationMarkDeploymentFinished($build->id(), $context);
    $this->assertEquals(PreviewSiteBuildInterface::STATUS_FAILED, PreviewSiteBuild::load($build->id())->getStatus());
    $this->assertFalse(empty($context['results']['generate_errors']));
  }

}

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

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