Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Tests

on:
pull_request:
push:
branches:
- master

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

jobs:

tests:
runs-on: ubuntu-24.04
strategy:
matrix:
php-versions: [ '8.2', '8.3', '8.4' ]
symfony-version: ['5.4.*', '6.4.*', '7.2.*']
fail-fast: false
steps:
- uses: actions/checkout@v4

- name: Setup PHP, with composer and extensions
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
coverage: none
tools: phpstan

- name: Configure Symfony
run: composer config extra.symfony.require "${{ matrix.symfony-version }}"

- name: Update project dependencies
run: composer update --no-progress --ansi --prefer-stable

- name: Composer install
run: composer install --no-scripts --no-interaction --prefer-dist -oa

- name: Run Phpunit
run: ./vendor/bin/phpunit

- name: Run Phpstan
run: phpstan analyze DependencyInjection Services
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
.idea/
composer.lock
vendor/
.phpunit.cache
.phpunit.result.cache
.devenv
.devenv.flake.nix
3 changes: 2 additions & 1 deletion DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Configuration implements ConfigurationInterface
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
public function getConfigTreeBuilder()
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('openclassrooms_use_case');
$rootNode = $treeBuilder->getRootNode();
Expand All @@ -24,6 +24,7 @@ public function getConfigTreeBuilder()
->scalarNode('transaction')->defaultValue('doctrine.orm.entity_manager')->end()
->scalarNode('event_sender')->defaultValue('event_dispatcher')->end()
->scalarNode('event_factory')->defaultValue('openclassrooms.use_case.event_factory')->end()
->variableNode('cache')->end()
->end();

return $treeBuilder;
Expand Down
7 changes: 6 additions & 1 deletion DependencyInjection/OpenClassroomsUseCaseExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,17 @@ public function load(array $config, ContainerBuilder $container)
$container->setParameter('openclassrooms.use_case.default_entity_manager', $config['transaction']);
$container->setParameter('openclassrooms.use_case.default_event_sender', $config['event_sender']);
$container->setParameter('openclassrooms.use_case.default_event_factory', $config['event_factory']);

if (isset($config['cache'])) {
$cache = $container->setAlias('openclassrooms.use_case.cache', $config['cache']);
$cache->setPublic(true);
}
}

/**
* @return string
*/
public function getAlias()
public function getAlias(): string
{
return 'open_classrooms_use_case';
}
Expand Down
27 changes: 9 additions & 18 deletions Resources/config/services.xml
Original file line number Diff line number Diff line change
@@ -1,38 +1,29 @@
<container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://symfony.com/schema/dic/services" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="openclassrooms.use_case.security_factory.class">OpenClassrooms\Bundle\UseCaseBundle\Services\Security\Impl\SecurityFactoryImpl</parameter>
<parameter key="openclassrooms.use_case.transaction_factory.class">OpenClassrooms\Bundle\UseCaseBundle\Services\Transaction\Impl\TransactionFactoryImpl</parameter>
<parameter key="openclassrooms.use_case.event_adapter_factory.class">OpenClassrooms\Bundle\UseCaseBundle\Services\Event\Impl\EventAdapterFactoryImpl</parameter>
<parameter key="openclassrooms.use_case.use_case_event_builder.class">OpenClassrooms\Bundle\UseCaseBundle\Services\Event\Impl\UseCaseEventBuilderImpl</parameter>
<parameter key="openclassrooms.use_case.event_factory.class">OpenClassrooms\Bundle\UseCaseBundle\Services\Event\Impl\EventFactoryImpl</parameter>
<parameter key="openclassrooms.use_case.use_case_proxy_factory.class">OpenClassrooms\Bundle\UseCaseBundle\Services\Proxy\Impl\UseCaseProxyFactoryImpl</parameter>
</parameters>

