devel_wizard-2.x-dev/tests/src/Drush/EntityTypeSpellCommandsTest.php
tests/src/Drush/EntityTypeSpellCommandsTest.php
<?php
declare(strict_types=1);
namespace Drupal\Tests\devel_wizard\Drush;
use Stringy\StaticStringy;
use Symfony\Component\Finder\Finder;
use Webmozart\PathUtil\Path;
/**
* @group drush.command
* @group devel_wizard
* @group devel_wizard.spell
* @group devel_wizard.spell.entity_type
*
* @covers \Drupal\devel_wizard\Commands\EntityTypeSpellCommands
*/
class EntityTypeSpellCommandsTest extends DrushTestCase {
protected static string $command = 'devel-wizard:spell:entity-type';
public function testRunSuccess(): void {
$drupalRoot = static::getDrupalRoot();
$moduleName = 'my_mod';
$moduleNameDash = StaticStringy::dasherize($moduleName);
$configEntityTypeId = 'my_mod_foo_type';
$contentEntityTypeId = 'my_mod_foo';
$contentEntityTypeIdDash = StaticStringy::dasherize($contentEntityTypeId);
$configClass = StaticStringy::upperCamelize($configEntityTypeId);
$contentClass = StaticStringy::upperCamelize($contentEntityTypeId);
$expectedFiles = [
"modules/custom/{$moduleName}/config/schema/{$moduleName}.schema.yml" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}AccessControlHandler.php" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}AddForm.php" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}Comparer.php" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}DeleteForm.php" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}EditForm.php" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}ListBuilder.php" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}RouteProvider.php" => [],
"modules/custom/{$moduleName}/src/ConfigEntity/{$configClass}Storage.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}AccessControlHandler.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}AddForm.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}Controller.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}DeleteForm.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}EditForm.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}ListBuilder.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}RevisionDeleteForm.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}RevisionRevertForm.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}RevisionRevertTranslationForm.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}RouteProvider.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}Storage.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}StorageInterface.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}StorageSchema.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}TranslationHandler.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}ViewBuilder.php" => [],
"modules/custom/{$moduleName}/src/ContentEntity/{$contentClass}ViewController.php" => [],
"modules/custom/{$moduleName}/src/Entity/{$contentClass}.php" => [],
"modules/custom/{$moduleName}/src/Entity/{$configClass}.php" => [],
"modules/custom/{$moduleName}/src/{$contentClass}Interface.php" => [],
"modules/custom/{$moduleName}/src/{$contentClass}PermissionProvider.php" => [],
"modules/custom/{$moduleName}/src/{$contentClass}PermissionProviderInterface.php" => [],
"modules/custom/{$moduleName}/src/{$configClass}Interface.php" => [],
"modules/custom/{$moduleName}/templates/{$moduleNameDash}.{$contentEntityTypeIdDash}.html.twig" => [],
"modules/custom/{$moduleName}/{$moduleName}.info.yml" => [],
"modules/custom/{$moduleName}/{$moduleName}.links.action.yml" => [],
"modules/custom/{$moduleName}/{$moduleName}.links.contextual.yml" => [],
"modules/custom/{$moduleName}/{$moduleName}.links.menu.yml" => [],
"modules/custom/{$moduleName}/{$moduleName}.links.task.yml" => [],
"modules/custom/{$moduleName}/{$moduleName}.module" => [],
"modules/custom/{$moduleName}/{$moduleName}.permissions.yml" => [],
"modules/custom/{$moduleName}/{$moduleName}.services.yml" => [],
"modules/custom/{$moduleName}/tests/src/Functional/ConfigEntityCrudTest.php" => [],
"modules/custom/{$moduleName}/tests/src/Functional/TestBase.php" => [],
];
static::assertDirectoryDoesNotExist("$drupalRoot/modules/custom/$moduleName");
$args = [
$contentEntityTypeId,
$configEntityTypeId,
$moduleName,
];
$options = [];
$options += $this->getCommonCommandLineOptions();
$envVars = [];
$envVars += $this->getCommonCommandLineEnvVars();
$this->drush(
static::$command,
$args,
$options,
NULL,
NULL,
0,
NULL,
$envVars,
);
$actualStdError = $this->getErrorOutput();
$actualStdOutput = $this->getOutput();
foreach ($expectedFiles as $path => $expectedFile) {
$expectedFile += [
'{{ path }}' => $path,
];
if (!empty($expectedFile['{{ message }}'])) {
static::assertStringContainsString(
strtr($expectedFile['{{ message }}'], $expectedFile),
$actualStdError,
);
}
if (!empty($expectedFile['{{ path }}'])) {
static::assertFileExists("$drupalRoot/{$expectedFile['{{ path }}']}");
}
}
static::assertSame('', $actualStdOutput, 'StdOutput');
$actualFiles = $this->collectFiles("$drupalRoot/modules/custom");
ksort($expectedFiles);
ksort($actualFiles);
static::assertSame(array_keys($expectedFiles), array_keys($actualFiles));
}
/**
* @return \Symfony\Component\Finder\SplFileInfo[]
*/
protected function collectFiles(string $dir): array {
$result = [];
$files = (new Finder())
->in($dir)
->files();
$drupalRoot = static::getDrupalRoot();
foreach ($files as $file) {
$relative = Path::makeRelative($file->getPathname(), $drupalRoot);
$result[$relative] = $file;
}
return $result;
}
}
