|
| 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