<services>
<service id="openclassrooms.use_case.use_case_proxy_factory" class="%openclassrooms.use_case.use_case_proxy_factory.class%" shared="false" public="true">
<service id="openclassrooms.use_case.use_case_proxy_factory" class="OpenClassrooms\Bundle\UseCaseBundle\Services\Proxy\Impl\UseCaseProxyFactoryImpl" shared="false">
<call method="setContainer">
<argument type="service" id="service_container"/>
</call>
<call method="setReader">
<argument type="service" id="annotation_reader"/>
</call>
</service>
<service id="openclassrooms.use_case.security_factory" class="%openclassrooms.use_case.security_factory.class%" public="true"/>
<service id="openclassrooms.use_case.transaction_factory" class="%openclassrooms.use_case.transaction_factory.class%" public="true"/>
<service id="openclassrooms.use_case.event_adapter_factory" class="%openclassrooms.use_case.event_adapter_factory.class%" public="true"/>
<service id="openclassrooms.use_case.use_case_event_builder" class="%openclassrooms.use_case.use_case_event_builder.class%"/>
<service id="openclassrooms.use_case.event_factory" class="%openclassrooms.use_case.event_factory.class%" public="true">
<service id="openclassrooms.use_case.security_factory" class="OpenClassrooms\Bundle\UseCaseBundle\Services\Security\Impl\SecurityFactoryImpl" public="true"/>
<service id="openclassrooms.use_case.transaction_factory" class="OpenClassrooms\Bundle\UseCaseBundle\Services\Transaction\Impl\TransactionFactoryImpl" public="true"/>
<service id="openclassrooms.use_case.event_adapter_factory" class="OpenClassrooms\Bundle\UseCaseBundle\Services\Event\Impl\EventAdapterFactoryImpl" public="true"/>
<service id="openclassrooms.use_case.use_case_event_builder" class="OpenClassrooms\Bundle\UseCaseBundle\Services\Event\Impl\UseCaseEventBuilderImpl" public="true"/>
<service id="openclassrooms.use_case.event_factory" class="OpenClassrooms\Bundle\UseCaseBundle\Services\Event\Impl\EventFactoryImpl" public="true">
<call method="setUseCaseEventBuilder">
<argument type="service" id="openclassrooms.use_case.use_case_event_builder"/>
</call>
</service>

<service id="openclassrooms.use_case.paginated_use_case_response_builder" class="OpenClassrooms\UseCase\Application\Responder\PaginatedUseCaseResponseBuilderImpl"/>
<service id="openclassrooms.use_case.paginated_use_case_response_factory" class="OpenClassrooms\UseCase\Application\Responder\PaginatedUseCaseResponseFactoryImpl">
<service id="openclassrooms.use_case.paginated_use_case_response_builder" class="OpenClassrooms\UseCase\Application\Responder\PaginatedUseCaseResponseBuilderImpl" public="true"/>
<service id="openclassrooms.use_case.paginated_use_case_response_factory" class="OpenClassrooms\UseCase\Application\Responder\PaginatedUseCaseResponseFactoryImpl" public="true">
<call method="setPaginatedUseCaseResponseBuilder">
<argument type="service" id="openclassrooms.use_case.paginated_use_case_response_builder"/>
</call>
</service>
<service id="openclassrooms.use_case.paginated_collection_builder" class="OpenClassrooms\UseCase\Application\Entity\PaginatedCollectionBuilderImpl"/>
<service id="openclassrooms.use_case.paginated_collection_builder" class="OpenClassrooms\UseCase\Application\Entity\PaginatedCollectionBuilderImpl" public="true"/>
</services>
</container>
6 changes: 3 additions & 3 deletions Services/Proxy/Impl/UseCaseProxyFactoryImpl.php
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,10 @@ private function buildCache(array $tagParameters)
if (isset($tagParameters['cache'])) {
/** @var Cache $cache */
$cache = $this->container->get($tagParameters['cache']);
} elseif ($this->container->has('openclassrooms.cache.cache')) {
$cache = $this->container->get('openclassrooms.cache.cache');
} elseif ($this->container->has('openclassrooms.use_case.cache')) {
$cache = $this->container->get('openclassrooms.use_case.cache');
} else {
throw new CacheIsNotDefinedException('Default cache is not defined. Have you configured open_classrooms_cache ?');
throw new CacheIsNotDefinedException('Default cache is not defined. Have you configured it ?');
}

return $cache;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

namespace OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection;

use OpenClassrooms\Bundle\CacheBundle\DependencyInjection\OpenClassroomsCacheExtension;
use OpenClassrooms\Bundle\CacheBundle\OpenClassroomsCacheBundle;
use OpenClassrooms\Bundle\UseCaseBundle\DependencyInjection\OpenClassroomsUseCaseExtension;
use OpenClassrooms\Bundle\UseCaseBundle\OpenClassroomsUseCaseBundle;
use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Fixtures\BusinessRules\UseCases\CacheUseCaseStub;
Expand All @@ -20,13 +18,13 @@
use PHPUnit\Framework\TestCase;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

