heisencache-8.x-1.x-dev/src/Heisencache/tests/EventEmitterTest.php

src/Heisencache/tests/EventEmitterTest.php
<?php
/**
 * @file
 * Test the EventEmitter class.
 *
 * @author: Frederic G. MARAND <fgm@osinet.fr>
 *
 * @copyright (c) 2013-2014 Ouest Systèmes Informatiques (OSInet).
 *
 * @license General Public License version 2 or later
 */

namespace Drupal\heisencache\tests;

use Drupal\heisencache\EventEmitter;
use PHPUnit\Framework\TestCase;

class EventEmitterTest extends TestCase {

  const SUBSCRIBER_CLASS = 'Drupal\heisencache\DebugSubscriber';
  const CHANNEL = "some channel";

  /**
   * @param array $events
   * @param null $class
   *
   * @return \Drupal\heisencache\tests\MockEventSubscriberInterface
   */
  protected function getMockSubscriber(array $events, $class = NULL) {
    static $sequence = 0;

    if (!isset($class)) {
      $class = "MockSubscriber$sequence";
      $sequence++;
    }

    $subscriber = $this->getMock(self::SUBSCRIBER_CLASS, $events, array(), $class, FALSE);
    return $subscriber;
  }

  public function testOnSingleSubscriberSingleEvent() {
    $event1 = 'event1';
    $emitter = new EventEmitter();

    $subscriber = $this->getMockSubscriber(array($event1));

    try {
      $emitter->on($event1, $subscriber);
    }
    catch (\Exception $e) {
      $this->fail('Passing a subscriber to on() does not throw an exception.');
    }

    $actual = $emitter->getSubscribersByEventName($event1);
    $this->assertInternalType('array', $actual, "getSubscribersByEventName() returns an array.");
    $this->assertEquals(count($actual), 1, "Exactly 1 subscriber returned for event.");
    $this->assertEquals(reset($actual), $subscriber, "Single subscriber on event is returned correctly.");

    try {
      $emitter->on($event1, $subscriber);
    }
    catch (\Exception $e) {
      $this->fail('Passing the same subscriber twice to on() does not throw an exception.');
    }
  }

  public function testOnSingleSubscriberInvalidEvent() {
    $event1 = 'event1';
    $event2 = 'event2';
    $emitter = new EventEmitter();

    $subscriber = $this->getMockSubscriber(array($event1));

    try {
      $emitter->on($event2, $subscriber);
      $this->fail('Passing a subscriber to on() throws an exception.');
    }
    catch (\InvalidArgumentException $e) {
    }
  }

  public function testOnSingleSubscriberTwoEvents() {
    $event1 = 'event1';
    $event2 = 'event2';
    $emitter = new EventEmitter();

    $subscriber = $this->getMockSubscriber(array($event1, $event2));

    try {
      $emitter->on($event1, $subscriber);
    }
    catch (\Exception $e) {
      $this->fail('Passing a subscriber to on() does not throw an exception.');
      }

    $actual = $emitter->getSubscribersByEventName($event1);
    $this->assertInternalType('array', $actual, "getSubscribersByEventName() returns an array.");
    $this->assertEquals(count($actual), 1, "Exactly 1 subscriber returned for first event.");
    $this->assertEquals(reset($actual), $subscriber, "Single subscriber on first event is returned correctly.");

    try {
      $emitter->on($event2, $subscriber);
    }
    catch (\Exception $e) {
      echo "Exception: " . $e->getMessage() . "\n";
      $this->fail('Passing the same subscriber to on() for a second event does not throw an exception.');
    }
    $actual = $emitter->getSubscribersByEventName($event2);
    $this->assertInternalType('array', $actual, "getSubscribersByEventName() returns an array.");
    $this->assertEquals(count($actual), 1, "Exactly 1 subscriber returned for second event.");
    $this->assertEquals(reset($actual), $subscriber, "Single subscriber on second event is returned correctly.");
  }

  public function testOnTwoSubscribersSingleEvent() {
    $event1 = 'event1';
    $emitter = new EventEmitter();

    $sub1 = $this->getMockSubscriber(array($event1));
    $sub2 = $this->getMockSubscriber(array($event1));

    try {
      $emitter->on($event1, $sub1);
    }
    catch (\Exception $e) {
      $this->fail('Passing a subscriber to on() does not throw an exception.');
    }

    $actual = $emitter->getSubscribersByEventName($event1);
    $this->assertInternalType('array', $actual, "getSubscribersByEventName() returns an array.");
    $this->assertEquals(count($actual), 1, "Exactly 1 subscriber returned for event.");
    $this->assertEquals(reset($actual), $sub1, "Single subscriber on first event is returned correctly.");

    try {
      $emitter->on($event1, $sub2);
    }
    catch (\Exception $e) {
      $this->fail('Passing a different subscriber to on() for the same event does not throw an exception.');
    }

    $actual = $emitter->getSubscribersByEventName($event1);
    $this->assertInternalType('array', $actual, "getSubscribersByEventName() returns an array.");
    $this->assertEquals(count($actual), 2, "Exactly 2 subscribers returned for event.");

    $this->assertTrue(in_array($sub1, $actual), "First subscriber on event is returned correctly.");
    $this->assertTrue(in_array($sub2, $actual), "Second subscriber on event is returned correctly.");
  }

  public function testRegister() {
    $event1 = 'event1';
    $event2 = 'event2';
    $events = array($event1, $event2);
    $mocked = array_merge($events, array('getSubscribedEvents'));

    $subscriber = $this->getMockSubscriber($mocked);
    $subscriber->expects($this->once())
      ->method('getSubscribedEvents')
      ->will($this->returnValue($events));

    $emitter = new EventEmitter();
    $emitter->register($subscriber);

    foreach ($events as $eventName) {
      $actual = $emitter->getSubscribersByEventName($eventName);
      $this->assertTrue(in_array($subscriber, $actual));
    }
  }

  public function testEmitHappy() {
    $event1 = 'event1';
    $emitter = new EventEmitter();

    $subscriber = $this->getMockSubscriber(array($event1));
    $subscriber->expects($this->once())
      ->method($event1);
    $emitter->on($event1, $subscriber);

    $emitter->emit($event1, self::CHANNEL);
  }

  /**
   * Test an event emitted without any listener at all.
   */
  public function testEmitSadNoSubscriber() {
    $event1 = 'event1';
    $emitter = new EventEmitter();

    // No subscriber: no one should be notified.
    $notified = $emitter->emit($event1, self::CHANNEL);
    $this->assertEquals(0, $notified);
  }

  /**
   * Test an event emitted without any listener on the event.
   */
  public function testEmitSadOtherSubscriber() {
    $event1 = 'event1';
    $event2 = 'event2';
    $emitter = new EventEmitter();

    $subscriber = $this->getMockSubscriber(array($event1));
    // Not called because this event is not the one being emitted.
    $subscriber->expects($this->never())
      ->method($event1);
    // Not called because this event is not the one being subscribed.
    $subscriber->expects($this->never())
      ->method($event2);

    // Subscriber is on event1, so no one should be notified on emit(event2).
    $listener_count = $emitter->on($event1, $subscriber);
    $this->assertEquals(1, $listener_count);

    $notified_count = $emitter->emit($event2, self::CHANNEL);
    $this->assertEquals(0, $notified_count);
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc