Failed Conditions
Push — master ( f7bbe5...2d1803 )
by Sam
11:37
created

MessageQueuerTest::createMockOrder()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 74
Code Lines 57

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 57
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 74
rs 8.9381

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace ApplicationTest\Service;
6
7
use Application\DBAL\Types\MessageTypeType;
8
use Application\DBAL\Types\PaymentMethodType;
9
use Application\DBAL\Types\ProductTypeType;
10
use Application\Model\Country;
11
use Application\Model\Message;
12
use Application\Model\Order;
13
use Application\Model\OrderLine;
14
use Application\Model\Product;
15
use Application\Model\Subscription;
16
use Application\Model\User;
17
use Application\Service\MessageQueuer;
18
use Doctrine\Common\Collections\ArrayCollection;
19
use Doctrine\ORM\EntityManager;
20
use Ecodev\Felix\Service\MessageRenderer;
21
use Laminas\View\Renderer\RendererInterface;
22
use Money\Money;
23
24
class MessageQueuerTest extends \PHPUnit\Framework\TestCase
25
{
26
    private function createMockMessageQueuer(): MessageQueuer
27
    {
28
        global $container;
29
30
        $entityManager = $container->get(EntityManager::class);
31
        $viewRenderer = $container->get(RendererInterface::class);
32
        $messageRenderer = new MessageRenderer($viewRenderer, 'artisans.lan');
33
34
        $messageQueuer = new MessageQueuer(
35
            $entityManager,
36
            $messageRenderer,
37
        );
38
39
        return $messageQueuer;
40
    }
41
42
    public function testQueueRegister(): void
43
    {
44
        $user = $this->createMockUserMinimal();
45
        $messageQueuer = $this->createMockMessageQueuer();
46
        $message = $messageQueuer->queueRegister($user);
47
48
        $this->assertMessage($message, $user, '[email protected]', MessageTypeType::REGISTER, 'Demande de création de compte Les artisans de la transition');
49
    }
50
51
    public function testQueueConfirmedRegistration(): void
52
    {
53
        $registeredUser = $this->createMockUser();
54
        $admin = $this->createMockUserAdmin();
55
        $messageQueuer = $this->createMockMessageQueuer();
56
        $message = $messageQueuer->queueConfirmedRegistration($admin, $registeredUser);
57
58
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::CONFIRMED_REGISTRATION, 'Nouveau membre');
59
    }
60
61
    public function testQueueUnregister(): void
62
    {
63
        $unregisteredUser = $this->createMockUser();
64
        $admin = $this->createMockUserAdmin();
65
        $messageQueuer = $this->createMockMessageQueuer();
66
        $message = $messageQueuer->queueUnregister($admin, $unregisteredUser);
67
68
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::UNREGISTER, 'Démission');
69
    }
70
71
    public function testQueueResetPassword(): void
72
    {
73
        $user = $this->createMockUser();
74
        $messageQueuer = $this->createMockMessageQueuer();
75
        $message = $messageQueuer->queueResetPassword($user, '[email protected]');
76
77
        $this->assertMessage($message, $user, '[email protected]', MessageTypeType::RESET_PASSWORD, 'Demande de modification de mot de passe');
78
    }
79
80
    public function testQueueUpdatedUser(): void
81
    {
82
        $updatedUser = $this->createMockUser();
83
        $admin = $this->createMockUserAdmin();
84
        $messageQueuer = $this->createMockMessageQueuer();
85
86
        $before = [
87
            'Prénom' => 'John',
88
            'Nom de famille ' => 'Doe',
89
        ];
90
91
        $after = [
92
            'Prénom' => 'John',
93
            'Nom de famille ' => 'Connor',
94
        ];
95
96
        $message = $messageQueuer->queueUpdatedUser($admin, $updatedUser, $before, $after);
97
98
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::UPDATED_USER, 'Un utilisateur a modifié ses données personnelles');
99
    }
100
101
    public function testQueueUserPendingOrder(): void
102
    {
103
        $user = $this->createMockUser();
104
        $order = $this->createMockOrder($user);
105
        $messageQueuer = $this->createMockMessageQueuer();
106
107
        $message = $messageQueuer->queueUserPendingOrder($order->getOwner(), $order);
0 ignored issues
show
Bug introduced by
It seems like $order->getOwner() can also be of type null; however, parameter $user of Application\Service\Mess...queueUserPendingOrder() does only seem to accept Application\Model\User, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

107
        $message = $messageQueuer->queueUserPendingOrder(/** @scrutinizer ignore-type */ $order->getOwner(), $order);
Loading history...
108
109
        $this->assertMessage($message, $user, '[email protected]', MessageTypeType::USER_PENDING_ORDER, 'Votre commande est en cours de traitement');
110
    }
111
112
    public function testQueueUserValidatedOrder(): void