/**
* @author Romain Kuzniak <[email protected]>
*/
abstract class AbstractDependencyInjectionTest extends TestCase
abstract class AbstractDependencyInjectionTestCase extends TestCase
{
const USE_CASE_PROXY_CLASS = 'OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Impl\UseCaseProxyImpl';

Expand All @@ -36,7 +34,7 @@ abstract class AbstractDependencyInjectionTest extends TestCase
protected $container;

/**
* @var YamlFileLoader
* @var PhpFileLoader
*/
protected $configLoader;

Expand Down Expand Up @@ -71,8 +69,8 @@ protected function initServiceLoader()

protected function initConfigLoader()
{
$this->configLoader = new YamlFileLoader($this->container, new FileLocator(__DIR__.'/Fixtures/Resources/config/'));
$this->configLoader->load('DefaultConfiguration.yml');
$this->configLoader = new PhpFileLoader($this->container, new FileLocator(__DIR__.'/Fixtures/Resources/config/'));
$this->configLoader->load('DefaultConfiguration.php');
}

protected function assertSecurityUseCaseProxy(UseCaseProxy $useCaseProxy)
Expand All @@ -93,7 +91,7 @@ protected function assertCacheUseCaseProxy(UseCaseProxy $useCaseProxy)
{
$this->assertUseCaseProxy($useCaseProxy);
$this->assertEquals(new CacheUseCaseStub(), $useCaseProxy->getUseCase());
$this->assertTrue(CacheSpy::$saved);
$this->assertNotEmpty(CacheSpy::$saved);
}

protected function assertTransactionUseCaseProxy(UseCaseProxy $useCaseProxy)
Expand All @@ -110,14 +108,4 @@ protected function assertEventUseCaseProxy(UseCaseProxy $useCaseProxy)
$this->assertTrue(EventDispatcherSpy::$sent);
$this->assertEquals(EventUseCaseStub::EVENT_NAME, EventDispatcherSpy::$eventName);
}

