Completed
Push — master ( f1f29b...3c2029 )
by Randy
02:32
created

HydrationTest::testSnippet()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 12
nc 1
nop 0
1
<?php
2
3
namespace Dgame\Soap\Test;
4
5
use Dgame\Soap\Hydrator\ClassMapper;
6
use Dgame\Soap\Hydrator\Dom\Hydrator;
7
use Dgame\Soap\Test\Object\TestAddress;
8
use Dgame\Soap\Test\Object\TestBody;
9
use Dgame\Soap\Test\Object\TestCar;
10
use Dgame\Soap\Test\Object\TestEnvelope;
11
use Dgame\Soap\Test\Object\TestFault;
12
use Dgame\Soap\Test\Object\TestOrt;
13
use Dgame\Soap\Test\Object\TestOrtsTeil;
14
use Dgame\Soap\Test\Object\TestPerson;
15
use Dgame\Soap\Test\Object\TestPhone;
16
use Dgame\Soap\Test\Object\TestResult;
17
use Dgame\Soap\Test\Object\TestRoot;
18
use Dgame\Soap\Test\Object\TestStammdaten;
19
use Dgame\Soap\Test\Object\TestStrassen;
20
use DOMDocument;
21
use PHPUnit\Framework\TestCase;
22
23
/**
24
 * Class HydrationTest
25
 */
