Passed
Push — master ( cc8c81...f0282f )
by Christopher
04:33
created

EdmxTest::testWithSingleEntityWithPropertiesSerializeDeserializeRoundTrip()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 29
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 24
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 29
rs 8.8571
1
<?php
2
3
namespace AlgoWeb\ODataMetadata\Tests;
4
5
use AlgoWeb\ODataMetadata\MetadataV3\edm\Schema;
6
use AlgoWeb\ODataMetadata\MetadataV3\edmx\Edmx;
7
8
use Illuminate\Support\Str;
9
10
use AlgoWeb\ODataMetadata\MetadataV3\edmx\TDataServicesType;
11
use AlgoWeb\ODataMetadata\MetadataV3\edmx\TEdmxType;
12
13
class EdmxTest extends TestCase
14
{
15
    public function testIsOKAtDefault()
16
    {
17
        $msg = null;
18
        $edmx = new Edmx();
19
        $this->assertTrue($edmx->isOK($msg), $msg);
20
    }
21
22
    public function testDefaultSerializeOk()
23
    {
24
        $ds = DIRECTORY_SEPARATOR;
25
        $msg = null;
26
        $edmx = new Edmx();
27
        $this->assertTrue($edmx->isOK($msg), $msg);
28
        $this->assertNull($msg);
29
        $ymlDir = dirname(__DIR__) . $ds . "src" . $ds . "MetadataV3" . $ds . "JMSmetadata";
30
        $serializer =
31
            \JMS\Serializer\SerializerBuilder::create()
32
                ->addMetadataDir($ymlDir)
33
                ->build();
34
        $d = $serializer->serialize($edmx, "xml");
35
        $this->v3MetadataAgainstXSD($d);
36
    }
37
38
    public function v3MetadataAgainstXSD($data)
39
    {
40
        $ds = DIRECTORY_SEPARATOR;
41
42
        $goodxsd = dirname(__DIR__) . $ds . "xsd" . $ds . "Microsoft.Data.Entity.Design.Edmx_3.Fixed.xsd";
43
        if (!file_exists($goodxsd)) {
44
            return true;
45
        }
46
        $xml = new \DOMDocument();
47
        $xml->loadXML($data);
48
        $xml->schemaValidate($goodxsd);
49
        return true;
50
    }
51
52
    public function testDefaultSerializeDeserializeRoundTrip()
53
    {
54
        $ds = DIRECTORY_SEPARATOR;
55
        $msg = null;
56
        $edmx = new Edmx();
57
        $this->assertTrue($edmx->isOK($msg), $msg);
58
        $this->assertNull($msg);
59
        $this->checkEdmxSerialiseDeserialiseRoundTrip($ds, $edmx, $msg);
60
    }
61
62
    /**
63
     * @param $ds
64
     * @param $edmx
65
     * @param $msg
66
     */
67
    private function checkEdmxSerialiseDeserialiseRoundTrip($ds, $edmx, $msg)
68
    {
69
        $ymlDir = dirname(__DIR__) . $ds . "src" . $ds . "MetadataV3" . $ds . "JMSmetadata";
70
        $serializer =
71
            \JMS\Serializer\SerializerBuilder::create()
72
                ->addMetadataDir($ymlDir)
73
                ->build();
74
        $d1 = $serializer->serialize($edmx, "xml");
75
        $this->v3MetadataAgainstXSD($d1);
76
        $edmxElectricBoogaloo = $serializer->deserialize($d1, get_class($edmx), 'xml');
77
        $this->assertTrue($edmxElectricBoogaloo->isOK($msg), $msg);
78
        $this->assertEquals($edmx, $edmxElectricBoogaloo);
79
        // and final serialize pass to further constrain undetected misbehaviour
80
        $d2 = $serializer->serialize($edmxElectricBoogaloo, 'xml');
81
        $this->v3MetadataAgainstXSD($d2);
82
        $this->assertEquals($d1, $d2);
83
    }
84
85
    public function testFirstLevelSerializeDeserializeRoundTrip()
86
    {
87
        $ds = DIRECTORY_SEPARATOR;
88
        $msg = null;
89
        $schema = new Schema('data', 'metadata');
90
        $this->assertTrue($schema->isOK($msg), $msg);
91
        $services = new TDataServicesType('3.0', '1.0');
92
        $services->addToSchema($schema);
93
        $this->assertTrue($services->isOK($msg), $msg);
94
        $edmx = new Edmx();
95
        $edmx->setDataServiceType($services);
96
        $this->assertTrue($edmx->isOK($msg), $msg);
97
        $this->assertNull($msg);
98
99
        $this->checkEdmxSerialiseDeserialiseRoundTrip($ds, $edmx, $msg);
100
    }
101
102
    public function testWithSingleEntitySerializeOk()
103
    {
104
        $ds = DIRECTORY_SEPARATOR;
105
        $msg = null;
106
        $NewEntity = new \AlgoWeb\ODataMetadata\MetadataV3\edm\TEntityTypeType();
107
        $NewEntity->setName("simpleEntityType");
108
        $this->assertTrue($NewEntity->isOK($msg), $msg);
109
        $this->assertNull($msg);
110
        $edmx = new Edmx();
111
        $edmx->getDataServiceType()->getSchema()[0]->addToEntityType($NewEntity);
112
        $this->assertTrue($edmx->isOK($msg), $msg);
113
        $this->assertNull($msg);
114
115
116
        $ymlDir = dirname(__DIR__) . $ds . "src" . $ds . "MetadataV3" . $ds . "JMSmetadata";
117
        $serializer =
118
            \JMS\Serializer\SerializerBuilder::create()
119
                ->addMetadataDir($ymlDir)
120
                ->build();
121
        $d = $serializer->serialize($edmx, "xml");
122
123
        $this->v3MetadataAgainstXSD($d);
124
    }
125
126
    public function testWithSingleEntitySerializeDeserializeRoundTrip()
127
    {
128
        $ds = DIRECTORY_SEPARATOR;
129
        $msg = null;
130
        $NewEntity = new \AlgoWeb\ODataMetadata\MetadataV3\edm\TEntityTypeType();
131
        $NewEntity->setName("simpleEntityType");
132
        $this->assertTrue($NewEntity->isOK($msg), $msg);
133
        $this->assertNull($msg);
134
        $edmx = new Edmx();
135
        $edmx->getDataServiceType()->getSchema()[0]->addToEntityType($NewEntity);
136
        $this->assertTrue($edmx->isOK($msg), $msg);
137
        $this->assertNull($msg);
138
139
        $this->checkEdmxSerialiseDeserialiseRoundTrip($ds, $edmx, $msg);
140
    }
141
142
    public function testKnownGoodV3DocumentDeserialiseToOk()
143
    {
144
        $this->markTestSkipped('Skipped until service-document models get implemented');
145
        $ds = DIRECTORY_SEPARATOR;
146
        $msg = null;
147
148
        $docLocation = dirname(__DIR__) . $ds . "tests" . $ds . "exampleV3ServiceDocument.xml";
149
        $document = file_get_contents($docLocation);
150
        $type = 'AlgoWeb\ODataMetadata\MetadataV3\edmx\TDataServicesType';
151
        $ymlDir = dirname(__DIR__) . $ds . "src" . $ds . "MetadataV3" . $ds . "JMSmetadata";
152
153
        $serializer =
154
            \JMS\Serializer\SerializerBuilder::create()
155
                ->addMetadataDir($ymlDir)
156
                ->build();
157
158
        $d = $serializer->deserialize($document, $type, 'xml');
159
        $this->assertTrue($d instanceof TDataServicesType, get_class($this));
160
        $this->assertTrue($d->isOK($msg), $msg);
161
    }
162
163
    public function testKnownGoodV3MetadataDeserialiseToOk()
164
    {
165
        $ds = DIRECTORY_SEPARATOR;
166
        $msg = null;
167
168
        $docLocation = dirname(__DIR__) . $ds . "tests" . $ds . "exampleV3ServiceMetadata.xml";
169
        $document = file_get_contents($docLocation);
170
        $type = 'AlgoWeb\ODataMetadata\MetadataV3\edmx\Edmx';
171
        $ymlDir = dirname(__DIR__) . $ds . "src" . $ds . "MetadataV3" . $ds . "JMSmetadata";
172
173
        $serializer =
174
            \JMS\Serializer\SerializerBuilder::create()
175
                ->addMetadataDir($ymlDir)
176
                ->build();
177
178
        $d = $serializer->deserialize($document, $type, 'xml');
179
        $this->assertTrue($d instanceof TEdmxType, get_class($d));
180
        $this->assertTrue($d->isOK($msg), $msg);
181
    }
182
183
    public function testKnownGoodV3MetadataDeserialiseToOkSerializeDeserializeRoundTrip()
184
    {
185
        $this->markTestSkipped();
186
        $ds = DIRECTORY_SEPARATOR;
187
        $msg = null;
188
189
        $docLocation = dirname(__DIR__) . $ds . "tests" . $ds . "exampleV3ServiceMetadata.xml";
190
        $document = file_get_contents($docLocation);
191
        $this->v3MetadataAgainstXSD($document);
192
        $type = 'AlgoWeb\ODataMetadata\MetadataV3\edmx\Edmx';
193
        $ymlDir = dirname(__DIR__) . $ds . "src" . $ds . "MetadataV3" . $ds . "JMSmetadata";
194
195
        $serializer =
196
            \JMS\Serializer\SerializerBuilder::create()
197
                ->addMetadataDir($ymlDir)
198
                ->build();
199
200
        $d = $serializer->deserialize($document, $type, 'xml');
201
        $this->assertTrue($d instanceof TEdmxType, get_class($d));
202
        $this->assertTrue($d->isOK($msg), $msg);
203
        $this->checkEdmxSerialiseDeserialiseRoundTrip($ds, $d, $msg);
204
    }
205
206
    public function testWithSingleEntityWithPropertiesSerializeOk()
207
    {
208
        $ds = DIRECTORY_SEPARATOR;
209
        $msg = null;
210
        $NewProperty = new \AlgoWeb\ODataMetadata\MetadataV3\edm\TEntityPropertyType();
211
        $NewProperty->setName("TheFirstProperty");
212
        $NewProperty->setType("String");
213
        $this->assertTrue($NewProperty->isOK($msg), $msg);
214
        $this->assertNull($msg);
215
216
        $NewEntity = new \AlgoWeb\ODataMetadata\MetadataV3\edm\TEntityTypeType();
217
        $NewEntity->setName("simpleEntityType");
218
        $NewEntity->addToProperty($NewProperty);
219
        $this->assertTrue($NewEntity->isOK($msg), $msg);
220
        $this->assertNull($msg);
221
222
        $entitySet = new \AlgoWeb\ODataMetadata\MetadataV3\edm\EntityContainer\EntitySetAnonymousType();
223
        $entitySet->setName(Str::plural($NewEntity->getName(), 2));
224
        $entitySet->setEntityType($NewEntity->getName());
225
        $this->assertTrue($entitySet->isOK($msg), $msg);
226
        $this->assertNull($msg);
227
        $edmx = new Edmx();
228
        $edmx->getDataServiceType()->getSchema()[0]->addToEntityType($NewEntity);
229
        $edmx->getDataServiceType()->getSchema()[0]->getEntityContainer()[0]->addToEntitySet($entitySet);
230
        $this->assertTrue($edmx->isOK($msg), $msg);
231
        $this->assertNull($msg);
232
233
234
        $ymlDir = dirname(__DIR__) . $ds . "src" . $ds . "MetadataV3" . $ds . "JMSmetadata";
235
        $serializer =
236
            \JMS\Serializer\SerializerBuilder::create()
237
                ->addMetadataDir($ymlDir)
238
                ->build();
239
        $d = $serializer->serialize($edmx, "xml");
240
        $this->v3MetadataAgainstXSD($d);
241
    }
242
243
    public function testWithSingleEntityWithPropertiesSerializeDeserializeRoundTrip()
244
    {
245
        $ds = DIRECTORY_SEPARATOR;
246
        $msg = null;
247
        $NewProperty = new \AlgoWeb\ODataMetadata\MetadataV3\edm\TEntityPropertyType();
248
        $NewProperty->setName("TheFirstProperty");
249
        $NewProperty->setType("String");
250
        $this->assertTrue($NewProperty->isOK($msg), $msg);
251
        $this->assertNull($msg);
252
253
        $NewEntity = new \AlgoWeb\ODataMetadata\MetadataV3\edm\TEntityTypeType();
254
        $NewEntity->setName("simpleEntityType");
255
        $NewEntity->addToProperty($NewProperty);
256
        $this->assertTrue($NewEntity->isOK($msg), $msg);
257
        $this->assertNull($msg);
258
259
        $entitySet = new \AlgoWeb\ODataMetadata\MetadataV3\edm\EntityContainer\EntitySetAnonymousType();
260
        $entitySet->setName(Str::plural($NewEntity->getName(), 2));
261
        $entitySet->setEntityType($NewEntity->getName());
262
        $this->assertTrue($entitySet->isOK($msg), $msg);
263
        $this->assertNull($msg);
264
        $edmx = new Edmx();
265
        $edmx->getDataServiceType()->getSchema()[0]->addToEntityType($NewEntity);
266
        $edmx->getDataServiceType()->getSchema()[0]->getEntityContainer()[0]->addToEntitySet($entitySet);
267
        $this->assertTrue($edmx->isOK($msg), $msg);
268
        $this->assertNull($msg);
269
270
        $this->checkEdmxSerialiseDeserialiseRoundTrip($ds, $edmx, $msg);
271
    }
272
273
    public function testWithSingleEntityWithoutPropertiesSerializeDeserializeRoundTrip()
274
    {
275
        $ds = DIRECTORY_SEPARATOR;
276
        $msg = null;
277
278
        $NewEntity = new \AlgoWeb\ODataMetadata\MetadataV3\edm\TEntityTypeType();
279
        $NewEntity->setName("simpleEntityType");
280
        $this->assertTrue($NewEntity->isOK($msg), $msg);
281
        $this->assertNull($msg);
282
283
        $entitySet = new \AlgoWeb\ODataMetadata\MetadataV3\edm\EntityContainer\EntitySetAnonymousType();
284
        $entitySet->setName(Str::plural($NewEntity->getName(), 2));
285
        $entitySet->setEntityType($NewEntity->getName());
286
        $this->assertTrue($entitySet->isOK($msg), $msg);
287
        $this->assertNull($msg);
288
        $edmx = new Edmx();
289
        $edmx->getDataServiceType()->getSchema()[0]->addToEntityType($NewEntity);
290
        $edmx->getDataServiceType()->getSchema()[0]->getEntityContainer()[0]->addToEntitySet($entitySet);
291
        $this->assertTrue($edmx->isOK($msg), $msg);
292
        $this->assertNull($msg);
293
294
        $this->checkEdmxSerialiseDeserialiseRoundTrip($ds, $edmx, $msg);
295
    }
296
}
297