protected function initCacheBundle()
{
$cacheExtension = new OpenClassroomsCacheExtension();
$this->container->registerExtension($cacheExtension);
$this->container->loadFromExtension('open_classrooms_cache');

$cacheBundle = new OpenClassroomsCacheBundle();
$cacheBundle->build($this->container);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@

namespace OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Yaml;

use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\AbstractDependencyInjectionTest;
use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\AbstractDependencyInjectionTestCase;
use OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Exceptions\CacheIsNotDefinedException;
use OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\UseCaseProxy;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
* @author Romain Kuzniak <[email protected]>
*/
class CacheOpenClassroomsUseCaseExtensionTest extends AbstractDependencyInjectionTest
class CacheOpenClassroomsUseCaseExtensionTest extends AbstractDependencyInjectionTestCase
{
/**
* @test
* @expectedException \OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Exceptions\CacheIsNotDefinedException
*/
public function WithCacheConfigurationWithoutCacheContext_CacheUseCase_ThrowException()
{
$this->configLoader->load('DefaultConfiguration.yml');
$this->expectException(CacheIsNotDefinedException::class);

$this->configLoader->load('DefaultConfiguration.php');
$this->container->compile();

$this->container->get('openclassrooms.tests.use_cases.configuration_cache_use_case_stub');
Expand All @@ -30,12 +32,11 @@ public function WithCacheConfiguration_CacheUseCase_ReturnUseCaseProxy()
{
$this->container = new ContainerBuilder();

$this->initCacheBundle();
$this->initUseCaseBundle();
$this->initServiceLoader();
$this->initConfigLoader();
$this->serviceLoader->load('cache_configuration_services.xml');
$this->configLoader->load('CacheConfiguration.yml');
$this->configLoader->load('CacheConfiguration.php');
$this->container->compile();

/** @var UseCaseProxy $useCaseProxy */
Expand All @@ -44,7 +45,7 @@ public function WithCacheConfiguration_CacheUseCase_ReturnUseCaseProxy()
$this->assertUseCaseProxy($useCaseProxy);
}

protected function setUp()
protected function setUp(): void
{
$this->initContainer();
$this->serviceLoader->load('cache_configuration_services.xml');
Expand Down
6 changes: 3 additions & 3 deletions Tests/DependencyInjection/Compiler/UseCaseProxyPassTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Compiler;

use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\AbstractDependencyInjectionTest;
use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\AbstractDependencyInjectionTestCase;
use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Fixtures\BusinessRules\UseCases\EventUseCaseStub;
use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Fixtures\BusinessRules\UseCases\SecurityUseCaseStub;
use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Fixtures\BusinessRules\UseCases\TransactionUseCaseStub;
Expand All @@ -16,7 +16,7 @@
/**
* @author Romain Kuzniak <[email protected]>
*/
class UseCaseProxyPassTest extends AbstractDependencyInjectionTest
class UseCaseProxyPassTest extends AbstractDependencyInjectionTestCase
{
/**
* @test
Expand Down Expand Up @@ -145,7 +145,7 @@ public function WithEventDispatcherEventUseCase_ReturnProxy()
$this->assertEventUseCaseProxy($useCaseProxy);
}

protected function setUp()
protected function setUp(): void
{
$this->initContainer();
$this->container->compile();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,51 @@

namespace OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Yaml;

use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\AbstractDependencyInjectionTest;
use OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\AbstractDependencyInjectionTestCase;
use OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Exceptions\EventFactoryIsNotDefinedException;
use OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Exceptions\EventIsNotDefinedException;
use OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\UseCaseProxy;

/**
* @author Romain Kuzniak <[email protected]>
*/
class EventOpenClassroomsUseCaseExtensionTest extends AbstractDependencyInjectionTest
class EventOpenClassroomsUseCaseExtensionTest extends AbstractDependencyInjectionTestCase
{
/**
* @test
* @expectedException \OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Exceptions\EventIsNotDefinedException
*/
public function WithEventConfigurationWithoutEvent_EventUseCase_ThrowException()
{
$this->configLoader->load('EventConfiguration.yml');
$this->expectException(EventIsNotDefinedException::class);

$this->configLoader->load('EventConfiguration.php');
$this->container->compile();

$this->container->get('openclassrooms.tests.use_cases.configuration_event_use_case_stub');
}

/**
* @test
* @expectedException \OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Exceptions\EventIsNotDefinedException
* @expectedExceptionMessage EventSender should be defined for use case: OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Fixtures\BusinessRules\UseCases\EventUseCaseStub. Default EventSender: 'event_dispatcher' is not defined.
*/
public function WithDefaultConfigurationWithoutEvent_EventUseCase_ThrowException()
{
$this->configLoader->load('DefaultConfiguration.yml');
$this->expectException(EventIsNotDefinedException::class);
$this->expectExceptionMessage("EventSender should be defined for use case: OpenClassrooms\Bundle\UseCaseBundle\Tests\DependencyInjection\Fixtures\BusinessRules\UseCases\EventUseCaseStub. Default EventSender: 'event_dispatcher' is not defined.");

$this->configLoader->load('DefaultConfiguration.php');
$this->container->compile();

$this->container->get('openclassrooms.tests.use_cases.configuration_event_use_case_stub');
}

/**
* @test
* @expectedException \OpenClassrooms\UseCase\Application\Services\Proxy\UseCases\Exceptions\EventFactoryIsNotDefinedException
*/
public function WithEventFactoryConfigurationWithoutEventFactory_EventUseCase_ThrowException()
{
$this->configLoader->load('EventConfiguration.yml');
$this->expectException(EventFactoryIsNotDefinedException::class);

$this->configLoader->load('EventConfiguration.php');
$this->serviceLoader->load('event_only_services.xml');
$this->container->compile();

Expand All @@ -53,7 +58,7 @@ public function WithEventFactoryConfigurationWithoutEventFactory_EventUseCase_Th
*/
public function WithEventConfiguration_EventUseCase_ReturnUseCaseProxy()
{
$this->configLoader->load('EventConfiguration.yml');
$this->configLoader->load('EventConfiguration.php');
$this->serviceLoader->load('default_services.xml');
$this->container->compile();

Expand All @@ -68,7 +73,7 @@ public function WithEventConfiguration_EventUseCase_ReturnUseCaseProxy()
*/
public function WithDefaultConfiguration_ReturnUseCaseProxy()
{
$this->configLoader->load('DefaultConfiguration.yml');
$this->configLoader->load('DefaultConfiguration.php');
$this->serviceLoader->load('default_services.xml');
$this->container->compile();

Expand All @@ -78,7 +83,7 @@ public function WithDefaultConfiguration_ReturnUseCaseProxy()
$this->assertEventUseCaseProxy($useCaseProxy);
}

protected function setUp()
protected function setUp(): void
{
$this->initContainer();
$this->serviceLoader->load('event_configuration_services.xml');
Expand Down
Loading
Loading