Skip to content

Commit

Permalink
Add missing tests vol. 2
Browse files Browse the repository at this point in the history
  • Loading branch information
donatorsky committed May 7, 2021
1 parent 641ab3e commit b1960e3
Show file tree
Hide file tree
Showing 17 changed files with 194 additions and 15 deletions.
9 changes: 8 additions & 1 deletion src/XmlTemplateReader.php
Expand Up @@ -516,12 +516,19 @@ private function addListenersFromTemplate(SimpleXMLElement $simpleXMLElement, ar
$this->namespace,
));

Assertion::true(class_exists($configuration['castTo']), sprintf(
Assertion::classExists($configuration['castTo'], sprintf(
'The "%s" node\'s %s:castTo attribute value "%s" refers to non-existent class FQN',
$currentPathString,
$this->namespace,
$configurationAttributes['castTo'],
));
Assertion::subclassOf($configuration['castTo'], NodeInterface::class, sprintf(
'The "%s" node\'s %s:castTo attribute value "%s" refers to a class that does not implement "%s" interface',
$currentPathString,
$this->namespace,
$configurationAttributes['castTo'],
NodeInterface::class,
));

// Attributes rules
foreach ($child->attributes() as $name => $rulesDefinition) {
Expand Down
Expand Up @@ -176,7 +176,7 @@ public function invalidChunkSizeDataProvider(): array
}

/**
* @depends testCanBeConstructedWithDefaultDispatcher
* @depends testCanBeConstructedWithDefaultDispatcher
* @dataProvider invalidChunkSizeDataProvider
*/
public function testFailToParseFromResourceWithInvalidChunkSize(int $chunkSize, XmlTemplateReader $xmlTemplateReader): void
Expand Down
89 changes: 89 additions & 0 deletions tests/Feature/XmlTemplateReader/CastToModeTest.php
@@ -0,0 +1,89 @@
<?php
declare(strict_types=1);

namespace Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader;

use Assert\InvalidArgumentException;
use Donatorsky\XmlTemplate\Reader\Models\Contracts\NodeInterface;
use Donatorsky\XmlTemplate\Reader\Models\Node;
use Donatorsky\XmlTemplate\Reader\XmlTemplateReader;

/**
* @covers \Donatorsky\XmlTemplate\Reader\XmlTemplateReader
* @coversDefaultClass \Donatorsky\XmlTemplate\Reader\XmlTemplateReader
*/
class CastToModeTest extends AbstractXmlTemplateReaderTest
{
private const XML_VALID = 'configuration-cast-to-valid';

private const XML_INVALID_NON_EXISTENT_CLASS = 'configuration-cast-to-invalid-non-existent-class';

private const XML_INVALID_UNSUPPORTED_CLASS = 'configuration-cast-to-invalid-unsupported-class';

public function testSingleNodeAsCollection(): void
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_VALID));

$node = $xmlTemplateReader->read(
<<<'XML'
<root>
<casted/>
<uncasted/>
<children/>
<children/>
<children/>
</root>
XML
);

self::assertInstanceOf(Node::class, $node);

$rootNodeRelationsMap = $node->getRelations();

self::assertTrue($rootNodeRelationsMap->has('casted'));
self::assertInstanceOf(CastedRelationNode::class, $rootNodeRelationsMap->get('casted'));

self::assertTrue($rootNodeRelationsMap->has('uncasted'));
self::assertInstanceOf(Node::class, $rootNodeRelationsMap->get('casted'));

$rootNodeChildrenMap = $node->getChildren();

self::assertTrue($rootNodeChildrenMap->has('children'));

$children = $rootNodeChildrenMap->get('children');
self::assertCount(3, $children);

foreach ($children as $child) {
self::assertInstanceOf(CastedChildNode::class, $child);
}
}

public function testFailToCastToNonExistentClass(): void
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_INVALID_NON_EXISTENT_CLASS));

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The "root/nonExistentClass" node\'s tpl:castTo attribute value "\Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader\NonExistentNodeClass" refers to non-existent class FQN');

$xmlTemplateReader->preloadTemplate();
}

public function testFailToCastToUnsupportedClass(): void
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_INVALID_UNSUPPORTED_CLASS));

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage(sprintf('The "root/unsupportedClass" node\'s tpl:castTo attribute value "\stdClass" refers to a class that does not implement "%s" interface', NodeInterface::class));

$xmlTemplateReader->preloadTemplate();
}
}

class CastedRelationNode extends Node
{
}

class CastedChildNode extends Node
{
}
19 changes: 16 additions & 3 deletions tests/Feature/XmlTemplateReader/CollectAttributesModeTest.php
Expand Up @@ -3,6 +3,7 @@

namespace Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader;

use Assert\InvalidArgumentException;
use Donatorsky\XmlTemplate\Reader\Models\Map;
use Donatorsky\XmlTemplate\Reader\XmlTemplateReader;

Expand All @@ -12,13 +13,15 @@
*/
class CollectAttributesModeTest extends AbstractXmlTemplateReaderTest
{
private const XML = 'configuration-collect-attributes';
private const XML_VALID = 'configuration-collect-attributes-valid';

private const XML_INVALID = 'configuration-collect-attributes-invalid';

public function testRelationsWereRead(): Map
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML));
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_VALID));

$node = $xmlTemplateReader->read(self::getDataXml(self::XML));
$node = $xmlTemplateReader->read(self::getDataXml(self::XML_VALID));

$relationsMap = $node->getRelations();
self::assertTrue($relationsMap->has('all'));
Expand Down Expand Up @@ -57,4 +60,14 @@ public function testCollectValidated(Map $relationsMap): void
self::assertSame('value 2', $attributesMap['validatedAttribute']);
self::assertArrayNotHasKey('otherAttribute', $attributesMap);
}

