Update tests to mock event subscribers not mailers

This commit is contained in:
Thibaud Fabre
2016-05-12 14:22:49 +02:00
parent 5495c4b507
commit 4ae762657e
3 changed files with 43 additions and 16 deletions

View File

@@ -12,6 +12,7 @@
namespace Alchemy\Phrasea\Core\Provider; namespace Alchemy\Phrasea\Core\Provider;
use Alchemy\Phrasea\Core\Event\Subscriber\OrderSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\OrderSubscriber;
use Alchemy\Phrasea\Model\Entities\Order;
use Alchemy\Phrasea\Order\ValidationNotifier\MailNotifier; use Alchemy\Phrasea\Order\ValidationNotifier\MailNotifier;
use Alchemy\Phrasea\Order\ValidationNotifier\WebhookNotifier; use Alchemy\Phrasea\Order\ValidationNotifier\WebhookNotifier;
use Alchemy\Phrasea\Order\ValidationNotifierRegistry; use Alchemy\Phrasea\Order\ValidationNotifierRegistry;
@@ -32,8 +33,8 @@ class OrderServiceProvider implements ServiceProviderInterface
$this['events.order_subscriber'] = $app->share(function (Application $app) { $this['events.order_subscriber'] = $app->share(function (Application $app) {
$notifierRegistry = new ValidationNotifierRegistry(); $notifierRegistry = new ValidationNotifierRegistry();
$notifierRegistry->registerNotifier('mail', new MailNotifier($app)); $notifierRegistry->registerNotifier(Order::NOTIFY_MAIL, new MailNotifier($app));
$notifierRegistry->registerNotifier('webhook', new WebhookNotifier($app['manipulator.webhook-event'])); $notifierRegistry->registerNotifier(Order::NOTIFY_WEBHOOK, new WebhookNotifier($app['manipulator.webhook-event']));
return new OrderSubscriber($notifierRegistry); return new OrderSubscriber($notifierRegistry);
}); });

View File

