Skip to content

Commit 609d31d

Browse files
committed
add tests for CanRefreshSubscriptions
1 parent e2d2979 commit 609d31d

4 files changed

Lines changed: 351 additions & 0 deletions

File tree

phpstan-baseline.neon

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,12 @@ parameters:
480480
count: 2
481481
path: tests/Unit/QueryBus/ServiceHandlerProviderTest.php
482482

483+
-
484+
message: '#^Parameter \#1 \$parent of class Patchlevel\\EventSourcing\\Subscription\\Engine\\CatchUpSubscriptionEngine constructor expects Patchlevel\\EventSourcing\\Subscription\\Engine\\SubscriptionEngine, PHPUnit\\Framework\\MockObject\\MockObject given\.$#'
485+
identifier: argument.type
486+
count: 1
487+
path: tests/Unit/Subscription/Engine/CatchUpSubscriptionEngineTest.php
488+
483489
-
484490
message: '#^Match expression does not handle remaining value\: string$#'
485491
identifier: match.unhandled
@@ -492,6 +498,12 @@ parameters:
492498
count: 8
493499
path: tests/Unit/Subscription/Engine/DefaultSubscriptionEngineTest.php
494500

501+
-
502+
message: '#^Parameter \#1 \$parent of class Patchlevel\\EventSourcing\\Subscription\\Engine\\ThrowOnErrorSubscriptionEngine constructor expects Patchlevel\\EventSourcing\\Subscription\\Engine\\SubscriptionEngine, PHPUnit\\Framework\\MockObject\\MockObject given\.$#'
503+
identifier: argument.type
504+
count: 2
505+
path: tests/Unit/Subscription/Engine/ThrowOnErrorSubscriptionEngineTest.php
506+
495507
-
496508
message: '#^Offset ''args'' on array\{file\: literal\-string&non\-falsy\-string, line\: int, function\: ''createException'', class\: ''Patchlevel\\\\EventSourcing\\\\Tests\\\\Unit\\\\Subscription\\\\ErrorContextTest'', type\: ''\-\>'', args\: array\<mixed\>\} on left side of \?\? always exists and is not nullable\.$#'
497509
identifier: nullCoalesce.offset

tests/Unit/Subscription/Engine/CatchUpSubscriptionEngineTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Patchlevel\EventSourcing\Tests\Unit\Subscription\Engine;
66

7+
use LogicException;
8+
use Patchlevel\EventSourcing\Subscription\Engine\CanRefreshSubscriptions;
79
use Patchlevel\EventSourcing\Subscription\Engine\CatchUpSubscriptionEngine;
810
use Patchlevel\EventSourcing\Subscription\Engine\Error;
911
use Patchlevel\EventSourcing\Subscription\Engine\ProcessedResult;
@@ -216,4 +218,32 @@ public function testSubscriptions(): void
216218

217219
self::assertEquals($expectedSubscriptions, $subscriptions);
218220
}
221+
222+
public function testRefreshSubscriptions(): void
223+
{
224+
$parent = $this->createMockForIntersectionOfInterfaces([
225+
SubscriptionEngine::class,
226+
CanRefreshSubscriptions::class,
227+
]);
228+
229+
$engine = new CatchUpSubscriptionEngine($parent);
230+
$criteria = new SubscriptionEngineCriteria();
231+
232+
$expectedResult = new Result();
233+
234+
$parent->expects($this->once())->method('refreshSubscriptions')->with($criteria)->willReturn($expectedResult);
235+
$result = $engine->refreshSubscriptions($criteria);
236+
237+
self::assertSame($expectedResult, $result);
238+
}
239+
240+
public function testRefreshSubscriptionsNotSupported(): void
241+
{
242+
$parent = $this->createMock(SubscriptionEngine::class);
243+
244+
$engine = new CatchUpSubscriptionEngine($parent);
245+
246+
$this->expectException(LogicException::class);
247+
$engine->refreshSubscriptions();
248+
}
219249
}