public function testFailsForInvalidValue(): void
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_INVALID));

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The "root/invalid" node\'s tpl:collectAttributes attribute value "invalid value" is invalid, expecting one of: all, validated');

$xmlTemplateReader->preloadTemplate();
}
}
19 changes: 16 additions & 3 deletions tests/Feature/XmlTemplateReader/ContentsModeTest.php
Expand Up @@ -3,6 +3,7 @@

namespace Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader;

use Assert\InvalidArgumentException;
use Donatorsky\XmlTemplate\Reader\Models\Map;
use Donatorsky\XmlTemplate\Reader\XmlTemplateReader;

Expand All @@ -12,13 +13,15 @@
*/
class ContentsModeTest extends AbstractXmlTemplateReaderTest
{
private const XML = 'configuration-contents';
private const XML_VALID = 'configuration-contents-valid';

private const XML_INVALID = 'configuration-contents-invalid';

public function testRelationsWereRead(): Map
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML));
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_VALID));

$node = $xmlTemplateReader->read(self::getDataXml(self::XML));
$node = $xmlTemplateReader->read(self::getDataXml(self::XML_VALID));

$relationsMap = $node->getRelations();
self::assertTrue($relationsMap->has('none'));
Expand Down Expand Up @@ -77,4 +80,14 @@ public function testContentsTrimmed(Map $relationsMap): void
self::assertSame('Contents of: trimmed', $trimmedNode->getContents());
self::assertSame('Contents "of" & <trimmed>', $trimmedWithCDataNode->getContents());
}

public function testFailsForInvalidValue(): void
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_INVALID));

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The "root/invalid" node\'s tpl:contents attribute value "invalid value" is invalid, expecting one of: none, raw, trimmed');

($xmlTemplateReader)->preloadTemplate();
}
}
26 changes: 19 additions & 7 deletions tests/Feature/XmlTemplateReader/TypeModeTest.php
Expand Up @@ -3,6 +3,7 @@

namespace Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader;

use Assert\InvalidArgumentException;
use Donatorsky\XmlTemplate\Reader\Exceptions\UnexpectedMultipleNodeReadException;
use Donatorsky\XmlTemplate\Reader\XmlTemplateReader;

Expand All @@ -12,19 +13,18 @@
*/
class TypeModeTest extends AbstractXmlTemplateReaderTest
{
private XmlTemplateReader $xmlTemplateReader;
private const XML_VALID = 'configuration-type-valid';

protected function setUp(): void
{
$this->xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml('configuration-type'));
}
private const XML_INVALID = 'configuration-type-invalid';

public function testSingleNodeAsCollection(): void
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_VALID));

$this->expectException(UnexpectedMultipleNodeReadException::class);
$this->expectExceptionMessage('The node "root/singleNode" is expected to be a single node, but another was read');

$this->xmlTemplateReader->read(
$xmlTemplateReader->read(
<<<'XML'
<root>
<singleNode>1</singleNode>
Expand All @@ -37,7 +37,9 @@ public function testSingleNodeAsCollection(): void

public function testFiltersPass(): void
{
$node = $this->xmlTemplateReader->read(
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_VALID));

$node = $xmlTemplateReader->read(
<<<'XML'
<root>
<singleNode>1</singleNode>
Expand All @@ -54,4 +56,14 @@ public function testFiltersPass(): void
self::assertTrue($childrenMap->has('multipleNode'));
self::assertCount(2, $childrenMap->get('multipleNode'));
}

public function testFailsForInvalidMode(): void
{
$xmlTemplateReader = new XmlTemplateReader(self::getTemplateXml(self::XML_INVALID));

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('The "root/invalid" node\'s tpl:type attribute value "invalid value" is invalid, expecting one of: single, collection');

$xmlTemplateReader->preloadTemplate();
}
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<template xmlns:tpl="http://www.w3.org/2001/XMLSchema-instance"
tpl:noNamespaceSchemaLocation="../../../../src/xml-template-reader.xsd">
<root>
<nonExistentClass tpl:castTo="\Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader\NonExistentNodeClass" />
</root>
</template>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<template xmlns:tpl="http://www.w3.org/2001/XMLSchema-instance"
tpl:noNamespaceSchemaLocation="../../../../src/xml-template-reader.xsd">
<root>
<unsupportedClass tpl:castTo="\stdClass" />
</root>
</template>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<template xmlns:tpl="http://www.w3.org/2001/XMLSchema-instance"
tpl:noNamespaceSchemaLocation="../../../../src/xml-template-reader.xsd">
<root>
<casted tpl:castTo="\Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader\CastedRelationNode" />
<uncasted />
<children tpl:castTo="\Donatorsky\XmlTemplate\Reader\Tests\Feature\XmlTemplateReader\CastedChildNode"
tpl:type="collection" />
</root>
</template>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<template xmlns:tpl="http://www.w3.org/2001/XMLSchema-instance"
tpl:noNamespaceSchemaLocation="../../../../src/xml-template-reader.xsd">
<root>
<invalid tpl:collectAttributes="invalid value" />
</root>
</template>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<template xmlns:tpl="http://www.w3.org/2001/XMLSchema-instance"
tpl:noNamespaceSchemaLocation="../../../../src/xml-template-reader.xsd">
<root>
<invalid tpl:contents="invalid value" />
</root>
</template>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<template xmlns:tpl="http://www.w3.org/2001/XMLSchema-instance"
tpl:noNamespaceSchemaLocation="../../../../src/xml-template-reader.xsd">
<root>
<invalid tpl:type="invalid value" />
</root>
</template>

0 comments on commit b1960e3

Please sign in to comment.