Initial commit

This commit is contained in:
2025-10-05 13:55:28 +02:00
commit 68d521677a
767 changed files with 46947 additions and 0 deletions
@@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
namespace Tests\Behat\Context;
use App\SharedKernel\Application\Messaging\CommandBus;
use App\SharedKernel\Application\Messaging\QueryBus;
use Behat\Behat\Context\Context;
use Symfony\Contracts\Service\ServiceMethodsSubscriberTrait;
use Symfony\Contracts\Service\ServiceSubscriberInterface;
use Tests\Behat\State\SharedStorage;
/**
* Class AbstractContext.
*
* @author bernard-ng <bernard@devscast.tech>
*/
final class AbstractContext implements Context, ServiceSubscriberInterface
{
use ServiceMethodsSubscriberTrait;
#[\Override]
public static function getSubscribedServices(): array
{
return [CommandBus::class, QueryBus::class, SharedStorage::class];
}
}
@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace Tests\Behat\Hook;
use Behat\Behat\Context\Context;
use Behat\Hook\BeforeScenario;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\ORM\EntityManagerInterface;
final readonly class DatabasePurger implements Context
{
public function __construct(
private EntityManagerInterface $entityManager
) {
}
#[BeforeScenario]
public function purge(): void
{
$this->entityManager->getConnection()
->getConfiguration()
->setMiddlewares([]);
$purger = new ORMPurger($this->entityManager);
$purger->purge();
$this->entityManager->clear();
}
}
@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace Tests\Behat\State;
/**
* Class SharedStorage.
*
* @author bernard-ng <bernard@devscast.tech>
*/
final class SharedStorage
{
private array $storage = [];
public function get(string $key): mixed
{
return $this->storage[$key] ?? null;
}
public function set(string $key, mixed $value): void
{
$this->storage[$key] = $value;
}
public function has(string $key): bool
{
return isset($this->storage[$key]);
}
public function remove(string $key): void
{
if ($this->has($key)) {
unset($this->storage[$key]);
}
}
}
@@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace Tests\Unit\Aggregator\Domain\Model\ValueObject;
use App\Aggregator\Domain\Model\ValueObject\Crawling\PageRange;
use App\SharedKernel\Domain\Exception\InvalidArgument;
use PHPUnit\Framework\TestCase;
/**
* Class PageRangeTest.
*
* @author bernard-ng <bernard@devscast.tech>
*/
final class PageRangeTest extends TestCase
{
public function testItShouldCreatePageRange(): void
{
$pageRange = PageRange::from('1:10');
$this->assertEquals(1, $pageRange->start);
$this->assertEquals(10, $pageRange->end);
}
public function testEndPageShouldBeGreaterThanStartPage(): void
{
$this->expectException(InvalidArgument::class);
PageRange::from('10:1');
}
public function testNonNegativePages(): void
{
$this->expectException(InvalidArgument::class);
PageRange::from('-1:-10');
}
}
@@ -0,0 +1,63 @@
<?php
declare(strict_types=1);
namespace Tests\Unit\Aggregator\Domain\Service;
use App\Aggregator\Domain\Service\Crawling\DateParser;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
/**
* Class DateParserTest.
*
* @author bernard-ng <bernard@devscast.tech>
*/
final class DateParserTest extends TestCase
{
private DateParser $dateParser;
#[\Override]
protected function setUp(): void
{
$this->dateParser = new DateParser();
}
#[DataProvider('validDateProvider')]
public function testCreateTimeStampWithValidDates(
string $date,
?string $format,
?string $pattern,
?string $replacement,
string $expected
): void {
$result = $this->dateParser->createTimeStamp($date, $format, $pattern, $replacement);
$this->assertEquals($expected, $result);
}
#[DataProvider('invalidDateProvider')]
public function testCreateTimeStampWithInvalidDates(
string $date,
?string $format,
?string $pattern,
?string $replacement
): void {
$currentTimestamp = new \DateTime('midnight')->format('U');
$result = $this->dateParser->createTimeStamp($date, $format, $pattern, $replacement);
$this->assertEquals($currentTimestamp, $result);
}
public static function validDateProvider(): \Generator
{
yield ['2004-02-12T15:19:21', 'c', null, null, '1076599161'];
yield ['08/10/2024 - 00:00', 'Y-m-d H:i', '/(\d{2})\/(\d{2})\/(\d{4}) - (\d{2}:\d{2})/', '$3-$2-$1 $4', '1728345600'];
yield ['mar 08/10/2024 - 00:00', 'Y-m-d H:i', '/\w{3} (\d{2})\/(\d{2})\/(\d{4}) - (\d{2}:\d{2})/', '$3-$2-$1 $4', '1728345600'];
yield ['Mardi 8 octobre 2024 - 00:00', 'Y-m-d H:i', '/(\d{1}) (\d{1,2}) (\d{2}) (\d{4}) - (\d{2}:\d{2})/', '$4-$3-$2 $5', '1728345600'];
yield ['8.10.2024 00:00', 'd.m.Y H:i', null, null, '1728345600'];
}
public static function invalidDateProvider(): \Generator
{
yield ['invalid date string', null, null, null];
}
}
@@ -0,0 +1,35 @@
<?php
declare(strict_types=1);
namespace Tests\Unit\SharedKernel\Domain\Model\ValueObject;
use App\SharedKernel\Domain\Exception\InvalidArgument;
use App\SharedKernel\Domain\Model\ValueObject\DateRange;
use PHPUnit\Framework\TestCase;
/**
* Class DateRangeTest.
*
* @author bernard-ng <bernard@devscast.tech>
*/
final class DateRangeTest extends TestCase
{
public function testItShouldCreateDateRange(): void
{
$dateRange = DateRange::from(
'2021-10-01 00:00:00--2021-10-10 00:00:00',
'Y-m-d H:i:s',
'--'
);
$this->assertEquals(1633046400, $dateRange->start);
$this->assertEquals(1633824000, $dateRange->end);
}
public function testEndShouldBeGreaterThanStart(): void
{
$this->expectException(InvalidArgument::class);
DateRange::from('2021-10-10:2021-10-01');
}
}
+11
View File
@@ -0,0 +1,11 @@
<?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');
}
+18
View File
@@ -0,0 +1,18 @@
<?php
declare(strict_types=1);
use App\SharedKernel\Infrastructure\Framework\Symfony\Kernel;
use Symfony\Component\Dotenv\Dotenv;
require __DIR__ . '/../vendor/autoload.php';
new Dotenv()->bootEnv(__DIR__ . '/../.env');
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$kernel->boot();
/** @var Doctrine\Bundle\DoctrineBundle\Registry $doctrine */
$doctrine = $kernel->getContainer()->get('doctrine');
return $doctrine->getManager();