commerce_export-8.x-1.0-alpha1/tests/src/Kernel/Migrate/TestBase.php
tests/src/Kernel/Migrate/TestBase.php
<?php
namespace Drupal\Tests\commerce_export\Kernel\Migrate;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Language\LanguageInterface;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\migrate\Kernel\MigrateTestBase;
use Drupal\commerce_product\Entity\ProductAttribute;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\taxonomy\Entity\Vocabulary;
use Drupal\Core\StreamWrapper\PublicStream;
use Drupal\Core\StreamWrapper\StreamWrapperInterface;
/**
* Test base for migrations tests.
*/
abstract class TestBase extends MigrateTestBase {
/**
* Modules to enable.
*
* @var array
*/
public static $modules = [
'action',
'address',
'entity',
'field',
'inline_entity_form',
'options',
'system',
'text',
'user',
'views',
'commerce',
'commerce_price',
'commerce_store',
'migrate_source_csv',
'commerce_export',
];
/**
* Filename of the test fixture.
*
* @var string
*/
public static $fixtureFile = 'product.csv';
/**
* File system active during the test.
*
* @var \Drupal\Core\File\FileSystem
*/
protected $fs;
/**
* {@inheritdoc}
*/
protected function setUp() {
KernelTestBase::setUp();
$this->fs = \Drupal::service('file_system');
$this->installEntitySchema('user');
$this->installEntitySchema('commerce_store');
$this->createDefaultStore();
$this->copyFiles();
}
/**
* Copy files for the tests.
*
* Copy the migrations to ./migrations for the tests to avoid schema errors
* when loading the migrations. Copy the source CSV to the path in the
* migrations.
*/
protected function copyFiles() {
// Copy all migrations.
$destination = __DIR__ . '/../../../../migrations';
if (!file_exists($destination)) {
$this->fs->mkdir($destination, NULL, TRUE);
}
$source_directory = __DIR__ . '/../../../../config/install/';
$mask = '/^((?!group).)*$/';
$files = file_scan_directory($source_directory, $mask);
foreach ($files as $file) {
$destination_uri = $destination . '/' . $file->filename;
file_unmanaged_copy($file->uri, $destination_uri);
}
// Make sure the file destination directory exists.
$destination = 'public://import';
if (!file_exists($destination)) {
$this->fs->mkdir($destination, NULL, TRUE);
}
// Copy fixture.
$source = __DIR__ . '/../../../fixtures/csv/' . self::$fixtureFile;
$destination_uri = $destination . '/' . self::$fixtureFile;
file_unmanaged_copy($source, $destination_uri);
}
/**
* Creates a default store.
*/
protected function createDefaultStore() {
$currency_importer = \Drupal::service('commerce_price.currency_importer');
/** @var \Drupal\commerce_store\StoreStorage $store_storage */
$store_storage = \Drupal::service('entity_type.manager')
->getStorage('commerce_store');
$currency_importer->import('USD');
$store_values = [
'type' => 'default',
'uid' => 1,
'name' => 'Demo store',
'mail' => 'admin@example.com',
'address' => [
'country_code' => 'US',
],
'default_currency' => 'USD',
];
/** @var \Drupal\commerce_store\Entity\StoreInterface $store */
$store = $store_storage->create($store_values);
$store->save();
$store_storage->markAsDefault($store);
}
/**
* Creates attributes.
*/
protected function createAttribute() {
$attributes = [
'Accessory Size',
'Color',
'Shoe Size',
'Size',
];
foreach ($attributes as $attribute) {
$id = strtolower($attribute);
$id = preg_replace('/[^a-z0-9_]+/', '_', $id);
preg_replace('/_+/', '_', $id);
$field_name = 'attribute_' . $id;
$field_storage_definition = [
'field_name' => $field_name,
'entity_type' => 'commerce_product_variation',
'type' => 'entity_reference',
'cardinality' => 1,
'settings' => ['target_type' => 'commerce_product_attribute_value'],
];
$storage = FieldStorageConfig::create($field_storage_definition);
$storage->save();
$field_instance = [
'field_name' => $field_name,
'entity_type' => 'commerce_product_variation',
'bundle' => 'default',
'label' => $attribute,
'settings' => [
'handler' => 'default:commerce_product_attribute_value',
'handler_settings' => [
'target_bundles' => [$id],
],
],
];
$field = FieldConfig::create($field_instance);
$field->save();
$ret = ProductAttribute::create([
'id' => strtolower($id),
'label' => $attribute,
]);
$ret->save();
}
}
/**
* Creates vocabularies..
*/
protected function createVocabularies() {
// Create a vocabularies.
$vids = [
'Category',
'Season',
];
foreach ($vids as $vid) {
$vocabulary = Vocabulary::create([
'name' => $vid,
'description' => $this->randomMachineName(),
'vid' => Unicode::strtolower($vid),
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
'weight' => mt_rand(0, 10),
]);
$vocabulary->save();
}
}
/**
* Prepare the file migration for running.
*/
protected function fileMigrationSetup() {
$this->installSchema('file', ['file_usage']);
$this->installEntitySchema('file');
$this->container->get('stream_wrapper_manager')
->registerWrapper('public', PublicStream::class, StreamWrapperInterface::NORMAL);
// The public file directory active during the test will serve as the
// source for the image files.
// @todo: Get the directory from the migration
$destination = 'public://images';
if (!file_exists($destination)) {
$this->fs->mkdir($destination, NULL, TRUE);
}
// Copy all test source files to source directory used in migration.
$source_directory = __DIR__ . '/../../../fixtures/images/';
$mask = '/.*/';
$files = file_scan_directory($source_directory, $mask);
foreach ($files as $file) {
$destination_uri = $destination . '/' . $file->filename;
file_unmanaged_copy($file->uri, $destination_uri);
}
}
/**
* {@inheritdoc}
*/
protected function tearDown() {
$dst = __DIR__ . '/../../../../migrations';
foreach (new \DirectoryIterator($dst) as $fileInfo) {
if (!$fileInfo->isDot()) {
unlink($fileInfo->getPathname());
}
}
rmdir($dst);
parent::tearDown();
}
}