@@ -20,13 +20,11 @@ class OrderTest extends \PhraseanetAuthenticatedWebTestCase
{ {
$app = $this->getApplication(); $app = $this->getApplication();
$app['notification.deliverer'] = $this->getMockBuilder(Deliverer::class)
->disableOriginalConstructor()
->getMock();
$triggered = false; $triggered = false;
$app['dispatcher']->addListener(PhraseaEvents::ORDER_CREATE, function (Event $event) use (&$triggered) { $app['dispatcher']->addListener(PhraseaEvents::ORDER_CREATE, function (Event $event) use (&$triggered) {
$triggered = true; $triggered = true;
}); });
$client = $this->getClient(); $client = $this->getClient();
$client->request('POST', '/prod/order/', [ $client->request('POST', '/prod/order/', [
'lst' => $this->getRecord1()->getId(), 'lst' => $this->getRecord1()->getId(),
@@ -45,9 +43,6 @@ class OrderTest extends \PhraseanetAuthenticatedWebTestCase
{ {
$app = $this->getApplication(); $app = $this->getApplication();
$app['notification.deliverer'] = $this->getMockBuilder(Deliverer::class)
->disableOriginalConstructor()
->getMock();
$triggered = false; $triggered = false;
$app['dispatcher']->addListener(PhraseaEvents::ORDER_CREATE, function (Event $event) use (&$triggered) { $app['dispatcher']->addListener(PhraseaEvents::ORDER_CREATE, function (Event $event) use (&$triggered) {
$triggered = true; $triggered = true;
@@ -90,37 +85,53 @@ class OrderTest extends \PhraseanetAuthenticatedWebTestCase
public function testSendOrder() public function testSendOrder()
{ {
$app = $this->getApplication();
$order = $this->createOneOrder('I need this pictures'); $order = $this->createOneOrder('I need this pictures');
$this->mockNotificationDeliverer('Alchemy\Phrasea\Notification\Mail\MailInfoOrderDelivered'); $triggered = false;
$this->mockUserNotificationSettings('eventsmanager_notify_orderdeliver'); $app['dispatcher']->addListener(PhraseaEvents::ORDER_DELIVER, function (Event $event) use (&$triggered) {
$triggered = true;
});
$parameters = []; $parameters = [];
foreach ($order->getElements() as $element) { foreach ($order->getElements() as $element) {
$parameters[] = $element->getId(); $parameters[] = $element->getId();
} }
$response = $this->request('POST', '/prod/order/' . $order->getId() . '/send/', ['elements' => $parameters]); $response = $this->request('POST', '/prod/order/' . $order->getId() . '/send/', ['elements' => $parameters]);
$this->assertTrue($triggered, 'Order delivered listener not triggered');
$this->assertTrue($response->isRedirect(), 'Could not validate some elements. not a redirect'); $this->assertTrue($response->isRedirect(), 'Could not validate some elements. not a redirect');
$url = parse_url($response->headers->get('location')); $url = parse_url($response->headers->get('location'));
parse_str($url['query']); parse_str($url['query']);
$this->assertTrue(strpos($url['query'], 'success=1') === 0, 'Validation of elements is not successful'); $this->assertTrue(strpos($url['query'], 'success=1') === 0, 'Validation of elements is not successful');
} }
public function testSendOrderJson() public function testSendOrderJson()
{ {
$app = $this->getApplication();
$order = $this->createOneOrder('I need this pictures'); $order = $this->createOneOrder('I need this pictures');
$this->mockNotificationDeliverer('Alchemy\Phrasea\Notification\Mail\MailInfoOrderDelivered'); $triggered = false;
$this->mockUserNotificationSettings('eventsmanager_notify_orderdeliver'); $app['dispatcher']->addListener(PhraseaEvents::ORDER_DELIVER, function (Event $event) use (&$triggered) {
$triggered = true;
});
$parameters = []; $parameters = [];
foreach ($order->getElements() as $element) { foreach ($order->getElements() as $element) {
$parameters[] = $element->getId(); $parameters[] = $element->getId();
} }
$response = $this->XMLHTTPRequest('POST', '/prod/order/' . $order->getId() . '/send/', ['elements' => $parameters]); $response = $this->XMLHTTPRequest('POST', '/prod/order/' . $order->getId() . '/send/', ['elements' => $parameters]);
$this->assertTrue($response->isOk()); $this->assertTrue($response->isOk());
$this->assertEquals('application/json', $response->headers->get('Content-Type')); $this->assertEquals('application/json', $response->headers->get('Content-Type'));
$this->assertTrue($triggered, 'Order delivered listener not triggered');
$content = json_decode($response->getContent()); $content = json_decode($response->getContent());
$this->assertTrue(is_object($content)); $this->assertTrue(is_object($content));
$this->assertObjectHasAttribute('success', $content, $response->getContent()); $this->assertObjectHasAttribute('success', $content, $response->getContent());
$this->assertTrue( ! ! $content->success, $response->getContent()); $this->assertTrue( ! ! $content->success, $response->getContent());
@@ -130,10 +141,13 @@ class OrderTest extends \PhraseanetAuthenticatedWebTestCase
public function testDenyOrder() public function testDenyOrder()
{ {
$app = $this->getApplication();
$order = $this->createOneOrder('I need this pictures'); $order = $this->createOneOrder('I need this pictures');
$this->mockNotificationDeliverer('Alchemy\Phrasea\Notification\Mail\MailInfoOrderCancelled'); $triggered = false;
$this->mockUserNotificationSettings('eventsmanager_notify_ordernotdelivered'); $app['dispatcher']->addListener(PhraseaEvents::ORDER_DENY, function (Event $event) use (&$triggered) {
$triggered = true;
});
$parameters = []; $parameters = [];
foreach ($order->getElements() as $element) { foreach ($order->getElements() as $element) {
@@ -141,7 +155,10 @@ class OrderTest extends \PhraseanetAuthenticatedWebTestCase
} }
$client = $this->getClient(); $client = $this->getClient();
$client->request('POST', '/prod/order/' . $order->getId() . '/deny/', ['elements' => $parameters]); $client->request('POST', '/prod/order/' . $order->getId() . '/deny/', ['elements' => $parameters]);
$this->assertTrue($client->getResponse()->isRedirect()); $this->assertTrue($client->getResponse()->isRedirect());
$this->assertTrue($triggered, 'Order denied listener not triggered');
$url = parse_url($client->getResponse()->headers->get('location')); $url = parse_url($client->getResponse()->headers->get('location'));
$var = []; $var = [];
parse_str($url['query'], $var); parse_str($url['query'], $var);
@@ -150,19 +167,27 @@ class OrderTest extends \PhraseanetAuthenticatedWebTestCase
public function testDenyOrderJson() public function testDenyOrderJson()
{ {
$app = $this->getApplication();
$order = $this->createOneOrder('I need this pictures'); $order = $this->createOneOrder('I need this pictures');
$this->mockNotificationDeliverer('Alchemy\Phrasea\Notification\Mail\MailInfoOrderCancelled'); $triggered = false;
$this->mockUserNotificationSettings('eventsmanager_notify_ordernotdelivered'); $app['dispatcher']->addListener(PhraseaEvents::ORDER_DENY, function (Event $event) use (&$triggered) {
$triggered = true;
});
$parameters = []; $parameters = [];
foreach ($order->getElements() as $element) { foreach ($order->getElements() as $element) {
$parameters[] = $element->getId(); $parameters[] = $element->getId();
} }
$response = $this->XMLHTTPRequest('POST', '/prod/order/' . $order->getId() . '/deny/', ['elements' => $parameters]); $response = $this->XMLHTTPRequest('POST', '/prod/order/' . $order->getId() . '/deny/', ['elements' => $parameters]);
$this->assertTrue($response->isOk()); $this->assertTrue($response->isOk());
$this->assertEquals('application/json', $response->headers->get('Content-Type')); $this->assertEquals('application/json', $response->headers->get('Content-Type'));
$this->assertTrue($triggered, 'Order denied listener not triggered');
$content = json_decode($response->getContent()); $content = json_decode($response->getContent());
$this->assertTrue(is_object($content)); $this->assertTrue(is_object($content));
$this->assertObjectHasAttribute('success', $content, $response->getContent()); $this->assertObjectHasAttribute('success', $content, $response->getContent());
$this->assertTrue( ! ! $content->success, $response->getContent()); $this->assertTrue( ! ! $content->success, $response->getContent());

View File

@@ -689,6 +689,7 @@ abstract class PhraseanetTestCase extends WebTestCase
self::$DI['app']['notification.deliverer'] = $this->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer') self::$DI['app']['notification.deliverer'] = $this->getMockBuilder('Alchemy\Phrasea\Notification\Deliverer')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
self::$DI['app']['notification.deliverer']->expects($this->exactly($qty)) self::$DI['app']['notification.deliverer']->expects($this->exactly($qty))
->method('deliver') ->method('deliver')
->with($this->isInstanceOf($expectedMail), $this->equalTo($receipt)); ->with($this->isInstanceOf($expectedMail), $this->equalTo($receipt));