273 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			273 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Illuminate\Support\Testing\Fakes;
 | 
						|
 | 
						|
use Closure;
 | 
						|
use Illuminate\Contracts\Events\Dispatcher;
 | 
						|
use Illuminate\Support\Arr;
 | 
						|
use Illuminate\Support\Traits\ReflectsClosures;
 | 
						|
use PHPUnit\Framework\Assert as PHPUnit;
 | 
						|
 | 
						|
class EventFake implements Dispatcher
 | 
						|
{
 | 
						|
    use ReflectsClosures;
 | 
						|
 | 
						|
    /**
 | 
						|
     * The original event dispatcher.
 | 
						|
     *
 | 
						|
     * @var \Illuminate\Contracts\Events\Dispatcher
 | 
						|
     */
 | 
						|
    protected $dispatcher;
 | 
						|
 | 
						|
    /**
 | 
						|
     * The event types that should be intercepted instead of dispatched.
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $eventsToFake;
 | 
						|
 | 
						|
    /**
 | 
						|
     * All of the events that have been intercepted keyed by type.
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $events = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create a new event fake instance.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Contracts\Events\Dispatcher  $dispatcher
 | 
						|
     * @param  array|string  $eventsToFake
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function __construct(Dispatcher $dispatcher, $eventsToFake = [])
 | 
						|
    {
 | 
						|
        $this->dispatcher = $dispatcher;
 | 
						|
 | 
						|
        $this->eventsToFake = Arr::wrap($eventsToFake);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Assert if an event was dispatched based on a truth-test callback.
 | 
						|
     *
 | 
						|
     * @param  string|\Closure  $event
 | 
						|
     * @param  callable|int|null  $callback
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function assertDispatched($event, $callback = null)
 | 
						|
    {
 | 
						|
        if ($event instanceof Closure) {
 | 
						|
            [$event, $callback] = [$this->firstClosureParameterType($event), $event];
 | 
						|
        }
 | 
						|
 | 
						|
        if (is_int($callback)) {
 | 
						|
            return $this->assertDispatchedTimes($event, $callback);
 | 
						|
        }
 | 
						|
 | 
						|
        PHPUnit::assertTrue(
 | 
						|
            $this->dispatched($event, $callback)->count() > 0,
 | 
						|
            "The expected [{$event}] event was not dispatched."
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Assert if an event was dispatched a number of times.
 | 
						|
     *
 | 
						|
     * @param  string  $event
 | 
						|
     * @param  int  $times
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function assertDispatchedTimes($event, $times = 1)
 | 
						|
    {
 | 
						|
        $count = $this->dispatched($event)->count();
 | 
						|
 | 
						|
        PHPUnit::assertSame(
 | 
						|
            $times, $count,
 | 
						|
            "The expected [{$event}] event was dispatched {$count} times instead of {$times} times."
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Determine if an event was dispatched based on a truth-test callback.
 | 
						|
     *
 | 
						|
     * @param  string|\Closure  $event
 | 
						|
     * @param  callable|null  $callback
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function assertNotDispatched($event, $callback = null)
 | 
						|
    {
 | 
						|
        if ($event instanceof Closure) {
 | 
						|
            [$event, $callback] = [$this->firstClosureParameterType($event), $event];
 | 
						|
        }
 | 
						|
 | 
						|
        PHPUnit::assertCount(
 | 
						|
            0, $this->dispatched($event, $callback),
 | 
						|
            "The unexpected [{$event}] event was dispatched."
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get all of the events matching a truth-test callback.
 | 
						|
     *
 | 
						|
     * @param  string  $event
 | 
						|
     * @param  callable|null  $callback
 | 
						|
     * @return \Illuminate\Support\Collection
 | 
						|
     */
 | 
						|
    public function dispatched($event, $callback = null)
 | 
						|
    {
 | 
						|
        if (! $this->hasDispatched($event)) {
 | 
						|
            return collect();
 | 
						|
        }
 | 
						|
 | 
						|
        $callback = $callback ?: function () {
 | 
						|
            return true;
 | 
						|
        };
 | 
						|
 | 
						|
        return collect($this->events[$event])->filter(function ($arguments) use ($callback) {
 | 
						|
            return $callback(...$arguments);
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Determine if the given event has been dispatched.
 | 
						|
     *
 | 
						|
     * @param  string  $event
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function hasDispatched($event)
 | 
						|
    {
 | 
						|
        return isset($this->events[$event]) && ! empty($this->events[$event]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Register an event listener with the dispatcher.
 | 
						|
     *
 | 
						|
     * @param  string|array  $events
 | 
						|
     * @param  mixed  $listener
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function listen($events, $listener)
 | 
						|
    {
 | 
						|
        $this->dispatcher->listen($events, $listener);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Determine if a given event has listeners.
 | 
						|
     *
 | 
						|
     * @param  string  $eventName
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function hasListeners($eventName)
 | 
						|
    {
 | 
						|
        return $this->dispatcher->hasListeners($eventName);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Register an event and payload to be dispatched later.
 | 
						|
     *
 | 
						|
     * @param  string  $event
 | 
						|
     * @param  array  $payload
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function push($event, $payload = [])
 | 
						|
    {
 | 
						|
        //
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Register an event subscriber with the dispatcher.
 | 
						|
     *
 | 
						|
     * @param  object|string  $subscriber
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function subscribe($subscriber)
 | 
						|
    {
 | 
						|
        $this->dispatcher->subscribe($subscriber);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Flush a set of pushed events.
 | 
						|
     *
 | 
						|
     * @param  string  $event
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function flush($event)
 | 
						|
    {
 | 
						|
        //
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Fire an event and call the listeners.
 | 
						|
     *
 | 
						|
     * @param  string|object  $event
 | 
						|
     * @param  mixed  $payload
 | 
						|
     * @param  bool  $halt
 | 
						|
     * @return array|null
 | 
						|
     */
 | 
						|
    public function dispatch($event, $payload = [], $halt = false)
 | 
						|
    {
 | 
						|
        $name = is_object($event) ? get_class($event) : (string) $event;
 | 
						|
 | 
						|
        if ($this->shouldFakeEvent($name, $payload)) {
 | 
						|
            $this->events[$name][] = func_get_args();
 | 
						|
        } else {
 | 
						|
            return $this->dispatcher->dispatch($event, $payload, $halt);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Determine if an event should be faked or actually dispatched.
 | 
						|
     *
 | 
						|
     * @param  string  $eventName
 | 
						|
     * @param  mixed  $payload
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    protected function shouldFakeEvent($eventName, $payload)
 | 
						|
    {
 | 
						|
        if (empty($this->eventsToFake)) {
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        return collect($this->eventsToFake)
 | 
						|
            ->filter(function ($event) use ($eventName, $payload) {
 | 
						|
                return $event instanceof Closure
 | 
						|
                            ? $event($eventName, $payload)
 | 
						|
                            : $event === $eventName;
 | 
						|
            })
 | 
						|
            ->isNotEmpty();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Remove a set of listeners from the dispatcher.
 | 
						|
     *
 | 
						|
     * @param  string  $event
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function forget($event)
 | 
						|
    {
 | 
						|
        //
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Forget all of the queued listeners.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function forgetPushed()
 | 
						|
    {
 | 
						|
        //
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Dispatch an event and call the listeners.
 | 
						|
     *
 | 
						|
     * @param  string|object  $event
 | 
						|
     * @param  mixed  $payload
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function until($event, $payload = [])
 | 
						|
    {
 | 
						|
        return $this->dispatch($event, $payload, true);
 | 
						|
    }
 | 
						|
}
 |