From 55f260f583d7f27b5c11e0e0afb7058244120d8d Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Fri, 13 Sep 2013 17:35:32 +0200 Subject: [PATCH 01/18] [WIP] add common collaborators maintainer --- phpspec.yml | 2 + .../CommonCollaboratorsMaintainerSpec.php | 21 +++++ .../Symfony2Extension/TestControllerSpec.php | 15 ++++ .../Collaborator/CollaboratorFactorySpec.php | 20 +++++ src/PhpSpec/Symfony2Extension/Extension.php | 22 +++++ .../Collaborator/CollaboratorFactory.php | 30 +++++++ .../CommonCollaboratorsMaintainer.php | 82 +++++++++++++++++++ .../Symfony2Extension/TestController.php | 9 ++ 8 files changed, 201 insertions(+) create mode 100644 phpspec.yml create mode 100644 spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php create mode 100644 spec/PhpSpec/Symfony2Extension/TestControllerSpec.php create mode 100644 src/Php/Symfony2Extension/Spec/Runner/Collaborator/CollaboratorFactorySpec.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/CollaboratorFactory.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php create mode 100644 src/PhpSpec/Symfony2Extension/TestController.php diff --git a/phpspec.yml b/phpspec.yml new file mode 100644 index 0000000..56a990d --- /dev/null +++ b/phpspec.yml @@ -0,0 +1,2 @@ +extensions: + - PhpSpec\Symfony2Extension\Extension diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php new file mode 100644 index 0000000..dbc779b --- /dev/null +++ b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php @@ -0,0 +1,21 @@ +beConstructedWith($unwrapper, $factory, array()); + } + + function it_is_initializable() + { + $this->shouldHaveType('PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer'); + } +} diff --git a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php new file mode 100644 index 0000000..c0817c4 --- /dev/null +++ b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php @@ -0,0 +1,15 @@ +setContainer($container); + $this->generateUrl('homepage')->shouldReturn('test'); + } +} diff --git a/src/Php/Symfony2Extension/Spec/Runner/Collaborator/CollaboratorFactorySpec.php b/src/Php/Symfony2Extension/Spec/Runner/Collaborator/CollaboratorFactorySpec.php new file mode 100644 index 0000000..bb5bb75 --- /dev/null +++ b/src/Php/Symfony2Extension/Spec/Runner/Collaborator/CollaboratorFactorySpec.php @@ -0,0 +1,20 @@ +beConstructedWith($unwrapper); + } + + function it_is_initializable() + { + $this->shouldHaveType('Php\Symfony2Extension\Runner\Collaborator\CollaboratorFactory'); + } +} diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index d5159bc..078e9f8 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -14,6 +14,8 @@ use PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInitializerMaintainer; use PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInjectorMaintainer; use PhpSpec\Symfony2Extension\Specification\Container; +use PhpSpec\Symfony2Extension\Runner\Collaborator\CollaboratorFactory; +use PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer; class Extension implements ExtensionInterface { @@ -45,6 +47,26 @@ function ($c) { return new ContainerInjectorMaintainer(); } ); + + $container->setShared( + 'runner.maintainers.common_collaborators', + function ($c) { + return new CommonCollaboratorsMaintainer( + $c->get('unwrapper'), + $c->get('collaborator_factory'), + array() + ); + } + ); + + $container->setShared( + 'collaborator_factory', + function ($c) { + return new CollaboratorFactory( + $c->get('unwrapper') + ); + } + ); } /** diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/CollaboratorFactory.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/CollaboratorFactory.php new file mode 100644 index 0000000..ec918d5 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/CollaboratorFactory.php @@ -0,0 +1,30 @@ +unwrapper = $unwrapper; + } + + public function create(ObjectProphecy $prophecy, $className = null, array $arguments = array()) + { + $collaborator = new Collaborator($prophecy, $this->unwrapper); + if (null !== $className) { + $collaborator->beADoubleOf($className); + } + if (!empty($arguments)) { + $collaborator->beConstructedWith($arguments); + } + + return $collaborator; + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php new file mode 100644 index 0000000..936fa43 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php @@ -0,0 +1,82 @@ +unwrapper = $unwrapper; + $this->factory = $factory; + $this->commonCollaborators = $commonCollaborators ?: array( + 'router' => 'Symfony\Component\Routing\RouterInterface', + 'session' => 'Symfony\Component\HttpFoundation\Session\Session', + 'request' => 'Symfony\Component\HttpFoundation\Request', + //'securityContext' => 'SecurityContextIterface', + ); + + $this->commonServices = $commonServices ?: array( + 'router' => 'router', + 'session' => 'session', + 'request' => 'request', + //'securityContext' => 'security.context', + ); + } + + public function supports(ExampleNode $example) + { + $specClassName = $example->getSpecification()->getClassReflection()->getName(); + + return in_array('PhpSpec\Symfony2Extension\Specification\ControllerBehavior', class_parents($specClassName)); + } + + public function prepare(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators) + { + $this->prophet = new Prophet(null, $this->unwrapper, null); + + if (!$collaborators->has('container')) { + $container = $this->factory->create( + $this->prophet->prophesize(), + 'Symfony\Component\DependencyInjection\ContainerInterface' + ); + $collaborators->set('container', $container); + } + + foreach ($this->commonCollaborators as $name => $className) { + if (!$collaborators->has($name)) { + $collaborator = $this->factory->create($this->prophet->prophesize(), $className); + $collaborators->set($name, $collaborator); + + if ($collaborators->has('container')) { + $collaborators->get('container')->get($this->commonServices[$name])->willReturn($collaborator); + } + } + } + } + + public function teardown(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators) + { + $this->prophet->checkPredictions(); + } + + public function getPriority() + { + return 60; // more than CollaboratorsMaintainer :/ + } +} diff --git a/src/PhpSpec/Symfony2Extension/TestController.php b/src/PhpSpec/Symfony2Extension/TestController.php new file mode 100644 index 0000000..87168da --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/TestController.php @@ -0,0 +1,9 @@ + Date: Fri, 13 Sep 2013 21:15:24 +0200 Subject: [PATCH 02/18] refactor specs --- .../Symfony2Extension/Runner}/CollaboratorFactorySpec.php | 4 ++-- .../Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php | 2 +- spec/PhpSpec/Symfony2Extension/TestControllerSpec.php | 3 ++- src/PhpSpec/Symfony2Extension/Extension.php | 2 +- .../Runner/{Collaborator => }/CollaboratorFactory.php | 2 +- .../Runner/Maintainer/CommonCollaboratorsMaintainer.php | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) rename {src/Php/Symfony2Extension/Spec/Runner/Collaborator => spec/PhpSpec/Symfony2Extension/Runner}/CollaboratorFactorySpec.php (65%) rename src/PhpSpec/Symfony2Extension/Runner/{Collaborator => }/CollaboratorFactory.php (92%) diff --git a/src/Php/Symfony2Extension/Spec/Runner/Collaborator/CollaboratorFactorySpec.php b/spec/PhpSpec/Symfony2Extension/Runner/CollaboratorFactorySpec.php similarity index 65% rename from src/Php/Symfony2Extension/Spec/Runner/Collaborator/CollaboratorFactorySpec.php rename to spec/PhpSpec/Symfony2Extension/Runner/CollaboratorFactorySpec.php index bb5bb75..525ffeb 100644 --- a/src/Php/Symfony2Extension/Spec/Runner/Collaborator/CollaboratorFactorySpec.php +++ b/spec/PhpSpec/Symfony2Extension/Runner/CollaboratorFactorySpec.php @@ -1,6 +1,6 @@ shouldHaveType('Php\Symfony2Extension\Runner\Collaborator\CollaboratorFactory'); + $this->shouldHaveType('PhpSpec\Symfony2Extension\Runner\CollaboratorFactory'); } } diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php index dbc779b..461a181 100644 --- a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php @@ -5,7 +5,7 @@ use PhpSpec\ObjectBehavior; use Prophecy\Argument; use PhpSpec\Wrapper\Unwrapper; -use PhpSpec\Symfony2Extension\Runner\Collaborator\CollaboratorFactory; +use PhpSpec\Symfony2Extension\Runner\CollaboratorFactory; class CommonCollaboratorsMaintainerSpec extends ObjectBehavior { diff --git a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php index c0817c4..08d86d8 100644 --- a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php @@ -10,6 +10,7 @@ class TestControllerSpec extends ControllerBehavior public function it_generates_url($container, $router) { $this->setContainer($container); - $this->generateUrl('homepage')->shouldReturn('test'); + $router->generate('homepage', array(), false)->willReturn('/'); + $this->generateUrl('homepage')->shouldReturn('/'); } } diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index 078e9f8..727a813 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -14,7 +14,7 @@ use PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInitializerMaintainer; use PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInjectorMaintainer; use PhpSpec\Symfony2Extension\Specification\Container; -use PhpSpec\Symfony2Extension\Runner\Collaborator\CollaboratorFactory; +use PhpSpec\Symfony2Extension\Runner\CollaboratorFactory; use PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer; class Extension implements ExtensionInterface diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/CollaboratorFactory.php b/src/PhpSpec/Symfony2Extension/Runner/CollaboratorFactory.php similarity index 92% rename from src/PhpSpec/Symfony2Extension/Runner/Collaborator/CollaboratorFactory.php rename to src/PhpSpec/Symfony2Extension/Runner/CollaboratorFactory.php index ec918d5..0ad81a7 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/CollaboratorFactory.php +++ b/src/PhpSpec/Symfony2Extension/Runner/CollaboratorFactory.php @@ -1,6 +1,6 @@ Date: Fri, 13 Sep 2013 23:07:46 +0200 Subject: [PATCH 03/18] describe feature --- features/bootstrap/PhpSpecContext.php | 17 +++++-- .../provide_default_collaborators.feature | 46 +++++++++++++++++++ 2 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 features/provide_default_collaborators.feature diff --git a/features/bootstrap/PhpSpecContext.php b/features/bootstrap/PhpSpecContext.php index 9b1e43d..54aca0d 100644 --- a/features/bootstrap/PhpSpecContext.php +++ b/features/bootstrap/PhpSpecContext.php @@ -22,7 +22,7 @@ public function createWorkDir() // paths between scenarios. $this->workDir = sys_get_temp_dir().'/PhpSpecSymfony2Extension/'; - mkdir($this->workDir, 0777, true); + @mkdir($this->workDir, 0777, true); chdir($this->workDir); } @@ -39,12 +39,19 @@ public function removeWorkDir() */ public function theSymfonyExtendsionIsEnabled() { - $phpspecyml = <<workDir.'phpspec.yml', $yml); + } - file_put_contents($this->workDir.'phpspec.yml', $phpspecyml); + /** + * @Given /^(?:|the )Symfony extension is enabled with:$/ + */ + public function theSymfonyExtendsionIsEnabledWith(PyStringNode $yml = null) + { + file_put_contents($this->workDir.'phpspec.yml', $yml); } /** @@ -83,7 +90,7 @@ public function iDescribeThe($class) */ public function iWroteSpecInThe($file, PyStringNode $string) { - mkdir(dirname($file), 0777, true); + @mkdir(dirname($file), 0777, true); file_put_contents($file, $string->getRaw()); diff --git a/features/provide_default_collaborators.feature b/features/provide_default_collaborators.feature new file mode 100644 index 0000000..1e3c5bc --- /dev/null +++ b/features/provide_default_collaborators.feature @@ -0,0 +1,46 @@ +Feature: Provide default collaborators + As a Developer + I want to avoid configuring framework mocks every time by hand + In order to have a working preconfigured set of mocks + + Background: + Given the Symfony extension is enabled with: + """ + extensions: + PhpSpec\Symfony2Extension\Extension: + router: Symfony\Component\Routing\RouterInterface + """ + + Scenario: Controller has access to common collaborator + Given I wrote a spec in the "src/CommonCollaborator/Spec/Controller.php": + """ + generateUrl('homepage')->shouldHaveType('string'); + } + } + + """ + And I wrote a class in the "src/CommonCollaborator/Controller.php": + """ + Date: Fri, 13 Sep 2013 23:08:05 +0200 Subject: [PATCH 04/18] refactor extension to allow params --- phpspec.yml | 7 +++++- src/PhpSpec/Symfony2Extension/Extension.php | 7 ++++-- .../CommonCollaboratorsMaintainer.php | 25 +++++++++++-------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/phpspec.yml b/phpspec.yml index 56a990d..e1a8918 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -1,2 +1,7 @@ extensions: - - PhpSpec\Symfony2Extension\Extension + PhpSpec\Symfony2Extension\Extension: + common-collaborators: + # append: false # should we support append ? (ie: provide defaults) + router: Symfony\Component\Routing\RouterInterface + request: Symfony\Component\HttpFoundation\Request + #formFactory: { form.factory: FormFactoryInterface } diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index 727a813..162b0e1 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -22,8 +22,11 @@ class Extension implements ExtensionInterface /** * @param ServiceContainer $container */ - public function load(ServiceContainer $container) + public function load(ServiceContainer $container, array $params = array()) { + foreach ($params as $key => $value) { + $container->setParam('symfony2_extension.'.$key, $value); + } $this->registerConfigurators($container); $this->registerRunnerMaintainers($container); $this->registerCodeGenerators($container); @@ -54,7 +57,7 @@ function ($c) { return new CommonCollaboratorsMaintainer( $c->get('unwrapper'), $c->get('collaborator_factory'), - array() + $c->getParam('symfony2_extension.common-collaborators', array()) ); } ); diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php index 45c240e..f5ed8a8 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php @@ -24,19 +24,14 @@ public function __construct(Unwrapper $unwrapper, CollaboratorFactory $factory, // @TODO avoid indirect deps ? $this->unwrapper = $unwrapper; $this->factory = $factory; + + // @TODO should we ? or via extension config ? $this->commonCollaborators = $commonCollaborators ?: array( 'router' => 'Symfony\Component\Routing\RouterInterface', 'session' => 'Symfony\Component\HttpFoundation\Session\Session', 'request' => 'Symfony\Component\HttpFoundation\Request', //'securityContext' => 'SecurityContextIterface', ); - - $this->commonServices = $commonServices ?: array( - 'router' => 'router', - 'session' => 'session', - 'request' => 'request', - //'securityContext' => 'security.context', - ); } public function supports(ExampleNode $example) @@ -58,13 +53,14 @@ public function prepare(ExampleNode $example, SpecificationInterface $context, M $collaborators->set('container', $container); } - foreach ($this->commonCollaborators as $name => $className) { + foreach ($this->commonCollaborators as $name => $service) { + list($id, $class) = $this->extractCollaboratorConfig($name, $service); if (!$collaborators->has($name)) { - $collaborator = $this->factory->create($this->prophet->prophesize(), $className); + $collaborator = $this->factory->create($this->prophet->prophesize(), $class); $collaborators->set($name, $collaborator); if ($collaborators->has('container')) { - $collaborators->get('container')->get($this->commonServices[$name])->willReturn($collaborator); + $collaborators->get('container')->get($id)->willReturn($collaborator); } } } @@ -79,4 +75,13 @@ public function getPriority() { return 60; // more than CollaboratorsMaintainer :/ } + + private function extractCollaboratorConfig($name, $config) + { + if (is_array($config)) { + return each($config); + } + + return array($name, $config); + } } From 11feb78854af9218b7fff4d9d4c9d3b16e680464 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Sat, 14 Sep 2013 01:36:38 +0200 Subject: [PATCH 05/18] remove superseeded maintainers --- features/describing_a_controller.feature | 29 ++++---- .../provide_default_collaborators.feature | 7 +- .../Symfony2Extension/ExtensionSpec.php | 16 +++-- .../ContainerInitializerMaintainerSpec.php | 68 ------------------- .../ContainerInjectorMaintainerSpec.php | 44 ------------ .../Specification/ContainerSpec.php | 47 ------------- .../Specification/ControllerBehaviorSpec.php | 42 ------------ .../Symfony2Extension/TestControllerSpec.php | 4 +- .../ControllerSpecificationGenerator.php | 4 +- src/PhpSpec/Symfony2Extension/Extension.php | 17 ----- .../CommonCollaboratorsMaintainer.php | 10 ++- .../ContainerInitializerMaintainer.php | 34 ---------- .../ContainerInjectorMaintainer.php | 32 --------- .../Runner/Maintainer/ContainerMaintainer.php | 35 ---------- .../Specification/Container.php | 26 ------- .../Specification/ControllerBehavior.php | 25 ------- 16 files changed, 43 insertions(+), 397 deletions(-) delete mode 100644 spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainerSpec.php delete mode 100644 spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainerSpec.php delete mode 100644 spec/PhpSpec/Symfony2Extension/Specification/ContainerSpec.php delete mode 100644 spec/PhpSpec/Symfony2Extension/Specification/ControllerBehaviorSpec.php delete mode 100644 src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainer.php delete mode 100644 src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainer.php delete mode 100644 src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerMaintainer.php delete mode 100644 src/PhpSpec/Symfony2Extension/Specification/Container.php delete mode 100644 src/PhpSpec/Symfony2Extension/Specification/ControllerBehavior.php diff --git a/features/describing_a_controller.feature b/features/describing_a_controller.feature index 46e9373..e329e29 100644 --- a/features/describing_a_controller.feature +++ b/features/describing_a_controller.feature @@ -14,10 +14,10 @@ Feature: Describing a controller namespace Scenario1\Bundle\DemoBundle\Spec\Controller; - use PhpSpec\Symfony2Extension\Specification\ControllerBehavior; + use PhpSpec\ObjectBehavior; use Prophecy\Argument; - class UserControllerSpec extends ControllerBehavior + class UserControllerSpec extends ObjectBehavior { function it_is_container_aware() { @@ -52,13 +52,14 @@ Feature: Describing a controller namespace Scenario5\Bundle\DemoBundle\Spec\Controller; - use PhpSpec\Symfony2Extension\Specification\ControllerBehavior; + use PhpSpec\ObjectBehavior; use Prophecy\Argument; - class UserControllerSpec extends ControllerBehavior + class UserControllerSpec extends ObjectBehavior { - function it_should_respond_to_the_list_action_call() + function it_should_respond_to_the_list_action_call($container) { + $this->setContainer($container); $response = $this->listAction(); $response->shouldHaveType('Symfony\Component\HttpFoundation\Response'); $response->getStatusCode()->shouldBe(200); @@ -94,15 +95,16 @@ Feature: Describing a controller namespace Scenario6\Bundle\DemoBundle\Spec\Controller; - use PhpSpec\Symfony2Extension\Specification\ControllerBehavior; + use PhpSpec\ObjectBehavior; use Prophecy\Argument; use Symfony\Component\Routing\Router; - class UserControllerSpec extends ControllerBehavior + class UserControllerSpec extends ObjectBehavior { - function it_should_redirect_to_the_homepage(Router $router) + function it_should_redirect_to_the_homepage(Router $router, $container) { - $this->container->set('router', $router); + $this->setContainer($container); + $container->set('router', $router); $router->generate('homepage')->willReturn('/'); @@ -144,15 +146,16 @@ Feature: Describing a controller namespace Scenario7\Bundle\DemoBundle\Spec\Controller; - use PhpSpec\Symfony2Extension\Specification\ControllerBehavior; + use PhpSpec\ObjectBehavior; use Prophecy\Argument; use Symfony\Component\Templating\EngineInterface; - class UserControllerSpec extends ControllerBehavior + class UserControllerSpec extends ObjectBehavior { - function it_should_render_list_of_users(EngineInterface $templating) + function it_should_render_list_of_users(EngineInterface $templating, $container) { - $this->container->set('templating', $templating); + $this->setContainer($container); + $container->set('templating', $templating); $this->shouldRender('Scenario7UserBundle:User:list.html.twig', array('users' => array())) ->duringAction('list'); diff --git a/features/provide_default_collaborators.feature b/features/provide_default_collaborators.feature index 1e3c5bc..2476059 100644 --- a/features/provide_default_collaborators.feature +++ b/features/provide_default_collaborators.feature @@ -18,12 +18,13 @@ Feature: Provide default collaborators namespace CommonCollaborator\Spec; - use PhpSpec\Symfony2Extension\Specification\ControllerBehavior; + use PhpSpec\ObjectBehavior; - class Controller extends ControllerBehavior + class Controller extends ObjectBehavior { - function it_has_access_to_router($router) // magic! + function it_has_access_to_router($container, $router) // magic! { + $this->setContainer($container); $this->generateUrl('homepage')->shouldHaveType('string'); } } diff --git a/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php b/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php index 8638195..f3652b9 100644 --- a/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php +++ b/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php @@ -7,6 +7,8 @@ use PhpSpec\ObjectBehavior; use PhpSpec\ServiceContainer; use Prophecy\Argument; +use PhpSpec\Wrapper\Unwrapper; +use PhpSpec\Symfony2Extension\Runner\CollaboratorFactory; class ExtensionSpec extends ObjectBehavior { @@ -45,18 +47,22 @@ function it_registers_a_custom_locator_with_configuration(ServiceContainer $cont $configurator($container->getWrappedObject()); } - function it_registers_runner_maintainers_for_the_container(ServiceContainer $container) + function it_registers_runner_maintainers_for_the_container(ServiceContainer $container, Unwrapper $unwrapper, CollaboratorFactory $factory) { $container->setShared( - 'runner.maintainers.container_initializer', - $this->service('PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInitializerMaintainer', $container) + 'runner.maintainers.common_collaborators', + $this->service('PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer', $container) )->shouldBeCalled(); $container->setShared( - 'runner.maintainers.container_injector', - $this->service('PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInjectorMaintainer', $container) + 'collaborator_factory', + $this->service('PhpSpec\Symfony2Extension\Runner\CollaboratorFactory', $container) )->shouldBeCalled(); + $container->getParam('symfony2_extension.common-collaborators', array())->willReturn(array()); + $container->get('collaborator_factory')->willReturn($factory); + $container->get('unwrapper')->willReturn($unwrapper); + $this->load($container); } diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainerSpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainerSpec.php deleted file mode 100644 index 8a55f1c..0000000 --- a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainerSpec.php +++ /dev/null @@ -1,68 +0,0 @@ -getSpecification()->willReturn($specification); - $specification->getClassReflection()->willReturn($classReflection); - } - - function it_is_a_maintainer() - { - $this->shouldHaveType('PhpSpec\Runner\Maintainer\MaintainerInterface'); - } - - function it_is_a_container_maintainer() - { - $this->shouldHaveType('PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerMaintainer'); - } - - function it_has_an_increased_priority() - { - $this->getPriority()->shouldReturn(15); - } - - function it_supports_controller_behavior(ExampleNode $example, \ReflectionClass $classReflection) - { - $classReflection->getName()->willReturn('spec\PhpSpec\Symfony2Extension\Runner\Maintainer\UserControllerSpec'); - - $this->supports($example)->shouldReturn(true); - } - - function it_does_not_support_other_behaviors(ExampleNode $example, \ReflectionClass $classReflection) - { - $classReflection->getName()->willReturn('spec\PhpSpec\Symfony2Extension\Runner\Maintainer\UserSpec'); - - $this->supports($example)->shouldReturn(false); - } - - function it_creates_the_container(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators, \ReflectionClass $classReflection, \ReflectionProperty $property) - { - $classReflection->getProperty('container')->willReturn($property); - - $property->setAccessible(true)->shouldBeCalled(); - $property->setValue($context, Argument::type('PhpSpec\\Symfony2Extension\\Specification\\Container'))->shouldBeCalled(); - - $this->prepare($example, $context, $matchers, $collaborators); - } -} diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainerSpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainerSpec.php deleted file mode 100644 index 5c1f78f..0000000 --- a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainerSpec.php +++ /dev/null @@ -1,44 +0,0 @@ -getSpecification()->willReturn($specification); - $specification->getClassReflection()->willReturn($classReflection); - } - - function it_is_a_container_maintainer() - { - $this->shouldHaveType('PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerMaintainer'); - } - - function it_injects_the_container_into_the_subject(ExampleNode $example, ControllerBehavior $context, MatcherManager $matchers, CollaboratorManager $collaborators, \ReflectionClass $classReflection, \ReflectionProperty $property, Container $container) - { - $classReflection->getProperty('container')->willReturn($property); - - $property->setAccessible(true)->shouldBeCalled(); - $property->getValue($context->getWrappedObject())->shouldBeCalled()->willReturn($container); - - // PhpSpec cannot handle this properly. To verify as much as we can, the line above has a shouldBeCalled() call. - // $context->setContainer($container)->shouldBeCalled(); - - $this->prepare($example, $context, $matchers, $collaborators); - } - - function it_has_a_decreased_priority() - { - $this->getPriority()->shouldReturn(5); - } -} diff --git a/spec/PhpSpec/Symfony2Extension/Specification/ContainerSpec.php b/spec/PhpSpec/Symfony2Extension/Specification/ContainerSpec.php deleted file mode 100644 index 7a1d339..0000000 --- a/spec/PhpSpec/Symfony2Extension/Specification/ContainerSpec.php +++ /dev/null @@ -1,47 +0,0 @@ -wrappedObject = $wrappedObject; - } - - public function getWrappedObject() - { - return $this->wrappedObject; - } -} - -class ContainerSpec extends ObjectBehavior -{ - function it_is_a_symfony_container() - { - $this->shouldHaveType('Symfony\Component\DependencyInjection\Container'); - } - - function it_unwraps_a_service_if_wrapped(\stdClass $service) - { - $this->set('my_service', new Collaborator($service)); - - $this->get('my_service')->shouldBe($service); - } - - function it_returns_a_service_if_not_wrapped(\stdClass $service) - { - $this->set('my_service', $service); - - $this->get('my_service')->shouldBe($service); - } -} diff --git a/spec/PhpSpec/Symfony2Extension/Specification/ControllerBehaviorSpec.php b/spec/PhpSpec/Symfony2Extension/Specification/ControllerBehaviorSpec.php deleted file mode 100644 index 0acb805..0000000 --- a/spec/PhpSpec/Symfony2Extension/Specification/ControllerBehaviorSpec.php +++ /dev/null @@ -1,42 +0,0 @@ -container; - } -} - -class ContainerAwareSubject extends Subject -{ - public function setContainer($container) - { - } -} - -class ControllerBehaviorSpec extends ObjectBehavior -{ - function it_is_an_object_behavior() - { - $this->shouldHaveType('PhpSpec\ObjectBehavior'); - } - - function it_provides_an_internal_reference_to_the_container(ContainerAwareSubject $subject, \stdClass $container) - { - $this->beAnInstanceOf('spec\\PhpSpec\\Symfony2Extension\\Specification\\AccessibleControllerBehavior'); - $this->getWrappedObject()->setSpecificationSubject($subject->getWrappedObject()); - - $subject->setContainer($container)->shouldBeCalled(); - - $this->setContainer($container); - - $this->getContainer()->shouldBe($container); - } -} diff --git a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php index 08d86d8..ea3e012 100644 --- a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php @@ -2,10 +2,10 @@ namespace spec\PhpSpec\Symfony2Extension; -use PhpSpec\Symfony2Extension\Specification\ControllerBehavior; +use PhpSpec\ObjectBehavior; use Prophecy\Argument; -class TestControllerSpec extends ControllerBehavior +class TestControllerSpec extends ObjectBehavior { public function it_generates_url($container, $router) { diff --git a/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php b/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php index 1e06c1f..bc8d512 100644 --- a/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php +++ b/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php @@ -40,10 +40,10 @@ protected function getTemplate() namespace %namespace%; -use PhpSpec\Symfony2Extension\Specification\ControllerBehavior; +use PhpSpec\ObjectBehavior use Prophecy\Argument; -class %name% extends ControllerBehavior +class %name% extends ObjectBehavior { function it_is_container_aware() { diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index 162b0e1..891de42 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -11,9 +11,6 @@ use PhpSpec\Symfony2Extension\CodeGenerator\ControllerClassGenerator; use PhpSpec\Symfony2Extension\CodeGenerator\ControllerSpecificationGenerator; use PhpSpec\Symfony2Extension\Locator\PSR0Locator; -use PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInitializerMaintainer; -use PhpSpec\Symfony2Extension\Runner\Maintainer\ContainerInjectorMaintainer; -use PhpSpec\Symfony2Extension\Specification\Container; use PhpSpec\Symfony2Extension\Runner\CollaboratorFactory; use PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer; @@ -37,20 +34,6 @@ public function load(ServiceContainer $container, array $params = array()) */ private function registerRunnerMaintainers(ServiceContainer $container) { - $container->setShared( - 'runner.maintainers.container_initializer', - function ($c) { - return new ContainerInitializerMaintainer(); - } - ); - - $container->setShared( - 'runner.maintainers.container_injector', - function ($c) { - return new ContainerInjectorMaintainer(); - } - ); - $container->setShared( 'runner.maintainers.common_collaborators', function ($c) { diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php index f5ed8a8..3215e77 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php @@ -36,9 +36,15 @@ public function __construct(Unwrapper $unwrapper, CollaboratorFactory $factory, public function supports(ExampleNode $example) { - $specClassName = $example->getSpecification()->getClassReflection()->getName(); + $class = $example->getSpecification()->getResource()->getSrcClassname(); + try { + $srcRefl = new \ReflectionClass($class); - return in_array('PhpSpec\Symfony2Extension\Specification\ControllerBehavior', class_parents($specClassName)); + return $srcRefl->implementsInterface('Symfony\Component\DependencyInjection\ContainerAwareInterface'); + } + catch(\Exception $e) { + return false; + } } public function prepare(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators) diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainer.php deleted file mode 100644 index 2c276dc..0000000 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInitializerMaintainer.php +++ /dev/null @@ -1,34 +0,0 @@ -getSpecification()->getClassReflection()->getProperty('container'); - $containerProperty->setAccessible(true); - $containerProperty->setValue($context, new Container()); - } - - /** - * @return integer - */ - public function getPriority() - { - return 15; - } -} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainer.php deleted file mode 100644 index 98aa403..0000000 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerInjectorMaintainer.php +++ /dev/null @@ -1,32 +0,0 @@ -getSpecification()->getClassReflection()->getProperty('container'); - $containerProperty->setAccessible(true); - $context->setContainer($containerProperty->getValue($context)); - } - - /** - * @return integer - */ - public function getPriority() - { - return 5; - } -} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerMaintainer.php deleted file mode 100644 index 2056a74..0000000 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/ContainerMaintainer.php +++ /dev/null @@ -1,35 +0,0 @@ -getSpecification()->getClassReflection()->getName(); - - return in_array('PhpSpec\\Symfony2Extension\\Specification\\ControllerBehavior', class_parents($specClassName)); - } - - /** - * @param ExampleNode $example - * @param SpecificationInterface $context - * @param MatcherManager $matchers - * @param CollaboratorManager $collaborators - */ - public function teardown(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators) - { - } -} \ No newline at end of file diff --git a/src/PhpSpec/Symfony2Extension/Specification/Container.php b/src/PhpSpec/Symfony2Extension/Specification/Container.php deleted file mode 100644 index 3245a92..0000000 --- a/src/PhpSpec/Symfony2Extension/Specification/Container.php +++ /dev/null @@ -1,26 +0,0 @@ -getWrappedObject(); - } - - return $service; - } -} diff --git a/src/PhpSpec/Symfony2Extension/Specification/ControllerBehavior.php b/src/PhpSpec/Symfony2Extension/Specification/ControllerBehavior.php deleted file mode 100644 index dd7a34f..0000000 --- a/src/PhpSpec/Symfony2Extension/Specification/ControllerBehavior.php +++ /dev/null @@ -1,25 +0,0 @@ -container = $container; - - $this->object->setContainer($container); - } -} From 05ebcd7601111a644503cb16a0af4d559bf46700 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Sat, 14 Sep 2013 16:02:54 +0200 Subject: [PATCH 06/18] do not use extension config yet --- features/bootstrap/PhpSpecContext.php | 2 +- features/provide_default_collaborators.feature | 6 ++++-- phpspec.yml | 13 +++++++------ src/PhpSpec/Symfony2Extension/Extension.php | 8 ++++---- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/features/bootstrap/PhpSpecContext.php b/features/bootstrap/PhpSpecContext.php index 54aca0d..be6281a 100644 --- a/features/bootstrap/PhpSpecContext.php +++ b/features/bootstrap/PhpSpecContext.php @@ -41,7 +41,7 @@ public function theSymfonyExtendsionIsEnabled() { $yml = <<workDir.'phpspec.yml', $yml); } diff --git a/features/provide_default_collaborators.feature b/features/provide_default_collaborators.feature index 2476059..ed027bc 100644 --- a/features/provide_default_collaborators.feature +++ b/features/provide_default_collaborators.feature @@ -7,8 +7,10 @@ Feature: Provide default collaborators Given the Symfony extension is enabled with: """ extensions: - PhpSpec\Symfony2Extension\Extension: - router: Symfony\Component\Routing\RouterInterface + - PhpSpec\Symfony2Extension\Extension + + symfony2_extension.common-collaborators: + router: Symfony\Component\Routing\RouterInterface """ Scenario: Controller has access to common collaborator diff --git a/phpspec.yml b/phpspec.yml index e1a8918..9961384 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -1,7 +1,8 @@ extensions: - PhpSpec\Symfony2Extension\Extension: - common-collaborators: - # append: false # should we support append ? (ie: provide defaults) - router: Symfony\Component\Routing\RouterInterface - request: Symfony\Component\HttpFoundation\Request - #formFactory: { form.factory: FormFactoryInterface } + - PhpSpec\Symfony2Extension\Extension + +symfony2_extension.common-collaborators: + # append: false # should we support append ? (ie: provide defaults) + router: Symfony\Component\Routing\RouterInterface + request: Symfony\Component\HttpFoundation\Request + #formFactory: { form.factory: FormFactoryInterface } diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index 891de42..6641d59 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -19,11 +19,11 @@ class Extension implements ExtensionInterface /** * @param ServiceContainer $container */ - public function load(ServiceContainer $container, array $params = array()) + public function load(ServiceContainer $container) //, array $params = array()) { - foreach ($params as $key => $value) { - $container->setParam('symfony2_extension.'.$key, $value); - } + //foreach ($params as $key => $value) { + // $container->setParam('symfony2_extension.'.$key, $value); + //} $this->registerConfigurators($container); $this->registerRunnerMaintainers($container); $this->registerCodeGenerators($container); From 36b9c2829379c985f65c78db182e20adf08a3221 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Sat, 14 Sep 2013 16:03:46 +0200 Subject: [PATCH 07/18] fix typo --- .../CodeGenerator/ControllerSpecificationGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php b/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php index bc8d512..d3d9601 100644 --- a/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php +++ b/src/PhpSpec/Symfony2Extension/CodeGenerator/ControllerSpecificationGenerator.php @@ -40,7 +40,7 @@ protected function getTemplate() namespace %namespace%; -use PhpSpec\ObjectBehavior +use PhpSpec\ObjectBehavior; use Prophecy\Argument; class %name% extends ObjectBehavior From 0e97ad443a7c360c6882b945111c691a376780e1 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Sat, 14 Sep 2013 16:14:12 +0200 Subject: [PATCH 08/18] fix scenario about common collaborators --- .../provide_default_collaborators.feature | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/features/provide_default_collaborators.feature b/features/provide_default_collaborators.feature index ed027bc..fff2333 100644 --- a/features/provide_default_collaborators.feature +++ b/features/provide_default_collaborators.feature @@ -13,34 +13,35 @@ Feature: Provide default collaborators router: Symfony\Component\Routing\RouterInterface """ - Scenario: Controller has access to common collaborator - Given I wrote a spec in the "src/CommonCollaborator/Spec/Controller.php": + Scenario: Controller spec has access to common collaborators + Given I wrote a spec in the "src/Scenario7/Bundle/DemoBundle/Spec/Controller/UserControllerSpec.php": """ setContainer($container); - $this->generateUrl('homepage')->shouldHaveType('string'); + $this->generateUrl('homepage'); } } """ - And I wrote a class in the "src/CommonCollaborator/Controller.php": + And I wrote a class in the "src/Scenario7/Bundle/DemoBundle/Controller/UserController.php": """ Date: Mon, 16 Sep 2013 09:25:06 +0200 Subject: [PATCH 09/18] introduce collaborator initializers --- features/describing_a_controller.feature | 2 +- .../initialize_default_collaborators.feature | 51 +++++++++++++++++++ .../provide_default_collaborators.feature | 2 +- phpspec.yml | 4 +- .../Symfony2Extension/ExtensionSpec.php | 16 ++++-- .../Collaborator/DefaultFactorySpec.php | 26 ++++++++++ .../Collaborator/InitializerFactorySpec.php | 37 ++++++++++++++ .../Runner/CollaboratorFactorySpec.php | 20 -------- .../CommonCollaboratorsMaintainerSpec.php | 4 +- .../Symfony2Extension/TestControllerSpec.php | 6 +-- src/PhpSpec/Symfony2Extension/Extension.php | 32 ++++++++---- .../DefaultFactory.php} | 6 +-- .../Runner/Collaborator/FactoryInterface.php | 10 ++++ .../Collaborator/Initializer/Doctrine.php | 30 +++++++++++ .../Collaborator/Initializer/Request.php | 30 +++++++++++ .../Collaborator/Initializer/Router.php | 30 +++++++++++ .../Collaborator/Initializer/Templating.php | 30 +++++++++++ .../Collaborator/InitializerFactory.php | 36 +++++++++++++ .../Collaborator/InitializerInterface.php | 20 ++++++++ .../CommonCollaboratorsMaintainer.php | 14 +++-- 20 files changed, 354 insertions(+), 52 deletions(-) create mode 100644 features/initialize_default_collaborators.feature create mode 100644 spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php create mode 100644 spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php delete mode 100644 spec/PhpSpec/Symfony2Extension/Runner/CollaboratorFactorySpec.php rename src/PhpSpec/Symfony2Extension/Runner/{CollaboratorFactory.php => Collaborator/DefaultFactory.php} (72%) create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php diff --git a/features/describing_a_controller.feature b/features/describing_a_controller.feature index e329e29..4ed5786 100644 --- a/features/describing_a_controller.feature +++ b/features/describing_a_controller.feature @@ -101,7 +101,7 @@ Feature: Describing a controller class UserControllerSpec extends ObjectBehavior { - function it_should_redirect_to_the_homepage(Router $router, $container) + function it_should_redirect_to_the_homepage($router, $container) { $this->setContainer($container); $container->set('router', $router); diff --git a/features/initialize_default_collaborators.feature b/features/initialize_default_collaborators.feature new file mode 100644 index 0000000..c61e80f --- /dev/null +++ b/features/initialize_default_collaborators.feature @@ -0,0 +1,51 @@ +Feature: Initialize default collaborators + As a Developer + I want default collaborators to be preconfigured + In order to avoid complex let methods + + Background: + Given the Symfony extension is enabled with: + """ + extensions: + - PhpSpec\Symfony2Extension\Extension + + symfony2_extension.common-collaborators: + router: ~ + request: ~ + """ + + Scenario: Controller spec has access to common collaborators + Given I wrote a spec in the "src/Scenario8/Bundle/DemoBundle/Spec/Controller/UserControllerSpec.php": + """ + setContainer($container); + $this->generateUrl('homepage')->shouldReturn('homepage'); // preconfigured router! + } + } + + """ + And I wrote a class in the "src/Scenario8/Bundle/DemoBundle/Controller/UserController.php": + """ + setContainer($container); - $this->generateUrl('homepage'); + $this->generateUrl('homepage')->shouldReturn('homepage'); } } diff --git a/phpspec.yml b/phpspec.yml index 9961384..52f0617 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -3,6 +3,6 @@ extensions: symfony2_extension.common-collaborators: # append: false # should we support append ? (ie: provide defaults) - router: Symfony\Component\Routing\RouterInterface - request: Symfony\Component\HttpFoundation\Request + router: ~ + request: ~ #formFactory: { form.factory: FormFactoryInterface } diff --git a/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php b/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php index f3652b9..0e927dd 100644 --- a/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php +++ b/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php @@ -8,7 +8,7 @@ use PhpSpec\ServiceContainer; use Prophecy\Argument; use PhpSpec\Wrapper\Unwrapper; -use PhpSpec\Symfony2Extension\Runner\CollaboratorFactory; +use PhpSpec\Symfony2Extension\Runner\Collaborator\FactoryInterface; class ExtensionSpec extends ObjectBehavior { @@ -18,6 +18,9 @@ function let(ServiceContainer $container) { $container->setShared(Argument::cetera())->willReturn(); $container->addConfigurator(Argument::any())->willReturn(); + $container->getByPrefix(Argument::any())->willReturn(array()); + $container->setParam(Argument::cetera())->willReturn(); + $container->getParam(Argument::cetera())->willReturn(); } function it_is_a_phpspec_extension() @@ -47,20 +50,27 @@ function it_registers_a_custom_locator_with_configuration(ServiceContainer $cont $configurator($container->getWrappedObject()); } - function it_registers_runner_maintainers_for_the_container(ServiceContainer $container, Unwrapper $unwrapper, CollaboratorFactory $factory) + function it_registers_runner_maintainers_for_the_container(ServiceContainer $container, Unwrapper $unwrapper, FactoryInterface $factory) { $container->setShared( 'runner.maintainers.common_collaborators', $this->service('PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer', $container) )->shouldBeCalled(); + $container->setShared( + 'collaborator_factory.default', + $this->service('PhpSpec\Symfony2Extension\Runner\Collaborator\DefaultFactory', $container) + )->shouldBeCalled(); + $container->setShared( 'collaborator_factory', - $this->service('PhpSpec\Symfony2Extension\Runner\CollaboratorFactory', $container) + $this->service('PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerFactory', $container) )->shouldBeCalled(); + $container->getByPrefix('collaborator.initializers')->willReturn(array()); $container->getParam('symfony2_extension.common-collaborators', array())->willReturn(array()); $container->get('collaborator_factory')->willReturn($factory); + $container->get('collaborator_factory.default')->willReturn($factory); $container->get('unwrapper')->willReturn($unwrapper); $this->load($container); diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php new file mode 100644 index 0000000..78f2c57 --- /dev/null +++ b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php @@ -0,0 +1,26 @@ +beConstructedWith($unwrapper); + } + + function it_is_initializable() + { + $this->shouldHaveType('PhpSpec\Symfony2Extension\Runner\Collaborator\DefaultFactory'); + } + + function its_create_should_create_collaborators(ObjectProphecy $prophecy) + { + $this->create($prophecy, 'router', 'Symfony\Component\Routing\RouterInterface')->shouldHaveType('PhpSpec\Wrapper\Collaborator'); + } +} diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php new file mode 100644 index 0000000..83d2e56 --- /dev/null +++ b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php @@ -0,0 +1,37 @@ +beConstructedWith($factory, array( + $initializer, + )); + $factory->create(Argument::cetera())->willReturn($collaborator); + } + + function its_create_should_initialize_known_collaborators(ObjectProphecy $prophecy, $collaborator, $initializer) + { + $initializer->supports('router')->willReturn(true); + $initializer->initialize(Argument::cetera())->shouldBeCalled(); + $this->create($prophecy, 'router'); + } + + function its_create_should_not_initialize_unknown_collaborators(ObjectProphecy $prophecy, $collaborator, $initializer) + { + $initializer->supports('request')->willReturn(false); + $initializer->initialize(Argument::cetera())->shouldNotBeCalled(); + $this->create($prophecy, 'request'); + } +} diff --git a/spec/PhpSpec/Symfony2Extension/Runner/CollaboratorFactorySpec.php b/spec/PhpSpec/Symfony2Extension/Runner/CollaboratorFactorySpec.php deleted file mode 100644 index 525ffeb..0000000 --- a/spec/PhpSpec/Symfony2Extension/Runner/CollaboratorFactorySpec.php +++ /dev/null @@ -1,20 +0,0 @@ -beConstructedWith($unwrapper); - } - - function it_is_initializable() - { - $this->shouldHaveType('PhpSpec\Symfony2Extension\Runner\CollaboratorFactory'); - } -} diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php index 461a181..88ef24b 100644 --- a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php @@ -5,11 +5,11 @@ use PhpSpec\ObjectBehavior; use Prophecy\Argument; use PhpSpec\Wrapper\Unwrapper; -use PhpSpec\Symfony2Extension\Runner\CollaboratorFactory; +use PhpSpec\Symfony2Extension\Runner\Collaborator\FactoryInterface; class CommonCollaboratorsMaintainerSpec extends ObjectBehavior { - public function let(Unwrapper $unwrapper, CollaboratorFactory $factory) + public function let(Unwrapper $unwrapper, FactoryInterface $factory) { $this->beConstructedWith($unwrapper, $factory, array()); } diff --git a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php index ea3e012..89e7b46 100644 --- a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php @@ -4,13 +4,13 @@ use PhpSpec\ObjectBehavior; use Prophecy\Argument; +use Symfony\Component\HttpFoundation\Request; class TestControllerSpec extends ObjectBehavior { - public function it_generates_url($container, $router) + public function it_generates_url($container, $router, $request) { $this->setContainer($container); - $router->generate('homepage', array(), false)->willReturn('/'); - $this->generateUrl('homepage')->shouldReturn('/'); + $this->generateUrl('homepage')->shouldReturn('homepage'); } } diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index 6641d59..7861df0 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -11,8 +11,10 @@ use PhpSpec\Symfony2Extension\CodeGenerator\ControllerClassGenerator; use PhpSpec\Symfony2Extension\CodeGenerator\ControllerSpecificationGenerator; use PhpSpec\Symfony2Extension\Locator\PSR0Locator; -use PhpSpec\Symfony2Extension\Runner\CollaboratorFactory; +use PhpSpec\Symfony2Extension\Runner\Collaborator\DefaultFactory; use PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer; +use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerFactory; +use PhpSpec\Symfony2Extension\Runner\Collaborator\Initializer; class Extension implements ExtensionInterface { @@ -45,14 +47,26 @@ function ($c) { } ); - $container->setShared( - 'collaborator_factory', - function ($c) { - return new CollaboratorFactory( - $c->get('unwrapper') - ); - } - ); + $container->setShared('collaborator_factory.default', function ($c) { + return new DefaultFactory( + $c->get('unwrapper') + ); + }); + + $container->setShared('collaborator_factory', function ($c) { + return new InitializerFactory( + $c->get('collaborator_factory.default'), + $c->getByPrefix('collaborator.initializer') + ); + }); + + $container->setShared('collaborator.initializer.request', function ($c) { + return new Initializer\Request; + }); + + $container->setShared('collaborator.initializer.router', function ($c) { + return new Initializer\Router; + }); } /** diff --git a/src/PhpSpec/Symfony2Extension/Runner/CollaboratorFactory.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactory.php similarity index 72% rename from src/PhpSpec/Symfony2Extension/Runner/CollaboratorFactory.php rename to src/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactory.php index 0ad81a7..acf1cc9 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/CollaboratorFactory.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactory.php @@ -1,12 +1,12 @@ unwrapper = $unwrapper; } - public function create(ObjectProphecy $prophecy, $className = null, array $arguments = array()) + public function create(ObjectProphecy $prophecy, $name, $className = null, array $arguments = array()) { $collaborator = new Collaborator($prophecy, $this->unwrapper); if (null !== $className) { diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php new file mode 100644 index 0000000..cc359f1 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php @@ -0,0 +1,10 @@ +names = $names ?: array( + 'doctrine', 'em', 'om', 'dm', 'repository', + ); + } + + public function initialize(Collaborator $collaborator, $className, array $arguments) + { + if (null === $className) { + $collaborator->beADoubleOf('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface'); + } + $collaborator->renderResponse(Argument::cetera())->willReturnArgument(); + } + + public function supports($name) + { + return in_array($name, $this->names); + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php new file mode 100644 index 0000000..05bf651 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php @@ -0,0 +1,30 @@ +name = $name; + } + + public function initialize(Collaborator $collaborator, $className, array $arguments) + { + if (null === $className) { + $collaborator->beADoubleOf('Symfony\Component\HttpFoundation\Request'); + } + $collaborator->attributes = new ParameterBag; + } + + public function supports($name) + { + return $this->name === $name; + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php new file mode 100644 index 0000000..325ed26 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php @@ -0,0 +1,30 @@ +name = $name; + } + + public function initialize(Collaborator $collaborator, $className, array $arguments) + { + if (null === $className) { + $collaborator->beADoubleOf('Symfony\Component\Routing\RouterInterface'); + } + $collaborator->generate(Argument::cetera())->willReturnArgument(); + } + + public function supports($name) + { + return $this->name === $name; + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php new file mode 100644 index 0000000..cd4a3f2 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php @@ -0,0 +1,30 @@ +name = $name; + } + + public function initialize(Collaborator $collaborator, $className, array $arguments) + { + if (null === $className) { + $collaborator->beADoubleOf('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface'); + } + $collaborator->renderResponse(Argument::cetera())->willReturnArgument(); + } + + public function supports($name) + { + return $this->name === $name; + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php new file mode 100644 index 0000000..c0d773e --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php @@ -0,0 +1,36 @@ +factory = $factory; + $this->initializers = $initializers; + } + + public function create(ObjectProphecy $prophecy, $name, $className = null, array $arguments = array()) + { + $collaborator = $this->factory->create($prophecy, $name, $className, $arguments); + if ($initializer = $this->getInitializer($name)) { + $initializer->initialize($collaborator, $className, $arguments); + } + + return $collaborator; + } + + private function getInitializer($name) + { + foreach ($this->initializers as $initializer) { + if ($initializer->supports($name)) { + return $initializer; + } + } + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php new file mode 100644 index 0000000..e8e5567 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php @@ -0,0 +1,20 @@ +unwrapper = $unwrapper; $this->factory = $factory; - // @TODO should we ? or via extension config ? + // @TODO should we ? and/or via extension config ? $this->commonCollaborators = $commonCollaborators ?: array( 'router' => 'Symfony\Component\Routing\RouterInterface', 'session' => 'Symfony\Component\HttpFoundation\Session\Session', @@ -54,6 +53,7 @@ public function prepare(ExampleNode $example, SpecificationInterface $context, M if (!$collaborators->has('container')) { $container = $this->factory->create( $this->prophet->prophesize(), + 'container', 'Symfony\Component\DependencyInjection\ContainerInterface' ); $collaborators->set('container', $container); @@ -62,12 +62,10 @@ public function prepare(ExampleNode $example, SpecificationInterface $context, M foreach ($this->commonCollaborators as $name => $service) { list($id, $class) = $this->extractCollaboratorConfig($name, $service); if (!$collaborators->has($name)) { - $collaborator = $this->factory->create($this->prophet->prophesize(), $class); + $collaborator = $this->factory->create($this->prophet->prophesize(), $name, $class); $collaborators->set($name, $collaborator); - if ($collaborators->has('container')) { - $collaborators->get('container')->get($id)->willReturn($collaborator); - } + $collaborators->get('container')->get($id)->willReturn($collaborator); } } } From 14837740c5a2b57b4d5a19f27fdaf3b522e0676b Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Mon, 16 Sep 2013 23:00:35 +0200 Subject: [PATCH 10/18] add default initilaizers --- features/describing_a_controller.feature | 13 +++--- .../initialize_default_collaborators.feature | 1 + .../provide_default_collaborators.feature | 1 + phpspec.yml | 1 + .../Symfony2Extension/ExtensionSpec.php | 5 ++- .../Collaborator/DefaultFactorySpec.php | 5 ++- .../Collaborator/InitializerFactorySpec.php | 9 ++-- .../CommonCollaboratorsMaintainerSpec.php | 4 +- src/PhpSpec/Symfony2Extension/Extension.php | 14 +++++++ .../Runner/Collaborator/DefaultFactory.php | 6 +-- .../Runner/Collaborator/FactoryInterface.php | 3 +- .../Collaborator/Initializer/Container.php | 41 +++++++++++++++++++ .../Collaborator/Initializer/Doctrine.php | 25 +++++++++-- .../Collaborator/Initializer/Request.php | 14 +++++-- .../Collaborator/Initializer/Router.php | 14 +++++-- .../Collaborator/Initializer/Templating.php | 14 +++++-- .../Collaborator/InitializerFactory.php | 20 +++++++-- .../Collaborator/InitializerInterface.php | 9 +++- .../CommonCollaboratorsMaintainer.php | 36 +++++----------- 19 files changed, 168 insertions(+), 67 deletions(-) create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php diff --git a/features/describing_a_controller.feature b/features/describing_a_controller.feature index 4ed5786..f6d491e 100644 --- a/features/describing_a_controller.feature +++ b/features/describing_a_controller.feature @@ -57,9 +57,8 @@ Feature: Describing a controller class UserControllerSpec extends ObjectBehavior { - function it_should_respond_to_the_list_action_call($container) + function it_should_respond_to_the_list_action_call() { - $this->setContainer($container); $response = $this->listAction(); $response->shouldHaveType('Symfony\Component\HttpFoundation\Response'); $response->getStatusCode()->shouldBe(200); @@ -98,13 +97,14 @@ Feature: Describing a controller use PhpSpec\ObjectBehavior; use Prophecy\Argument; use Symfony\Component\Routing\Router; + use Symfony\Component\DependencyInjection\ContainerInterface; class UserControllerSpec extends ObjectBehavior { - function it_should_redirect_to_the_homepage($router, $container) + function it_should_redirect_to_the_homepage(Router $router, ContainerInterface $container) { $this->setContainer($container); - $container->set('router', $router); + $container->get('router')->willReturn($router); $router->generate('homepage')->willReturn('/'); @@ -149,13 +149,14 @@ Feature: Describing a controller use PhpSpec\ObjectBehavior; use Prophecy\Argument; use Symfony\Component\Templating\EngineInterface; + use Symfony\Component\DependencyInjection\ContainerInterface; class UserControllerSpec extends ObjectBehavior { - function it_should_render_list_of_users(EngineInterface $templating, $container) + function it_should_render_list_of_users(EngineInterface $templating, ContainerInterface $container) { $this->setContainer($container); - $container->set('templating', $templating); + $container->get('templating')->willReturn($templating); $this->shouldRender('Scenario7UserBundle:User:list.html.twig', array('users' => array())) ->duringAction('list'); diff --git a/features/initialize_default_collaborators.feature b/features/initialize_default_collaborators.feature index c61e80f..4c69056 100644 --- a/features/initialize_default_collaborators.feature +++ b/features/initialize_default_collaborators.feature @@ -10,6 +10,7 @@ Feature: Initialize default collaborators - PhpSpec\Symfony2Extension\Extension symfony2_extension.common-collaborators: + container: ~ router: ~ request: ~ """ diff --git a/features/provide_default_collaborators.feature b/features/provide_default_collaborators.feature index 885af0b..c82e8cd 100644 --- a/features/provide_default_collaborators.feature +++ b/features/provide_default_collaborators.feature @@ -10,6 +10,7 @@ Feature: Provide default collaborators - PhpSpec\Symfony2Extension\Extension symfony2_extension.common-collaborators: + container: ~ router: Symfony\Component\Routing\RouterInterface """ diff --git a/phpspec.yml b/phpspec.yml index 52f0617..8e9219a 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -3,6 +3,7 @@ extensions: symfony2_extension.common-collaborators: # append: false # should we support append ? (ie: provide defaults) + container: ~ router: ~ request: ~ #formFactory: { form.factory: FormFactoryInterface } diff --git a/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php b/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php index 0e927dd..7213f0a 100644 --- a/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php +++ b/spec/PhpSpec/Symfony2Extension/ExtensionSpec.php @@ -9,6 +9,7 @@ use Prophecy\Argument; use PhpSpec\Wrapper\Unwrapper; use PhpSpec\Symfony2Extension\Runner\Collaborator\FactoryInterface; +use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerFactory; class ExtensionSpec extends ObjectBehavior { @@ -50,7 +51,7 @@ function it_registers_a_custom_locator_with_configuration(ServiceContainer $cont $configurator($container->getWrappedObject()); } - function it_registers_runner_maintainers_for_the_container(ServiceContainer $container, Unwrapper $unwrapper, FactoryInterface $factory) + function it_registers_runner_maintainers_for_the_container(ServiceContainer $container, Unwrapper $unwrapper, FactoryInterface $defaultFactory, InitializerFactory $factory) { $container->setShared( 'runner.maintainers.common_collaborators', @@ -70,7 +71,7 @@ function it_registers_runner_maintainers_for_the_container(ServiceContainer $con $container->getByPrefix('collaborator.initializers')->willReturn(array()); $container->getParam('symfony2_extension.common-collaborators', array())->willReturn(array()); $container->get('collaborator_factory')->willReturn($factory); - $container->get('collaborator_factory.default')->willReturn($factory); + $container->get('collaborator_factory.default')->willReturn($defaultFactory); $container->get('unwrapper')->willReturn($unwrapper); $this->load($container); diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php index 78f2c57..538a9f9 100644 --- a/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php +++ b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactorySpec.php @@ -6,6 +6,7 @@ use Prophecy\Argument; use PhpSpec\Wrapper\Unwrapper; use Prophecy\Prophecy\ObjectProphecy; +use PhpSpec\Runner\CollaboratorManager; class DefaultFactorySpec extends ObjectBehavior { @@ -19,8 +20,8 @@ function it_is_initializable() $this->shouldHaveType('PhpSpec\Symfony2Extension\Runner\Collaborator\DefaultFactory'); } - function its_create_should_create_collaborators(ObjectProphecy $prophecy) + function its_create_should_create_collaborators(CollaboratorManager $collaborators, ObjectProphecy $prophecy) { - $this->create($prophecy, 'router', 'Symfony\Component\Routing\RouterInterface')->shouldHaveType('PhpSpec\Wrapper\Collaborator'); + $this->create($collaborators, $prophecy, 'router', 'Symfony\Component\Routing\RouterInterface')->shouldHaveType('PhpSpec\Wrapper\Collaborator'); } } diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php index 83d2e56..9885e23 100644 --- a/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php +++ b/spec/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactorySpec.php @@ -8,6 +8,7 @@ use Prophecy\Prophecy\ObjectProphecy; use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerInterface; use PhpSpec\Wrapper\Collaborator; +use PhpSpec\Runner\CollaboratorManager; class InitializerFactorySpec extends ObjectBehavior { @@ -21,17 +22,17 @@ function let(FactoryInterface $factory, Collaborator $collaborator, InitializerI $factory->create(Argument::cetera())->willReturn($collaborator); } - function its_create_should_initialize_known_collaborators(ObjectProphecy $prophecy, $collaborator, $initializer) + function its_create_should_initialize_known_collaborators(CollaboratorManager $collaborators, ObjectProphecy $prophecy, $collaborator, $initializer) { $initializer->supports('router')->willReturn(true); $initializer->initialize(Argument::cetera())->shouldBeCalled(); - $this->create($prophecy, 'router'); + $this->create($collaborators, $prophecy, 'router'); } - function its_create_should_not_initialize_unknown_collaborators(ObjectProphecy $prophecy, $collaborator, $initializer) + function its_create_should_not_initialize_unknown_collaborators(CollaboratorManager $collaborators, ObjectProphecy $prophecy, $collaborator, $initializer) { $initializer->supports('request')->willReturn(false); $initializer->initialize(Argument::cetera())->shouldNotBeCalled(); - $this->create($prophecy, 'request'); + $this->create($collaborators, $prophecy, 'request'); } } diff --git a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php index 88ef24b..f2973bc 100644 --- a/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainerSpec.php @@ -5,11 +5,11 @@ use PhpSpec\ObjectBehavior; use Prophecy\Argument; use PhpSpec\Wrapper\Unwrapper; -use PhpSpec\Symfony2Extension\Runner\Collaborator\FactoryInterface; +use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerFactory; class CommonCollaboratorsMaintainerSpec extends ObjectBehavior { - public function let(Unwrapper $unwrapper, FactoryInterface $factory) + public function let(Unwrapper $unwrapper, InitializerFactory $factory) { $this->beConstructedWith($unwrapper, $factory, array()); } diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index 7861df0..a41fd2c 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -60,6 +60,12 @@ function ($c) { ); }); + $container->setShared('collaborator.initializer.container', function ($c) { + return new Initializer\Container( + $c->getParam('symfony2_extension.common-collaborators', array()) + ); + }); // first! + $container->setShared('collaborator.initializer.request', function ($c) { return new Initializer\Request; }); @@ -67,6 +73,14 @@ function ($c) { $container->setShared('collaborator.initializer.router', function ($c) { return new Initializer\Router; }); + + $container->setShared('collaborator.initializer.templating', function ($c) { + return new Initializer\Router; + }); + + $container->setShared('collaborator.initializer.doctrine', function ($c) { + return new Initializer\Router; + }); } /** diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactory.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactory.php index acf1cc9..78b1d37 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactory.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/DefaultFactory.php @@ -5,6 +5,7 @@ use PhpSpec\Wrapper\Unwrapper; use PhpSpec\Wrapper\Collaborator; use Prophecy\Prophecy\ObjectProphecy; +use PhpSpec\Runner\CollaboratorManager; class DefaultFactory implements FactoryInterface { @@ -15,15 +16,12 @@ public function __construct(Unwrapper $unwrapper) $this->unwrapper = $unwrapper; } - public function create(ObjectProphecy $prophecy, $name, $className = null, array $arguments = array()) + public function create(CollaboratorManager $collaborators, ObjectProphecy $prophecy, $name, $className = null) { $collaborator = new Collaborator($prophecy, $this->unwrapper); if (null !== $className) { $collaborator->beADoubleOf($className); } - if (!empty($arguments)) { - $collaborator->beConstructedWith($arguments); - } return $collaborator; } diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php index cc359f1..77ae0a4 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/FactoryInterface.php @@ -3,8 +3,9 @@ namespace PhpSpec\Symfony2Extension\Runner\Collaborator; use Prophecy\Prophecy\ObjectProphecy; +use PhpSpec\Runner\CollaboratorManager; interface FactoryInterface { - public function create(ObjectProphecy $prophecy, $name, $className = null, array $arguments = array()); + public function create(CollaboratorManager $collaborators, ObjectProphecy $prophecy, $name, $className = null); } diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php new file mode 100644 index 0000000..637e71e --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php @@ -0,0 +1,41 @@ +commonCollaborators = $commonCollaborators; + $this->name = $name; + } + + public function initialize(CollaboratorManager $collaborators, $name, $className = null) + { + $container = $collaborators->get($name); + if (null === $className) { + $container->beADoubleOf('Symfony\Component\DependencyInjection\ContainerInterface'); + } + $container->has('service_container')->willReturn(true); + $container->get('service_container')->willReturn($container); + } + + public function postInitialize(CollaboratorManager $collaborators) + { + foreach ($this->commonCollaborators as $name => $config) { + $collaborators->get('container')->has($name)->willReturn(true); + $collaborators->get('container')->get($name)->willReturn($collaborators->get($name)); + } + } + + public function supports($name) + { + return $this->name === $name; + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php index d90be1c..5e79ba6 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php @@ -15,16 +15,33 @@ public function __construct(array $names = array()) ); } - public function initialize(Collaborator $collaborator, $className, array $arguments) + public function initialize(CollaboratorManager $collaborators, $name, $className = null) { - if (null === $className) { - $collaborator->beADoubleOf('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface'); + switch ($name) { + case 'doctrine': + return $this->initDoctrine($collaborators, $className); + default: + return; + } + } + + public function postInitialize(CollaboratorManager $collaborators) + { + if ($collaborators->has('em')) { + $doctrine->getManager()->willReturn($collaborators->get('em')); } - $collaborator->renderResponse(Argument::cetera())->willReturnArgument(); } public function supports($name) { return in_array($name, $this->names); } + + private function initDoctrine(CollaboratorManager $collaborators, $className) + { + $doctrine = $collaborators->get('doctrine'); + if (null === $className) { + $doctrine->beADoubleOf('Doctrine\Common\Persistence\ManagerRegistry'); + } + } } diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php index 05bf651..dee5cb7 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Request.php @@ -3,7 +3,7 @@ namespace PhpSpec\Symfony2Extension\Runner\Collaborator\Initializer; use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerInterface; -use PhpSpec\Wrapper\Collaborator; +use PhpSpec\Runner\CollaboratorManager; use Symfony\Component\HttpFoundation\ParameterBag; class Request implements InitializerInterface @@ -15,12 +15,18 @@ public function __construct($name = 'request') $this->name = $name; } - public function initialize(Collaborator $collaborator, $className, array $arguments) + public function initialize(CollaboratorManager $collaborators, $name, $className = null) { + $request = $collaborators->get($name); if (null === $className) { - $collaborator->beADoubleOf('Symfony\Component\HttpFoundation\Request'); + $request->beADoubleOf('Symfony\Component\HttpFoundation\Request'); } - $collaborator->attributes = new ParameterBag; + $request->attributes = new ParameterBag; + } + + public function postInitialize(CollaboratorManager $collaborators) + { + } public function supports($name) diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php index 325ed26..144f7f6 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Router.php @@ -3,7 +3,7 @@ namespace PhpSpec\Symfony2Extension\Runner\Collaborator\Initializer; use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerInterface; -use PhpSpec\Wrapper\Collaborator; +use PhpSpec\Runner\CollaboratorManager; use Prophecy\Argument; class Router implements InitializerInterface @@ -15,12 +15,18 @@ public function __construct($name = 'router') $this->name = $name; } - public function initialize(Collaborator $collaborator, $className, array $arguments) + public function initialize(CollaboratorManager $collaborators, $name, $className = null) { + $router = $collaborators->get($name); if (null === $className) { - $collaborator->beADoubleOf('Symfony\Component\Routing\RouterInterface'); + $router->beADoubleOf('Symfony\Component\Routing\RouterInterface'); } - $collaborator->generate(Argument::cetera())->willReturnArgument(); + $router->generate(Argument::cetera())->willReturnArgument(); + } + + public function postInitialize(CollaboratorManager $collaborators) + { + } public function supports($name) diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php index cd4a3f2..17aff8e 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php @@ -3,7 +3,7 @@ namespace PhpSpec\Symfony2Extension\Runner\Collaborator\Initializer; use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerInterface; -use PhpSpec\Wrapper\Collaborator; +use PhpSpec\Runner\CollaboratorManager; use Symfony\Component\HttpFoundation\ParameterBag; class Templating implements InitializerInterface @@ -15,12 +15,18 @@ public function __construct($name = 'templating') $this->name = $name; } - public function initialize(Collaborator $collaborator, $className, array $arguments) + public function initialize(CollaboratorManager $collaborators, $name, $className = null) { + $collaborator = $collaborators->get($name); if (null === $className) { - $collaborator->beADoubleOf('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface'); + $templating->beADoubleOf('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface'); } - $collaborator->renderResponse(Argument::cetera())->willReturnArgument(); + $templating->renderResponse(Argument::cetera())->willReturnArgument(); + } + + public function postInitialize(CollaboratorManager $collaborators) + { + } public function supports($name) diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php index c0d773e..a459622 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php @@ -3,6 +3,7 @@ namespace PhpSpec\Symfony2Extension\Runner\Collaborator; use Prophecy\Prophecy\ObjectProphecy; +use PhpSpec\Runner\CollaboratorManager; class InitializerFactory implements FactoryInterface { @@ -15,16 +16,29 @@ public function __construct(FactoryInterface $factory, array $initializers = arr $this->initializers = $initializers; } - public function create(ObjectProphecy $prophecy, $name, $className = null, array $arguments = array()) + public function create(CollaboratorManager $collaborators, ObjectProphecy $prophecy, $name, $className = null) { - $collaborator = $this->factory->create($prophecy, $name, $className, $arguments); + if (!$collaborators->has($name)) { + $collaborator = $this->factory->create($collaborators, $prophecy, $name, $className); + $collaborators->set($name, $collaborator); + } + else { + $collaborator = $collaborators->get($name); + } if ($initializer = $this->getInitializer($name)) { - $initializer->initialize($collaborator, $className, $arguments); + $initializer->initialize($collaborators, $name, $className); } return $collaborator; } + function postInitialize(CollaboratorManager $collaborators) + { + foreach ($this->initializers as $initializer) { + $initializer->postInitialize($collaborators); + } + } + private function getInitializer($name) { foreach ($this->initializers as $initializer) { diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php index e8e5567..43259bd 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerInterface.php @@ -2,14 +2,19 @@ namespace PhpSpec\Symfony2Extension\Runner\Collaborator; -use PhpSpec\Wrapper\Collaborator; +use PhpSpec\Runner\CollaboratorManager; interface InitializerInterface { /** * add common default behavior to a collaborator **/ - public function initialize(Collaborator $collaborator, $className, array $arguments); + public function initialize(CollaboratorManager $collaborators, $name, $className = null); + + /** + * add more behaviors with knowledge of other collaborators + **/ + public function postInitialize(CollaboratorManager $collaborators); /** * return bool if supports the collaborator name diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php index 84e95c5..298a944 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php @@ -7,9 +7,9 @@ use PhpSpec\SpecificationInterface; use PhpSpec\Runner\CollaboratorManager; use PhpSpec\Runner\MatcherManager; -use PhpSpec\Symfony2Extension\Runner\Collaborator\FactoryInterface; use Prophecy\Prophet; use PhpSpec\Wrapper\Unwrapper; +use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerFactory; class CommonCollaboratorsMaintainer implements MaintainerInterface { @@ -18,19 +18,12 @@ class CommonCollaboratorsMaintainer implements MaintainerInterface private $commonCollaborators; private $prophet; - public function __construct(Unwrapper $unwrapper, FactoryInterface $factory, array $commonCollaborators = array()) + public function __construct(Unwrapper $unwrapper, InitializerFactory $factory, array $commonCollaborators = array()) { - // @TODO avoid indirect deps ? - $this->unwrapper = $unwrapper; + $this->unwrapper = $unwrapper; // @TODO avoid indirect deps $this->factory = $factory; - // @TODO should we ? and/or via extension config ? - $this->commonCollaborators = $commonCollaborators ?: array( - 'router' => 'Symfony\Component\Routing\RouterInterface', - 'session' => 'Symfony\Component\HttpFoundation\Session\Session', - 'request' => 'Symfony\Component\HttpFoundation\Request', - //'securityContext' => 'SecurityContextIterface', - ); + $this->commonCollaborators = $commonCollaborators; } public function supports(ExampleNode $example) @@ -50,24 +43,17 @@ public function prepare(ExampleNode $example, SpecificationInterface $context, M { $this->prophet = new Prophet(null, $this->unwrapper, null); - if (!$collaborators->has('container')) { - $container = $this->factory->create( - $this->prophet->prophesize(), - 'container', - 'Symfony\Component\DependencyInjection\ContainerInterface' - ); - $collaborators->set('container', $container); - } - foreach ($this->commonCollaborators as $name => $service) { list($id, $class) = $this->extractCollaboratorConfig($name, $service); - if (!$collaborators->has($name)) { - $collaborator = $this->factory->create($this->prophet->prophesize(), $name, $class); - $collaborators->set($name, $collaborator); - $collaborators->get('container')->get($id)->willReturn($collaborator); - } + $collaborator = $this->factory->create( + $collaborators, + $this->prophet->prophesize(), + $name, + $class + ); } + $this->factory->postInitialize($collaborators); } public function teardown(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators) From 43de656a87ed54cd7eb3e0a1892957ee33a07c65 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Mon, 16 Sep 2013 23:23:29 +0200 Subject: [PATCH 11/18] fix postInitialize --- .../initialize_default_collaborators.feature | 2 + phpspec.yml | 2 + .../Symfony2Extension/TestControllerSpec.php | 3 +- src/PhpSpec/Symfony2Extension/Extension.php | 11 ++++-- .../Collaborator/Initializer/Doctrine.php | 3 +- .../Collaborator/Initializer/Session.php | 39 +++++++++++++++++++ .../Collaborator/InitializerFactory.php | 10 +++-- .../CommonCollaboratorsMaintainer.php | 2 +- 8 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Session.php diff --git a/features/initialize_default_collaborators.feature b/features/initialize_default_collaborators.feature index 4c69056..db0bac4 100644 --- a/features/initialize_default_collaborators.feature +++ b/features/initialize_default_collaborators.feature @@ -13,6 +13,8 @@ Feature: Initialize default collaborators container: ~ router: ~ request: ~ + session: ~ + doctrine: ~ """ Scenario: Controller spec has access to common collaborators diff --git a/phpspec.yml b/phpspec.yml index 8e9219a..6750034 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -6,4 +6,6 @@ symfony2_extension.common-collaborators: container: ~ router: ~ request: ~ + session: ~ + doctrine: ~ #formFactory: { form.factory: FormFactoryInterface } diff --git a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php index 89e7b46..809a8ef 100644 --- a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php @@ -8,9 +8,10 @@ class TestControllerSpec extends ObjectBehavior { - public function it_generates_url($container, $router, $request) + public function it_generates_url($container, $router, $request, $doctrine) { $this->setContainer($container); + $doctrine->getManager(); $this->generateUrl('homepage')->shouldReturn('homepage'); } } diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index a41fd2c..30457a3 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -11,8 +11,8 @@ use PhpSpec\Symfony2Extension\CodeGenerator\ControllerClassGenerator; use PhpSpec\Symfony2Extension\CodeGenerator\ControllerSpecificationGenerator; use PhpSpec\Symfony2Extension\Locator\PSR0Locator; -use PhpSpec\Symfony2Extension\Runner\Collaborator\DefaultFactory; use PhpSpec\Symfony2Extension\Runner\Maintainer\CommonCollaboratorsMaintainer; +use PhpSpec\Symfony2Extension\Runner\Collaborator\DefaultFactory; use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerFactory; use PhpSpec\Symfony2Extension\Runner\Collaborator\Initializer; @@ -56,7 +56,8 @@ function ($c) { $container->setShared('collaborator_factory', function ($c) { return new InitializerFactory( $c->get('collaborator_factory.default'), - $c->getByPrefix('collaborator.initializer') + $c->getByPrefix('collaborator.initializer'), + $c->getParam('symfony2_extension.common-collaborators', array()) ); }); @@ -70,6 +71,10 @@ function ($c) { return new Initializer\Request; }); + $container->setShared('collaborator.initializer.session', function ($c) { + return new Initializer\Session; + }); + $container->setShared('collaborator.initializer.router', function ($c) { return new Initializer\Router; }); @@ -79,7 +84,7 @@ function ($c) { }); $container->setShared('collaborator.initializer.doctrine', function ($c) { - return new Initializer\Router; + return new Initializer\Doctrine; }); } diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php index 5e79ba6..4d9c924 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php @@ -3,8 +3,7 @@ namespace PhpSpec\Symfony2Extension\Runner\Collaborator\Initializer; use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerInterface; -use PhpSpec\Wrapper\Collaborator; -use Symfony\Component\HttpFoundation\ParameterBag; +use PhpSpec\Runner\CollaboratorManager; class Doctrine implements InitializerInterface { diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Session.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Session.php new file mode 100644 index 0000000..2db0423 --- /dev/null +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Session.php @@ -0,0 +1,39 @@ +name = $name; + } + + public function initialize(CollaboratorManager $collaborators, $name, $className = null) + { + $session = $collaborators->get($name); + if (null === $className) { + $session->beADoubleOf('Symfony\Component\HttpFoundation\Session\Session'); + } + + $session->getFlashBag()->willReturn(new FlashBag); + } + + public function postInitialize(CollaboratorManager $collaborators) + { + if ($collaborators->has('request')) { + $collaborators->get('request')->getSession()->willReturn($collaborators->get($this->name)); + } + } + + public function supports($name) + { + return $this->name === $name; + } +} diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php index a459622..c4efe8f 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php @@ -9,11 +9,13 @@ class InitializerFactory implements FactoryInterface { private $factory; private $initializers; + private $commonCollaborators; - public function __construct(FactoryInterface $factory, array $initializers = array()) + public function __construct(FactoryInterface $factory, array $initializers = array(), array $commonCollaborators = array()) { $this->factory = $factory; $this->initializers = $initializers; + $this->commonCollaborators = $commonCollaborators; } public function create(CollaboratorManager $collaborators, ObjectProphecy $prophecy, $name, $className = null) @@ -34,8 +36,10 @@ public function create(CollaboratorManager $collaborators, ObjectProphecy $proph function postInitialize(CollaboratorManager $collaborators) { - foreach ($this->initializers as $initializer) { - $initializer->postInitialize($collaborators); + foreach ($this->commonCollaborators as $name => $config) { + if ($initializer = $this->getInitializer($name)) { + $initializer->postInitialize($collaborators); + } } } diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php index 298a944..de5551d 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php @@ -53,7 +53,7 @@ public function prepare(ExampleNode $example, SpecificationInterface $context, M $class ); } - $this->factory->postInitialize($collaborators); + $this->factory->postInitialize($collaborators, array_keys($this->commonCollaborators)); } public function teardown(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators) From e40642c7cec6cfade00349208ce316ce68d325b2 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Mon, 16 Sep 2013 23:43:51 +0200 Subject: [PATCH 12/18] improve doctrine init --- phpspec.yml | 2 ++ .../Collaborator/Initializer/Doctrine.php | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/phpspec.yml b/phpspec.yml index 6750034..efdd470 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -8,4 +8,6 @@ symfony2_extension.common-collaborators: request: ~ session: ~ doctrine: ~ + em: ~ + repository: ~ #formFactory: { form.factory: FormFactoryInterface } diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php index 4d9c924..564990f 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php @@ -4,6 +4,7 @@ use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerInterface; use PhpSpec\Runner\CollaboratorManager; +use Prophecy\Argument; class Doctrine implements InitializerInterface { @@ -19,6 +20,12 @@ public function initialize(CollaboratorManager $collaborators, $name, $className switch ($name) { case 'doctrine': return $this->initDoctrine($collaborators, $className); + case 'em': + case 'om': + case 'dm': + return $this->initManager($collaborators, $className); + case 'repository': + return $this->initRepository($collaborators, $className); default: return; } @@ -26,9 +33,8 @@ public function initialize(CollaboratorManager $collaborators, $name, $className public function postInitialize(CollaboratorManager $collaborators) { - if ($collaborators->has('em')) { - $doctrine->getManager()->willReturn($collaborators->get('em')); - } + $collaborators->get('doctrine')->getManager()->willReturn($collaborators->get('em')); + $collaborators->get('doctrine')->getRepository(Argument::type('string'))->willReturn($collaborators->get('repository')); } public function supports($name) @@ -43,4 +49,22 @@ private function initDoctrine(CollaboratorManager $collaborators, $className) $doctrine->beADoubleOf('Doctrine\Common\Persistence\ManagerRegistry'); } } + + private function initManager(CollaboratorManager $collaborators, $className) + { + $em = $collaborators->get('em'); + if (null === $className) { + $em->beADoubleOf('Doctrine\Common\Persistence\ObjectManager'); + } + } + + private function initRepository(CollaboratorManager $collaborators, $className) + { + $repository = $collaborators->get('repository'); + if (null === $className) { + $repository->beADoubleOf('Doctrine\Common\Persistence\ObjectRepository'); + } + + $repository->findAll()->willReturn(array()); + } } From ae0deda8586f90b5221657eac86f4025dfbfbd8c Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Mon, 16 Sep 2013 23:43:58 +0200 Subject: [PATCH 13/18] add examples --- .../Symfony2Extension/TestControllerSpec.php | 17 +++++++++++++++-- .../Symfony2Extension/TestController.php | 9 +++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php index 809a8ef..ca1bdc1 100644 --- a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php @@ -8,10 +8,23 @@ class TestControllerSpec extends ObjectBehavior { - public function it_generates_url($container, $router, $request, $doctrine) + public function let($container) { $this->setContainer($container); - $doctrine->getManager(); + } + + public function it_generates_url() + { $this->generateUrl('homepage')->shouldReturn('homepage'); } + + public function it_flushes() + { + $this->flush(); + } + + public function it_finds() + { + $this->find()->shouldReturn(array()); + } } diff --git a/src/PhpSpec/Symfony2Extension/TestController.php b/src/PhpSpec/Symfony2Extension/TestController.php index 87168da..e4855cb 100644 --- a/src/PhpSpec/Symfony2Extension/TestController.php +++ b/src/PhpSpec/Symfony2Extension/TestController.php @@ -6,4 +6,13 @@ class TestController extends Controller { + public function flush() + { + $this->get('doctrine')->getManager()->flush(); + } + + public function find() + { + return $this->get('doctrine')->getRepository('Stuff')->findAll(); + } } From c18f931174b4d4398da5de684a188453451efdc1 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Tue, 17 Sep 2013 09:14:23 +0200 Subject: [PATCH 14/18] improve postInit --- .../Runner/Collaborator/Initializer/Doctrine.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php index 564990f..d8a8edc 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Doctrine.php @@ -33,8 +33,15 @@ public function initialize(CollaboratorManager $collaborators, $name, $className public function postInitialize(CollaboratorManager $collaborators) { - $collaborators->get('doctrine')->getManager()->willReturn($collaborators->get('em')); - $collaborators->get('doctrine')->getRepository(Argument::type('string'))->willReturn($collaborators->get('repository')); + if ($collaborators->has('em')) { + $collaborators->get('doctrine')->getManager()->willReturn($collaborators->get('em')); + } + if ($collaborators->has('repository')) { + $collaborators->get('doctrine') + ->getRepository(Argument::type('string')) + ->willReturn($collaborators->get('repository')) + ; + } } public function supports($name) From ee29164122a73633f23500cb8356f03b5f970b9a Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Sat, 21 Sep 2013 12:35:17 +0200 Subject: [PATCH 15/18] move id alias config --- .../Runner/Collaborator/Initializer/Container.php | 15 +++++++++++++-- .../Runner/Collaborator/InitializerFactory.php | 2 +- .../Maintainer/CommonCollaboratorsMaintainer.php | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php index 637e71e..7abd91f 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php @@ -29,8 +29,10 @@ public function initialize(CollaboratorManager $collaborators, $name, $className public function postInitialize(CollaboratorManager $collaborators) { foreach ($this->commonCollaborators as $name => $config) { - $collaborators->get('container')->has($name)->willReturn(true); - $collaborators->get('container')->get($name)->willReturn($collaborators->get($name)); + list($id, $class) = $this->extractCollaboratorConfig($name, $config); + + $collaborators->get('container')->has($id)->willReturn(true); + $collaborators->get('container')->get($id)->willReturn($collaborators->get($name)); } } @@ -38,4 +40,13 @@ public function supports($name) { return $this->name === $name; } + + private function extractCollaboratorConfig($name, $config) + { + if (is_array($config)) { + return each($config); + } + + return array($name, $config); + } } diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php index c4efe8f..4329bda 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/InitializerFactory.php @@ -34,7 +34,7 @@ public function create(CollaboratorManager $collaborators, ObjectProphecy $proph return $collaborator; } - function postInitialize(CollaboratorManager $collaborators) + public function postInitialize(CollaboratorManager $collaborators) { foreach ($this->commonCollaborators as $name => $config) { if ($initializer = $this->getInitializer($name)) { diff --git a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php index de5551d..298a944 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Maintainer/CommonCollaboratorsMaintainer.php @@ -53,7 +53,7 @@ public function prepare(ExampleNode $example, SpecificationInterface $context, M $class ); } - $this->factory->postInitialize($collaborators, array_keys($this->commonCollaborators)); + $this->factory->postInitialize($collaborators); } public function teardown(ExampleNode $example, SpecificationInterface $context, MatcherManager $matchers, CollaboratorManager $collaborators) From 01363b047d9242e0983adf5ace677d364cc2eee5 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Fri, 27 Sep 2013 08:57:17 +0200 Subject: [PATCH 16/18] use dynamic name --- .../Runner/Collaborator/Initializer/Container.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php index 7abd91f..e25f7db 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php @@ -31,8 +31,8 @@ public function postInitialize(CollaboratorManager $collaborators) foreach ($this->commonCollaborators as $name => $config) { list($id, $class) = $this->extractCollaboratorConfig($name, $config); - $collaborators->get('container')->has($id)->willReturn(true); - $collaborators->get('container')->get($id)->willReturn($collaborators->get($name)); + $collaborators->get($this->name)->has($id)->willReturn(true); + $collaborators->get($this->name)->get($id)->willReturn($collaborators->get($name)); } } From 924fe126bc1be4e54f0c1c66489e3a1336f09f2f Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Wed, 13 Nov 2013 15:42:03 +0100 Subject: [PATCH 17/18] fix service id of container --- features/initialize_default_collaborators.feature | 2 +- features/provide_default_collaborators.feature | 2 +- phpspec.yml | 2 +- .../Runner/Collaborator/Initializer/Container.php | 2 -- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/features/initialize_default_collaborators.feature b/features/initialize_default_collaborators.feature index db0bac4..8adce55 100644 --- a/features/initialize_default_collaborators.feature +++ b/features/initialize_default_collaborators.feature @@ -10,7 +10,7 @@ Feature: Initialize default collaborators - PhpSpec\Symfony2Extension\Extension symfony2_extension.common-collaborators: - container: ~ + container: { service_container: ~ } router: ~ request: ~ session: ~ diff --git a/features/provide_default_collaborators.feature b/features/provide_default_collaborators.feature index c82e8cd..7a3644e 100644 --- a/features/provide_default_collaborators.feature +++ b/features/provide_default_collaborators.feature @@ -10,7 +10,7 @@ Feature: Provide default collaborators - PhpSpec\Symfony2Extension\Extension symfony2_extension.common-collaborators: - container: ~ + container: { service_container: ~ } router: Symfony\Component\Routing\RouterInterface """ diff --git a/phpspec.yml b/phpspec.yml index efdd470..af9ef0b 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -3,7 +3,7 @@ extensions: symfony2_extension.common-collaborators: # append: false # should we support append ? (ie: provide defaults) - container: ~ + container: { service_container: ~ } router: ~ request: ~ session: ~ diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php index e25f7db..465ae29 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Container.php @@ -22,8 +22,6 @@ public function initialize(CollaboratorManager $collaborators, $name, $className if (null === $className) { $container->beADoubleOf('Symfony\Component\DependencyInjection\ContainerInterface'); } - $container->has('service_container')->willReturn(true); - $container->get('service_container')->willReturn($container); } public function postInitialize(CollaboratorManager $collaborators) From 5c96a1fb818d9a45195bacec7c5a6a6f14aad2b8 Mon Sep 17 00:00:00 2001 From: Klein Florian Date: Wed, 13 Nov 2013 15:42:25 +0100 Subject: [PATCH 18/18] activate templating initializer --- features/initialize_default_collaborators.feature | 1 + phpspec.yml | 1 + spec/PhpSpec/Symfony2Extension/TestControllerSpec.php | 11 +++++++++++ src/PhpSpec/Symfony2Extension/Extension.php | 2 +- .../Runner/Collaborator/Initializer/Templating.php | 9 +++++++-- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/features/initialize_default_collaborators.feature b/features/initialize_default_collaborators.feature index 8adce55..699c354 100644 --- a/features/initialize_default_collaborators.feature +++ b/features/initialize_default_collaborators.feature @@ -12,6 +12,7 @@ Feature: Initialize default collaborators symfony2_extension.common-collaborators: container: { service_container: ~ } router: ~ + templating: ~ request: ~ session: ~ doctrine: ~ diff --git a/phpspec.yml b/phpspec.yml index af9ef0b..2e84dde 100644 --- a/phpspec.yml +++ b/phpspec.yml @@ -5,6 +5,7 @@ symfony2_extension.common-collaborators: # append: false # should we support append ? (ie: provide defaults) container: { service_container: ~ } router: ~ + templating: ~ request: ~ session: ~ doctrine: ~ diff --git a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php index ca1bdc1..9606006 100644 --- a/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php +++ b/spec/PhpSpec/Symfony2Extension/TestControllerSpec.php @@ -5,6 +5,7 @@ use PhpSpec\ObjectBehavior; use Prophecy\Argument; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; class TestControllerSpec extends ObjectBehavior { @@ -18,6 +19,16 @@ public function it_generates_url() $this->generateUrl('homepage')->shouldReturn('homepage'); } + function it_renders_template_in_response() + { + $this->render('test')->shouldBeLike(new Response('test')); + } + + function it_renders_view() + { + $this->renderView('test')->shouldReturn('test'); + } + public function it_flushes() { $this->flush(); diff --git a/src/PhpSpec/Symfony2Extension/Extension.php b/src/PhpSpec/Symfony2Extension/Extension.php index 30457a3..57e95c4 100644 --- a/src/PhpSpec/Symfony2Extension/Extension.php +++ b/src/PhpSpec/Symfony2Extension/Extension.php @@ -80,7 +80,7 @@ function ($c) { }); $container->setShared('collaborator.initializer.templating', function ($c) { - return new Initializer\Router; + return new Initializer\Templating; }); $container->setShared('collaborator.initializer.doctrine', function ($c) { diff --git a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php index 17aff8e..d877a74 100644 --- a/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php +++ b/src/PhpSpec/Symfony2Extension/Runner/Collaborator/Initializer/Templating.php @@ -5,6 +5,8 @@ use PhpSpec\Symfony2Extension\Runner\Collaborator\InitializerInterface; use PhpSpec\Runner\CollaboratorManager; use Symfony\Component\HttpFoundation\ParameterBag; +use Symfony\Component\HttpFoundation\Response; +use Prophecy\Argument; class Templating implements InitializerInterface { @@ -17,11 +19,14 @@ public function __construct($name = 'templating') public function initialize(CollaboratorManager $collaborators, $name, $className = null) { - $collaborator = $collaborators->get($name); + $templating = $collaborators->get($name); if (null === $className) { $templating->beADoubleOf('Symfony\Bundle\FrameworkBundle\Templating\EngineInterface'); } - $templating->renderResponse(Argument::cetera())->willReturnArgument(); + $templating->render(Argument::cetera())->willReturnArgument(); + $templating->renderResponse(Argument::cetera())->will(function($arguments) { + return new Response($arguments[0]); + }); } public function postInitialize(CollaboratorManager $collaborators)