113
    {
114
        $user = $this->createMockUser();
115
        $order = $this->createMockOrder($user);
116
        $messageQueuer = $this->createMockMessageQueuer();
117
118
        $message = $messageQueuer->queueUserValidatedOrder($order->getOwner(), $order);
0 ignored issues
show
Bug introduced by
It seems like $order->getOwner() can also be of type null; however, parameter $user of Application\Service\Mess...eueUserValidatedOrder() does only seem to accept Application\Model\User, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

118
        $message = $messageQueuer->queueUserValidatedOrder(/** @scrutinizer ignore-type */ $order->getOwner(), $order);
Loading history...
119
120
        $this->assertMessage($message, $user, '[email protected]', MessageTypeType::USER_VALIDATED_ORDER, 'Votre commande a été validée');
121
    }
122
123
    public function testQueueAdminPendingOrder(): void
124
    {
125
        $admin = $this->createMockUserAdmin();
126
        $user = $this->createMockUser();
127
        $order = $this->createMockOrder($user);
128
        $messageQueuer = $this->createMockMessageQueuer();
129
130
        $message = $messageQueuer->queueAdminPendingOrder($admin, $order);
131
132
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::ADMIN_PENDING_ORDER, 'Une commande a besoin d\'un BVR');
133
    }
134
135
    public function testQueueAdminValidatedOrder(): void
136
    {
137
        $admin = $this->createMockUserAdmin();
138
        $user = $this->createMockUser();
139
        $order = $this->createMockOrder($user);
140
        $messageQueuer = $this->createMockMessageQueuer();
141
142
        $message = $messageQueuer->queueAdminValidatedOrder($admin, $order);
143
144
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::ADMIN_VALIDATED_ORDER, 'Commande à comptabiliser');
145
    }
146
147
    public function testQueueAdminValidatedOrderWithoutOwner(): void
148
    {
149
        $admin = $this->createMockUserAdmin();
150
        $order = $this->createMockOrder(null);
151
        $messageQueuer = $this->createMockMessageQueuer();
152
153
        $message = $messageQueuer->queueAdminValidatedOrder($admin, $order);
154
155
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::ADMIN_VALIDATED_ORDER, 'Commande à comptabiliser', 'without-owner');
156
    }
157
158
    public function testQueueRequestMembershipEnd(): void
159
    {
160
        $admin = $this->createMockUserAdmin();
161
        $user = $this->createMockUser();
162
        $messageQueuer = $this->createMockMessageQueuer();
163
164
        $message = $messageQueuer->queueRequestMembershipEnd($admin, $user);
165
166
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::REQUEST_MEMBERSHIP_END, 'Demande d\'arrêt de cotisations');
167
    }
168
169
    public function testQueueNewsletterSubscription(): void
170
    {
171
        $admin = $this->createMockUserAdmin();
172
        $messageQueuer = $this->createMockMessageQueuer();
173
174
        $message = $messageQueuer->queueNewsletterSubscription($admin, '[email protected]');
175
176
        $this->assertMessage($message, $admin, '[email protected]', MessageTypeType::NEWSLETTER_SUBSCRIPTION, 'Demande d\'inscription à la newsletter');
177
    }
178
179
    private function createMockOrder(?User $owner): Order
180
    {
181
        $product = $this->createMock(Product::class);
182
        $product->expects(self::any())
183
            ->method('getId')
184
            ->willReturn(1);
185
186
        $product->expects(self::any())
187
            ->method('getCode')
188
            ->willReturn('xxx-yyy');
189
190
        $product->expects(self::any())
191
            ->method('getName')
192
            ->willReturn('Article 1');
193
194
        $productLine = new OrderLine();
195
        $productLine->setProduct($product);
196
        $productLine->setBalanceCHF(Money::CHF(500));
197
        $productLine->setBalanceEUR(Money::EUR(0));
198
        $productLine->setType(ProductTypeType::PAPER);
199
200
        $subscriptionLine = new OrderLine();
201
        $subscriptionLine->setSubscription(new Subscription());
202
        $subscriptionLine->setName('Abonnement standard papier');
203
        $subscriptionLine->setBalanceCHF(Money::CHF(1500));
204
        $subscriptionLine->setBalanceEUR(Money::EUR(0));
205
        $subscriptionLine->setType(ProductTypeType::BOTH);
206
207
        $subscriptionLine2 = new OrderLine();
208
        $subscriptionLine2->setSubscription(new Subscription());
209
        $subscriptionLine2->setName('Abonnement institutionnel numérique');
210
        $subscriptionLine2->setAdditionalEmails(['[email protected]', '[email protected]', '[email protected]']);
211
        $subscriptionLine2->setBalanceCHF(Money::CHF(2500));
212
        $subscriptionLine2->setBalanceEUR(Money::EUR(0));
213
        $subscriptionLine2->setType(ProductTypeType::DIGITAL);
214
215
        $donationLine = new OrderLine();
216
        $donationLine->setName('Don');
217
        $donationLine->setBalanceCHF(Money::CHF(3500));
218
        $donationLine->setBalanceEUR(Money::EUR(0));
219
        $donationLine->setType(ProductTypeType::OTHER);
220
221
        $lines = new ArrayCollection([$productLine, $subscriptionLine, $subscriptionLine2, $donationLine]);
222
223
        $order = $this->createMock(Order::class);
224
        $order->expects(self::any())
225
            ->method('getId')
226
            ->willReturn(456);
227
228
        $order->expects(self::any())
229
            ->method('getBalanceCHF')
230
            ->willReturn(Money::CHF(1500));
231
232
        $order->expects(self::any())
233
            ->method('getBalanceEUR')
234
            ->willReturn(Money::EUR(0));
235
236
        $order->expects(self::any())
237
            ->method('getOrderLines')
238
            ->willReturn($lines);
239
240
        $order->expects(self::any())
241
            ->method('getOwner')
242
            ->willReturn($owner);
243
244
        $order->expects(self::any())
245
            ->method('getFormattedBalance')
246
            ->willReturn('33.00 CHF');
247
248
        $order->expects(self::any())
249
            ->method('getPaymentMethod')
250
            ->willReturn(PaymentMethodType::BVR);
251
252
        return $order;
253
    }
