preview_site-1.1.2/tests/src/Traits/PreviewSiteTestTrait.php
tests/src/Traits/PreviewSiteTestTrait.php
<?php
namespace Drupal\Tests\preview_site\Traits;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\file\Entity\File;
use Drupal\file\FileInterface;
use Drupal\preview_site\Entity\PreviewSiteBuild;
use Drupal\preview_site\Entity\PreviewSiteBuildInterface;
use Drupal\preview_site\Entity\PreviewStrategy;
use Drupal\preview_site\Entity\PreviewStrategyInterface;
use Drupal\preview_site\PreviewSiteBuilder;
use Drupal\Tests\TestFileCreationTrait;
/**
* Defines a trait for testing preview-site functionality.
*
* @codeCoverageIgnore
*/
trait PreviewSiteTestTrait {
use TestFileCreationTrait;
/**
* Deployment prefix.
*
* @var string
*/
protected $prefix;
/**
* Creates a test strategy.
*
* @param string|null $label
* Strategy label.
* @param string|null $id
* Strategy ID.
* @param string|null $prefix
* Strategy prefix.
*
* @return \Drupal\preview_site\Entity\PreviewStrategyInterface
* Preview strategy.
*/
protected function createStrategy(?string $label = NULL, ?string $id = NULL, ?string $prefix = NULL) : PreviewStrategyInterface {
$strategy = PreviewStrategy::create([
'id' => $id ?: $this->randomMachineName(),
'label' => $label ?: $this->randomMachineName(),
'generate' => 'test',
'deploy' => 'test',
'generateSettings' => [],
'deploySettings' => [
'prefix' => $prefix ?: $this->randomMachineName(),
],
]);
$strategy->save();
return $strategy;
}
/**
* Gets a test file.
*
* @param string $type
* File type.
* @param int $index
* Test file index.
*
* @return \Drupal\file\FileInterface
* Created file.
*/
protected function getTestFile(string $type = 'html', int $index = 0) : FileInterface {
$test_files = $this->getTestFiles($type);
$test_file = $test_files[$index]->uri;
$file = File::create([
'uri' => $test_file,
'status' => FileInterface::STATUS_PERMANENT,
'filename' => basename($test_file),
]);
$file->save();
return $file;
}
/**
* Creates a preview-site build.
*
* @param array $values
* Entity values.
*
* @return \Drupal\preview_site\Entity\PreviewSiteBuildInterface
* New site build.
*/
protected function createPreviewSiteBuild(array $values = []) : PreviewSiteBuildInterface {
if (!array_key_exists('strategy', $values)) {
$values['strategy'] = $this->createStrategy()->id();
}
if (!array_key_exists('contents', $values)) {
$values['contents'] = $this->createUser();
}
if (!array_key_exists('artifacts', $values)) {
$values['artifacts'] = $this->getTestFile()->id();
}
$build = PreviewSiteBuild::create($values + [
'label' => $this->randomMachineName(),
'log' => 'Created a test item',
'processed_paths' => ['/' . $this->randomMachineName()],
]);
$build->save();
return $build;
}
/**
* Gets the URIs of artifacts in the preview-site build.
*
* @param \Drupal\preview_site\Entity\PreviewSiteBuildInterface $build
* Build.
* @param array $files
* Array files.
*
* @return array
* Artifact URIs.
*/
protected function getArtifactUris(PreviewSiteBuildInterface $build, array $files): array {
return array_map(function (string $file) use ($build) {
return str_replace(sprintf('private://preview-site/%s', $build->uuid()), '', $file);
}, $files);
}
/**
* Gets the filepath for a generated static file for a content-entity.
*
* @param \Drupal\Core\Entity\ContentEntityInterface $entity
* Entity.
* @param \Drupal\preview_site\Entity\PreviewSiteBuildInterface $build
* Build.
*
* @return string
* Path to file.
*/
protected function getGeneratedFileForEntity(ContentEntityInterface $entity, PreviewSiteBuildInterface $build) : string {
return sprintf('public://preview-site-test/%s/%s/%s/index.html', $this->prefix, $build->uuid(), $entity->toUrl()->toString());
}
/**
* Generates and deploys a build.
*
* @param \Drupal\preview_site\Entity\PreviewSiteBuildInterface $build
* Build to generate and deploy.
*
* @return array
* Results.
*/
protected function genererateAndDeployBuild(PreviewSiteBuildInterface $build): array {
$context = [
'results' => [],
'finished' => 1,
'sandbox' => [],
];
$clean_batch = function (array $context) {
return [
'finished' => 1,
'sandbox' => [],
] + $context;
};
PreviewSiteBuilder::operationMarkDeploymentStarted($build->id(), $context);
PreviewSiteBuilder::operationQueueGenerate($build->id());
$context = $clean_batch($context);
do {
PreviewSiteBuilder::operationProcessGenerate($build->id(), $context);
} while ($context['finished'] !== 1);
$context = $clean_batch($context);
PreviewSiteBuilder::operationQueueAdditionalPaths($build->id(), $context);
$context = $clean_batch($context);
do {
PreviewSiteBuilder::operationProcessAssets($build->id(), $context);
} while ($context['finished'] !== 1);
PreviewSiteBuilder::operationQueueDeploy($build->id());
$context = $clean_batch($context);
do {
PreviewSiteBuilder::operationProcessDeploy($build->id(), $context);
} while ($context['finished'] !== 1);
$files = [];
// Load back from DB to pass back the artifacts before they're deleted.
$build = \Drupal::entityTypeManager()
->getStorage('preview_site_build')
->loadUnchanged($build->id());
foreach ($build->get('artifacts') as $item) {
$files[] = $item->entity;
}
$paths = array_column($build->get('paths')->getValue(), 'value');
$context = $clean_batch($context);
do {
PreviewSiteBuilder::operationMarkDeploymentFinished($build->id(), $context);
} while ($context['finished'] !== 1);
return $context['results'] + ['files' => $files, 'paths' => $paths];
}
}
