Passed
Pull Request — master (#306)
by Tobias
02:05
created

MiddlewareChainTest   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 56
rs 10
c 0
b 0
f 0
wmc 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getHttpClients() 0 6 1
B testChainOrder() 0 43 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Buzz\Test\Functional;
6
7
use Buzz\Browser;
8
use Buzz\Client\AbstractClient;
9
use Buzz\Middleware\MiddlewareInterface;
10
use Http\Client\Tests\PHPUnitUtility;
11
use Nyholm\Psr7\Request;
12
use PHPUnit\Framework\TestCase;
13
use Psr\Http\Message\RequestInterface;
14
use Psr\Http\Message\ResponseInterface;
15
16
/**
17
 * @author Tobias Nyholm <[email protected]>
18
 */
19
class MiddlewareChainTest extends TestCase
20
{
21
    /**
22
     * @dataProvider getHttpClients
23
     */
24
    public function testChainOrder(AbstractClient $client)
25
    {
26
        MyMiddleware::$hasBeenHandled = false;
27
        MyMiddleware::$handleCount = 0;
28
29
        $browser = new Browser($client);
30
        $browser->addMiddleware(new MyMiddleware(
31
            function () {
32
                ++MyMiddleware::$handleCount;
33
                MyMiddleware::$hasBeenHandled = true;
34
                $this->assertEquals(1, MyMiddleware::$handleCount);
35
            },
36
            function () {
37
                $this->assertEquals(1, MyMiddleware::$handleCount);
38
                --MyMiddleware::$handleCount;
39
            }
40
        ));
41
        $browser->addMiddleware(new MyMiddleware(
42
            function () {
43
                ++MyMiddleware::$handleCount;
44
                $this->assertEquals(2, MyMiddleware::$handleCount);
45
            },
46
            function () {
47
                $this->assertEquals(2, MyMiddleware::$handleCount);
48
                --MyMiddleware::$handleCount;
49
            }
50
        ));
51
        $browser->addMiddleware(new MyMiddleware(
52
            function () {
53
                ++MyMiddleware::$handleCount;
54
                $this->assertEquals(3, MyMiddleware::$handleCount);
55
            },
56
            function () {
57
                $this->assertEquals(3, MyMiddleware::$handleCount);
58
                --MyMiddleware::$handleCount;
59
            }
60
        ));
61
62
        $request = new Request('GET', PHPUnitUtility::getUri());
63
        $browser->sendRequest($request);
64
65
        $this->assertEquals(0, MyMiddleware::$handleCount);
66
        $this->assertTrue(MyMiddleware::$hasBeenHandled);
67
    }
68
69
    public function getHttpClients()
70
    {
71
        return [
72
            [new \Buzz\Client\MultiCurl()],
73
            [new \Buzz\Client\FileGetContents()],
74
            [new \Buzz\Client\Curl()],
75
        ];
76
    }
77
}
78
79
/**
80
 * A test class to verify the correctness of the middleware chain.
81
 */
82
class MyMiddleware implements MiddlewareInterface
83
{
84
    public static $handleCount = 0;
85
    public static $hasBeenHandled = false;
86
87
    /** @var callable */
88
    private $requestCallable;
89
90
    /** @var callable */
91
    private $responseCallable;
92
93
    /**
94
     * @param callable $requestCallable
95
     * @param callable $responseCallable
96
     */
97
    public function __construct(callable $requestCallable, callable $responseCallable)
98
    {
99
        $this->requestCallable = $requestCallable;
100
        $this->responseCallable = $responseCallable;
101
    }
102
103
    public function handleRequest(RequestInterface $request, callable $next)
104
    {
105
        call_user_func($this->requestCallable, $request);
106
107
        return $next($request);
108
    }
109
110
    public function handleResponse(RequestInterface $request, ResponseInterface $response, callable $next)
111
    {
112
        call_user_func($this->responseCallable, $request, $request);
113
114
        return $next($request, $response);
115
    }
116
}
117