tome-8.x-1.x-dev/modules/tome_sync/tests/src/Kernel/ExporterTest.php

modules/tome_sync/tests/src/Kernel/ExporterTest.php
<?php

namespace Drupal\Tests\tome_sync\Kernel;

use Drupal\Core\Site\Settings;
use Drupal\node\Entity\Node;
use Drupal\Tests\tome_base\Kernel\TestBase;
use Drupal\tome_sync\TomeSyncHelper;

/**
 * Tests that the exporter works.
 *
 * @group tome_sync
 */
class ExporterTest extends TestBase {

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

  /**
   * {@inheritdoc}
   */
  public function setUp(): void {
    parent::setUp();
    $this->installSchema('tome_sync', ['tome_sync_content_hash']);
    if (\Drupal::entityTypeManager()->hasDefinition('path_alias')) {
      $this->installEntitySchema('path_alias');
    }
  }

  /**
   * @covers \Drupal\tome_sync\Exporter::exportContent
   */
  public function testExportContent() {
    /** @var \Symfony\Component\Serializer\Serializer $serializer */
    $serializer = \Drupal::service('serializer');

    /** @var \Drupal\Core\Config\StorageInterface $storage */
    $storage = \Drupal::service('tome_sync.storage.content');

    $user = $this->createUser();

    $article = Node::create([
      'type' => 'article',
      'title' => 'My article',
      'uid' => $user->id(),
    ]);
    $article->save();

    $page = Node::create([
      'type' => 'page',
      'title' => 'My page',
      'field_reference' => [
        'target_id' => $article->id(),
      ],
      'uid' => $user->id(),
    ]);
    $page->save();

    $data = $storage->read(TomeSyncHelper::getContentName($page));
    $exported_page = $serializer->denormalize($data, Node::class, 'json');
    $this->assertEquals($page->uuid(), $exported_page->uuid());
    $this->assertEquals($page->getTitle(), $exported_page->getTitle());
    $this->assertEquals($article->id(), $exported_page->field_reference->target_id);

    $page->addTranslation('fr', ['title' => 'My french page'])->save();
    $data = $storage->read(TomeSyncHelper::getContentName($page->getTranslation('fr')));
    $exported_page = $serializer->denormalize($data, Node::class, 'json');
    $this->assertEquals('My french page', $exported_page->getTitle());

    $index_file = Settings::get('tome_content_directory', '../content') . '/meta/index.json';
    $this->assertFileExists($index_file);
    $index = json_decode(file_get_contents($index_file), TRUE);
    $user_name = TomeSyncHelper::getContentName($user);
    $page_name = TomeSyncHelper::getContentName($page);
    $article_name = TomeSyncHelper::getContentName($article);
    $this->assertArrayHasKey($user_name, $index);
    $this->assertArrayHasKey($page_name, $index);
    $this->assertArrayHasKey($article_name, $index);
    $this->assertEmpty($index[$user_name]);
    $this->assertContains($article_name, $index[$page_name]);
    $this->assertContains($user_name, $index[$page_name]);
    $this->assertContains($user_name, $index[$article_name]);
  }

  /**
   * @covers \Drupal\tome_sync\Exporter::deleteContentExport
   */
  public function testDeleteContentExport() {
    /** @var \Drupal\Core\Config\StorageInterface $storage */
    $storage = \Drupal::service('tome_sync.storage.content');
    $article = Node::create(['type' => 'article', 'title' => 'My article']);
    $article->save();
    $this->assertTrue($storage->exists(TomeSyncHelper::getContentName($article)));

    $article_name = TomeSyncHelper::getContentName($article);

    $index_file = Settings::get('tome_content_directory', '../content') . '/meta/index.json';
    $this->assertFileExists($index_file);
    $index = json_decode(file_get_contents($index_file), TRUE);
    $this->assertArrayHasKey($article_name, $index);

    $article->addTranslation('fr', ['title' => 'My french article'])->save();
    $name = TomeSyncHelper::getContentName($article->getTranslation('fr'));
    $this->assertTrue($storage->exists($name));

    $article->removeTranslation('fr');
    $article->save();
    $this->assertFalse($storage->exists($name));

    $article->addTranslation('fr', ['title' => 'My french article'])->save();
    $this->assertTrue($storage->exists($name));

    $article->delete();
    $this->assertFalse($storage->exists(TomeSyncHelper::getContentName($article)));
    $this->assertFalse($storage->exists($name));

    $index = json_decode(file_get_contents($index_file), TRUE);
    $this->assertArrayNotHasKey($article_name, $index);
  }

  /**
   * @covers \Drupal\tome_sync\EventSubscriber\ConfigEventSubscriber::configDelete
   * @covers \Drupal\tome_sync\EventSubscriber\LanguageConfigEventSubscriber::configDelete
   */
  public function testDeleteConfigExport() {
    /** @var \Drupal\Core\Config\StorageInterface $storage */
    $storage = \Drupal::service('config.storage.sync');

    \Drupal::configFactory()->getEditable('foo.bar')->save();
    $this->assertTrue($storage->exists('foo.bar'));

    /** @var \Drupal\language\Config\LanguageConfigFactoryOverrideInterface $config_factory_override */
    $config_factory_override = \Drupal::service('language.config_factory_override');
    $override = $config_factory_override->getOverride('fr', 'foo.bar');
    $override->setData(['bonjour' => 'monde'])->save();
    $collection = $storage->createCollection($override->getStorage()->getCollectionName());
    $this->assertTrue($collection->exists('foo.bar'));

    \Drupal::configFactory()->getEditable('foo.bar')->delete();
    $this->assertFalse($storage->exists('foo.bar'));
    $this->assertFalse($collection->exists('foo.bar'));
  }

