Completed
Push — master ( 7271c2...50c06c )
by Jorge
01:54
created

GuzzleMiddlewareTest::aRequestToAService()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace JVelasco\CircuitBreaker\Adapters;
4
5
use GuzzleHttp\Client;
6
use GuzzleHttp\Handler\MockHandler;
7
use GuzzleHttp\Psr7\Request;
8
use GuzzleHttp\Psr7\Response;
9
use JVelasco\CircuitBreaker\CircuitBreaker;
10
use PHPUnit\Framework\TestCase;
11
12
final class GuzzleMiddlewareTest extends TestCase
13
{
14
    const RESOLVED_SERVICE_NAME = "service_8080";
15
16
    /** @test */
17
    public function it_delegates_on_next_handler()
18
    {
19
        $handlerResponse = new Response(200);
20
        $circuitBreaker = $this->prophesize(CircuitBreaker::class);
21
        $middleware = new GuzzleMiddleware(
22
            $circuitBreaker->reveal(),
23
            new MockHandler([$handlerResponse])
24
        );
25
26
        $client = new Client(['handler' => $middleware]);
27
28
        $circuitBreaker->isAvailable(self::RESOLVED_SERVICE_NAME)->willReturn(true);
29
        $circuitBreaker->reportSuccess(self::RESOLVED_SERVICE_NAME)->willReturn(null);
30
        $this->assertSame(
31
            $handlerResponse,
32
            $client->send($this->aRequestToAService()),
33
            "Delegates on handler"
34
        );
35
    }
36
37
    /** @test */
38
    public function it_reports_successes()
39
    {
40
        $handlerResponse = new Response(200);
41
        $circuitBreaker = $this->prophesize(CircuitBreaker::class);
42
        $middleware = new GuzzleMiddleware(
43
            $circuitBreaker->reveal(),
44
            new MockHandler([$handlerResponse])
45
        );
46
47
        $client = new Client(['handler' => $middleware]);
48
49
        $circuitBreaker->isAvailable(self::RESOLVED_SERVICE_NAME)->willReturn(true);
50
        $circuitBreaker->reportSuccess(self::RESOLVED_SERVICE_NAME)
51
            ->shouldBeCalledTimes(1);
52
53
        $client->send($this->aRequestToAService());
54
    }
55
56
    /** @test */
57
    public function it_reports_failed_request()
58
    {
59
        $handlerResponse = new Response(500);
60
        $circuitBreaker = $this->prophesize(CircuitBreaker::class);
61
        $middleware = new GuzzleMiddleware(
62
            $circuitBreaker->reveal(),
63
            new MockHandler([$handlerResponse])
64
        );
65
66
        $client = new Client(['handler' => $middleware]);
67
68
        $circuitBreaker->isAvailable(self::RESOLVED_SERVICE_NAME)->willReturn(true);
69
        $circuitBreaker->reportFailure(self::RESOLVED_SERVICE_NAME)
70
            ->shouldBeCalledTimes(1);
71
72
        $client->send($this->aRequestToAService());
73
    }
74
75
    /** @test */
76
    public function it_return_server_error_response_when_service_is_not_available()
77
    {
78
        $handlerResponse = new Response(200);
79
        $circuitBreaker = $this->prophesize(CircuitBreaker::class);
80
        $middleware = new GuzzleMiddleware(
81
            $circuitBreaker->reveal(),
82
            new MockHandler([$handlerResponse])
83
        );
84
85
        $client = new Client(['handler' => $middleware]);
86
87
        $circuitBreaker->isAvailable(self::RESOLVED_SERVICE_NAME)->willReturn(false);
88
        $response = $client->send($this->aRequestToAService());
89
90
        $this->assertEquals(503, $response->getStatusCode());
91
        $this->assertEquals("Circuit for service service_8080 is open", $response->getReasonPhrase());
92
    }
93
94
    private function aRequestToAService(): Request
95
    {
96
        return new Request("GET", "http://service:8080/some/path");
97
    }
98
}
99