Skip to content
Snippets Groups Projects
Verified Commit 67ee291f authored by Jiří Pudil's avatar Jiří Pudil
Browse files

add tests for commands

parent fa826f80
No related branches found
No related tags found
1 merge request!53Check command
Showing
with 329 additions and 0 deletions
Checking 1 definition file:
F
check/.definition.php: 3 definitions, 2 errors
----------------------------------------------
FAIL ModifiedClass
[ERROR] RuntimeException: The generated file contains changes that will be lost
if you generate it again.
in %A%
FAIL MissingClass
[ERROR] RuntimeException: There is no generated file for given definition.
in %A%
<?php
declare(strict_types=1);
namespace Grifart\ClassScaffolder\Test\Console;
use Grifart\ClassScaffolder\Console\CheckCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Tester\Assert;
require __DIR__ . '/../bootstrap.php';
/**
* @testCase
*/
final class CheckCommandTest extends CommandTestCase
{
public function testCheck(): void
{
$input = new ArrayInput(['check', 'definition' => __DIR__ . '/check']);
$output = new BufferedOutput();
$exitCode = $this->runCommand($input, $output);
Assert::same(1, $exitCode);
Assert::matchFile(__DIR__ . '/CheckCommandTest.expected.txt', $output->fetch());
}
protected function createCommand(): Command
{
return new CheckCommand();
}
}
(new CheckCommandTest())->run();
<?php
declare(strict_types=1);
namespace Grifart\ClassScaffolder\Test\Console;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Tester\TestCase;
abstract class CommandTestCase extends TestCase
{
abstract protected function createCommand(): Command;
protected function runCommand(
InputInterface $input,
OutputInterface $output,
): int
{
$command = $this->createCommand();
$application = new Application();
$application->setAutoExit(false);
$application->add($command);
return $application->run($input, $output);
}
}
Processing 3 definition files:
F.F
definitions/invalid.definition.php: error loading definitions
-------------------------------------------------------------
[ERROR] RuntimeException: Definition file must return an iterable of
ClassDefinition, int received.
in %A%
definitions/failing.definition.php: 2 definitions, 1 error
----------------------------------------------------------
FAIL FailingClass
[ERROR] RuntimeException: Oh no, I failed :(
in %A%
Processing 1 definition file:
F
definitions/failing.definition.php: 2 definitions, 1 error
----------------------------------------------------------
FAIL FailingClass
[ERROR] RuntimeException: Oh no, I failed :(
in %A%
Processing 1 definition file:
F
definitions/invalid.definition.php: error loading definitions
-------------------------------------------------------------
[ERROR] RuntimeException: Definition file must return an iterable of
ClassDefinition, int received.
in %A%
Processing 1 definition file:
.
Processing 1 definition file:
.
definitions/good.definition.php: 2 definitions, OK
--------------------------------------------------
Processing 1 definition file:
.
definitions/good.definition.php: 2 definitions, OK
--------------------------------------------------
OK DataClass
OK AnotherClass
<?php
declare(strict_types=1);
namespace Grifart\ClassScaffolder\Test\Console;
use Grifart\ClassScaffolder\Console\ScaffoldCommand;
use Nette\Utils\Finder;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Tester\Assert;
require __DIR__ . '/../bootstrap.php';
/**
* @testCase
*/
final class ScaffoldCommandTest extends CommandTestCase
{
public function testSuccess(): void
{
$input = new ArrayInput(['scaffold', 'definition' => __DIR__ . '/definitions/good.definition.php']);
$output = new BufferedOutput();
$exitCode = $this->runCommand($input, $output);
Assert::same(0, $exitCode);
Assert::matchFile(__DIR__ . '/ScaffoldCommandTest.expected.success.txt', $output->fetch());
}
public function testVerbose(): void
{
$input = new ArrayInput(['scaffold', 'definition' => __DIR__ . '/definitions/good.definition.php']);
$output = new BufferedOutput(BufferedOutput::VERBOSITY_VERBOSE);
$exitCode = $this->runCommand($input, $output);
Assert::same(0, $exitCode);
Assert::matchFile(__DIR__ . '/ScaffoldCommandTest.expected.verbose.txt', $output->fetch());
}
public function testVeryVerbose(): void
{
$input = new ArrayInput(['scaffold', 'definition' => __DIR__ . '/definitions/good.definition.php']);
$output = new BufferedOutput(BufferedOutput::VERBOSITY_VERY_VERBOSE);
$exitCode = $this->runCommand($input, $output);
Assert::same(0, $exitCode);
Assert::matchFile(__DIR__ . '/ScaffoldCommandTest.expected.veryVerbose.txt', $output->fetch());
}
public function testFailure(): void
{
$input = new ArrayInput(['scaffold', 'definition' => __DIR__ . '/definitions/failing.definition.php']);
$output = new BufferedOutput();
$exitCode = $this->runCommand($input, $output);
Assert::same(1, $exitCode);
Assert::matchFile(__DIR__ . '/ScaffoldCommandTest.expected.failing.txt', $output->fetch());
}
public function testInvalid(): void
{
$input = new ArrayInput(['scaffold', 'definition' => __DIR__ . '/definitions/invalid.definition.php']);
$output = new BufferedOutput();
$exitCode = $this->runCommand($input, $output);
Assert::same(1, $exitCode);
Assert::matchFile(__DIR__ . '/ScaffoldCommandTest.expected.invalid.txt', $output->fetch());
}
protected function createCommand(): Command
{
return new ScaffoldCommand();
}
}
(new ScaffoldCommandTest())->run();
<?php
use function Grifart\ClassScaffolder\Capabilities\constructorWithPromotedProperties;
use function Grifart\ClassScaffolder\Definition\definitionOf;
return [
definitionOf(UnmodifiedClass::class)
->withField('field', 'string')
->with(constructorWithPromotedProperties()),
definitionOf(ModifiedClass::class)
->withField('field', 'string')
->with(constructorWithPromotedProperties()),
definitionOf(MissingClass::class)
->withField('field', 'string')
->with(constructorWithPromotedProperties()),
];
<?php
/**
* Do not edit. This is generated file. Modify definition file instead.
*/
declare(strict_types=1);
final class ModifiedClass
{
public function __construct(private int $field)
{
}
}
<?php
/**
* Do not edit. This is generated file. Modify definition file instead.
*/
declare(strict_types=1);
final class UnmodifiedClass
{
public function __construct(private string $field)
{
}
}
*.php
!*.definition.php
<?php
use Grifart\ClassScaffolder\Capabilities\Capability;
use Grifart\ClassScaffolder\ClassInNamespace;
use Grifart\ClassScaffolder\Definition\ClassDefinition;
use function Grifart\ClassScaffolder\Definition\definitionOf;
return [
definitionOf(SuccessClass::class)
->withField('field', 'string'),
definitionOf(FailingClass::class)
->withField('field', 'string')
->with(new class implements Capability {
public function applyTo(ClassDefinition $definition, ClassInNamespace $draft, ?ClassInNamespace $current,): void
{
throw new RuntimeException('Oh no, I failed :(');
}
}),
];
<?php
use Grifart\ClassScaffolder\Capabilities;
use Grifart\ClassScaffolder\Definition\ClassDefinition;
use Grifart\ClassScaffolder\Definition\Types;
use function Grifart\ClassScaffolder\Definition\definitionOf;
function valueObject(string $className): ClassDefinition {
return definitionOf($className)->with(
Capabilities\constructorWithPromotedProperties(),
Capabilities\readonlyProperties(),
);
}
return [
$dataClass = definitionOf(valueObject(DataClass::class))
->withField('field', 'string'),
definitionOf(valueObject(AnotherClass::class))
->withField('data', Types\listOf($dataClass)),
];
<?php
return 42;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment