previousUNHAreOverriddenIfTheyDoesntHaveUNT()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 18
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 24
rs 9.6666
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EdifactParser\Tests\Unit;
6
7
use EDI\Parser;
8
use EdifactParser\SegmentList;
9
use EdifactParser\Segments\CNTControl;
10
use EdifactParser\Segments\UNHMessageHeader;
11
use EdifactParser\Segments\UNTMessageFooter;
12
use EdifactParser\TransactionMessage;
13
use PHPUnit\Framework\TestCase;
14
15
final class TransactionMessageTest extends TestCase
16
{
17
    /** @test */
18
    public function segmentsInOneMessage(): void
19
    {
20
        $fileContent = "UNH+1+IFTMIN:S:93A:UN:PN001'\nUNT+19+1'";
21
22
        self::assertEquals([
23
            new TransactionMessage([
24
                UNHMessageHeader::class => [
25
                    '1' => new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]),
26
                ],
27
                UNTMessageFooter::class => [
28
                    '19' => new UNTMessageFooter(['UNT', '19', '1']),
29
                ],
30
            ]),
31
        ], $this->transactionMessages($fileContent));
32
    }
33
34
    /** @test */
35
    public function segmentsInTwoMessages(): void
36
    {
37
        $fileContent = <<<EDI
38
UNA:+.? '
39
UNH+1+IFTMIN:S:93A:UN:PN001'
40
UNT+19+1'
41
UNH+2+IFTMIN:S:94A:UN:PN002'
42
UNT+19+2'
43
EDI;
44
        self::assertEquals([
45
            new TransactionMessage([
46
                UNHMessageHeader::class => [
47
                    '1' => new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]),
48
                ],
49
                UNTMessageFooter::class => [
50
                    '19' => new UNTMessageFooter(['UNT', '19', '1']),
51
                ],
52
            ]),
53
            new TransactionMessage([
54
                UNHMessageHeader::class => [
55
                    '2' => new UNHMessageHeader(['UNH', '2', ['IFTMIN', 'S', '94A', 'UN', 'PN002']]),
56
                ],
57
                UNTMessageFooter::class => [
58
                    '19' => new UNTMessageFooter(['UNT', '19', '2']),
59
                ],
60
            ]),
61
        ], $this->transactionMessages($fileContent));
62
    }
63
64
    /** @test */
65
    public function oneMessageWithMultipleSegmentsWithTheSameName(): void
66
    {
67
        $fileContent = <<<EDI
68
UNA:+.? '
69
UNH+1+IFTMIN:S:93A:UN:PN001'
70
CNT+7:0.1:KGM'
71
CNT+11:1:PCE'
72
CNT+15:0.068224:MTQ'
73
UNT+19+1'
74
EDI;
75
        self::assertEquals([
76
            new TransactionMessage([
77
                UNHMessageHeader::class => [
78
                    '1' => new UNHMessageHeader(['UNH', '1', ['IFTMIN', 'S', '93A', 'UN', 'PN001']]),
79
                ],
80
                UNTMessageFooter::class => [
81
                    '19' => new UNTMessageFooter(['UNT', '19', '1']),
82
                ],
83
                CNTControl::class => [
84
                    '7' => new CNTControl(['CNT', ['7', '0.1', 'KGM']]),
85
                    '11' => new CNTControl(['CNT', ['11', '1', 'PCE']]),
86
                    '15' => new CNTControl(['CNT', ['15', '0.068224', 'MTQ']]),
87
                ],
88
            ]),
89
        ], $this->transactionMessages($fileContent));
90
    }
91
92
    /** @test */
93
    public function oneMessageIsCreatedWhenStartWithUNHAndEndsWithUNT(): void
