|
6 | 6 |
|
7 | 7 | use DateTimeImmutable; |
8 | 8 | use Patchlevel\EventSourcing\Aggregate\AggregateHeader; |
| 9 | +use Patchlevel\EventSourcing\Message\MissingHeaders; |
9 | 10 | use Patchlevel\EventSourcing\Message\Serializer\DefaultHeadersSerializer; |
10 | 11 | use Patchlevel\EventSourcing\Metadata\Message\AttributeMessageHeaderRegistryFactory; |
| 12 | +use Patchlevel\EventSourcing\Metadata\Message\HeaderNameNotRegistered; |
11 | 13 | use Patchlevel\EventSourcing\Serializer\Encoder\JsonEncoder; |
12 | 14 | use Patchlevel\EventSourcing\Store\ArchivedHeader; |
| 15 | +use Patchlevel\EventSourcing\Store\Header\StreamNameHeader; |
13 | 16 | use Patchlevel\Hydrator\MetadataHydrator; |
14 | 17 | use PHPUnit\Framework\Attributes\CoversClass; |
15 | 18 | use PHPUnit\Framework\TestCase; |
@@ -54,4 +57,94 @@ public function testDeserialize(): void |
54 | 57 | $deserializedMessage, |
55 | 58 | ); |
56 | 59 | } |
| 60 | + |
| 61 | + public function testDeserializeUnknownHeadersAsMissingHeaders(): void |
| 62 | + { |
| 63 | + $serializer = new DefaultHeadersSerializer( |
| 64 | + (new AttributeMessageHeaderRegistryFactory())->create([ |
| 65 | + __DIR__ . '/../../Fixture', |
| 66 | + ]), |
| 67 | + new MetadataHydrator(), |
| 68 | + new JsonEncoder(), |
| 69 | + ['removed', 'alsoRemoved'], |
| 70 | + ); |
| 71 | + |
| 72 | + $deserializedMessage = $serializer->deserialize('{"streamName":{"streamName":"profile-1"},"removed":{"foo":"bar"},"alsoRemoved":{"baz":1}}'); |
| 73 | + |
| 74 | + self::assertEquals( |
| 75 | + [ |
| 76 | + new StreamNameHeader('profile-1'), |
| 77 | + new MissingHeaders([ |
| 78 | + 'removed' => ['foo' => 'bar'], |
| 79 | + 'alsoRemoved' => ['baz' => 1], |
| 80 | + ]), |
| 81 | + ], |
| 82 | + $deserializedMessage, |
| 83 | + ); |
| 84 | + } |
| 85 | + |
| 86 | + public function testDeserializeUnknownHeaderNotConfiguredCrashes(): void |
| 87 | + { |
| 88 | + $serializer = new DefaultHeadersSerializer( |
| 89 | + (new AttributeMessageHeaderRegistryFactory())->create([ |
| 90 | + __DIR__ . '/../../Fixture', |
| 91 | + ]), |
| 92 | + new MetadataHydrator(), |
| 93 | + new JsonEncoder(), |
| 94 | + ['removed'], |
| 95 | + ); |
| 96 | + |
| 97 | + $this->expectException(HeaderNameNotRegistered::class); |
| 98 | + |
| 99 | + $serializer->deserialize('{"streamName":{"streamName":"profile-1"},"removed":{"foo":"bar"},"notListed":{"baz":1}}'); |
| 100 | + } |
| 101 | + |
| 102 | + public function testDeserializeWildcardHandlesAllUnknownHeaders(): void |
| 103 | + { |
| 104 | + $serializer = new DefaultHeadersSerializer( |
| 105 | + (new AttributeMessageHeaderRegistryFactory())->create([ |
| 106 | + __DIR__ . '/../../Fixture', |
| 107 | + ]), |
| 108 | + new MetadataHydrator(), |
| 109 | + new JsonEncoder(), |
| 110 | + ['*'], |
| 111 | + ); |
| 112 | + |
| 113 | + $deserializedMessage = $serializer->deserialize('{"streamName":{"streamName":"profile-1"},"removed":{"foo":"bar"},"alsoRemoved":{"baz":1}}'); |
| 114 | + |
| 115 | + self::assertEquals( |
| 116 | + [ |
| 117 | + new StreamNameHeader('profile-1'), |
| 118 | + new MissingHeaders([ |
| 119 | + 'removed' => ['foo' => 'bar'], |
| 120 | + 'alsoRemoved' => ['baz' => 1], |
| 121 | + ]), |
| 122 | + ], |
| 123 | + $deserializedMessage, |
| 124 | + ); |
| 125 | + } |
| 126 | + |
| 127 | + public function testSerializeMissingHeadersRoundTrip(): void |
| 128 | + { |
| 129 | + $serializer = new DefaultHeadersSerializer( |
| 130 | + (new AttributeMessageHeaderRegistryFactory())->create([ |
| 131 | + __DIR__ . '/../../Fixture', |
| 132 | + ]), |
| 133 | + new MetadataHydrator(), |
| 134 | + new JsonEncoder(), |
| 135 | + ); |
| 136 | + |
| 137 | + $content = $serializer->serialize([ |
| 138 | + new StreamNameHeader('profile-1'), |
| 139 | + new MissingHeaders([ |
| 140 | + 'removed' => ['foo' => 'bar'], |
| 141 | + 'alsoRemoved' => ['baz' => 1], |
| 142 | + ]), |
| 143 | + ]); |
| 144 | + |
| 145 | + self::assertEquals( |
| 146 | + '{"streamName":{"streamName":"profile-1"},"removed":{"foo":"bar"},"alsoRemoved":{"baz":1}}', |
| 147 | + $content, |
| 148 | + ); |
| 149 | + } |
57 | 150 | } |
0 commit comments