Skip to content

Commit

Permalink
Updated test annotation
Browse files Browse the repository at this point in the history
  • Loading branch information
nathanjosiah authored and NathanS committed Oct 2, 2017
1 parent b0e0a3a commit 05f005e
Show file tree
Hide file tree
Showing 6 changed files with 272 additions and 23 deletions.
23 changes: 12 additions & 11 deletions src/ZfDonate/Controller/DefaultController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use Zend\EventManager\EventManager;
use Zend\Form\Form;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use ZfDonate\Event\DonationEvent;
use ZfDonate\Model\Adapter\FormAdapterInterface;
use ZfDonate\Model\Adapter\StorageAdapterInterface;
Expand All @@ -15,7 +16,7 @@ class DefaultController extends AbstractActionController {
const EVENT_STORE_DONATION = 'store';
const EVENT_FINISH = 'finish';

protected $entity,$form,$formAdapter,$storageAdapter,$donationGateway,$eventManager,$zfdonateConfig,$event;
protected $entity,$form,$formAdapter,$storageAdapter,$donationGateway,$eventManager,$zfdonateConfig,$donationEvent;
public function __construct(
DonationGateway $donationGateway,
FormAdapterInterface $formAdapter,
Expand All @@ -37,29 +38,29 @@ public function __construct(
$event->setTarget($this);
$event->setDonationEntity($this->entity);
$event->setDonationForm($this->form);
$this->event = $event;
$this->donationEvent = $event;
}

public function donateAction() {
public function indexAction() {
//$this->form->setAttribute('action',$this->Url()->fromRoute($this->zfdonateConfig['routes']['page']));
$request = $this->getRequest();

if($request->isPost()) {
$this->formAdapter->hydrateForm($this->form,$request->getPost());
if($this->donateForm->isValid()) {
$this->formAdapter->hydrateForm($this->form,$this->entity,$request->getPost()->toArray());
if($this->form->isValid()) {
$this->formAdapter->hydrateEntity($this->form,$this->entity);

// Process the donation
$this->event->setName(self::EVENT_PROCESS_DONATION);
$this->eventManager->triggerEvent($this->event);
$this->donationEvent->setName(self::EVENT_PROCESS_DONATION);
$this->eventManager->triggerEvent($this->donationEvent);
$response = $this->donationGateway->processDonation($this->entity);

/*
* This event should always fire because this is the only place
* where the donation is fully processed.
*/
$this->event->setName(self::EVENT_STORE_DONATION);
$this->eventManager->triggerEvent($this->event);
$this->donationEvent->setName(self::EVENT_STORE_DONATION);
$this->eventManager->triggerEvent($this->donationEvent);
if($this->storageAdapter) {
$this->storageAdapter->save($this->entity);
}
Expand All @@ -76,8 +77,8 @@ public function donateAction() {
* Allow custom return for controller
* Default behavior is to redirect to confirmation route.
*/
$this->event->setName(self::EVENT_FINISH);
$event_results = $this->eventManager->triggerEvent($this->event);
$this->donationEvent->setName(self::EVENT_FINISH);
$event_results = $this->eventManager->triggerEvent($this->donationEvent);
if($event_results->stopped()) {
// Return result from event
return $event_results->last();
Expand Down

This file was deleted.

5 changes: 0 additions & 5 deletions src/ZfDonate/Payment/PaymentFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

use Zend\ServiceManager\ServiceLocatorInterface;
use ZfDonate\Payment\Gateway\OptionsAwareInterface;
use ZfDonate\Payment\Adapter\Exception\BadAdapterException;
use ZfDonate\Payment\Adapter\AdapterInterface;

class PaymentFactory {
private $serviceLocator;
Expand All @@ -22,9 +20,6 @@ public function createGateway($configuration_name) : DonationGateway {
$adapter_config = $module_config['gateways'][$gateway_config['gateway']];

$adapter = $this->serviceLocator->get($adapter_config['adapter']);
if(!$adapter instanceof AdapterInterface) {
throw new BadAdapterException(sprintf('Adapter "%s" needs to implement %s.',$adapter_config['adapter'],AdapterInterface::class));
}

$gateway = $this->serviceLocator->get($adapter_config['gateway']);
if($gateway instanceof OptionsAwareInterface) {
Expand Down
218 changes: 218 additions & 0 deletions tests/ZfDonateTest/Controller/DefaultControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
<?php
namespace ZfDonateTest\Controller;

use Zend\EventManager\EventManager;
use Zend\Form\Form;
use Zend\Http\PhpEnvironment\Request;
use Zend\Http\Response;
use Zend\Mvc\MvcEvent;
use Zend\Router\RouteMatch;
use Zend\Stdlib\Parameters;
use Zend\View\Model\ViewModel;
use ZfDonate\Controller\DefaultController;
use ZfDonate\Model\Adapter\FormAdapterInterface;
use ZfDonate\Model\Adapter\StorageAdapterInterface;
use ZfDonate\Model\DonationEntity;
use ZfDonate\Payment\DonationGateway;
use ZfDonate\Payment\PaymentResultEntity;
use ZfDonateTest\Controller\TestAsset\EventListenerSpy;

class DefaultControllerTest extends \PHPUnit_Framework_TestCase {
public function testDonate_FirstVisit() {
$config = [
'views' => [
'form' => 'mytemplate',
]
];
$donationGateway = $this->getMockBuilder(DonationGateway::class)->disableOriginalConstructor()->getMock();
$formAdapter = $this->getMockBuilder(FormAdapterInterface::class)->getMock();
$storageAdapter = $this->getMockBuilder(StorageAdapterInterface::class)->getMock();
$donationEntity = new DonationEntity();
$form = new Form();
$eventManager = new EventManager();
$controller = new DefaultController($donationGateway,$formAdapter,$storageAdapter,$donationEntity,$form,$eventManager,$config);

$request = new Request();
$event = new MvcEvent();
$event->setRouteMatch(new RouteMatch(['action'=>'index']));
$controller->setEvent($event);

// Assert form default state is set
$formAdapter->expects($this->once())->method('setDefaultData')->with($form,$request,$donationEntity);

$result = $controller->dispatch($request,new Response());

$this->assertInstanceOf(ViewModel::class,$result);
$this->assertSame($form,$result->getVariable('form'));
$this->assertSame('mytemplate',$result->getTemplate());
}

public function testDonate_SubmissionWithErrors() {
$config = [
'views' => [
'form' => 'mytemplate',
]
];
$donationGateway = $this->getMockBuilder(DonationGateway::class)->disableOriginalConstructor()->getMock();
$formAdapter = $this->getMockBuilder(FormAdapterInterface::class)->getMock();
$storageAdapter = $this->getMockBuilder(StorageAdapterInterface::class)->getMock();
$donationEntity = new DonationEntity();
$form = $this->getMockBuilder(Form::class)->getMock();
$eventManager = new EventManager();
$controller = new DefaultController($donationGateway,$formAdapter,$storageAdapter,$donationEntity,$form,$eventManager,$config);

$request = new Request();
$request->setMethod(Request::METHOD_POST);
$request->setPost(new Parameters(['mydata'=>'foo']));
$event = new MvcEvent();
$event->setRouteMatch(new RouteMatch(['action'=>'index']));
$controller->setEvent($event);

// Assert form default state is NOT set
$formAdapter->expects($this->never())->method('setDefaultData');
// Assert nothing else happens
$formAdapter->expects($this->never())->method('hydrateEntity');
$formAdapter->expects($this->once())->method('hydrateForm')->with($form,$donationEntity,['mydata'=>'foo']);
$form->expects($this->once())->method('isValid')->willReturn(false);

$result = $controller->dispatch($request,new Response());

$this->assertInstanceOf(ViewModel::class,$result);
$this->assertSame($form,$result->getVariable('form'));
$this->assertSame('mytemplate',$result->getTemplate());
}

public function testDonate_ValidSubmission_PaymentGatewayError() {
$config = [
'views' => [
'form' => 'mytemplate',
]
];
$donationGateway = $this->getMockBuilder(DonationGateway::class)->disableOriginalConstructor()->getMock();
$formAdapter = $this->getMockBuilder(FormAdapterInterface::class)->getMock();
$storageAdapter = $this->getMockBuilder(StorageAdapterInterface::class)->getMock();
$donationEntity = new DonationEntity();
$form = $this->getMockBuilder(Form::class)->getMock();
$eventManager = new EventManager();
$listener = new EventListenerSpy();
$listener->attach($eventManager);
$controller = new DefaultController($donationGateway,$formAdapter,$storageAdapter,$donationEntity,$form,$eventManager,$config);

$request = new Request();
$request->setMethod(Request::METHOD_POST);
$request->setPost(new Parameters(['mydata'=>'foo']));
$event = new MvcEvent();
$event->setRouteMatch(new RouteMatch(['action'=>'index']));
$controller->setEvent($event);

$donation_result = new PaymentResultEntity();
$donation_result->errors = ['oh noe'];
// Assert form default state is NOT set
$formAdapter->expects($this->never())->method('setDefaultData');
$formAdapter->expects($this->once())->method('hydrateEntity')->with($form,$donationEntity);
$formAdapter->expects($this->once())->method('hydrateForm')->with($form,$donationEntity,['mydata'=>'foo']);
$form->expects($this->once())->method('getMessages')->willReturn([]);
$form->expects($this->once())->method('setMessages')->with(['cc'=>['number' => ['oh noe']]]);
$donationGateway->expects($this->once())->method('processDonation')->with($donationEntity)->willReturn($donation_result);
$form->expects($this->once())->method('isValid')->willReturn(true);

$result = $controller->dispatch($request,new Response());

$this->assertInstanceOf(ViewModel::class,$result);
$this->assertSame($form,$result->getVariable('form'));
$this->assertSame('mytemplate',$result->getTemplate());

$this->assertTrue($listener->hasEvent(DefaultController::EVENT_PROCESS_DONATION),'Process event was not triggered.');
$this->assertSame($donationEntity,$listener->getEvent(DefaultController::EVENT_PROCESS_DONATION)->getDonationEntity());
$this->assertSame($form,$listener->getEvent(DefaultController::EVENT_PROCESS_DONATION)->getDonationForm());

$this->assertTrue($listener->hasEvent(DefaultController::EVENT_STORE_DONATION),'Store event was not triggered.');
$this->assertSame($donationEntity,$listener->getEvent(DefaultController::EVENT_STORE_DONATION)->getDonationEntity());
$this->assertSame($form,$listener->getEvent(DefaultController::EVENT_STORE_DONATION)->getDonationForm());

$this->assertFalse($listener->hasEvent(DefaultController::EVENT_FINISH),'Finish event was triggered.');
}

public function testDonate_ValidSubmission_NoErrors() {
$config = [
'views' => [
'form' => 'mytemplate',
]
];
$donationGateway = $this->getMockBuilder(DonationGateway::class)->disableOriginalConstructor()->getMock();
$formAdapter = $this->getMockBuilder(FormAdapterInterface::class)->getMock();
$storageAdapter = $this->getMockBuilder(StorageAdapterInterface::class)->getMock();
$donationEntity = new DonationEntity();
$form = $this->getMockBuilder(Form::class)->getMock();
$eventManager = new EventManager();
$listener = new EventListenerSpy();
$listener->attach($eventManager);
$controller = new DefaultController($donationGateway,$formAdapter,$storageAdapter,$donationEntity,$form,$eventManager,$config);

$request = new Request();
$request->setMethod(Request::METHOD_POST);
$request->setPost(new Parameters(['mydata'=>'foo']));
$event = new MvcEvent();
$event->setRouteMatch(new RouteMatch(['action'=>'index']));
$controller->setEvent($event);

$donation_result = new PaymentResultEntity();
$formAdapter->expects($this->never())->method('setDefaultData');
$formAdapter->expects($this->once())->method('hydrateEntity')->with($form,$donationEntity);
$formAdapter->expects($this->once())->method('hydrateForm')->with($form,$donationEntity,['mydata'=>'foo']);
$form->expects($this->never())->method('getMessages');
$form->expects($this->never())->method('setMessages');
$donationGateway->expects($this->once())->method('processDonation')->with($donationEntity)->willReturn($donation_result);
$form->expects($this->once())->method('isValid')->willReturn(true);

$result = $controller->dispatch($request,new Response());
$this->assertInstanceOf(ViewModel::class,$result);
$this->assertSame('yep',$result->getVariable('myresult'));

$this->assertTrue($listener->hasEvent(DefaultController::EVENT_PROCESS_DONATION),'Process event was not triggered.');
$this->assertSame($donationEntity,$listener->getEvent(DefaultController::EVENT_PROCESS_DONATION)->getDonationEntity());
$this->assertSame($form,$listener->getEvent(DefaultController::EVENT_PROCESS_DONATION)->getDonationForm());

$this->assertTrue($listener->hasEvent(DefaultController::EVENT_STORE_DONATION),'Store event was not triggered.');
$this->assertSame($donationEntity,$listener->getEvent(DefaultController::EVENT_STORE_DONATION)->getDonationEntity());
$this->assertSame($form,$listener->getEvent(DefaultController::EVENT_STORE_DONATION)->getDonationForm());

$this->assertTrue($listener->hasEvent(DefaultController::EVENT_FINISH),'Finish event was not triggered.');
$this->assertSame($donationEntity,$listener->getEvent(DefaultController::EVENT_FINISH)->getDonationEntity());
$this->assertSame($form,$listener->getEvent(DefaultController::EVENT_FINISH)->getDonationForm());
}

public function testConfirmationAction() {
$config = [
'views' => [
'thank_you' => 'mytemplate',
]
];
$donationGateway = $this->getMockBuilder(DonationGateway::class)->disableOriginalConstructor()->getMock();
$formAdapter = $this->getMockBuilder(FormAdapterInterface::class)->getMock();
$storageAdapter = $this->getMockBuilder(StorageAdapterInterface::class)->getMock();
$donationEntity = new DonationEntity();
$form = new Form();
$eventManager = new EventManager();
$controller = new DefaultController($donationGateway,$formAdapter,$storageAdapter,$donationEntity,$form,$eventManager,$config);

$request = new Request();
$request->setQuery(new Parameters([
'amount' => '12.34',
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'myemail',
]));
$event = new MvcEvent();
$event->setRouteMatch(new RouteMatch(['action'=>'confirmation']));
$controller->setEvent($event);
$result = $controller->dispatch($request,new Response());

$this->assertInstanceOf(ViewModel::class,$result);
$this->assertSame('12.34',$result->getVariable('amount'));
$this->assertSame('John',$result->getVariable('first_name'));
$this->assertSame('Doe',$result->getVariable('last_name'));
$this->assertSame('myemail',$result->getVariable('email'));
$this->assertSame('mytemplate',$result->getTemplate());
}
}
38 changes: 38 additions & 0 deletions tests/ZfDonateTest/Controller/TestAsset/EventListenerSpy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php
namespace ZfDonateTest\Controller\TestAsset;

use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\View\Model\ViewModel;
use ZfDonate\Controller\DefaultController;
use ZfDonate\Event\DonationEvent;

class EventListenerSpy extends AbstractListenerAggregate {
private $events;

public function attach(EventManagerInterface $events, $priority = 1) {
$events->attach(DefaultController::EVENT_PROCESS_DONATION,[$this,'onProcess']);
$events->attach(DefaultController::EVENT_STORE_DONATION,[$this,'onStore']);
$events->attach(DefaultController::EVENT_FINISH,[$this,'onFinish']);
}

public function onProcess(DonationEvent $event) {
$this->events[DefaultController::EVENT_PROCESS_DONATION] = clone $event;
}
public function onStore(DonationEvent $event) {
$this->events[DefaultController::EVENT_STORE_DONATION] = clone $event;
}
public function onFinish(DonationEvent $event) {
$this->events[DefaultController::EVENT_FINISH] = clone $event;
$event->stopPropagation();
return new ViewModel(['myresult'=>'yep']);
}
public function hasEvent(string $name) : bool {
return isset($this->events[$name]);
}

public function getEvent(string $name) {
return $this->events[$name];
}
}
4 changes: 4 additions & 0 deletions tests/ZfDonateTest/Model/Adapter/DefaultFormAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
use ZfDonate\Model\DonationEntity;

class DefaultFormAdapterTest extends \PHPUnit_Framework_TestCase {

/**
* @covers \ZfDonate\Model\Adapter\DefaultFormAdapter::setDefaultData
*/
public function testHydrateForm() {
$entity = new DonationEntity();
$form = $this->getForm();
Expand Down

0 comments on commit 05f005e

Please sign in to comment.