test: re-add original tests

This commit is contained in:
Oliver Davies 2023-11-06 01:04:25 +00:00
parent 1a4eba7349
commit 1c5eac72bb
9 changed files with 2255 additions and 7 deletions

6
.env.test Normal file
View file

@ -0,0 +1,6 @@
# define your env variables for the test env here
KERNEL_CLASS='App\Kernel'
APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots

16
.gitignore vendored
View file

@ -11,3 +11,19 @@
/var/ /var/
/vendor/ /vendor/
###< symfony/framework-bundle ### ###< symfony/framework-bundle ###
/new-bin/
###> phpstan/phpstan ###
phpstan.neon
###< phpstan/phpstan ###
###> symfony/phpunit-bridge ###
.phpunit.result.cache
/phpunit.xml
###< symfony/phpunit-bridge ###
###> phpunit/phpunit ###
/phpunit.xml
.phpunit.result.cache
###< phpunit/phpunit ###

View file

@ -36,7 +36,8 @@
"allow-plugins": { "allow-plugins": {
"symfony/flex": true, "symfony/flex": true,
"symfony/runtime": true, "symfony/runtime": true,
"bamarni/composer-bin-plugin": true "bamarni/composer-bin-plugin": true,
"pestphp/pest-plugin": true
} }
}, },
"bin": ["bin/build-configs"], "bin": ["bin/build-configs"],
@ -69,6 +70,10 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8", "bamarni/composer-bin-plugin": "^1.8",
"symfony/maker-bundle": "^1.48" "phpunit/phpunit": "^9.5",
"symfony/browser-kit": "6.2.*",
"symfony/css-selector": "6.2.*",
"symfony/maker-bundle": "^1.48",
"symfony/phpunit-bridge": "^6.3"
} }
} }

2032
composer.lock generated

File diff suppressed because it is too large Load diff

38
phpunit.xml.dist Normal file
View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
backupGlobals="false"
colors="true"
bootstrap="tests/bootstrap.php"
convertDeprecationsToExceptions="false"
>
<php>
<ini name="display_errors" value="1" />
<ini name="error_reporting" value="-1" />
<server name="APP_ENV" value="test" force="true" />
<server name="SHELL_VERBOSITY" value="-1" />
<server name="SYMFONY_PHPUNIT_REMOVE" value="" />
<server name="SYMFONY_PHPUNIT_VERSION" value="9.5" />
</php>
<testsuites>
<testsuite name="Project Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">src</directory>
</include>
</coverage>
<listeners>
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
</listeners>
<extensions>
</extensions>
</phpunit>

View file

@ -49,7 +49,6 @@ final class Config
#[Assert\Choice(choices: ['javascript', 'php', 'typescript'])] #[Assert\Choice(choices: ['javascript', 'php', 'typescript'])]
public string $language; public string $language;
#[Assert\Length(min: 1)]
#[Assert\NotBlank] #[Assert\NotBlank]
public string $name; public string $name;
@ -57,9 +56,6 @@ final class Config
#[Assert\NotBlank] #[Assert\NotBlank]
public string $type; public string $type;
#[Assert\NotBlank]
public ?string $projectRoot;
#[Assert\Collection( #[Assert\Collection(
allowExtraFields: false, allowExtraFields: false,
fields: [ fields: [

View file

@ -11,6 +11,32 @@
"php": { "php": {
"version": "7.2.9" "version": "7.2.9"
}, },
"phpstan/phpstan": {
"version": "1.10",
"recipe": {
"repo": "github.com/symfony/recipes-contrib",
"branch": "main",
"version": "1.0",
"ref": "5e490cc197fb6bb1ae22e5abbc531ddc633b6767"
},
"files": [
"phpstan.dist.neon"
]
},
"phpunit/phpunit": {
"version": "9.6",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "9.6",
"ref": "7364a21d87e658eb363c5020c072ecfdc12e2326"
},
"files": [
".env.test",
"phpunit.xml.dist",
"tests/bootstrap.php"
]
},
"psr/cache": { "psr/cache": {
"version": "1.0.1" "version": "1.0.1"
}, },
@ -127,6 +153,21 @@
"ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f"
} }
}, },
"symfony/phpunit-bridge": {
"version": "6.3",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "6.3",
"ref": "01dfaa98c58f7a7b5a9b30e6edb7074af7ed9819"
},
"files": [
".env.test",
"new-bin/phpunit",
"phpunit.xml.dist",
"tests/bootstrap.php"
]
},
"symfony/polyfill-intl-grapheme": { "symfony/polyfill-intl-grapheme": {
"version": "v1.22.1" "version": "v1.22.1"
}, },

View file

@ -0,0 +1,101 @@
<?php
namespace App\Tests;
use App\DataTransferObject\Config;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class ConfigurationValidatorTest extends KernelTestCase
{
private SerializerInterface $serializer;
private ValidatorInterface $validator;
public function setUp(): void
{
$normalizer = new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter());
$this->serializer = new Serializer([$normalizer], [new JsonEncoder()]);
$this->validator = Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();
}
/**
* @dataProvider projectNameProvider
* @test
*/
public function project_name_should_be_a_string(string|int|bool|null $projectName, int $expectedViolationCount): void
{
$configurationData = [
'language' => 'php',
'name' => $projectName,
'type' => 'drupal',
];
$configurationDataDto = $this->createConfigurationDTO($configurationData);
$violations = $this->validator->validate($configurationDataDto);
self::assertCount(
expectedCount: $expectedViolationCount,
haystack: $violations,
);
}
/**
* @dataProvider projectLanguageProvider
* @test
*/
public function the_project_language_should_be_a_supported_language(string|int|bool|null $language, int $expectedViolationCount): void
{
$configurationData = [
'language' => $language,
'name' => 'test',
'type' => 'drupal',
];
$configurationDataDto = $this->createConfigurationDTO($configurationData);
$violations = $this->validator->validate($configurationDataDto);
self::assertCount(
expectedCount: $expectedViolationCount,
haystack: $violations,
);
}
public function projectLanguageProvider(): \Generator
{
return [
yield 'Supported language string' => ['php', 0],
yield 'Non-supported language string' => ['not-supported', 1],
yield 'Empty string' => ['', 1],
yield 'True' => [true, 1],
yield 'False' => [false, 1],
// yield 'Integer' => [1, 2],
// yield 'Null' => [null, 1],
];
}
public function projectNameProvider(): \Generator
{
return [
yield 'Non-empty string' => ['test', 0],
yield 'Empty string' => ['', 1],
yield 'False' => [false, 1],
// yield 'Null' => [null, 1],
];
}
private function createConfigurationDTO(array $configurationData): Config
{
return $this->serializer->deserialize(json_encode($configurationData), Config::class, 'json');
}
}

15
tests/bootstrap.php Normal file
View file

@ -0,0 +1,15 @@
<?php
use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__).'/vendor/autoload.php';
if (file_exists(dirname(__DIR__).'/config/bootstrap.php')) {
require dirname(__DIR__).'/config/bootstrap.php';
} elseif (method_exists(Dotenv::class, 'bootEnv')) {
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
}
if ($_SERVER['APP_DEBUG']) {
umask(0000);
}