summaryrefslogtreecommitdiffstats
path: root/tests/Controller/RouteActionTest.php
blob: 30f1923aa4368797a648d23fa580463e1e4754bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php

require_once dirname(__DIR__) . '/support/TestController.php';

use Jasny\Controller\RouteAction;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

class RouteActionTest extends PHPUnit_Framework_TestCase
{
    /**
     * Test running controller action
     *
     * @dataProvider runProvider
     * @param [type] $[name] [<description>]
     */
    public function testRun($route, $positive)
    {
        $controller = new TestController();
        $request = $this->createMock(ServerRequestInterface::class);
        $response = $this->createMock(ResponseInterface::class);

        $request->method('getAttribute')->with($this->equalTo('route'))->will($this->returnValue($route));

        if (!$positive) $this->expectException(\RuntimeException::class);

        $result = $controller($request, $response);
        $args = !empty($route->args) ? $route->args : [$route->param1, isset($route->param2) ? $route->param2 : 'defaultValue'];

        $this->assertEquals(get_class($response), get_class($result), "Controller should return 'ResponseInterface' instance");
        $this->assertTrue($result->actionCalled, "Controller action was not called");
        $this->assertEquals($args[0], $result->param1, "First route parameter was not passed correctly");
        $this->assertEquals($args[1], $result->param2, "Second route parameter was not passed correctly");
    }

    /**
     * Provide data for testing run method
     */
    public function runProvider()
    {
        return [
            [(object)['controller' => 'TestController'], false],
            [(object)['controller' => 'TestController', 'action' => 'nonExistMethod'], false],
            [(object)['controller' => 'TestController', 'action' => 'test-run'], false],
            [(object)['controller' => 'TestController', 'action' => 'test-run', 'param2' => 'value2'], false],
            [(object)['controller' => 'TestController', 'action' => 'test-run', 'param1' => 'value1'], true],
            [(object)['controller' => 'TestController', 'action' => 'test-run', 'param1' => 'value1', 'param2' => 'value2'], true],
            [(object)['controller' => 'TestController', 'action' => 'test-run', 'args' => ['value1', 'value2']], true]
        ];
    }

    /**
     * Test running controller without setting request and response
     */
    public function testRunNoRequest()
    {
        $controller = new TestController();

        $this->expectException(\RuntimeException::class);

        $controller->run();
    }
}