254
255
    private function createMockUser(): User
256
    {
257
        $user = $this->createMock(User::class);
258
259
        $user->expects(self::any())
260
            ->method('getId')
261
            ->willReturn(123);
262
263
        $user->expects(self::any())
264
            ->method('getFirstName')
265
            ->willReturn('John');
266
267
        $user->expects(self::any())
268
            ->method('getLastName')
269
            ->willReturn('Doe');
270
271
        $user->expects(self::any())
272
            ->method('getName')
273
            ->willReturn('John Doe');
274
275
        $user->expects(self::any())
276
            ->method('getStreet')
277
            ->willReturn('Main street');
278
279
        $user->expects(self::any())
280
            ->method('getPostcode')
281
            ->willReturn('2020');
282
283
        $user->expects(self::any())
284
            ->method('getLocality')
285
            ->willReturn('Locality');
286
287
        $user->expects(self::any())
288
            ->method('getCountry')
289
            ->willReturn(new Country('Wookaya'));
290
291
        $user->expects(self::any())
292
            ->method('getPhone')
293
            ->willReturn('123 456 87 98');
294
295
        $user->expects(self::any())
296
            ->method('getEmail')
297
            ->willReturn('[email protected]');
298
299
        $user->expects(self::any())
300
            ->method('createToken')
301
            ->willReturn(str_repeat('X', 32));
302
303
        return $user;
304
    }
305
306
    private function createMockUserAdmin(): User
307
    {
308
        $user = $this->createMock(User::class);
309
310
        $user->expects(self::any())
311
            ->method('getFirstName')
312
            ->willReturn('Admin');
313
314
        $user->expects(self::any())
315
            ->method('getLastName')
316
            ->willReturn('Istrator');
317
318
        $user->expects(self::any())
319
            ->method('getEmail')
320
            ->willReturn('[email protected]');
321
322
        return $user;
323
    }
324
325
    private function createMockUserMinimal(): User
326
    {
327
        $user = $this->createMock(User::class);
328
        $user->expects(self::any())
329
            ->method('getEmail')
330
            ->willReturn('[email protected]');
331
332
        $user->expects(self::any())
333
            ->method('createToken')
334
            ->willReturn(str_repeat('X', 32));
335
336
        return $user;
337
    }
338
339
    private function assertMessage(Message $message, ?User $user, string $email, string $type, string $subject, ?string $variant = null): void
340
    {
341
        self::assertSame($type, $message->getType());
342
        self::assertSame($email, $message->getEmail());
343
        self::assertSame($user, $message->getRecipient());
344
        self::assertNull($message->getDateSent());
345
        self::assertSame($subject, $message->getSubject());
346
347
        $variant = $variant ? '-' . $variant : $variant;
348
        $expectedBody = 'tests/data/emails/' . str_replace('_', '-', $type . $variant) . '.html';
349
        $this->assertFile($expectedBody, $message->getBody());
350
    }
351
352
    /**
353
     * Custom assert that will not produce gigantic diff
354
     */
355
    private function assertFile(string $file, string $actual): void
356
    {
357
        // Log actual result for easier comparison with external diff tools
358
        $logFile = 'logs/' . $file;
359
        $dir = dirname($logFile);
360
        @mkdir($dir, 0777, true);
361
        file_put_contents($logFile, $actual);
362
363
        self::assertFileExists($file, 'Expected file must exist on disk, fix it with: cp ' . $logFile . ' ' . $file);
364
        $expected = file_get_contents($file);
365
366
        self::assertTrue($expected === $actual, 'File content does not match, compare with: meld ' . $file . ' ' . $logFile);
367
    }
368
}
369