Passed
Branch master (7a0b0e)
by Randy
02:56
created

HydrationTest::testList()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 38
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 38
rs 8.8571
c 0
b 0
f 0
cc 2
eloc 25
nc 2
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\Address;
8
use Dgame\Soap\Test\Object\Body;
9
use Dgame\Soap\Test\Object\Car;
10
use Dgame\Soap\Test\Object\Envelope;
11
use Dgame\Soap\Test\Object\Fault;
12
use Dgame\Soap\Test\Object\Ort;
13
use Dgame\Soap\Test\Object\OrtsTeil;
14
use Dgame\Soap\Test\Object\Person;
15
use Dgame\Soap\Test\Object\Phone;
16
use Dgame\Soap\Test\Object\Result;
17
use Dgame\Soap\Test\Object\Root;
18
use Dgame\Soap\Test\Object\Stammdaten;
19
use Dgame\Soap\Test\Object\Strassen;
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'    => Root::class,
36
                'Person'  => Person::class,
37
                'Car'     => Car::class,
38
                'Phone'   => Phone::class,
39
                'Address' => Address::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 Root $root */
50
        $root = $objects[0];
51
52
        $this->assertNotNull($root);
53
        $this->assertInstanceOf(Root::class, $root);
54
55
        $persons = $root->getPersons();
56
        $this->assertCount(2, $persons);
57
58
        $this->assertInstanceOf(Person::class, $persons[0]);
59
        $this->assertEquals('Max Musterman', $persons[0]->getName());
60
        $this->assertInstanceOf(Car::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(Phone::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(Address::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(Person::class, $persons[1]);
73
        $this->assertEquals('Dr. Dolittle', $persons[1]->getName());
74
        $this->assertInstanceOf(Car::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(Phone::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(Address::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' => Car::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(Car::class, $objects[0]);
104
        /** @var Car $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' => Stammdaten::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(Stammdaten::class, $objects[0]);
126
        /** @var Stammdaten $stammdaten */
127
        $stammdaten = $objects[0];
128
        $this->assertEquals('Muster', $stammdaten->Name);
129
        $this->assertEquals('Max', $stammdaten->Vorname);
130
    }
131
132
    public function testFault()
133
    {
134
        $doc = new DOMDocument();
135
        $doc->load(__DIR__ . '/xml/fault.xml');
136
137
        $mapper = new ClassMapper(
138
            [
139
                'Envelope' => Envelope::class,
140
                'Body'     => Body::class,
141
                'Fault'    => Fault::class
142
            ]
143
        );
144
145
        $hydrator = new Hydrator($mapper);
146
        $objects  = $hydrator->hydrateDocument($doc);
147
148
        $this->assertCount(1, $objects);
149
        $this->assertArrayHasKey(0, $objects);
150
        $this->assertInstanceOf(Envelope::class, $objects[0]);
151
152
        /** @var Envelope $envelope */
153
        $envelope = $objects[0];
154
155
        $this->assertTrue($envelope->getBody()->hasFault());
156
        $this->assertEquals('Fehler!', $envelope->getBody()->getFault()->getFaultcode());
157
        $this->assertEquals('Es ist ein Fehler aufgetreten', $envelope->getBody()->getFault()->getFaultstring());
158
    }
159
160
    public function testList()
161
    {
162
        $doc = new DOMDocument();
163
        $doc->load(__DIR__ . '/xml/list.xml');
164
165
        $mapper = new ClassMapper(
166
            [
167
                'Envelope' => Envelope::class,
168
                'Body'     => Body::class,
169
                'Fault'    => Fault::class,
170
                'Result'   => Result::class,
171
                'Ort'      => Ort::class,
172
                'Oteil'    => OrtsTeil::class,
173
                'Strassen' => Strassen::class
174
            ]
175
        );
176
177
        $hydrator = new Hydrator($mapper);
178
        $objects  = $hydrator->hydrateDocument($doc);
179
180
        $this->assertCount(1, $objects);
181
        $this->assertArrayHasKey(0, $objects);
182
        $this->assertInstanceOf(Envelope::class, $objects[0]);
183
184
        /** @var Envelope $envelope */
185
        $envelope = $objects[0];
186
187
        $this->assertFalse($envelope->getBody()->hasFault());
188
        $this->assertInstanceOf(Result::class, $envelope->getBody()->getResult());
189
        $this->assertCount(1, $envelope->getBody()->getResult()->getOrte());
190
        $this->assertEquals('Hamburg', $envelope->getBody()->getResult()->getOrte()[0]->getName());
191
        $this->assertCount(4, $envelope->getBody()->getResult()->getOrte()[0]->getOrtsteile());
192
        $this->assertEquals('Hamburg-Altstadt', $envelope->getBody()->getResult()->getOrte()[0]->getOrtsteile()[1]->getName());
193
194
        for ($i = 0; $i < 4; $i++) {
195
            $this->assertNotEmpty($envelope->getBody()->getResult()->getOrte()[0]->getOrtsteile()[$i]->getStrassen());
196
        }
197
    }
198
}