  /**
   * @covers \Drupal\tome_sync\EventSubscriber\ConfigEventSubscriber::configSave
   * @covers \Drupal\tome_sync\EventSubscriber\LanguageConfigEventSubscriber::configSave
   */
  public function testExportConfig() {
    /** @var \Drupal\Core\Config\StorageInterface $storage */
    $storage = \Drupal::service('config.storage.sync');
    $data = ['hello' => 'world'];
    \Drupal::configFactory()->getEditable('foo.bar')
      ->setData($data)
      ->save();
    $this->assertEquals($data, $storage->read('foo.bar'));

    $data = ['bonjour' => 'monde'];
    /** @var \Drupal\language\Config\LanguageConfigFactoryOverrideInterface $config_factory_override */
    $config_factory_override = \Drupal::service('language.config_factory_override');
    $override = $config_factory_override->getOverride('fr', 'foo.bar');
    $override->setData($data)->save();
    $collection = $storage->createCollection($override->getStorage()->getCollectionName());
    $this->assertEquals($data, $collection->read('foo.bar'));
  }

  /**
   * @covers \Drupal\tome_sync\EventSubscriber\ConfigEventSubscriber::configRename
   * @covers \Drupal\tome_sync\EventSubscriber\LanguageConfigEventSubscriber::configSave
   * @covers \Drupal\tome_sync\EventSubscriber\LanguageConfigEventSubscriber::configDelete
   */
  public function testRenameConfig() {
    /** @var \Drupal\Core\Config\StorageInterface $storage */
    $storage = \Drupal::service('config.storage.sync');
    $data = ['hello' => 'world'];
    \Drupal::configFactory()->getEditable('foo.bar')
      ->setData($data)->save();
    $this->assertEquals($data, $storage->read('foo.bar'));

    $override_data = ['bonjour' => 'monde'];
    /** @var \Drupal\language\Config\LanguageConfigFactoryOverrideInterface $config_factory_override */
    $config_factory_override = \Drupal::service('language.config_factory_override');
    $override = $config_factory_override->getOverride('fr', 'foo.bar');
    $override->setData($override_data)->save();
    $collection = $storage->createCollection($override->getStorage()->getCollectionName());
    $this->assertEquals($override_data, $collection->read('foo.bar'));

    \Drupal::configFactory()->rename('foo.bar', 'bar.baz');
    $this->assertEquals($data, $storage->read('bar.baz'));
    $this->assertFalse($storage->exists('foo.bar'));

    // @todo Add test coverage when https://www.drupal.org/project/drupal/issues/2981444
    // is fixed.
    // $this->assertEquals($override_data, $collection->read('bar.baz'));
    $this->assertFalse($collection->exists('foo.bar'));
  }

  /**
   * @covers \Drupal\tome_sync\Exporter::getContentToExport
   */
  public function testExcludedTypes() {
    $this->enableModules(['content_moderation', 'workflows']);
    $this->installEntitySchema('content_moderation_state');
    $this->assertArrayNotHasKey('content_moderation_state', \Drupal::service('tome_sync.exporter')->getContentToExport());
  }

  /**
   * @covers \Drupal\tome_sync\Exporter::exportContent
   */
  public function testExportContentYaml() {
    $settings = Settings::getInstance() ? Settings::getAll() : [];
    $settings['tome_sync_encoder'] = 'yaml';
    new Settings($settings);
    drupal_flush_all_caches();

    /** @var \Symfony\Component\Serializer\Serializer $serializer */
    $serializer = \Drupal::service('serializer');

    /** @var \Drupal\Core\Config\StorageInterface $storage */
    $storage = \Drupal::service('tome_sync.storage.content');

    $user = $this->createUser();

    $article = Node::create([
      'type' => 'article',
      'title' => 'My article',
      'uid' => $user->id(),
    ]);
    $article->save();

    $page = Node::create([
      'type' => 'page',
      'title' => 'My page',
      'field_reference' => [
        'target_id' => $article->id(),
      ],
      'uid' => $user->id(),
    ]);
    $page->save();

    $data = $storage->read(TomeSyncHelper::getContentName($page));
    $exported_page = $serializer->denormalize($data, Node::class, 'yaml');
    $this->assertEquals($page->uuid(), $exported_page->uuid());
    $this->assertEquals($page->getTitle(), $exported_page->getTitle());
    $this->assertEquals($article->id(), $exported_page->field_reference->target_id);

    $yml_file = Settings::get('tome_content_directory', '../content') . '/node.' . $page->uuid() . '.yml';
    $this->assertFileExists($yml_file);
  }

}

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

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