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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\MessageQueue\Test\Unit;
/**
* Unit test for BatchConsumer class.
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class BatchConsumerTest extends \PHPUnit\Framework\TestCase
{
/**
* @var \Magento\Framework\MessageQueue\ConsumerConfigurationInterface|\PHPUnit_Framework_MockObject_MockObject
*/
private $configuration;
/**
* @var \Magento\Framework\MessageQueue\MessageEncoder|\PHPUnit_Framework_MockObject_MockObject
*/
private $messageEncoder;
/**
* @var \Magento\Framework\MessageQueue\QueueRepository|\PHPUnit_Framework_MockObject_MockObject
*/
private $queueRepository;
/**
* @var \Magento\Framework\MessageQueue\MergerFactory|\PHPUnit_Framework_MockObject_MockObject
*/
private $mergerFactory;
/**
* @var \Magento\Framework\MessageQueue\Consumer\ConfigInterface|\PHPUnit_Framework_MockObject_MockObject
*/
private $consumerConfig;
/**
* @var \Magento\Framework\MessageQueue\MessageController|\PHPUnit_Framework_MockObject_MockObject
*/
private $messageController;
/**
* @var \Magento\Framework\App\ResourceConnection|\PHPUnit_Framework_MockObject_MockObject
*/
private $resource;
/**
* @var \Magento\Framework\MessageQueue\BatchConsumer
*/
private $batchConsumer;
/**
* @var int
*/
private $batchSize = 10;
/**
* @var \Magento\Framework\MessageQueue\MessageProcessorLoader|\PHPUnit_Framework_MockObject_MockObject
*/
private $messageProcessorLoader;
/**
* Set up.
*
* @return void
*/
protected function setUp()
{
$this->configuration = $this
->getMockBuilder(\Magento\Framework\MessageQueue\ConsumerConfigurationInterface::class)
->disableOriginalConstructor()->getMock();
$this->messageEncoder = $this->getMockBuilder(\Magento\Framework\MessageQueue\MessageEncoder::class)
->disableOriginalConstructor()->getMock();
$this->queueRepository = $this->getMockBuilder(\Magento\Framework\MessageQueue\QueueRepository::class)
->disableOriginalConstructor()->getMock();
$this->mergerFactory = $this->getMockBuilder(\Magento\Framework\MessageQueue\MergerFactory::class)
->setMethods(['create'])
->disableOriginalConstructor()->getMock();
$this->resource = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class)
->disableOriginalConstructor()->getMock();
$this->messageProcessorLoader = $this
->getMockBuilder(\Magento\Framework\MessageQueue\MessageProcessorLoader::class)
->disableOriginalConstructor()
->getMock();
$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
$this->batchConsumer = $objectManager->getObject(
\Magento\Framework\MessageQueue\BatchConsumer::class,
[
'configuration' => $this->configuration,
'messageEncoder' => $this->messageEncoder,
'queueRepository' => $this->queueRepository,
'mergerFactory' => $this->mergerFactory,
'resource' => $this->resource,
'batchSize' => $this->batchSize,
'messageProcessorLoader' => $this->messageProcessorLoader
]
);
$this->consumerConfig = $this->getMockBuilder(\Magento\Framework\MessageQueue\Consumer\ConfigInterface::class)
->disableOriginalConstructor()->getMock();
$objectManager->setBackwardCompatibleProperty(
$this->batchConsumer,
'consumerConfig',
$this->consumerConfig
);
$this->messageController = $this->getMockBuilder(\Magento\Framework\MessageQueue\MessageController::class)
->disableOriginalConstructor()->getMock();
$objectManager->setBackwardCompatibleProperty(
$this->batchConsumer,
'messageController',
$this->messageController
);
}
/**
* Test for process().
*
* @return void
*/
public function testProcess()
{
$queueName = 'queue.name';
$consumerName = 'consumerName';
$connectionName = 'connection_name';
$topicName = 'topicName';
$messageBody = 'messageBody';
$message = ['message_data'];
$numberOfMessages = 2;
$this->configuration->expects($this->once())->method('getQueueName')->willReturn($queueName);
$this->configuration->expects($this->atLeastOnce())->method('getConsumerName')->willReturn($consumerName);
$consumerConfigItem = $this
->getMockBuilder(\Magento\Framework\MessageQueue\Consumer\Config\ConsumerConfigItemInterface::class)
->disableOriginalConstructor()->getMock();
$this->consumerConfig->expects($this->once())
->method('getConsumer')->with($consumerName)->willReturn($consumerConfigItem);
$consumerConfigItem->expects($this->once())->method('getConnection')->willReturn($connectionName);
$queue = $this->getMockBuilder(\Magento\Framework\MessageQueue\QueueInterface::class)
->disableOriginalConstructor()->getMock();
$this->queueRepository->expects($this->once())
->method('get')->with($connectionName, $queueName)->willReturn($queue);
$merger = $this->getMockBuilder(\Magento\Framework\MessageQueue\MergerInterface::class)
->disableOriginalConstructor()->getMock();
$this->mergerFactory->expects($this->once())->method('create')->with($consumerName)->willReturn($merger);
$envelope = $this->getMockBuilder(\Magento\Framework\MessageQueue\EnvelopeInterface::class)
->disableOriginalConstructor()->getMock();
$queue->expects($this->exactly($numberOfMessages))->method('dequeue')->willReturn($envelope);
$this->messageController->expects($this->exactly($numberOfMessages))
->method('lock')->with($envelope, $consumerName);
$envelope->expects($this->exactly($numberOfMessages))
->method('getProperties')->willReturn(['topic_name' => $topicName]);
$envelope->expects($this->exactly($numberOfMessages))
->method('getBody')->willReturn($messageBody);
$this->messageEncoder->expects($this->exactly($numberOfMessages))
->method('decode')->with($topicName, $messageBody)->willReturn($message);
$messageProcessor = $this->getMockBuilder(\Magento\Framework\MessageQueue\MessageProcessorInterface::class)
->disableOriginalConstructor()
->getMockForAbstractClass();
$this->messageProcessorLoader->expects($this->atLeastOnce())->method('load')->willReturn($messageProcessor);
$merger->expects($this->once())->method('merge')
->with([$topicName => [$message, $message]])->willReturnArgument(0);
$this->batchConsumer->process($numberOfMessages);
}
/**
* Test for process() with MessageLockException.
*
* @return void
*/
public function testProcessWithMessageLockException()
{
$queueName = 'queue.name';
$consumerName = 'consumerName';
$connectionName = 'connection_name';
$numberOfMessages = 2;
$this->configuration->expects($this->once())->method('getQueueName')->willReturn($queueName);
$this->configuration->expects($this->atLeastOnce())->method('getConsumerName')->willReturn($consumerName);
$consumerConfigItem = $this
->getMockBuilder(\Magento\Framework\MessageQueue\Consumer\Config\ConsumerConfigItemInterface::class)
->disableOriginalConstructor()->getMock();
$this->consumerConfig->expects($this->once())
->method('getConsumer')->with($consumerName)->willReturn($consumerConfigItem);
$consumerConfigItem->expects($this->once())->method('getConnection')->willReturn($connectionName);
$queue = $this->getMockBuilder(\Magento\Framework\MessageQueue\QueueInterface::class)
->disableOriginalConstructor()->getMock();
$this->queueRepository->expects($this->once())
->method('get')->with($connectionName, $queueName)->willReturn($queue);
$merger = $this->getMockBuilder(\Magento\Framework\MessageQueue\MergerInterface::class)
->disableOriginalConstructor()->getMock();
$this->mergerFactory->expects($this->once())->method('create')->with($consumerName)->willReturn($merger);
$envelope = $this->getMockBuilder(\Magento\Framework\MessageQueue\EnvelopeInterface::class)
->disableOriginalConstructor()->getMock();
$queue->expects($this->exactly($numberOfMessages))->method('dequeue')->willReturn($envelope);
$exception = new \Magento\Framework\MessageQueue\MessageLockException(__('Exception Message'));
$this->messageController->expects($this->atLeastOnce())
->method('lock')->with($envelope, $consumerName)->willThrowException($exception);
$messageProcessor = $this->getMockBuilder(\Magento\Framework\MessageQueue\MessageProcessorInterface::class)
->disableOriginalConstructor()
->getMockForAbstractClass();
$this->messageProcessorLoader->expects($this->atLeastOnce())->method('load')->willReturn($messageProcessor);
$merger->expects($this->once())->method('merge')->willReturn([]);
$this->batchConsumer->process($numberOfMessages);
}
}