|
7 | 7 | use DateTimeImmutable; |
8 | 8 | use Patchlevel\EventSourcing\Aggregate\AggregateHeader; |
9 | 9 | use Patchlevel\EventSourcing\Message\Message; |
| 10 | +use Patchlevel\EventSourcing\Metadata\Event\EventRegistry; |
10 | 11 | use Patchlevel\EventSourcing\Store\ArchivedHeader; |
11 | 12 | use Patchlevel\EventSourcing\Store\Criteria\AggregateIdCriterion; |
12 | 13 | use Patchlevel\EventSourcing\Store\Criteria\AggregateNameCriterion; |
13 | 14 | use Patchlevel\EventSourcing\Store\Criteria\ArchivedCriterion; |
14 | 15 | use Patchlevel\EventSourcing\Store\Criteria\Criteria; |
| 16 | +use Patchlevel\EventSourcing\Store\Criteria\EventsCriterion; |
15 | 17 | use Patchlevel\EventSourcing\Store\Criteria\FromIndexCriterion; |
16 | 18 | use Patchlevel\EventSourcing\Store\Criteria\FromPlayheadCriterion; |
17 | 19 | use Patchlevel\EventSourcing\Store\Criteria\StreamCriterion; |
| 20 | +use Patchlevel\EventSourcing\Store\Criteria\ToIndexCriterion; |
18 | 21 | use Patchlevel\EventSourcing\Store\Header\PlayheadHeader; |
19 | 22 | use Patchlevel\EventSourcing\Store\Header\StreamNameHeader; |
20 | 23 | use Patchlevel\EventSourcing\Store\InMemoryStore; |
| 24 | +use Patchlevel\EventSourcing\Store\MissingEventRegistry; |
21 | 25 | use Patchlevel\EventSourcing\Store\UnsupportedCriterion; |
| 26 | +use Patchlevel\EventSourcing\Tests\Unit\Fixture\Email; |
| 27 | +use Patchlevel\EventSourcing\Tests\Unit\Fixture\ProfileCreated; |
22 | 28 | use Patchlevel\EventSourcing\Tests\Unit\Fixture\ProfileId; |
23 | 29 | use Patchlevel\EventSourcing\Tests\Unit\Fixture\ProfileVisited; |
24 | 30 | use PHPUnit\Framework\Attributes\CoversClass; |
@@ -156,13 +162,33 @@ public function testLoadFromIndex(): void |
156 | 162 |
|
157 | 163 | $store = new InMemoryStore([$message1, $message2, $message3, $message4]); |
158 | 164 |
|
159 | | - $stream = $store->load(new Criteria(new FromIndexCriterion(2))); |
| 165 | + $stream = $store->load(new Criteria(new FromIndexCriterion(3))); |
160 | 166 |
|
161 | 167 | $messages = iterator_to_array($stream); |
162 | 168 |
|
163 | 169 | self::assertSame([$message3, $message4], $messages); |
164 | 170 | } |
165 | 171 |
|
| 172 | + public function testLoadToIndex(): void |
| 173 | + { |
| 174 | + $message1 = (new Message(new ProfileVisited(ProfileId::fromString('1')))) |
| 175 | + ->withHeader(new AggregateHeader('foo', '1', 1, new DateTimeImmutable())); |
| 176 | + $message2 = (new Message(new ProfileVisited(ProfileId::fromString('2')))) |
| 177 | + ->withHeader(new AggregateHeader('foo', '1', 2, new DateTimeImmutable())); |
| 178 | + $message3 = (new Message(new ProfileVisited(ProfileId::fromString('3')))) |
| 179 | + ->withHeader(new StreamNameHeader('foo-1')) |
| 180 | + ->withHeader(new PlayheadHeader(3)); |
| 181 | + $message4 = new Message(new ProfileVisited(ProfileId::fromString('3'))); |
| 182 | + |
| 183 | + $store = new InMemoryStore([$message1, $message2, $message3, $message4]); |
| 184 | + |
| 185 | + $stream = $store->load(new Criteria(new ToIndexCriterion(2))); |
| 186 | + |
| 187 | + $messages = iterator_to_array($stream); |
| 188 | + |
| 189 | + self::assertSame([$message1, $message2], $messages); |
| 190 | + } |
| 191 | + |
166 | 192 | public function testLoadByStreamNameWithLikeAll(): void |
167 | 193 | { |
168 | 194 | $message1 = (new Message(new ProfileVisited(ProfileId::fromString('1')))) |
@@ -196,6 +222,48 @@ public function testLoadArchived(): void |
196 | 222 | self::assertSame([$message1], $messages); |
197 | 223 | } |
198 | 224 |
|
| 225 | + public function testLoadByEventName(): void |
| 226 | + { |
| 227 | + $message1 = (new Message(new ProfileCreated(ProfileId::fromString('1'), Email::fromString('s@b.de')))) |
| 228 | + ->withHeader(new StreamNameHeader('foo')); |
| 229 | + $message2 = (new Message(new ProfileVisited(ProfileId::fromString('2')))) |
| 230 | + ->withHeader(new StreamNameHeader('bar')); |
| 231 | + $message3 = new Message(new ProfileVisited(ProfileId::fromString('3'))); |
| 232 | + |
| 233 | + $store = new InMemoryStore( |
| 234 | + [$message1, $message2, $message3], |
| 235 | + new EventRegistry([ |
| 236 | + 'profile_created' => ProfileCreated::class, |
| 237 | + 'profile_visited' => ProfileVisited::class, |
| 238 | + ]), |
| 239 | + ); |
| 240 | + |
| 241 | + $stream = $store->load(new Criteria(new EventsCriterion(['profile_created']))); |
| 242 | + $messages = iterator_to_array($stream); |
| 243 | + |
| 244 | + self::assertSame([$message1], $messages); |
| 245 | + |
| 246 | + $stream = $store->load(new Criteria(new EventsCriterion(['profile_visited']))); |
| 247 | + $messages = iterator_to_array($stream); |
| 248 | + |
| 249 | + self::assertSame([$message2, $message3], $messages); |
| 250 | + self::assertSame([], iterator_to_array($store->load(new Criteria(new EventsCriterion(['profile_deleted']))))); |
| 251 | + } |
| 252 | + |
| 253 | + public function testLoadByEventNameWithoutRegistry(): void |
| 254 | + { |
| 255 | + $message1 = (new Message(new ProfileCreated(ProfileId::fromString('1'), Email::fromString('s@b.de')))) |
| 256 | + ->withHeader(new StreamNameHeader('foo')); |
| 257 | + $message2 = (new Message(new ProfileVisited(ProfileId::fromString('2')))) |
| 258 | + ->withHeader(new StreamNameHeader('bar')); |
| 259 | + $message3 = new Message(new ProfileVisited(ProfileId::fromString('3'))); |
| 260 | + |
| 261 | + $store = new InMemoryStore([$message1, $message2, $message3]); |
| 262 | + |
| 263 | + $this->expectException(MissingEventRegistry::class); |
| 264 | + $store->load(new Criteria(new EventsCriterion(['profile_created']))); |
| 265 | + } |
| 266 | + |
199 | 267 | public function testLoadUnsupportedCriterion(): void |
200 | 268 | { |
201 | 269 | $store = new InMemoryStore([ |
|
0 commit comments