Skip to content

Commit

Permalink
Refactor to use arachne/service-collections and eloquent/phony
Browse files Browse the repository at this point in the history
  • Loading branch information
enumag committed Sep 30, 2016
1 parent b1e9383 commit edfd1aa
Show file tree
Hide file tree
Showing 14 changed files with 543 additions and 487 deletions.
7 changes: 3 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
],
"require": {
"php": "^5.4.0|^7.0.0",
"arachne/di-helpers": "^0.4.0|^0.5.0",
"arachne/event-dispatcher": "^0.1.0",
"arachne/service-collections": "^0.1.0",
"nette/application": "^2.3.0",
"nette/caching": "^2.3.0",
"nette/di": "^2.3.0",
Expand All @@ -27,9 +27,8 @@
"php": "^5.5.0|^7.0.0",
"arachne/codeception": "^0.7.3",
"codeception/codeception": "~2.2.0",
"codeception/mockery-module": "^0.2.2",
"enumag/application": "^0.3.5",
"mockery/mockery": "^0.9.0"
"eloquent/phony": "^0.13.5",
"enumag/application": "^0.3.5"
},
"autoload": {
"psr-4": {
Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Now you need to register the necessary extensions using your [neon](http://ne-on
```
extensions:
- Oops\CacheFactory\DI\CacheFactoryExtension
- Arachne\DIHelpers\DI\ResolversExtension
- Arachne\ServiceCollections\DI\ServiceCollectionsExtension
- Arachne\ContainerAdapter\DI\ContainerAdapterExtension
- Arachne\EventDispatcher\DI\EventDispatcherExtension
- Arachne\EntityLoader\DI\EntityLoaderExtension
Expand Down
62 changes: 41 additions & 21 deletions src/DI/EntityLoaderExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@

namespace Arachne\EntityLoader\DI;

use Arachne\DIHelpers\CompilerExtension;
use Arachne\EventDispatcher\DI\EventDispatcherExtension;
use Arachne\ServiceCollections\DI\ServiceCollectionsExtension;
use Nette\DI\CompilerExtension;
use Nette\Utils\AssertionException;

/**
* @author Jáchym Toušek <[email protected]>
Expand Down Expand Up @@ -43,9 +45,20 @@ public function loadConfiguration()
{
$builder = $this->getContainerBuilder();

$extension = $this->getExtension('Arachne\DIHelpers\DI\ResolversExtension');
$extension->add(self::TAG_FILTER_IN, 'Arachne\EntityLoader\FilterInInterface');
$extension->add(self::TAG_FILTER_OUT, 'Arachne\EntityLoader\FilterOutInterface');
/* @var $serviceCollectionsExtension ServiceCollectionsExtension */
$serviceCollectionsExtension = $this->getExtension('Arachne\ServiceCollections\DI\ServiceCollectionsExtension');

$filterInResolver = $serviceCollectionsExtension->getCollection(
ServiceCollectionsExtension::TYPE_RESOLVER,
self::TAG_FILTER_IN,
'Arachne\EntityLoader\FilterInInterface'
);

$filterOutResolver = $serviceCollectionsExtension->getCollection(
ServiceCollectionsExtension::TYPE_RESOLVER,
self::TAG_FILTER_OUT,
'Arachne\EntityLoader\FilterOutInterface'
);

foreach ($this->filters as $class => $type) {
$builder->addDefinition($this->prefix('filterIn.'.$type))
Expand All @@ -54,10 +67,20 @@ public function loadConfiguration()
}

$builder->addDefinition($this->prefix('entityLoader'))
->setClass('Arachne\EntityLoader\EntityLoader');
->setClass('Arachne\EntityLoader\EntityLoader')
->setArguments(
[
'filterInResolver' => '@'.$filterInResolver,
]
);

$builder->addDefinition($this->prefix('entityUnloader'))
->setClass('Arachne\EntityLoader\EntityUnloader');
->setClass('Arachne\EntityLoader\EntityUnloader')
->setArguments(
[
'filterOutResolver' => '@'.$filterOutResolver,
]
);

$builder->addDefinition($this->prefix('application.parameterFinder'))
->setClass('Arachne\EntityLoader\Application\ParameterFinder');
Expand All @@ -73,24 +96,21 @@ public function loadConfiguration()
->addTag(EventDispatcherExtension::TAG_SUBSCRIBER);
}

public function beforeCompile()
/**
* @param string $class
*
* @return CompilerExtension
*/
private function getExtension($class)
{
$builder = $this->getContainerBuilder();

$extension = $this->getExtension('Arachne\DIHelpers\DI\ResolversExtension');
$extensions = $this->compiler->getExtensions($class);

$builder->getDefinition($this->prefix('entityLoader'))
->setArguments(
[
'filterInResolver' => '@'.$extension->get(self::TAG_FILTER_IN),
]
if (!$extensions) {
throw new AssertionException(
sprintf('Extension "%s" requires "%s" to be installed.', get_class($this), $class)
);
}

$builder->getDefinition($this->prefix('entityUnloader'))
->setArguments(
[
'filterOutResolver' => '@'.$extension->get(self::TAG_FILTER_OUT),
]
);
return reset($extensions);
}
}
7 changes: 3 additions & 4 deletions src/EntityLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

namespace Arachne\EntityLoader;

use Arachne\DIHelpers\ResolverInterface;
use Arachne\EntityLoader\Exception\UnexpectedValueException;

/**
Expand All @@ -19,11 +18,11 @@
class EntityLoader
{
/**
* @var ResolverInterface
* @var callable
*/
private $filterInResolver;

public function __construct(ResolverInterface $filterInResolver)
public function __construct(callable $filterInResolver)
{
$this->filterInResolver = $filterInResolver;
}
Expand Down Expand Up @@ -54,7 +53,7 @@ public function filterIn($type, $parameter)
*/
private function getFilter($type)
{
$filter = $this->filterInResolver->resolve($type);
$filter = call_user_func($this->filterInResolver, $type);
if (!$filter) {
throw new UnexpectedValueException("No filter in found for type '$type'.");
}
Expand Down
7 changes: 3 additions & 4 deletions src/EntityUnloader.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

namespace Arachne\EntityLoader;

use Arachne\DIHelpers\ResolverInterface;
use Arachne\EntityLoader\Exception\UnexpectedValueException;

/**
Expand All @@ -19,11 +18,11 @@
class EntityUnloader
{
/**
* @var ResolverInterface
* @var callable
*/
private $filterOutResolver;

public function __construct(ResolverInterface $filterOutResolver)
public function __construct(callable $filterOutResolver)
{
$this->filterOutResolver = $filterOutResolver;
}
Expand All @@ -47,7 +46,7 @@ public function filterOut($object)
*/
private function getFilter($type)
{
$filter = $this->filterOutResolver->resolve($type);
$filter = call_user_func($this->filterOutResolver, $type);
if (!$filter) {
throw new UnexpectedValueException("No filter out found for type '$type'.");
}
Expand Down
2 changes: 1 addition & 1 deletion tests/functional/config/config.neon
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
extensions:
codeception.http: Arachne\Codeception\DI\HttpExtension
arachne.containeradaper: Arachne\ContainerAdapter\DI\ContainerAdapterExtension
arachne.dihelpers.resolvers: Arachne\DIHelpers\DI\ResolversExtension
arachne.servicecollections: Arachne\ServiceCollections\DI\ServiceCollectionsExtension
arachne.entityloader: Arachne\EntityLoader\DI\EntityLoaderExtension
arachne.eventdispatcher: Arachne\EventDispatcher\DI\EventDispatcherExtension
enumag.application: Enumag\Application\DI\ApplicationExtension
Expand Down
4 changes: 0 additions & 4 deletions tests/unit.suite.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
error_level: "E_ALL"

class_name: UnitSuiteTester

modules:
enabled:
- Mockery
81 changes: 35 additions & 46 deletions tests/unit/src/EntityLoaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,103 +2,92 @@

namespace Tests\Unit;

use Arachne\DIHelpers\ResolverInterface;
use Arachne\EntityLoader\EntityLoader;
use Arachne\EntityLoader\FilterInInterface;
use Codeception\MockeryModule\Test;
use Mockery;
use Mockery\MockInterface;
use Codeception\Test\Unit;
use DateTime;
use Eloquent\Phony\Mock\Handle\InstanceHandle;
use Eloquent\Phony\Phpunit\Phony;
use Eloquent\Phony\Stub\StubVerifier;

/**
* @author Jáchym Toušek <[email protected]>
*/
class EntityLoaderTest extends Test
class EntityLoaderTest extends Unit
{
/**
* @var EntityLoader
*/
private $entityLoader;

/**
* @var MockInterface
* @var InstanceHandle
*/
private $filter;
private $filterHandle;

/**
* @var MockInterface
* @var StubVerifier
*/
private $filterResolver;

protected function _before()
{
$this->filter = Mockery::mock(FilterInInterface::class);
$this->filterResolver = Mockery::mock(ResolverInterface::class);
$this->filterHandle = Phony::mock(FilterInInterface::class);
$this->filterResolver = Phony::stub();
$this->entityLoader = new EntityLoader($this->filterResolver);
}

public function testFilterIn()
{
$this->filterResolver
->shouldReceive('resolve')
->once()
->with('Type1')
->andReturn($this->filter);
->returns($this->filterHandle->get());

$mock1 = Mockery::mock('Type1');
$mock1 = Phony::mock(DateTime::class)->get();

$this->filter
->shouldReceive('filterIn')
->once()
->with(1)
->andReturn($mock1);
$this->filterHandle
->filterIn
->returns($mock1);

$this->assertSame($mock1, $this->entityLoader->filterIn('Type1', 1));
$this->assertSame($mock1, $this->entityLoader->filterIn(DateTime::class, 1));

$this->filterHandle
->filterIn
->calledWith(1);
}

/**
* @expectedException Arachne\EntityLoader\Exception\UnexpectedValueException
* @expectedExceptionMessage FilterIn did not return an instance of 'Type1'.
* @expectedException \Arachne\EntityLoader\Exception\UnexpectedValueException
* @expectedExceptionMessage FilterIn did not return an instance of 'DateTime'.
*/
public function testFilterInFail()
{
$this->filterResolver
->shouldReceive('resolve')
->once()
->with('Type1')
->andReturn($this->filter);

$this->filter
->shouldReceive('filterIn')
->once()
->with(1)
->andReturn(null);

$this->entityLoader->filterIn('Type1', 1);
->returns($this->filterHandle->get());

$this->filterHandle
->filterIn
->returns(null);

$this->entityLoader->filterIn(DateTime::class, 1);
}

public function testFilterInIgnore()
{
// Make sure that the converter is not called at all if the parameter already has the desired type.
$mock1 = Mockery::mock('Type1');
$this->assertSame($mock1, $this->entityLoader->filterIn('Type1', $mock1));
$mock1 = Phony::mock(DateTime::class)->get();
$this->assertSame($mock1, $this->entityLoader->filterIn(DateTime::class, $mock1));
}

/**
* @expectedException Arachne\EntityLoader\Exception\UnexpectedValueException
* @expectedExceptionMessage No filter in found for type 'Type1'.
* @expectedException \Arachne\EntityLoader\Exception\UnexpectedValueException
* @expectedExceptionMessage No filter in found for type 'DateTime'.
*/
public function testFilterNotFound()
{
$parameters = [
'entity' => 'value1',
];

$this->filterResolver
->shouldReceive('resolve')
->once()
->with('Type1')
->andReturn();

$this->entityLoader->filterIn('Type1', $parameters);
$this->entityLoader->filterIn(DateTime::class, $parameters);
}
}
Loading

0 comments on commit edfd1aa

Please sign in to comment.