94
    {
95
        $fileContent = <<<EDI
96
UNA:+.? '
97
UNH+1+anything'
98
CNT+7:0.1:KGM'
99
UNT+19+1'
100
IGN+ORE:ME'
101
UNH+2+anything'
102
UNT+19+2'
103
UNZ+2+3'
104
EDI;
105
        self::assertEquals([
106
            new TransactionMessage([
107
                UNHMessageHeader::class => [
108
                    '1' => new UNHMessageHeader(['UNH', '1', 'anything']),
109
                ],
110
                CNTControl::class => [
111
                    '7' => new CNTControl(['CNT', ['7', '0.1', 'KGM']]),
112
                ],
113
                UNTMessageFooter::class => [
114
                    '19' => new UNTMessageFooter(['UNT', '19', '1']),
115
                ],
116
            ]),
117
            new TransactionMessage([
118
                UNHMessageHeader::class => [
119
                    '2' => new UNHMessageHeader(['UNH', '2', 'anything']),
120
                ],
121
                UNTMessageFooter::class => [
122
                    '19' => new UNTMessageFooter(['UNT', '19', '2']),
123
                ],
124
            ]),
125
        ], $this->transactionMessages($fileContent));
126
    }
127
128
    /** @test */
129
    public function previousUNHAreOverriddenIfTheyDoesntHaveUNT(): void
130
    {
131
        $fileContent = <<<EDI
132
UNA:+.? '
133
UNH+1+anything'
134
UNH+2+anything'
135
CNT+5:0.1:KGM'
136
UNT+10+2'
137
UNH+3+anything'
138
UNZ+2+3'
139
EDI;
140
        self::assertEquals([
141
            new TransactionMessage([
142
                UNHMessageHeader::class => [
143
                    '2' => new UNHMessageHeader(['UNH', '2', 'anything']),
144
                ],
145
                CNTControl::class => [
146
                    '5' => new CNTControl(['CNT', ['5', '0.1', 'KGM']]),
147
                ],
148
                UNTMessageFooter::class => [
149
                    '10' => new UNTMessageFooter(['UNT', '10', '2']),
150
                ],
151
            ]),
152
        ], $this->transactionMessages($fileContent));
153
    }
154
155
    /** @test */
156
    public function messageNotCreatedIfUNTDoesntHaveUNHOrViceVersa(): void
157
    {
158
        $fileContent = <<<EDI
159
UNA:+.? '
160
CNT+1000:0.1:KGM'
161
UNT+10+2'
162
CNT+2000:0.2:KGM'
163
UNH+3+anything'
164
CNT+3000:0.3:KGM'
165
UNZ+2+3'
166
EDI;
167
        self::assertEquals([], $this->transactionMessages($fileContent));
168
    }
169
170
    /** @test */
171
    public function segmentsByTag(): void
172
    {
173
        $fileContent = <<<EDI
174
UNA:+.? '
175
UNH+1+anything'
176
CNT+5:0.1:KGM'
177
UNT+10+2'
178
UNZ+2+3'
179
EDI;
180
        $messages = $this->transactionMessages($fileContent);
181
        /** @var TransactionMessage $firstMessage */
182
        $firstMessage = reset($messages);
183
184
        self::assertEquals([
185
            '5' => new CNTControl(['CNT', ['5', '0.1', 'KGM']]),
186
        ], $firstMessage->segmentsByTag(CNTControl::class));
187
188
        self::assertEmpty($firstMessage->segmentsByTag('unknown'));
189
    }
190
191
    /** @test */
192
    public function segmentByTagAndSubId(): void
193
    {
194
        $fileContent = <<<EDI
195
UNA:+.? '
196
UNH+1+anything'
197
CNT+5:0.1:KGM'
198
UNT+10+2'
199
UNZ+2+3'
200
EDI;
201
        $messages = $this->transactionMessages($fileContent);
202
        /** @var TransactionMessage $firstMessage */
203
        $firstMessage = reset($messages);
204
205
        self::assertEquals(
206
            new CNTControl(['CNT', ['5', '0.1', 'KGM']]),
207
            $firstMessage->segmentByTagAndSubId(CNTControl::class, '5')
208
        );
209
210
        self::assertNull($firstMessage->segmentByTagAndSubId(CNTControl::class, 'unknown'));
211
    }
212
213
    private function transactionMessages(string $fileContent): array
214
    {
215
        $segments = SegmentList::withDefaultFactory()
216
            ->fromRaw((new Parser($fileContent))->get());
217
218
        return TransactionMessage::groupSegmentsByMessage(...$segments);
219
    }
220
}
221