Skip to content

Commit 4392e90

Browse files
oliverkleeSam Tuke
authored andcommitted
[BUGFIX] Cascading removal of subscriptions (#271)
When a subscriber or a subscriber list is removed, all associated subscriptions need to be removed as well.
1 parent 45bbf67 commit 4392e90

File tree

5 files changed

+79
-2
lines changed

5 files changed

+79
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
2020
### Removed
2121

2222
### Fixed
23+
- Remove associated subscriptions when a subscriber list or subscriber is removed (#271)
2324
- Always truncate the DB tables after an integration test (#259)
2425
- Adapt the system tests to possible HTTP errors (#256)
2526

src/Domain/Model/Messaging/SubscriberList.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,11 @@ class SubscriberList implements Identity, CreationDate, ModificationDate
106106

107107
/**
108108
* @var Collection
109-
* @OneToMany(targetEntity="PhpList\PhpList4\Domain\Model\Subscription\Subscription", mappedBy="subscriberList")
109+
* @OneToMany(
110+
* targetEntity="PhpList\PhpList4\Domain\Model\Subscription\Subscription",
111+
* mappedBy="subscriberList",
112+
* cascade={"remove"}
113+
* )
110114
*/
111115
private $subscriptions = null;
112116

src/Domain/Model/Subscription/Subscriber.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,11 @@ class Subscriber implements Identity, CreationDate, ModificationDate
107107

108108
/**
109109
* @var Collection
110-
* @OneToMany(targetEntity="PhpList\PhpList4\Domain\Model\Subscription\Subscription", mappedBy="subscriber")
110+
* @OneToMany(
111+
* targetEntity="PhpList\PhpList4\Domain\Model\Subscription\Subscription",
112+
* mappedBy="subscriber",
113+
* cascade={"remove"}
114+
* )
111115
*/
112116
private $subscriptions = null;
113117

tests/Integration/Domain/Repository/Messaging/SubscriberListRepositoryTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpList\PhpList4\Domain\Repository\Identity\AdministratorRepository;
1111
use PhpList\PhpList4\Domain\Repository\Messaging\SubscriberListRepository;
1212
use PhpList\PhpList4\Domain\Repository\Subscription\SubscriberRepository;
13+
use PhpList\PhpList4\Domain\Repository\Subscription\SubscriptionRepository;
1314
use PhpList\PhpList4\TestingSupport\Traits\DatabaseTestTrait;
1415
use PhpList\PhpList4\TestingSupport\Traits\SimilarDatesAssertionTrait;
1516
use PHPUnit\Framework\TestCase;
@@ -59,13 +60,19 @@ class SubscriberListRepositoryTest extends TestCase
5960
*/
6061
private $subscriberRepository = null;
6162

63+
/**
64+
* @var SubscriptionRepository
65+
*/
66+
private $subscriptionRepository = null;
67+
6268
protected function setUp()
6369
{
6470
$this->setUpDatabaseTest();
6571

6672
$this->subject = $this->container->get(SubscriberListRepository::class);
6773
$this->administratorRepository = $this->container->get(AdministratorRepository::class);
6874
$this->subscriberRepository = $this->container->get(SubscriberRepository::class);
75+
$this->subscriptionRepository = $this->container->get(SubscriptionRepository::class);
6976
}
7077

7178
/**
@@ -256,4 +263,31 @@ public function findsAssociatedSubscribers()
256263
static::assertTrue($subscribers->contains($expectedSubscriber));
257264
static::assertFalse($subscribers->contains($unexpectedSubscriber));
258265
}
266+
267+
/**
268+
* @test
269+
*/
270+
public function removeAlsoRemovesAssociatedSubscriptions()
271+
{
272+
$this->getDataSet()->addTable(static::TABLE_NAME, __DIR__ . '/../Fixtures/SubscriberList.csv');
273+
$this->getDataSet()->addTable(static::SUBSCRIBER_TABLE_NAME, __DIR__ . '/../Fixtures/Subscriber.csv');
274+
$this->getDataSet()->addTable(static::SUBSCRIPTION_TABLE_NAME, __DIR__ . '/../Fixtures/Subscription.csv');
275+
$this->applyDatabaseChanges();
276+
277+
$initialNumberOfSubscriptions = count($this->subscriptionRepository->findAll());
278+
279+
/** @var SubscriberList $model */
280+
$id = 2;
281+
$model = $this->subject->find($id);
282+
283+
$numberOfAssociatedSubscriptions = count($model->getSubscriptions());
284+
static::assertGreaterThan(0, $numberOfAssociatedSubscriptions);
285+
286+
$this->entityManager->remove($model);
287+
$this->entityManager->flush();
288+
289+
$newNumberOfSubscriptions = count($this->subscriptionRepository->findAll());
290+
$numberOfRemovedSubscriptions = $initialNumberOfSubscriptions - $newNumberOfSubscriptions;
291+
static::assertSame($numberOfAssociatedSubscriptions, $newNumberOfSubscriptions);
292+
}
259293
}

tests/Integration/Domain/Repository/Subscription/SubscriberRepositoryTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use PhpList\PhpList4\Domain\Model\Subscription\Subscription;
99
use PhpList\PhpList4\Domain\Repository\Messaging\SubscriberListRepository;
1010
use PhpList\PhpList4\Domain\Repository\Subscription\SubscriberRepository;
11+
use PhpList\PhpList4\Domain\Repository\Subscription\SubscriptionRepository;
1112
use PhpList\PhpList4\TestingSupport\Traits\DatabaseTestTrait;
1213
use PhpList\PhpList4\TestingSupport\Traits\SimilarDatesAssertionTrait;
1314
use PHPUnit\Framework\TestCase;
@@ -52,12 +53,18 @@ class SubscriberRepositoryTest extends TestCase
5253
*/
5354
private $subscriberListRepository = null;
5455

56+
/**
57+
* @var SubscriptionRepository
58+
*/
59+
private $subscriptionRepository = null;
60+
5561
protected function setUp()
5662
{
5763
$this->setUpDatabaseTest();
5864

5965
$this->subject = $this->container->get(SubscriberRepository::class);
6066
$this->subscriberListRepository = $this->container->get(SubscriberListRepository::class);
67+
$this->subscriptionRepository = $this->container->get(SubscriptionRepository::class);
6168
}
6269

6370
/**
@@ -261,4 +268,31 @@ public function findsAssociatedSubscribedLists()
261268
static::assertTrue($subscribedLists->contains($expectedList));
262269
static::assertFalse($subscribedLists->contains($unexpectedList));
263270
}
271+
272+
/**
273+
* @test
274+
*/
275+
public function removeAlsoRemovesAssociatedSubscriptions()
276+
{
277+
$this->getDataSet()->addTable(static::TABLE_NAME, __DIR__ . '/../Fixtures/Subscriber.csv');
278+
$this->getDataSet()->addTable(static::SUBSCRIBER_LIST_TABLE_NAME, __DIR__ . '/../Fixtures/SubscriberList.csv');
279+
$this->getDataSet()->addTable(static::SUBSCRIPTION_TABLE_NAME, __DIR__ . '/../Fixtures/Subscription.csv');
280+
$this->applyDatabaseChanges();
281+
282+
$initialNumberOfSubscriptions = count($this->subscriptionRepository->findAll());
283+
284+
/** @var Subscriber $model */
285+
$id = 2;
286+
$model = $this->subject->find($id);
287+
288+
$numberOfAssociatedSubscriptions = count($model->getSubscriptions());
289+
static::assertGreaterThan(0, $numberOfAssociatedSubscriptions);
290+
291+
$this->entityManager->remove($model);
292+
$this->entityManager->flush();
293+
294+
$newNumberOfSubscriptions = count($this->subscriptionRepository->findAll());
295+
$numberOfRemovedSubscriptions = $initialNumberOfSubscriptions - $newNumberOfSubscriptions;
296+
static::assertSame($numberOfAssociatedSubscriptions, $newNumberOfSubscriptions);
297+
}
264298
}

0 commit comments

Comments
 (0)