Completed
Pull Request — master (#10)
by
unknown
11:04
created

DelayServiceTest.php$0 ➔ generateInterval()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Lamoda\QueueBundle\Tests\Unit\Service;
6
7
use DateInterval;
8
use DateTime;
9
use Lamoda\QueueBundle\Entity\QueueEntityInterface;
10
use Lamoda\QueueBundle\Service\DelayService;
11
use Lamoda\QueueBundle\Service\ResolverStrategyService;
12
use Lamoda\QueueBundle\Strategy\Delay\DelayStrategyInterface;
13
use Lamoda\QueueBundle\Tests\Unit\QueueEntity;
14
use PHPUnit_Framework_TestCase;
15
16
class DelayServiceTest extends PHPUnit_Framework_TestCase
17
{
18
    /**
19
     * @param QueueEntityInterface $queue
20
     * @param QueueEntityInterface $expectedQueue
21
     * @param DateTime             $dateTime
22
     *
23
     * @dataProvider dataDelayQueue
24
     */
25
    public function testDelayQueue(
26
        QueueEntityInterface $queue,
27
        QueueEntityInterface $expectedQueue,
28
        DateTime $dateTime
29
    ): void {
30
        $strategyService = $this->createResolverStrategyService();
31
        /** @var DelayService | \PHPUnit_Framework_MockObject_MockObject $delayService */
32
        $delayService = $this->getMockBuilder(DelayService::class)
33
            ->setConstructorArgs([$strategyService])
34
            ->setMethods(['getStartDateTime'])
35
            ->getMock();
36
        $delayService->method('getStartDateTime')
37
            ->willReturn($dateTime);
38
39
        $actualQueue = $delayService->delayQueue($queue);
40
        $this->assertEquals($expectedQueue, $actualQueue);
41
    }
42
43
    /**
44
     * @return array
45
     * @throws \Exception
46
     *
47
     */
48
    public function dataDelayQueue(): array
49
    {
50
        $strategyService = $this->createResolverStrategyService();
51
        $dateTime        = new DateTime();
52
        $queue           = $this->createQueue();
53
        $strategy        = $strategyService->getStrategy($queue->getName());
54
        $expected        = clone $queue;
55
        $expected->setWaiting($dateTime->add($strategy::getInterval()));
56
57
        return [
58
            [
59
                $queue,
60
                $expected,
61
                $dateTime,
62
            ],
63
        ];
64
    }
65
66
    private function createQueue(): QueueEntity
67
    {
68
        return new QueueEntity('queue', 'exchange', 'ClassJob', []);
69
    }
70
71
    private function createResolverStrategyService(): ResolverStrategyService
72
    {
73
        $strategy = new class() implements DelayStrategyInterface {
74
            public function generateInterval(int $iteration): DateInterval
75
            {
76
                return static::getInterval();
77
            }
78
79
            public static function getInterval(): DateInterval
80
            {
81
                return new DateInterval('PT1M');
82
            }
83
        };
84
85
        return new ResolverStrategyService($this->createStrategiesList(['test_strategy_key' => $strategy]), ['queue' => 'test_strategy_key']);
86
    }
87
88
    private function createStrategiesList(array $strategies)
89
    {
90
        return new class($strategies) implements \Iterator {
91
            /**
92
             * @var array
93
             */
94
            protected $strategies;
95
96
            public function __construct(array $strategies)
97
            {
98
                $this->strategies = $strategies;
99
            }
100
101
            public function current()
102
            {
103
                return current($this->strategies);
104
            }
105
106
            public function next()
107
            {
108
                return next($this->strategies);
109
            }
110
111
            public function key()
112
            {
113
                return key($this->strategies);
114
            }
115
116
            public function valid()
117
            {
118
                return key($this->strategies) !== null;
119
            }
120
121
            public function rewind()
122
            {
123
                return reset($this->strategies);
124
            }
125
126
        };
127
    }
128
}
129