Passed
Pull Request — master (#141)
by
unknown
10:36
created

EndToEndTest::testTransactionDetails()   C

Complexity

Conditions 8
Paths 8

Size

Total Lines 219
Code Lines 152

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 8
eloc 152
c 3
b 0
f 0
nc 8
nop 0
dl 0
loc 219
rs 6.7555

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 Genkgo\TestCamt\Unit\Camt054;
6
7
use DateTimeImmutable;
8
use DOMDocument;
9
use Genkgo\Camt\Camt054\DTO as Camt054DTO;
10
use Genkgo\Camt\Camt054\DTO\V04\GroupHeader;
11
use Genkgo\Camt\Camt054\MessageFormat;
12
use Genkgo\Camt\DTO;
13
use Genkgo\Camt\DTO\Message;
14
use Genkgo\Camt\DTO\OrganisationIdentification;
15
use PHPUnit\Framework;
16
17
class EndToEndTest extends Framework\TestCase
18
{
19
    protected function getV2Message(): Message
20
    {
21
        $dom = new DOMDocument('1.0', 'UTF-8');
22
        $dom->load('test/data/camt054.v2.xml');
23
24
        return (new MessageFormat\V02())->getDecoder()->decode($dom);
25
    }
26
27
    protected function getV4Message(): Message
28
    {
29
        $dom = new DOMDocument('1.0', 'UTF-8');
30
        $dom->load('test/data/camt054.v4.xml');
31
32
        return (new MessageFormat\V04())->getDecoder()->decode($dom);
33
    }
34
35
    protected function getv8Message(): Message
36
    {
37
        $dom = new DOMDocument('1.0', 'UTF-8');
38
        $dom->load('test/data/camt054.v8.xml');
39
40
        return (new MessageFormat\V08())->getDecoder()->decode($dom);
41
    }
42
43
    public function testGroupHeader(): void
44
    {
45
        $messages = [
46
            $this->getV2Message(),
47
            $this->getV4Message(),
48
            $this->getV8Message(),
49
        ];
50
51
        /** @var Message $message */
52
        foreach ($messages as $message) {
53
            $groupHeader = $message->getGroupHeader();
54
55
            self::assertInstanceOf(DTO\GroupHeader::class, $groupHeader);
56
            self::assertEquals('AAAASESS-FP-ACCR001', $groupHeader->getMessageId());
57
            self::assertEquals(new DateTimeImmutable('2007-10-18T12:30:00+01:00'), $groupHeader->getCreatedOn());
58
            self::assertEquals('Group header additional information', $groupHeader->getAdditionalInformation());
59
            self::assertInstanceOf(DTO\Pagination::class, $groupHeader->getPagination());
60
            self::assertEquals('1', $groupHeader->getPagination()->getPageNumber());
61
            self::assertTrue($groupHeader->getPagination()->isLastPage());
62
            $msgRecipient = $groupHeader->getMessageRecipient();
63
            self::assertInstanceOf(DTO\Recipient::class, $msgRecipient);
64
            self::assertEquals('COMPANY BVBA', $msgRecipient->getName());
65
            self::assertEquals('NL', $msgRecipient->getCountryOfResidence());
66
            self::assertInstanceOf(DTO\Address::class, $msgRecipient->getAddress());
67
            self::assertEquals('12 Oxford Street', $msgRecipient->getAddress()->getStreetName());
68
            self::assertEquals('UK', $msgRecipient->getAddress()->getCountry());
69
70
            /** @var OrganisationIdentification $identification */
71
            $identification = $msgRecipient->getIdentification();
72
            self::assertInstanceOf(DTO\Identification::class, $identification);
73
            self::assertEquals('DABAIE2D', $identification->getBic());
74
            self::assertEquals('Some other Id', $identification->getOtherId());
75
            self::assertEquals('Some other Issuer', $identification->getOtherIssuer());
76
        }
77
78
        /** @var GroupHeader $groupHeaderV4 */
79
        $groupHeaderV4 = $messages[1]->getGroupHeader();
80
        self::assertInstanceOf(GroupHeader::class, $groupHeaderV4);
81
        self::assertInstanceOf(Camt054DTO\V04\OriginalBusinessQuery::class, $groupHeaderV4->getOriginalBusinessQuery());
82
        self::assertEquals('SomeMessageId', $groupHeaderV4->getOriginalBusinessQuery()->getMessageId());
83
        self::assertEquals(
84
            'SomeMessageNameId',
85
            $groupHeaderV4->getOriginalBusinessQuery()->getMessageNameId()
86
        );
87
        self::assertEquals(
88
            new DateTimeImmutable('2010-10-18T12:30:00+01:00'),
89
            $groupHeaderV4->getOriginalBusinessQuery()->getCreatedOn()
90
        );
91
    }
92
93
    public function testNotifications(): void
94
    {
95
        $messages = [
96
            $this->getV2Message(),
97
            $this->getV4Message(),
98
            $this->getV8Message(),
99
        ];
100
101
        foreach ($messages as $message) {
102
            $notifications = $message->getRecords();
103
104
            self::assertCount(1, $notifications);
105
            foreach ($notifications as $notification) {
106
                self::assertInstanceOf(Camt054DTO\Notification::class, $notification);
107
                self::assertEquals('AAAASESS-FP-ACCR001', $notification->getId());
108
                self::assertEquals('CH2801234000123456789', $notification->getAccount()->getIdentification());
109
                self::assertEquals(new DateTimeImmutable('2007-10-18T12:30:00+01:00'), $notification->getCreatedOn());
110
                self::assertEquals('12312', $notification->getElectronicSequenceNumber());
111
                self::assertEquals('12312', $notification->getLegalSequenceNumber());
112
                self::assertEquals('CODU', $notification->getCopyDuplicateIndicator());
113
                self::assertEquals(new DateTimeImmutable('2007-10-18T08:00:00+01:00'), $notification->getFromDate());
114
                self::assertEquals(new DateTimeImmutable('2007-10-18T12:30:00+01:00'), $notification->getToDate());
115
                self::assertEquals('Additional Information', $notification->getAdditionalInformation());
116
            }
117
        }
118
119
        $notificationV4 = $messages[1]->getRecords()[0];
120
        self::assertInstanceOf(DTO\Pagination::class, $notificationV4->getPagination());
121
        self::assertEquals('2', $notificationV4->getPagination()->getPageNumber());
122
        self::assertTrue($notificationV4->getPagination()->isLastPage());
123
    }
124
125
    public function testEntries(): void
126
    {
127
        $messages = [
128
            $this->getV2Message(),
129
            $this->getV4Message(),
130
            $this->getV8Message(),
131
        ];
132
133
        foreach ($messages as $message) {
134
            $notifications = $message->getRecords();
135
136
            self::assertCount(1, $notifications);
137
            foreach ($notifications as $notification) {
138
                $entries = $notification->getEntries();
139
                self::assertCount(1, $entries);
140
141
                foreach ($entries as $entry) {
142
                    self::assertEquals(-20000000, $entry->getAmount()->getAmount());
143
                    self::assertEquals('SEK', $entry->getAmount()->getCurrency()->getCode());
144
                    self::assertEquals('2007-10-18', $entry->getBookingDate()->format('Y-m-d'));
145
                    self::assertEquals('2007-10-18', $entry->getValueDate()->format('Y-m-d'));
146
                    self::assertEquals('PMNT', $entry->getBankTransactionCode()->getDomain()->getCode());
147
                    self::assertEquals('ICDT', $entry->getBankTransactionCode()->getDomain()->getFamily()->getCode());
148
                    self::assertEquals('DMCT', $entry->getBankTransactionCode()->getDomain()->getFamily()->getSubFamilyCode());
149
                }
150
            }
151
        }
152
    }
153
154
    public function testTransactionDetails(): void
155
    {
156
        $messages = [
157
            $this->getV4Message(),
158
            $this->getV8Message(),
159
        ];
160
161
        // this is because V4 and V8 don't support the structure with proprietary amount
162
        $this->testV2Message();
163
164
        foreach ($messages as $message) {
165
            $notifications = $message->getRecords();
166
167
            self::assertCount(1, $notifications);
168
            foreach ($notifications as $notification) {
169
                $entries = $notification->getEntries();
170
171
                self::assertCount(1, $entries);
172
                foreach ($entries as $entry) {
173
                    $transactionDetails = $entry->getTransactionDetails();
174
175
                    self::assertCount(3, $transactionDetails);
176
                    foreach ($transactionDetails as $index => $transactionDetail) {
177
                        switch ($index) {
178
                            case 0:
179
                                // Legacy : The first message comes from unstructured block
180
                                self::assertEquals(
181
                                    'Unstructured Remittance Information V1',
182
                                    $transactionDetail
183
                                        ->getRemittanceInformation()
184
                                        ->getMessage()
185
                                );
186
187
                                // Only one structured data block
188
                                self::assertEquals(
189
                                    'Unstructured Remittance Information V1',
190
                                    $transactionDetail
191
                                        ->getRemittanceInformation()
192
                                        ->getUnstructuredBlock()
193
                                        ->getMessage()
194
                                );
195
196
                                // Check structured and unstructured blocks
197
                                self::assertEquals(
198
                                    'ISR ref number V1',
199
                                    $transactionDetail
200
                                        ->getRemittanceInformation()
201
                                        ->getStructuredBlock()
202
                                        ->getCreditorReferenceInformation()
203
                                        ->getRef()
204
                                );
205
206
                                self::assertEquals(
207
                                    'ISR Reference',
208
                                    $transactionDetail
209
                                        ->getRemittanceInformation()
210
                                        ->getStructuredBlock()
211
                                        ->getCreditorReferenceInformation()
212
                                        ->getProprietary()
213
                                );
214
215
                                self::assertNull(
216
                                    $transactionDetail
217
                                        ->getRemittanceInformation()
218
                                        ->getStructuredBlock()
219
                                        ->getCreditorReferenceInformation()
220
                                        ->getCode()
221
                                );
222
223
                                self::assertEquals(
224
                                    'Additional Remittance Information V1',
225
                                    $transactionDetail
226
                                        ->getRemittanceInformation()
227
                                        ->getStructuredBlock()
228
                                        ->getAdditionalRemittanceInformation()
229
                                );
230
231
                                break;
232
                            case 1:
233
234
                                // Legacy : ref number from the structured information
235
                                // because the unstructured block is not present
236
                                self::assertEquals(
237
                                    'ISR ref number V2',
238
                                    $transactionDetail
239
                                        ->getRemittanceInformation()
240
                                        ->getMessage()
241
                                );
242
243
                                // No unstructured block
244
                                self::assertCount(
245
                                    0,
246
                                    $transactionDetail
247
                                        ->getRemittanceInformation()
248
                                        ->getUnstructuredBlocks()
249
                                );
250
251
                                // Check structured and unstructured blocks
252
                                self::assertEquals(
253
                                    'ISR ref number V2',
254
                                    $transactionDetail
255
                                        ->getRemittanceInformation()
256
                                        ->getStructuredBlock()
257
                                        ->getCreditorReferenceInformation()
258
                                        ->getRef()
259
                                );
260
261
                                self::assertEquals(
262
                                    'ISR Reference',
263
                                    $transactionDetail
264
                                        ->getRemittanceInformation()
265
                                        ->getStructuredBlock()
266
                                        ->getCreditorReferenceInformation()
267
                                        ->getProprietary()
268
                                );
269
270
                                self::assertNull(
271
                                    $transactionDetail
272
                                        ->getRemittanceInformation()
273
                                        ->getStructuredBlock()
274
                                        ->getCreditorReferenceInformation()
275
                                        ->getCode()
276
                                );
277
278
                                self::assertEquals(
279
                                    'Additional Remittance Information V2',
280
                                    $transactionDetail
281
                                        ->getRemittanceInformation()
282
                                        ->getStructuredBlock()
283
                                        ->getAdditionalRemittanceInformation()
284
                                );
285
286
                                break;
287
                            case 2:
288
                                // Legacy : ref number from the first unstructured block
289
                                self::assertEquals(
290
                                    'Unstructured Remittance Information V3 block 1',
291
                                    $transactionDetail
292
                                        ->getRemittanceInformation()
293
                                        ->getMessage()
294
                                );
295
296
                                // First unstructured block
297
                                self::assertEquals(
298
                                    'Unstructured Remittance Information V3 block 1',
299
                                    $transactionDetail
300
                                        ->getRemittanceInformation()
301
                                        ->getUnstructuredBlocks()[0]
302
                                        ->getMessage()
303
                                );
304
305
                                // Second unstructured block
306
                                self::assertEquals(
307
                                    'Unstructured Remittance Information V3 block 2',
308
                                    $transactionDetail
309
                                        ->getRemittanceInformation()
310
                                        ->getUnstructuredBlocks()[1]
311
                                        ->getMessage()
312
                                );
313
314
                                // Ref number from the first structured block
315
                                self::assertEquals(
316
                                    'Ref number V3 block 1',
317
                                    $transactionDetail
318
                                        ->getRemittanceInformation()
319
                                        ->getStructuredBlocks()[0]
320
                                        ->getCreditorReferenceInformation()
321
                                        ->getRef()
322
                                );
323
324
                                // Ref number from the second structured block
325
                                self::assertEquals(
326
                                    'Ref number V3 block 2',
327
                                    $transactionDetail
328
                                        ->getRemittanceInformation()
329
                                        ->getStructuredBlocks()[1]
330
                                        ->getCreditorReferenceInformation()
331
                                        ->getRef()
332
                                );
333
334
                                // Code from the first structured block
335
                                self::assertEquals(
336
                                    'SCOR',
337
                                    $transactionDetail
338
                                        ->getRemittanceInformation()
339
                                        ->getStructuredBlocks()[0]
340
                                        ->getCreditorReferenceInformation()
341
                                        ->getCode()
342
                                );
343
344
                                // Code from the second structured block
345
                                self::assertEquals(
346
                                    'SCOR',
347
                                    $transactionDetail
348
                                        ->getRemittanceInformation()
349
                                        ->getStructuredBlocks()[1]
350
                                        ->getCreditorReferenceInformation()
351
                                        ->getCode()
352
                                );
353
354
                                // Additional remittance information from the first structured block
355
                                self::assertEquals(
356
                                    'Additional Remittance Information V3 block 1',
357
                                    $transactionDetail
358
                                        ->getRemittanceInformation()
359
                                        ->getStructuredBlocks()[0]
360
                                        ->getAdditionalRemittanceInformation()
361
                                );
362
363
                                // Additional remittance information from the second structured block
364
                                self::assertEquals(
365
                                    'Additional Remittance Information V3 block 2',
366
                                    $transactionDetail
367
                                        ->getRemittanceInformation()
368
                                        ->getStructuredBlocks()[1]
369
                                        ->getAdditionalRemittanceInformation()
370
                                );
371
372
                                break;
373
                            default:
374
                                break;
375
                        }
376
                    }
377
                }
378
            }
379
        }
380
    }
381
382
    public function testV2Message(): void
383
    {
384
        $message = $this->getV2Message();
385
386
        $notifications = $message->getRecords();
387
388
        self::assertCount(1, $notifications);
389
        foreach ($notifications as $notification) {
390
            $entries = $notification->getEntries();
391
392
            self::assertCount(1, $entries);
393
            foreach ($entries as $entry) {
394
                $transactionDetails = $entry->getTransactionDetails();
395
                self::assertCount(4, $transactionDetails);
396
                foreach ($transactionDetails as $index => $transactionDetail) {
397
                    switch ($index) {
398
                        case 0:
399
                            // Legacy : The first message comes from unstructured block
400
                            self::assertEquals(
401
                                'Unstructured Remittance Information V1',
402
                                $transactionDetail
403
                                    ->getRemittanceInformation()
404
                                    ->getMessage()
405
                            );
406
407
                            // Only one structured data block
408
                            self::assertEquals(
409
                                'Unstructured Remittance Information V1',
410
                                $transactionDetail
411
                                    ->getRemittanceInformation()
412
                                    ->getUnstructuredBlock()
413
                                    ->getMessage()
414
                            );
415
416
                            // Check structured and unstructured blocks
417
                            self::assertEquals(
418
                                'ISR ref number V1',
419
                                $transactionDetail
420
                                    ->getRemittanceInformation()
421
                                    ->getStructuredBlock()
422
                                    ->getCreditorReferenceInformation()
423
                                    ->getRef()
424
                            );
425
426
                            self::assertEquals(
427
                                'ISR Reference',
428
                                $transactionDetail
429
                                    ->getRemittanceInformation()
430
                                    ->getStructuredBlock()
431
                                    ->getCreditorReferenceInformation()
432
                                    ->getProprietary()
433
                            );
434
435
                            self::assertNull(
436
                                $transactionDetail
437
                                    ->getRemittanceInformation()
438
                                    ->getStructuredBlock()
439
                                    ->getCreditorReferenceInformation()
440
                                    ->getCode()
441
                            );
442
443
                            self::assertEquals(
444
                                'Additional Remittance Information V1',
445
                                $transactionDetail
446
                                    ->getRemittanceInformation()
447
                                    ->getStructuredBlock()
448
                                    ->getAdditionalRemittanceInformation()
449
                            );
450
451
                            break;
452
                        case 1:
453
                            self::assertEquals(
454
                                'ISR ref number V2',
455
                                $transactionDetail
456
                                    ->getRemittanceInformation()
457
                                    ->getMessage()
458
                            );
459
460
                            // Only one structured data block
461
                            self::assertEquals(
462
                                'ISR ref number V2',
463
                                $transactionDetail
464
                                    ->getRemittanceInformation()
465
                                    ->getUnstructuredBlock()
466
                                    ->getMessage()
467
                            );
468
469
                            // Check structured and unstructured blocks
470
                            self::assertEquals(
471
                                'ISR ref number V2',
472
                                $transactionDetail
473
                                    ->getRemittanceInformation()
474
                                    ->getStructuredBlock()
475
                                    ->getCreditorReferenceInformation()
476
                                    ->getRef()
477
                            );
478
479
                            self::assertEquals(
480
                                null,
481
                                $transactionDetail
482
                                    ->getRemittanceInformation()
483
                                    ->getStructuredBlock()
484
                                    ->getCreditorReferenceInformation()
485
                                    ->getProprietary()
486
                            );
487
488
                            self::assertEquals(
489
                                'SCOR',
490
                                $transactionDetail
491
                                    ->getRemittanceInformation()
492
                                    ->getStructuredBlock()
493
                                    ->getCreditorReferenceInformation()
494
                                    ->getCode()
495
                            );
496
497
                            self::assertEquals(
498
                                null,
499
                                $transactionDetail
500
                                    ->getRemittanceInformation()
501
                                    ->getStructuredBlock()
502
                                    ->getAdditionalRemittanceInformation()
503
                            );
504
                            break;
505
                        case 2:
506
507
                            // Legacy : ref number from the structured information
508
                            // because the unstructured block is not present
509
                            self::assertEquals(
510
                                'ISR ref number V2',
511
                                $transactionDetail
512
                                    ->getRemittanceInformation()
513
                                    ->getMessage()
514
                            );
515
516
                            // No unstructured block
517
                            self::assertCount(
518
                                0,
519
                                $transactionDetail
520
                                    ->getRemittanceInformation()
521
                                    ->getUnstructuredBlocks()
522
                            );
523
524
                            // Check structured and unstructured blocks
525
                            self::assertEquals(
526
                                'ISR ref number V2',
527
                                $transactionDetail
528
                                    ->getRemittanceInformation()
529
                                    ->getStructuredBlock()
530
                                    ->getCreditorReferenceInformation()
531
                                    ->getRef()
532
                            );
533
534
                            self::assertEquals(
535
                                'ISR Reference',
536
                                $transactionDetail
537
                                    ->getRemittanceInformation()
538
                                    ->getStructuredBlock()
539
                                    ->getCreditorReferenceInformation()
540
                                    ->getProprietary()
541
                            );
542
543
                            self::assertNull(
544
                                $transactionDetail
545
                                    ->getRemittanceInformation()
546
                                    ->getStructuredBlock()
547
                                    ->getCreditorReferenceInformation()
548
                                    ->getCode()
549
                            );
550
551
                            self::assertEquals(
552
                                'Additional Remittance Information V2',
553
                                $transactionDetail
554
                                    ->getRemittanceInformation()
555
                                    ->getStructuredBlock()
556
                                    ->getAdditionalRemittanceInformation()
557
                            );
558
559
                            break;
560
                        case 3:
561
                            // Legacy : ref number from the first unstructured block
562
                            self::assertEquals(
563
                                'Unstructured Remittance Information V3 block 1',
564
                                $transactionDetail
565
                                    ->getRemittanceInformation()
566
                                    ->getMessage()
567
                            );
568
569
                            // First unstructured block
570
                            self::assertEquals(
571
                                'Unstructured Remittance Information V3 block 1',
572
                                $transactionDetail
573
                                    ->getRemittanceInformation()
574
                                    ->getUnstructuredBlocks()[0]
575
                                    ->getMessage()
576
                            );
577
578
                            // Second unstructured block
579
                            self::assertEquals(
580
                                'Unstructured Remittance Information V3 block 2',
581
                                $transactionDetail
582
                                    ->getRemittanceInformation()
583
                                    ->getUnstructuredBlocks()[1]
584
                                    ->getMessage()
585
                            );
586
587
                            // Ref number from the first structured block
588
                            self::assertEquals(
589
                                'Ref number V3 block 1',
590
                                $transactionDetail
591
                                    ->getRemittanceInformation()
592
                                    ->getStructuredBlocks()[0]
593
                                    ->getCreditorReferenceInformation()
594
                                    ->getRef()
595
                            );
596
597
                            // Ref number from the second structured block
598
                            self::assertEquals(
599
                                'Ref number V3 block 2',
600
                                $transactionDetail
601
                                    ->getRemittanceInformation()
602
                                    ->getStructuredBlocks()[1]
603
                                    ->getCreditorReferenceInformation()
604
                                    ->getRef()
605
                            );
606
607
                            // Code from the first structured block
608
                            self::assertEquals(
609
                                'SCOR',
610
                                $transactionDetail
611
                                    ->getRemittanceInformation()
612
                                    ->getStructuredBlocks()[0]
613
                                    ->getCreditorReferenceInformation()
614
                                    ->getCode()
615
                            );
616
617
                            // Code from the second structured block
618
                            self::assertEquals(
619
                                'SCOR',
620
                                $transactionDetail
621
                                    ->getRemittanceInformation()
622
                                    ->getStructuredBlocks()[1]
623
                                    ->getCreditorReferenceInformation()
624
                                    ->getCode()
625
                            );
626
627
                            // Additional remittance information from the first structured block
628
                            self::assertEquals(
629
                                'Additional Remittance Information V3 block 1',
630
                                $transactionDetail
631
                                    ->getRemittanceInformation()
632
                                    ->getStructuredBlocks()[0]
633
                                    ->getAdditionalRemittanceInformation()
634
                            );
635
636
                            // Additional remittance information from the second structured block
637
                            self::assertEquals(
638
                                'Additional Remittance Information V3 block 2',
639
                                $transactionDetail
640
                                    ->getRemittanceInformation()
641
                                    ->getStructuredBlocks()[1]
642
                                    ->getAdditionalRemittanceInformation()
643
                            );
644
645
                            break;
646
                        default:
647
                            break;
648
                    }
649
                }
650
            }
651
        }
652
    }
653
}
654