View source
<?php
namespace Drupal\Tests\wbm2cm\Functional;
use Drupal\Core\Config\Entity\ThirdPartySettingsInterface;
use Drupal\Core\Database\Database;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\Tests\wbm2cm\Kernel\MigrationTestTrait;
use Drupal\Tests\BrowserTestBase;
abstract class TestBase extends BrowserTestBase {
use MigrationTestTrait;
protected static $modules = [
'wbm2cm',
'workbench_moderation',
];
protected function setUp() {
parent::setUp();
ConfigurableLanguage::createFromLangcode('fr')
->save();
ConfigurableLanguage::createFromLangcode('hu')
->save();
}
protected function prepareDatabase() {
$db = $this
->getDatabaseConnection()
->getConnectionOptions();
$db['prefix']['default'] = $this->databasePrefix;
Database::addConnectionInfo('migrate', 'default', $db);
}
protected function doMigration() {
wbm2cm_install();
$entity_type_id = $this->storage
->getEntityTypeId();
$this
->execute($entity_type_id, 'save');
$this
->execute($entity_type_id, 'clear');
$module_installer = $this->container
->get('module_installer');
$module_installer
->uninstall([
'workbench_moderation',
]);
$module_installer
->install([
'content_moderation',
]);
$this->container
->get('entity_field.manager')
->clearCachedFieldDefinitions();
$this->storage
->resetCache();
$this
->execute($entity_type_id, 'restore');
$this->storage = $this->container
->get('entity_type.manager')
->getStorage($entity_type_id);
}
protected function createEntity() {
$values = [];
$entity_type = $this->storage
->getEntityType();
if ($entity_type
->hasKey('bundle')) {
$values[$entity_type
->getKey('bundle')] = $this
->randomBundle();
}
if ($entity_type
->hasKey('label')) {
$values[$entity_type
->getKey('label')] = $this
->randomMachineName(16);
}
return $this->storage
->create($values);
}
protected function translate(ContentEntityInterface $entity, $language) {
if ($entity
->hasTranslation($language)) {
$translation = $entity
->getTranslation($language);
}
else {
$translation = $entity
->addTranslation($language)
->getTranslation($language);
$label_key = $entity
->getEntityType()
->getKey('label');
if ($label_key) {
$translation
->set($label_key, $this
->randomMachineName(16));
}
}
return $translation;
}
public function testSingleUntranslatedRevision() {
$moderation_state = $this
->randomEntity('moderation_state');
$entity = $this
->createEntity()
->set('moderation_state', $moderation_state);
$this->storage
->save($entity);
$this
->doMigration();
$this
->assertSame($moderation_state, $this->storage
->load($entity
->id())->moderation_state->value);
}
public function testSingleTranslatedRevision() {
$entity = $this
->createEntity();
$states = [
'en' => $this
->randomEntity('moderation_state'),
'fr' => $this
->randomEntity('moderation_state'),
'hu' => $this
->randomEntity('moderation_state'),
];
foreach ($states as $language => $state) {
$this
->translate($entity, $language)
->set('moderation_state', $state);
}
$this->storage
->save($entity);
$this
->doMigration();
$entity = $this->storage
->load($entity
->id());
foreach ($states as $language => $state) {
$this
->assertTrue($entity
->isDefaultRevision());
$this
->assertSame($state, $entity
->getTranslation($language)->moderation_state->value);
}
}
public function testMultipleUntranslatedRevisions() {
$entity = $this
->createEntity();
$default_vid = NULL;
$moderation_states = [];
while (count($moderation_states) < 5) {
$entity
->setNewRevision();
if (count($moderation_states) === 2) {
$entity
->isDefaultRevision(TRUE);
}
$entity
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this->storage
->save($entity);
$vid = (int) $entity
->getRevisionId();
if ($entity
->isDefaultRevision()) {
$default_vid = $vid;
}
$moderation_states[$vid] = $entity->moderation_state->target_id;
}
$this
->assertInternalType('integer', $default_vid);
$this
->doMigration();
foreach ($moderation_states as $vid => $moderation_state) {
$revision = $this->storage
->loadRevision($vid);
if ($vid === $default_vid) {
$this
->assertTrue($revision
->isDefaultRevision());
}
$this
->assertSame($moderation_state, $revision->moderation_state->value);
}
}
public function testMultipleTranslatedRevisions() {
$entity = $this
->createEntity();
$default_vid = NULL;
$revisions = [];
while (count($revisions) < 5) {
$entity
->setNewRevision();
if (count($revisions) === 3) {
$entity
->isDefaultRevision(TRUE);
}
$moderation_states = [];
foreach ([
'en',
'fr',
'hu',
] as $language) {
$moderation_states[$language] = $this
->randomEntity('moderation_state');
$this
->translate($entity, $language)
->set('moderation_state', $moderation_states[$language]);
}
$this->storage
->save($entity);
$vid = (int) $entity
->getRevisionId();
if ($entity
->isDefaultRevision()) {
$default_vid = $vid;
}
$revisions[$vid] = $moderation_states;
}
$this
->assertInternalType('integer', $default_vid);
$this
->doMigration();
foreach ($revisions as $vid => $moderation_states) {
$revision = $this->storage
->loadRevision($vid);
if ($vid === $default_vid) {
$this
->assertTrue($revision
->isDefaultRevision());
}
foreach ($moderation_states as $language => $moderation_state) {
$this
->assertSame($moderation_state, $revision
->getTranslation($language)->moderation_state->value);
}
}
}
public function testMultipleTranslatedMixedRevisions() {
$entity = $this
->createEntity();
$revisions = [];
$entity
->setNewRevision();
$entity
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this
->translate($entity, 'fr');
$this
->translate($entity, 'hu')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this->storage
->save($entity);
$vid = $entity
->getRevisionId();
$revisions[$vid]['en'] = $entity->moderation_state->target_id;
$revisions[$vid]['fr'] = $entity
->getTranslation('fr')->moderation_state->target_id;
$revisions[$vid]['hu'] = $entity
->getTranslation('hu')->moderation_state->target_id;
$entity
->setNewRevision();
$entity
->getTranslation('fr')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$entity
->getTranslation('hu')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this->storage
->save($entity);
$vid = $entity
->getRevisionId();
$revisions[$vid]['en'] = $entity->moderation_state->target_id;
$revisions[$vid]['fr'] = $entity
->getTranslation('fr')->moderation_state->target_id;
$revisions[$vid]['hu'] = $entity
->getTranslation('hu')->moderation_state->target_id;
$entity
->setNewRevision();
$entity
->set('moderation_state', $this
->randomEntity('moderation_state'));
$entity
->getTranslation('hu')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this->storage
->save($entity);
$vid = $entity
->getRevisionId();
$revisions[$vid]['en'] = $entity->moderation_state->target_id;
$revisions[$vid]['fr'] = $entity
->getTranslation('fr')->moderation_state->target_id;
$revisions[$vid]['hu'] = $entity
->getTranslation('hu')->moderation_state->target_id;
$this
->doMigration();
foreach ($revisions as $vid => $moderation_states) {
$revision = $this->storage
->loadRevision($vid);
foreach ($moderation_states as $language => $moderation_state) {
$this
->assertSame($moderation_state, $revision
->getTranslation($language)->moderation_state->value);
}
}
}
public function testMultipleRevisionsWithNewTranslation() {
$entity = $this
->createEntity();
$revisions = [];
$entity
->setNewRevision();
$entity
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this
->translate($entity, 'fr')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this->storage
->save($entity);
$initial_revision = $vid = $entity
->getRevisionId();
$revisions[$vid]['en'] = $entity->moderation_state->target_id;
$revisions[$vid]['fr'] = $entity
->getTranslation('fr')->moderation_state->target_id;
$entity
->setNewRevision();
$entity
->set('moderation_state', $this
->randomEntity('moderation_state'));
$entity
->getTranslation('fr')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this
->translate($entity, 'hu');
$this->storage
->save($entity);
$vid = $entity
->getRevisionId();
$revisions[$vid]['en'] = $entity->moderation_state->target_id;
$revisions[$vid]['fr'] = $entity
->getTranslation('fr')->moderation_state->target_id;
$revisions[$vid]['hu'] = $entity
->getTranslation('hu')->moderation_state->target_id;
$entity
->setNewRevision();
$entity
->set('moderation_state', $this
->randomEntity('moderation_state'));
$entity
->getTranslation('fr')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$entity
->getTranslation('hu')
->set('moderation_state', $this
->randomEntity('moderation_state'));
$this->storage
->save($entity);
$vid = $entity
->getRevisionId();
$revisions[$vid]['en'] = $entity->moderation_state->target_id;
$revisions[$vid]['fr'] = $entity
->getTranslation('fr')->moderation_state->target_id;
$revisions[$vid]['hu'] = $entity
->getTranslation('hu')->moderation_state->target_id;
$this
->doMigration();
foreach ($revisions as $vid => $moderation_states) {
$revision = $this->storage
->loadRevision($vid);
if ($vid === $initial_revision) {
$this
->assertFalse($revision
->hasTranslation('hu'));
}
foreach ($moderation_states as $language => $moderation_state) {
$this
->assertSame($moderation_state, $revision
->getTranslation($language)->moderation_state->value);
}
}
}
protected function moderate(ThirdPartySettingsInterface $entity) {
$moderation_states = $this->container
->get('entity_type.manager')
->getStorage('moderation_state')
->getQuery()
->execute();
return $entity
->setThirdPartySetting('workbench_moderation', 'enabled', TRUE)
->setThirdPartySetting('workbench_moderation', 'allowed_moderation_states', $moderation_states)
->setThirdPartySetting('workbench_moderation', 'default_moderation_state', 'draft');
}
}