Skip to content

Commit f16f554

Browse files
committed
Add additional serialization test cases for additional and pattern properties
1 parent 2a58036 commit f16f554

File tree

2 files changed

+96
-12
lines changed

2 files changed

+96
-12
lines changed

tests/PostProcessor/AdditionalPropertiesAccessorPostProcessorTest.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use PHPModelGenerator\ModelGenerator;
1717
use PHPModelGenerator\SchemaProcessor\Hook\SetterBeforeValidationHookInterface;
1818
use PHPModelGenerator\SchemaProcessor\PostProcessor\AdditionalPropertiesAccessorPostProcessor;
19+
use PHPModelGenerator\SchemaProcessor\PostProcessor\PopulatePostProcessor;
1920
use PHPModelGenerator\SchemaProcessor\PostProcessor\PostProcessor;
2021
use PHPModelGenerator\Tests\AbstractPHPModelGeneratorTest;
2122

@@ -405,6 +406,66 @@ public function testAdditionalPropertiesAreSerialized(bool $implicitNull): void
405406
$this->assertNull($this->getParameterType($object, 'setAdditionalProperty', 1));
406407
}
407408

409+
410+
public function testAdditionalPropertiesAreSerializedWithoutAdditionalPropertiesAccessorPostProcessor(): void
411+
{
412+
$this->modifyModelGenerator = function (ModelGenerator $generator): void {
413+
$generator->addPostProcessor(new PopulatePostProcessor());
414+
};
415+
416+
$className = $this->generateClassFromFile(
417+
'AdditionalPropertiesTransformingFilter.json',
418+
(new GeneratorConfiguration())->setSerialization(true)
419+
);
420+
421+
$object = new $className(['name' => 'Late autumn', 'start' => '2020-10-10']);
422+
$this->assertEqualsCanonicalizing(['name' => 'Late autumn', 'start' => '20201010'], $object->toArray());
423+
424+
$object->populate(['end' => '20201212']);
425+
$this->assertEqualsCanonicalizing(
426+
['name' => 'Late autumn', 'start' => '20201010', 'end' => '20201212'],
427+
$object->toArray()
428+
);
429+
}
430+
431+
public function testAdditionalPropertiesAreNotSerializedWhenNotDefinedWithoutExplicitAccessorMethods(): void
432+
{
433+
$this->modifyModelGenerator = function (ModelGenerator $generator): void {
434+
$generator->addPostProcessor(new PopulatePostProcessor());
435+
};
436+
437+
$className = $this->generateClassFromFile(
438+
'AdditionalPropertiesNotDefined.json',
439+
(new GeneratorConfiguration())->setSerialization(true)
440+
);
441+
442+
$object = new $className(['a' => 1, 'b' => 2]);
443+
$this->assertSame([], $object->toArray());
444+
445+
$object->populate(['a' => 3, 'c' => 4]);
446+
$this->assertSame([], $object->toArray());
447+
}
448+
449+
public function testAdditionalPropertiesAreSerializedWhenNotDefinedWithExplicitAccessorMethods(): void
450+
{
451+
$this->modifyModelGenerator = function (ModelGenerator $generator): void {
452+
$generator
453+
->addPostProcessor(new PopulatePostProcessor())
454+
->addPostProcessor(new AdditionalPropertiesAccessorPostProcessor(true));
455+
};
456+
457+
$className = $this->generateClassFromFile(
458+
'AdditionalPropertiesNotDefined.json',
459+
(new GeneratorConfiguration())->setSerialization(true)
460+
);
461+
462+
$object = new $className(['a' => 1, 'b' => 2]);
463+
$this->assertEqualsCanonicalizing(['a' => 1, 'b' => 2], $object->toArray());
464+
465+
$object->populate(['a' => 3, 'c' => 4]);
466+
$this->assertEqualsCanonicalizing(['a' => 3, 'b' => 2, 'c' => 4], $object->toArray());
467+
}
468+
408469
public function testMultiTypeAdditionalProperties(): void
409470
{
410471
$this->addPostProcessor(true);

tests/PostProcessor/PatternPropertiesAccessorPostProcessorTest.php

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,19 +249,42 @@ public function testModifyingPatternPropertiesViaPopulate(): void
249249
$object->getPatternProperties('^b')
250250
);
251251
$this->assertSame(['c1' => 'World'], $object->getAdditionalProperties());
252-
$this->assertEqualsCanonicalizing(
253-
[
254-
'a0' => 100,
255-
'a1' => -10,
256-
'a2' => 10,
257-
'b1' => 'Hello',
258-
'b2' => 'World',
259-
'c1' => 'World',
260-
'alpha' => 100,
261-
'beta' => null,
262-
],
263-
$object->toArray()
252+
253+
$state = [
254+
'a0' => 100,
255+
'a1' => -10,
256+
'a2' => 10,
257+
'b1' => 'Hello',
258+
'b2' => 'World',
259+
'c1' => 'World',
260+
'alpha' => 100,
261+
'beta' => null,
262+
];
263+
$this->assertEqualsCanonicalizing($state, $object->toArray());
264+
265+
// make sure the pattern properties are not changed when a validation error occurs
266+
try {
267+
$object->populate(['a0' => 50, 'a1' => 60, 'beta' => false]);
268+
$this->fail('Exception not thrown');
269+
} catch (Exception $exception) {
270+
$this->assertEqualsCanonicalizing($state, $object->toArray());
271+
}
272+
}
273+
274+
public function testPatternPropertiesAreSerializedWithoutPatternPropertiesAccessorPostProcessor(): void
275+
{
276+
$this->addPostProcessors(new PopulatePostProcessor());
277+
278+
$className = $this->generateClassFromFile(
279+
'PatternProperties.json',
280+
(new GeneratorConfiguration())->setSerialization(true)
264281
);
282+
283+
$object = new $className(['a0' => 100]);
284+
$this->assertEqualsCanonicalizing(['alpha' => null, 'beta' => null, 'a0' => 100], $object->toArray());
285+
286+
$object->populate(['alpha' => 30, 'a0' => 10, 'a1' => 20]);
287+
$this->assertEqualsCanonicalizing(['alpha' => 30, 'beta' => null, 'a0' => 10, 'a1' => 20], $object->toArray());
265288
}
266289

267290
/**

0 commit comments

Comments
 (0)