From bb1126914632aef439de7bff4bba5dc633409981 Mon Sep 17 00:00:00 2001
From: Alejandro Celaya <alejandro@alejandrocelaya.com>
Date: Sun, 1 May 2016 13:36:23 +0200
Subject: [PATCH] Added more tests

---
 src/Middleware/CliParamsMiddleware.php        |  9 +-
 .../Factory/CliParamsMiddlewareFactory.php    |  5 +-
 tests/Middleware/CliParamsMiddlewareTest.php  | 91 +++++++++++++++++++
 .../CliParamsMiddlewareFactoryTest.php        | 29 ++++++
 4 files changed, 131 insertions(+), 3 deletions(-)
 create mode 100644 tests/Middleware/CliParamsMiddlewareTest.php
 create mode 100644 tests/Middleware/Factory/CliParamsMiddlewareFactoryTest.php

diff --git a/src/Middleware/CliParamsMiddleware.php b/src/Middleware/CliParamsMiddleware.php
index da243a15..683a8e86 100644
--- a/src/Middleware/CliParamsMiddleware.php
+++ b/src/Middleware/CliParamsMiddleware.php
@@ -12,10 +12,15 @@ class CliParamsMiddleware implements MiddlewareInterface
      * @var array
      */
     private $argv;
+    /**
+     * @var
+     */
+    private $currentSapi;
 
-    public function __construct(array $argv)
+    public function __construct(array $argv, $currentSapi)
     {
         $this->argv = $argv;
+        $this->currentSapi = $currentSapi;
     }
 
     /**
@@ -46,7 +51,7 @@ class CliParamsMiddleware implements MiddlewareInterface
     public function __invoke(Request $request, Response $response, callable $out = null)
     {
         // When not in CLI, just call next middleware
-        if (php_sapi_name() !== 'cli') {
+        if ($this->currentSapi !== 'cli') {
             return $out($request, $response);
         }
 
diff --git a/src/Middleware/Factory/CliParamsMiddlewareFactory.php b/src/Middleware/Factory/CliParamsMiddlewareFactory.php
index b806cbeb..9be7f52e 100644
--- a/src/Middleware/Factory/CliParamsMiddlewareFactory.php
+++ b/src/Middleware/Factory/CliParamsMiddlewareFactory.php
@@ -24,6 +24,9 @@ class CliParamsMiddlewareFactory implements FactoryInterface
      */
     public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
-        return new CliParamsMiddleware(isset($_SERVER['argv']) ? $_SERVER['argv'] : []);
+        return new CliParamsMiddleware(
+            isset($_SERVER['argv']) ? $_SERVER['argv'] : [],
+            php_sapi_name()
+        );
     }
 }
diff --git a/tests/Middleware/CliParamsMiddlewareTest.php b/tests/Middleware/CliParamsMiddlewareTest.php
new file mode 100644
index 00000000..e07d05c0
--- /dev/null
+++ b/tests/Middleware/CliParamsMiddlewareTest.php
@@ -0,0 +1,91 @@
+<?php
+namespace AcelayaTest\UrlShortener\Middleware;
+
+use Acelaya\UrlShortener\Middleware\CliParamsMiddleware;
+use PHPUnit_Framework_TestCase as TestCase;
+use Psr\Http\Message\ServerRequestInterface;
+use Zend\Diactoros\Response;
+use Zend\Diactoros\ServerRequestFactory;
+use Zend\Expressive\Router\RouteResult;
+
+class CliParamsMiddlewareTest extends TestCase
+{
+    /**
+     * @test
+     */
+    public function nonCliRequestsJustInvokeNextMiddleware()
+    {
+        $middleware = new CliParamsMiddleware([], 'non-cli');
+
+        $invoked = false;
+        $originalResponse = new Response();
+
+        $response = $middleware->__invoke(
+            ServerRequestFactory::fromGlobals(),
+            $originalResponse,
+            function ($req, $resp) use (&$invoked) {
+                $invoked = true;
+                return $resp;
+            }
+        );
+
+        $this->assertSame($originalResponse, $response);
+        $this->assertTrue($invoked);
+    }
+
+    /**
+     * @test
+     */
+    public function nonSuccessRouteResultJustInvokesNextMiddleware()
+    {
+        $middleware = new CliParamsMiddleware([], 'cli');
+
+        $invoked = false;
+        $originalResponse = new Response();
+        $routeResult = $this->prophesize(RouteResult::class);
+        $routeResult->isSuccess()->willReturn(false)->shouldBeCalledTimes(1);
+
+        $response = $middleware->__invoke(
+            ServerRequestFactory::fromGlobals()->withAttribute(RouteResult::class, $routeResult->reveal()),
+            $originalResponse,
+            function ($req, $resp) use (&$invoked) {
+                $invoked = true;
+                return $resp;
+            }
+        );
+
+        $this->assertSame($originalResponse, $response);
+        $this->assertTrue($invoked);
+    }
+
+    /**
+     * @test
+     */
+    public function properRouteWillInjectAttributeInResponse()
+    {
+        $expectedLongUrl = 'http://www.google.com';
+        $middleware = new CliParamsMiddleware(['foo', 'bar', $expectedLongUrl], 'cli');
+
+        $invoked = false;
+        $originalResponse = new Response();
+        $routeResult = $this->prophesize(RouteResult::class);
+        $routeResult->isSuccess()->willReturn(true)->shouldBeCalledTimes(1);
+        $routeResult->getMatchedRouteName()->willReturn('cli-generate-shortcode')->shouldBeCalledTimes(1);
+        /** @var ServerRequestInterface $request */
+        $request = null;
+
+        $response = $middleware->__invoke(
+            ServerRequestFactory::fromGlobals()->withAttribute(RouteResult::class, $routeResult->reveal()),
+            $originalResponse,
+            function ($req, $resp) use (&$invoked, &$request) {
+                $invoked = true;
+                $request = $req;
+                return $resp;
+            }
+        );
+
+        $this->assertSame($originalResponse, $response);
+        $this->assertEquals($expectedLongUrl, $request->getAttribute('longUrl'));
+        $this->assertTrue($invoked);
+    }
+}
diff --git a/tests/Middleware/Factory/CliParamsMiddlewareFactoryTest.php b/tests/Middleware/Factory/CliParamsMiddlewareFactoryTest.php
new file mode 100644
index 00000000..3fad4bab
--- /dev/null
+++ b/tests/Middleware/Factory/CliParamsMiddlewareFactoryTest.php
@@ -0,0 +1,29 @@
+<?php
+namespace AcelayaTest\UrlShortener\Middleware\Factory;
+
+use Acelaya\UrlShortener\Middleware\CliParamsMiddleware;
+use Acelaya\UrlShortener\Middleware\Factory\CliParamsMiddlewareFactory;
+use PHPUnit_Framework_TestCase as TestCase;
+use Zend\ServiceManager\ServiceManager;
+
+class CliParamsMiddlewareFactoryTest extends TestCase
+{
+    /**
+     * @var CliParamsMiddlewareFactory
+     */
+    protected $factory;
+
+    public function setUp()
+    {
+        $this->factory = new CliParamsMiddlewareFactory();
+    }
+
+    /**
+     * @test
+     */
+    public function serviceIsCreated()
+    {
+        $instance = $this->factory->__invoke(new ServiceManager(), '');
+        $this->assertInstanceOf(CliParamsMiddleware::class, $instance);
+    }
+}