tests/Unit/Subscription/Engine/DefaultSubscriptionEngineTest.php

Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Patchlevel\EventSourcing\Store\Criteria\Criteria;
1818
use Patchlevel\EventSourcing\Store\Criteria\FromIndexCriterion;
1919
use Patchlevel\EventSourcing\Store\Store;
20+
use Patchlevel\EventSourcing\Subscription\Cleanup\Cleaner;
2021
use Patchlevel\EventSourcing\Subscription\Cleanup\CleanupFailed;
2122
use Patchlevel\EventSourcing\Subscription\Cleanup\CleanupTaskHandler;
2223
use Patchlevel\EventSourcing\Subscription\Cleanup\Dbal\DropTableTask;
@@ -4572,4 +4573,262 @@ private function criteria(int $fromIndex = 0): Criteria
45724573
{
45734574
return new Criteria(new FromIndexCriterion($fromIndex));
45744575
}
4576+
4577+
public function testRefreshSubscriptionsNoChanges(): void
4578+
{
4579+
$subscriber = new #[Subscriber('test', RunMode::FromBeginning, group: 'default')]
4580+
class {
4581+
};
4582+
4583+
$subscription = new Subscription(
4584+
'test',
4585+
'default',
4586+
RunMode::FromBeginning,
4587+
Status::Active,
4588+
);
4589+
4590+
$subscriptionStore = new DummySubscriptionStore([$subscription]);
4591+
4592+
$engine = new DefaultSubscriptionEngine(
4593+
$this->createMock(Store::class),
4594+
$subscriptionStore,
4595+
new MetadataSubscriberAccessorRepository([$subscriber]),
4596+
logger: new NullLogger(),
4597+
cleaner: $this->createMock(Cleaner::class),
4598+
);
4599+
4600+
$engine->refreshSubscriptions();
4601+
4602+
$subscriptionStore->assertNoChanges();
4603+
}
4604+
4605+
public function testRefreshSubscriptionsChangeRunMode(): void
4606+
{
4607+
$subscriber = new #[Subscriber('test', RunMode::FromNow)]
4608+
class {
4609+
};
4610+
4611+
$subscription = new Subscription(
4612+
'test',
4613+
'default',
4614+
RunMode::FromBeginning,
4615+
Status::Active,
4616+
);
4617+
4618+
$subscriptionStore = new DummySubscriptionStore([$subscription]);
4619+
4620+
$engine = new DefaultSubscriptionEngine(
4621+
$this->createMock(Store::class),
4622+
$subscriptionStore,
4623+
new MetadataSubscriberAccessorRepository([$subscriber]),
4624+
logger: new NullLogger(),
4625+
cleaner: $this->createMock(Cleaner::class),
4626+
);
4627+
4628+
$engine->refreshSubscriptions();
4629+
4630+
$subscriptionStore->assertUpdated(
4631+
new Subscription(
4632+
'test',
4633+
'default',
4634+
RunMode::FromNow,
4635+
Status::Active,
4636+
),
4637+
);
4638+
}
4639+
4640+
public function testRefreshSubscriptionsChangeGroup(): void
4641+
{
4642+
$subscriber = new #[Subscriber('test', RunMode::FromBeginning, group: 'new-group')]
4643+
class {
4644+
};
4645+
4646+
$subscription = new Subscription(
4647+
'test',
4648+
'default',
4649+
RunMode::FromBeginning,
4650+
Status::Active,
4651+
);
4652+
4653+
$subscriptionStore = new DummySubscriptionStore([$subscription]);
4654+
4655+
$engine = new DefaultSubscriptionEngine(
4656+
$this->createMock(Store::class),
4657+
$subscriptionStore,
4658+
new MetadataSubscriberAccessorRepository([$subscriber]),
4659+
logger: new NullLogger(),
4660+
cleaner: $this->createMock(Cleaner::class),
4661+
);
4662+
4663+
$engine->refreshSubscriptions();
4664+
4665+
$subscriptionStore->assertUpdated(
4666+
new Subscription(
4667+
'test',
4668+
'new-group',
4669+
RunMode::FromBeginning,
4670+
Status::Active,
4671+
),
4672+
);
4673+
}
4674+
4675+
public function testRefreshSubscriptionsChangeCleanupTasks(): void
4676+
{
4677+
$subscriber = new #[Subscriber('test', RunMode::FromBeginning)]
4678+
class {
4679+
/** @return iterable<object> */
4680+
#[Cleanup]
4681+
public function cleanup(): iterable
4682+
{
4683+
yield new DropTableTask('test');
4684+
}
4685+
};
4686+
4687+
$subscription = new Subscription(
4688+
'test',
4689+
'default',
4690+
RunMode::FromBeginning,
4691+
Status::Active,
4692+
);
4693+
4694+
$subscriptionStore = new DummySubscriptionStore([$subscription]);
4695+
4696+
$engine = new DefaultSubscriptionEngine(
4697+
$this->createMock(Store::class),
4698+
$subscriptionStore,
4699+
new MetadataSubscriberAccessorRepository([$subscriber]),
4700+
logger: new NullLogger(),
4701+
cleaner: $this->createMock(Cleaner::class),
4702+
);
4703+
4704+
$engine->refreshSubscriptions();
4705+
4706+
$subscriptionStore->assertUpdated(
4707+
new Subscription(
4708+
'test',
4709+
'default',
4710+
RunMode::FromBeginning,
4711+
Status::Active,
4712+
cleanupTasks: [new DropTableTask('test')],
4713+
),
4714+
);
4715+
}
4716+
4717+
public function testRefreshSubscriptionsMultipleChanges(): void
4718+
{
4719+
$subscriber = new #[Subscriber('test', RunMode::FromNow, group: 'new-group')]
4720+
class {
4721+
/** @return iterable<object> */
4722+
#[Cleanup]
4723+
public function cleanup(): iterable
4724+
{
4725+
yield new DropTableTask('test');
4726+
}
4727+
};
4728+
4729+
$subscription = new Subscription(
4730+
'test',
4731+
'default',
4732+
RunMode::FromBeginning,
4733+
Status::Active,
4734+
);
4735+
4736+
$subscriptionStore = new DummySubscriptionStore([$subscription]);
4737+
4738+
$engine = new DefaultSubscriptionEngine(
4739+
$this->createMock(Store::class),
4740+
$subscriptionStore,
4741+
new MetadataSubscriberAccessorRepository([$subscriber]),
4742+
logger: new NullLogger(),
4743+
cleaner: $this->createMock(Cleaner::class),
4744+
);
4745+
4746+
$engine->refreshSubscriptions();
4747+
4748+
$subscriptionStore->assertUpdated(
4749+
new Subscription(
4750+
'test',
4751+
'new-group',
4752+
RunMode::FromNow,
4753+
Status::Active,
4754+
cleanupTasks: [new DropTableTask('test')],
4755+
),
4756+
);
4757+
}
4758+
4759+
public function testRefreshSubscriptionsWithCriteria(): void
4760+
{
4761+
$subscriber1 = new #[Subscriber('test1', RunMode::FromNow)]
4762+
class {
4763+
};
4764+
4765+
$subscriber2 = new #[Subscriber('test2', RunMode::FromNow)]
4766+
class {
4767+
};
4768+
4769+
$subscription1 = new Subscription(
4770+
'test1',
4771+
'default',
4772+
RunMode::FromBeginning,
4773+
Status::Active,
4774+
);
4775+
4776+
$subscription2 = new Subscription(
4777+
'test2',
4778+
'default',
4779+
RunMode::FromBeginning,
4780+
Status::Active,
4781+
);
4782+
4783+
$subscriptionStore = new DummySubscriptionStore([$subscription1, $subscription2]);
4784+
4785+
$engine = new DefaultSubscriptionEngine(
4786+
$this->createMock(Store::class),
4787+
$subscriptionStore,
4788+
new MetadataSubscriberAccessorRepository([$subscriber1, $subscriber2]),
4789+
logger: new NullLogger(),
4790+
cleaner: $this->createMock(Cleaner::class),
4791+
);
4792+
4793+
$engine->refreshSubscriptions(new SubscriptionEngineCriteria(['test1']));
4794+
4795+
$subscriptionStore->assertUpdated(
4796+
new Subscription(
4797+
'test1',
4798+
'default',
4799+
RunMode::FromNow,
4800+
Status::Active,
4801+
),
4802+
);
4803+
4804+
self::assertCount(1, $subscriptionStore->updatedSubscriptions);
4805+
}
4806+
4807+
public function testRefreshSubscriptionsDiscoverNewSubscribers(): void
4808+
{
4809+
$subscriber = new #[Subscriber('test', RunMode::FromBeginning)]
4810+
class {
4811+
};
4812+
4813+
$subscriptionStore = new DummySubscriptionStore();
4814+
4815+
$engine = new DefaultSubscriptionEngine(
4816+
$this->createMock(Store::class),
4817+
$subscriptionStore,
4818+
new MetadataSubscriberAccessorRepository([$subscriber]),
4819+
logger: new NullLogger(),
4820+
cleaner: $this->createMock(Cleaner::class),
4821+
);
4822+
4823+
$engine->refreshSubscriptions();
4824+
4825+
$subscriptionStore->assertAdded(
4826+
new Subscription(
4827+
'test',
4828+
'default',
4829+
RunMode::FromBeginning,
4830+
Status::New,
4831+
),
4832+
);
4833+
}
45754834
}

0 commit comments

Comments
 (0)