|
17 | 17 | use Patchlevel\EventSourcing\Store\Criteria\Criteria; |
18 | 18 | use Patchlevel\EventSourcing\Store\Criteria\FromIndexCriterion; |
19 | 19 | use Patchlevel\EventSourcing\Store\Store; |
| 20 | +use Patchlevel\EventSourcing\Subscription\Cleanup\Cleaner; |
20 | 21 | use Patchlevel\EventSourcing\Subscription\Cleanup\CleanupFailed; |
21 | 22 | use Patchlevel\EventSourcing\Subscription\Cleanup\CleanupTaskHandler; |
22 | 23 | use Patchlevel\EventSourcing\Subscription\Cleanup\Dbal\DropTableTask; |
@@ -4572,4 +4573,262 @@ private function criteria(int $fromIndex = 0): Criteria |
4572 | 4573 | { |
4573 | 4574 | return new Criteria(new FromIndexCriterion($fromIndex)); |
4574 | 4575 | } |
| 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 | + } |
4575 | 4834 | } |
0 commit comments