Skip to content

Commit 71fa29b

Browse files
committed
TASK: Change behavior of Event::create() and Event::with() for tags
1 parent a8ce347 commit 71fa29b

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

src/Event/Event.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static function create(
4848
} elseif ($tags instanceof Tag) {
4949
$tags = Tags::create($tags);
5050
} elseif (is_string($tags)) {
51-
$tags = Tags::fromJson($tags);
51+
$tags = Tags::single($tags);
5252
} elseif (is_array($tags)) {
5353
$tags = Tags::fromArray($tags);
5454
}
@@ -71,7 +71,7 @@ public function with(
7171
EventMetadata|array|string|null $metadata = null,
7272
): self {
7373
if (is_string($tags)) {
74-
$tags = Tags::fromJson($tags);
74+
$tags = Tags::single($tags);
7575
} elseif (is_array($tags)) {
7676
$tags = Tags::fromArray($tags);
7777
}

tests/Unit/Event/EventTest.php

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Unit\Event;
6+
7+
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
use PHPUnit\Framework\Attributes\Medium;
10+
use PHPUnit\Framework\TestCase;
11+
use Wwwision\DCBEventStore\Event\Event;
12+
use Wwwision\DCBEventStore\Event\Tag;
13+
14+
#[Medium]
15+
#[CoversClass(Event::class)]
16+
final class EventTest extends TestCase
17+
{
18+
public function test_create_fails_if_data_contains_invalid_json(): void
19+
{
20+
$this->expectExceptionMessage('Failed to JSON-encode event payload: Malformed UTF-8 characters, possibly incorrectly encoded');
21+
Event::create(type: 'SomeType', data: ["\xB1\x31"]);
22+
}
23+
24+
public function test_create_fails_if_metadata_contains_invalid_json(): void
25+
{
26+
$this->expectExceptionMessage('Failed to decode JSON to event metadata: Syntax error');
27+
Event::create(type: 'SomeType', data: 'some-data', metadata: 'no-json');
28+
}
29+
30+
public static function dataProvider_create(): iterable
31+
{
32+
yield ['input' => ['type' => 'SomeEventType', 'data' => 'some-data'], 'expectedResult' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => [], 'metadata' => []]];
33+
yield ['input' => ['type' => 'SomeEventType', 'data' => ['some' => 'data']], 'expectedResult' => ['type' => 'SomeEventType', 'data' => '{"some":"data"}', 'tags' => [], 'metadata' => []]];
34+
yield ['input' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => Tag::fromString('some-tag')], 'expectedResult' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => ['some-tag'], 'metadata' => []]];
35+
yield ['input' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => 'some-tag'], 'expectedResult' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => ['some-tag'], 'metadata' => []]];
36+
yield ['input' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => ['some-tag', 'another-tag']], 'expectedResult' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => ['another-tag', 'some-tag'], 'metadata' => []]];
37+
yield ['input' => ['type' => 'SomeEventType', 'data' => 'some-data', 'metadata' => '{"foo":"bar"}'], 'expectedResult' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => [], 'metadata' => ['foo' => 'bar']]];
38+
yield ['input' => ['type' => 'SomeEventType', 'data' => 'some-data', 'metadata' => ['foo' => 'bar']], 'expectedResult' => ['type' => 'SomeEventType', 'data' => 'some-data', 'tags' => [], 'metadata' => ['foo' => 'bar']]];
39+
}
40+
41+
#[DataProvider('dataProvider_create')]
42+
public function test_create(array $input, array $expectedResult): void
43+
{
44+
$event = Event::create(...$input);
45+
$actualResult = [
46+
'type' => $event->type->value,
47+
'data' => $event->data->value,
48+
'tags' => $event->tags->toStrings(),
49+
'metadata' => $event->metadata->value,
50+
];
51+
self::assertSame($expectedResult, $actualResult);
52+
}
53+
54+
public function test_with_without_arguments(): void
55+
{
56+
$event = Event::create(type: 'SomeEventType', data: 'some-data');
57+
$event2 = $event->with();
58+
self::assertEquals($event, $event2);
59+
}
60+
61+
public function test_with_with_string_tag(): void
62+
{
63+
$event = Event::create(type: 'SomeEventType', data: 'some-data')->with(tags: 'some-tag');
64+
self::assertSame(['some-tag'], $event->tags->toStrings());
65+
}
66+
67+
public function test_with_with_array_tags(): void
68+
{
69+
$event = Event::create(type: 'SomeEventType', data: 'some-data')->with(tags: ['some-tag', 'another-tag']);
70+
self::assertSame(['another-tag', 'some-tag'], $event->tags->toStrings());
71+
}
72+
73+
public function test_with_with_string_metadata(): void
74+
{
75+
$event = Event::create(type: 'SomeEventType', data: 'some-data')->with(metadata: '{"foo":"bar"}');
76+
self::assertSame(['foo' => 'bar'], $event->metadata->value);
77+
}
78+
79+
public function test_with_with_array_metadata(): void
80+
{
81+
$event = Event::create(type: 'SomeEventType', data: 'some-data')->with(metadata: ['foo' => 'bar']);
82+
self::assertSame(['foo' => 'bar'], $event->metadata->value);
83+
}
84+
}

0 commit comments

Comments
 (0)