26
final class HydrationTest extends TestCase
27
{
28
    public function testObjects()
29
    {
30
        $doc = new DOMDocument();
31
        $doc->load(__DIR__ . '/xml/test1.xml');
32
33
        $mapper = new ClassMapper(
34
            [
35
                'Root'    => TestRoot::class,
36
                'Person'  => TestPerson::class,
37
                'Car'     => TestCar::class,
38
                'Phone'   => TestPhone::class,
39
                'Address' => TestAddress::class
40
            ]
41
        );
42
        $mapper->appendPattern('/^(?:soap\-?)?env(?:elope)?/iS', 'Root');
43
44
        $hydrator = new Hydrator($mapper);
45
        $objects  = $hydrator->hydrateDocument($doc);
46
47
        $this->assertCount(1, $objects);
48
49
        /** @var TestRoot $root */
50
        $root = $objects[0];
51
52
        $this->assertNotNull($root);
53
        $this->assertInstanceOf(TestRoot::class, $root);
54
55
        $persons = $root->getPersons();
56
        $this->assertCount(2, $persons);
57
58
        $this->assertInstanceOf(TestPerson::class, $persons[0]);
59
        $this->assertEquals('Max Musterman', $persons[0]->getName());
60
        $this->assertInstanceOf(TestCar::class, $persons[0]->getCar());
61
        $this->assertEquals('BMW', $persons[0]->getCar()->getMarke());
62
        $this->assertNotEmpty($persons[0]->getCar()->kennung);
63
        $this->assertEquals('i8', $persons[0]->getCar()->kennung);
64
        $this->assertInstanceOf(TestPhone::class, $persons[0]->getPhone());
65
        $this->assertEquals('iPhone', $persons[0]->getPhone()->getName());
66
        $this->assertEquals(9, $persons[0]->getPhone()->getValue());
67
        $this->assertEquals('Hamburg', $persons[0]->getBirthplace());
68
        $this->assertInstanceOf(TestAddress::class, $persons[0]->getAddress());
69
        $this->assertEquals('Hauptstraße 1', $persons[0]->getAddress()->getStreet());
70
        $this->assertEquals(245698, $persons[0]->getAddress()->getPlz());
71
72
        $this->assertInstanceOf(TestPerson::class, $persons[1]);
73
        $this->assertEquals('Dr. Dolittle', $persons[1]->getName());
74
        $this->assertInstanceOf(TestCar::class, $persons[1]->getCar());
75
        $this->assertEquals('Audi', $persons[1]->getCar()->getMarke());
76
        $this->assertNotEmpty($persons[0]->getCar()->kennung);
77
        $this->assertEquals('A3', $persons[1]->getCar()->kennung);
78
        $this->assertInstanceOf(TestPhone::class, $persons[1]->getPhone());
79
        $this->assertEquals('Sony', $persons[1]->getPhone()->getName());
80
        $this->assertEquals('Xperia Z3', $persons[1]->getPhone()->getValue());
81
        $this->assertEquals('München', $persons[1]->getBirthplace());
82
        $this->assertInstanceOf(TestAddress::class, $persons[1]->getAddress());
83
        $this->assertEquals('Partkstraße', $persons[1]->getAddress()->getStreet());
84
        $this->assertEquals(365494, $persons[1]->getAddress()->getPlz());
85
    }
86
87
    public function testWithoutFirstObject()
88
    {
89
        $doc = new DOMDocument();
90
        $doc->loadXml('<root><Car marke="Mercedes" /></root>');
91
92
        $mapper = new ClassMapper(
93
            [
94
                'Car' => TestCar::class
95
            ]
96
        );
97
98
        $hydrator = new Hydrator($mapper);
99
        $objects  = $hydrator->hydrateDocument($doc);
100
101
        $this->assertCount(1, $objects);
102
        $this->assertArrayHasKey(0, $objects);
103
        $this->assertInstanceOf(TestCar::class, $objects[0]);
104
        /** @var TestCar $car */
105
        $car = $objects[0];
106
        $this->assertEquals('Mercedes', $car->getMarke());
107
    }
108
109
    public function testPropertyAssignment()
110
    {
111
        $doc = new DOMDocument();
112
        $doc->load(__DIR__ . '/xml/test2.xml');
113
114
        $mapper = new ClassMapper(
115
            [
116
                'Stammdaten' => TestStammdaten::class
117
            ]
118
        );
119
120
        $hydrator = new Hydrator($mapper);
121
        $objects  = $hydrator->hydrateDocument($doc);
122
123
        $this->assertCount(1, $objects);
124
        $this->assertArrayHasKey(0, $objects);
125
        $this->assertInstanceOf(TestStammdaten::class, $objects[0]);
126
127
        /** @var TestStammdaten $stammdaten */
128
        $stammdaten = $objects[0];
129
130
        $this->assertEquals('Muster', $stammdaten->Name);
131
        $this->assertEquals('Max', $stammdaten->Vorname);
132
    }
133
134
    public function testFault()
135
    {
136
        $doc = new DOMDocument();
137
        $doc->load(__DIR__ . '/xml/fault.xml');
138
139
        $mapper = new ClassMapper(
140
            [
141
                'Envelope' => TestEnvelope::class,
142
                'Body'     => TestBody::class,
143
                'Fault'    => TestFault::class
144
            ]
145
        );
146
147
        $hydrator = new Hydrator($mapper);
148
        $objects  = $hydrator->hydrateDocument($doc);
149
150
        $this->assertCount(1, $objects);
151
        $this->assertArrayHasKey(0, $objects);
152
        $this->assertInstanceOf(TestEnvelope::class, $objects[0]);
153
154
        /** @var TestEnvelope $envelope */
155
        $envelope = $objects[0];
156
157
        $this->assertTrue($envelope->getBody()->hasFault());
158
        $this->assertEquals('Fehler!', $envelope->getBody()->getFault()->getFaultcode());
159
        $this->assertEquals('Es ist ein Fehler aufgetreten', $envelope->getBody()->getFault()->getFaultstring());
160
    }
161
162
    public function testList()
163
    {
164
        $doc = new DOMDocument();
165
        $doc->load(__DIR__ . '/xml/list.xml');
166
167
        $mapper = new ClassMapper(
168
            [
169
                'Envelope' => TestEnvelope::class,
170
                'Body'     => TestBody::class,
171
                'Fault'    => TestFault::class,
172
                'Result'   => TestResult::class,
173
                'Ort'      => TestOrt::class,
174
                'Oteil'    => TestOrtsTeil::class,
175
                'Strassen' => TestStrassen::class
176
            ]
177
        );
178
179
        $hydrator = new Hydrator($mapper);
180
        $objects  = $hydrator->hydrateDocument($doc);
181
182
        $this->assertCount(1, $objects);
183
        $this->assertArrayHasKey(0, $objects);
184
        $this->assertInstanceOf(TestEnvelope::class, $objects[0]);
185
186
        /** @var TestEnvelope $envelope */
187
        $envelope = $objects[0];
188
189
        $this->assertFalse($envelope->getBody()->hasFault());
190
        $this->assertInstanceOf(TestResult::class, $envelope->getBody()->getResult());
191
        $this->assertCount(1, $envelope->getBody()->getResult()->getOrte());
192
        $this->assertEquals('Hamburg', $envelope->getBody()->getResult()->getOrte()[0]->getName());
193
        $this->assertCount(4, $envelope->getBody()->getResult()->getOrte()[0]->getOrtsteile());
194
        $this->assertEquals('Hamburg-Altstadt', $envelope->getBody()->getResult()->getOrte()[0]->getOrtsteile()[1]->getName());
195
196
        for ($i = 0; $i < 4; $i++) {
197
            $this->assertNotEmpty($envelope->getBody()->getResult()->getOrte()[0]->getOrtsteile()[$i]->getStrassen());
198
        }
199
    }
200
201
    public function testSnippet()
202
    {
203
        $doc = new DOMDocument();
204
        $doc->load(__DIR__ . '/xml/test3.xml');
205
206
        $mapper   = new ClassMapper(['Address' => TestAddress::class]);
207
        $hydrator = new Hydrator($mapper);
208
        $objects  = $hydrator->hydrateDocument($doc);
209
210
        $this->assertNotEmpty($objects);
211
        $this->assertCount(1, $objects);
212
        $this->assertInstanceOf(TestAddress::class, $objects[0]);
213
214
        /** @var TestAddress $address */
215
        $address = $objects[0];
216
        $this->assertEquals('Hauptstraße 1', $address->getStreet());
217
        $this->assertEquals(245698, $address->getPlz());
218
    }
219
}