Completed
Push — master ( 7f76db...32e949 )
by Leonardo
13s queued 11s
created

CircuitBreakerTest::testSuccess()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 7
c 1
b 0
f 1
dl 0
loc 9
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
use LeoCarmo\CircuitBreaker\Adapters\AdapterInterface;
4
use LeoCarmo\CircuitBreaker\CircuitBreaker;
5
use PHPUnit\Framework\TestCase;
6
7
class CircuitBreakerTest extends TestCase
8
{
9
    public function testGetAdapter()
10
    {
11
        $expected = $this->createMock(AdapterInterface::class);
12
        CircuitBreaker::setAdapter($expected);
13
        $adapter = CircuitBreaker::getAdapter();
14
        static::assertEquals($expected, $adapter);
15
    }
16
17
    public function testGetGlobalSettings()
18
    {
19
        $settings = ['timeWindow' => 10];
20
        CircuitBreaker::setGlobalSettings($settings);
21
        $globalSettings = CircuitBreaker::getGlobalSettings();
22
        $expected = [
23
            'timeWindow' => $settings['timeWindow'],
24
            'failureRateThreshold' => CircuitBreaker::FAILURE_RATE_THRESHOLD,
25
            'intervalToHalfOpen' => CircuitBreaker::INTERVAL_TO_HALF_OPEN,
26
        ];
27
        static::assertEquals($expected, $globalSettings);
28
    }
29
30
    public function testGetServiceSetting()
31
    {
32
        $service = 'service-name';
33
        $setting = 'timeWindow';
34
        $settings = [$setting => 10];
35
        CircuitBreaker::setServiceSettings($service, $settings);
36
        $serviceSetting = CircuitBreaker::getServiceSetting($service, $setting);
37
        $expected = $settings[$setting];
38
        static::assertEquals($expected, $serviceSetting);
39
    }
40
41
    public function testIsAvailableWhenIsOpenThenReturnFalse()
42
    {
43
        $service = 'service-name';
44
        $adapter = $this->createMock(AdapterInterface::class);
45
        $adapter->method('isOpen')
46
            ->with($service)
47
            ->willReturn(true);
48
        CircuitBreaker::setAdapter($adapter);
49
        $isAvailable = CircuitBreaker::isAvailable($service);
50
        static::assertFalse($isAvailable);
51
    }
52
53
    public function testIsAvailableWhenReachRateLimitThenReturnFalse()
54
    {
55
        $service = 'service-name';
56
        $adapter = $this->createMock(AdapterInterface::class);
57
        $adapter->method('isOpen')
58
            ->with($service)
59
            ->willReturn(false);
60
        $adapter->method('reachRateLimit')
61
            ->with($service)
62
            ->willReturn(true);
63
        $adapter->expects(self::once())
64
            ->method('setOpenCircuit')
65
            ->with($service);
66
        $adapter->expects(self::once())
67
            ->method('setHalfOpenCircuit')
68
            ->with($service);
69
        CircuitBreaker::setAdapter($adapter);
70
        $isAvailable = CircuitBreaker::isAvailable($service);
71
        static::assertFalse($isAvailable);
72
    }
73
74
    public function testIsAvailableWhenIsNotOpenAndIsNotReachRateLimitThenReturnTrue()
75
    {
76
        $service = 'service-name';
77
        $adapter = $this->createMock(AdapterInterface::class);
78
        $adapter->method('isOpen')
79
            ->with($service)
80
            ->willReturn(false);
81
        $adapter->method('reachRateLimit')
82
            ->with($service)
83
            ->willReturn(false);
84
        CircuitBreaker::setAdapter($adapter);
85
        $isAvailable = CircuitBreaker::isAvailable($service);
86
        static::assertTrue($isAvailable);
87
    }
88
89
    public function testFailureWhenIsHalfOpenThenReturnFalse()
90
    {
91
        $service = 'service-name';
92
        $adapter = $this->createMock(AdapterInterface::class);
93
        $adapter->method('isHalfOpen')
94
            ->with($service)
95
            ->willReturn(true);
96
        $adapter->expects(self::once())
97
            ->method('setOpenCircuit')
98
            ->with($service);
99
        $adapter->expects(self::once())
100
            ->method('setHalfOpenCircuit')
101
            ->with($service);
102
        CircuitBreaker::setAdapter($adapter);
103
        $isFailure = CircuitBreaker::failure($service);
104
        static::assertFalse($isFailure);
105
    }
106
107
    public function testFailureWhenIncrementFailureIsFalseThenReturnFalse()
108
    {
109
        $service = 'service-name';
110
        $adapter = $this->createMock(AdapterInterface::class);
111
        $adapter->method('isHalfOpen')
112
            ->with($service)
113
            ->willReturn(false);
114
        $adapter->method('incrementFailure')
115
            ->with($service)
116
            ->willReturn(false);
117
        CircuitBreaker::setAdapter($adapter);
118
        $isFailure = CircuitBreaker::failure($service);
119
        static::assertFalse($isFailure);
120
    }
121
122
    public function testFailureWhenIncrementFailureIsTrueThenReturnTrue()
123
    {
124
        $service = 'service-name';
125
        $adapter = $this->createMock(AdapterInterface::class);
126
        $adapter->method('isHalfOpen')
127
            ->with($service)
128
            ->willReturn(false);
129
        $adapter->method('incrementFailure')
130
            ->with($service)
131
            ->willReturn(true);
132
        CircuitBreaker::setAdapter($adapter);
133
        $isFailure = CircuitBreaker::failure($service);
134
        static::assertTrue($isFailure);
135
    }
136
137
    public function testSuccess()
138
    {
139
        $service = 'service-name';
140
        $adapter = $this->createMock(AdapterInterface::class);
141
        $adapter->expects(self::once())
142
            ->method('setSuccess')
143
            ->with($service);
144
        CircuitBreaker::setAdapter($adapter);
145
        CircuitBreaker::success($service);
146
    }
147
}
148