Valinor/tests/Unit/Mapper/Tree/Message/NodeMessageTest.php
Romain Canon a805ba0442 feat!: wrap node messages in proper class
A new class `NodeMessage` is used to wrap messages added to a node
during the mapping. This class will allow further features by giving
access to useful data related to the bound node.

BREAKING CHANGE: as of now every message is wrapped into a `NodeMessage`
it is therefore not possible to check whether the message is an instance
of `Throwable` — a new method `$message->isError()` is now to be used
for such cases.
2022-01-06 14:11:42 +01:00

80 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace CuyZ\Valinor\Tests\Unit\Mapper\Tree\Message;
use CuyZ\Valinor\Mapper\Tree\Message\NodeMessage;
use CuyZ\Valinor\Tests\Fake\Definition\FakeAttributes;
use CuyZ\Valinor\Tests\Fake\Mapper\FakeNode;
use CuyZ\Valinor\Tests\Fake\Mapper\Tree\Message\FakeErrorMessage;
use CuyZ\Valinor\Tests\Fake\Mapper\Tree\Message\FakeMessage;
use CuyZ\Valinor\Tests\Fake\Type\FakeType;
use PHPUnit\Framework\TestCase;
final class NodeMessageTest extends TestCase
{
public function test_node_properties_can_be_accessed(): void
{
$originalMessage = new FakeMessage();
$type = FakeType::permissive();
$attributes = new FakeAttributes();
$node = FakeNode::branch([[
'name' => 'foo',
'type' => $type,
'value' => 'some value',
'attributes' => $attributes,
'message' => $originalMessage
]])->children()['foo'];
$message = new NodeMessage($node, $originalMessage);
self::assertSame('foo', $message->name());
self::assertSame('foo', $message->path());
self::assertSame('some value', $message->value());
self::assertSame($type, $message->type());
self::assertSame($attributes, $message->attributes());
self::assertSame($originalMessage, $message->originalMessage());
}
public function test_value_from_invalid_node_returns_null(): void
{
$originalMessage = new FakeErrorMessage();
$node = FakeNode::leaf(FakeType::permissive(), 'foo')->withMessage($originalMessage);
$message = new NodeMessage($node, $originalMessage);
self::assertNull($message->value());
}
public function test_format_message_replaces_placeholders_with_default_values(): void
{
$originalMessage = new FakeMessage();
$type = FakeType::permissive();
$node = FakeNode::branch([[
'name' => 'foo',
'type' => $type,
'value' => 'some value',
'message' => $originalMessage
]])->children()['foo'];
$message = new NodeMessage($node, $originalMessage);
$text = $message->format('%1$s / %2$s / %3$s / %4$s / %5$s');
self::assertSame("some_code / some message / $type / foo / foo", $text);
}
public function test_format_message_replaces_placeholders_with_given_values(): void
{
$originalMessage = new FakeMessage();
$node = FakeNode::any();
$message = new NodeMessage($node, $originalMessage);
$text = $message->format('%1$s / %2$s', 'foo', 'bar');
self::assertSame('foo / bar', $text);
}
}