diff --git a/src/Models/Subscription.php b/src/Models/Subscription.php index e6b1f44..de61aef 100644 --- a/src/Models/Subscription.php +++ b/src/Models/Subscription.php @@ -112,7 +112,7 @@ public function renew(?Carbon $expirationDate = null): self $expirationDate = $this->getRenewedExpiration($expirationDate); $graceDaysEndedAt = null; - if ($this->plan->grace_days) { + if ($this->plan->grace_days && $expirationDate) { $graceDaysEndedAt = $expirationDate->copy()->addDays($this->plan->grace_days); } diff --git a/tests/Models/SubscriptionTest.php b/tests/Models/SubscriptionTest.php index fc0829c..c196355 100644 --- a/tests/Models/SubscriptionTest.php +++ b/tests/Models/SubscriptionTest.php @@ -247,6 +247,66 @@ public function testModelRenewsEvenIfPlanHasNoPeriodicity() ]); } + public function testModelRenewsEvenIfPlanHasNoPeriodicityButHasGraceDays() + { + $subscriber = User::factory()->create(); + $plan = Plan::factory()->create([ + 'periodicity' => null, + 'periodicity_type' => null, + 'grace_days' => 1, + ]); + + $subscription = Subscription::factory() + ->for($plan) + ->for($subscriber, 'subscriber') + ->create([ + 'expired_at' => now()->subDay(), + ]); + + Event::fake(); + + $subscription->renew(); + + Event::assertDispatched(SubscriptionRenewed::class); + + $this->assertDatabaseHas('subscriptions', [ + 'id' => $subscription->id, + 'expired_at' => null, + 'grace_days_ended_at' => null, + ]); + } + + public function testModelRenewsWithDefinedExpirationEvenIfPlanHasNoPeriodicityButHasGraceDays() + { + $subscriber = User::factory()->create(); + $plan = Plan::factory()->create([ + 'periodicity' => null, + 'periodicity_type' => null, + 'grace_days' => 1, + ]); + + $subscription = Subscription::factory() + ->for($plan) + ->for($subscriber, 'subscriber') + ->create([ + 'expired_at' => now()->subDay(), + ]); + + $expiration = now(); + + Event::fake(); + + $subscription->renew(now()); + + Event::assertDispatched(SubscriptionRenewed::class); + + $this->assertDatabaseHas('subscriptions', [ + 'id' => $subscription->id, + 'expired_at' => $expiration->toDateTimeString(), + 'grace_days_ended_at' => $expiration->addDays(1)->toDateTimeString(), + ]); + } + public function testModelConsidersGraceDaysOnOverdue() { $subscriber = User::factory()->create();