From cf5dcc81e1283d4c8308e658c27e4e99138b5dfd Mon Sep 17 00:00:00 2001 From: Peter Baettig Date: Mon, 11 Jul 2022 15:04:39 +0200 Subject: [PATCH] add possibility to check whether a plan has a feature --- src/Models/Plan.php | 7 +++++++ tests/feature/SubscribeTest.php | 2 +- tests/unit/FeatureTest.php | 25 +++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Models/Plan.php b/src/Models/Plan.php index dff677c..6cfb961 100644 --- a/src/Models/Plan.php +++ b/src/Models/Plan.php @@ -76,6 +76,13 @@ public function subscriptions(): HasMany return $this->hasMany(config('subscriptions.models.subscription'), 'plan_id'); } + public function hasFeature(string $code): bool + { + /** @noinspection PhpUndefinedMethodInspection */ + if (count($this->features()->code($code)->get())) return true; + return false; + } + public function getPlanTypeDefinitionAttribute(): array { return $this::getPlanTypeDefinitionForCode($this->type); diff --git a/tests/feature/SubscribeTest.php b/tests/feature/SubscribeTest.php index 6fa63ae..520a2d1 100644 --- a/tests/feature/SubscribeTest.php +++ b/tests/feature/SubscribeTest.php @@ -46,7 +46,7 @@ public function can_subscribe_to_a_recurring_yearly_plan(): void $this->assertTrue($plan->is($subscription->plan)); $this->assertEquals($plan->price, $subscription->price); $this->assertEquals($plan->currency, $subscription->currency); - $this->assertEquals(Carbon::now()->addYear()->diffInDays(Carbon::now()), $subscription->remaining_days); + $this->assertEqualsWithDelta(Carbon::now()->addYear()->diffInDays(Carbon::now()), $subscription->remaining_days, 1); $this->assertEqualsWithDelta(Carbon::now()->addDays(30)->endOfDay(), $subscription->payment_tolerance_ends_at, 1); $this->assertTrue($subscription->is_recurring); $this->assertNull($subscription->refunded_at); diff --git a/tests/unit/FeatureTest.php b/tests/unit/FeatureTest.php index 58ed993..03610b6 100644 --- a/tests/unit/FeatureTest.php +++ b/tests/unit/FeatureTest.php @@ -91,4 +91,29 @@ public function info_on_unlimited_feature_is_correct(): void $this->assertFalse($unlimitedFeature->isLimited()); $this->assertTrue($unlimitedFeature->isUnlimited()); } + + /** @test */ + public function a_plan_also_knows_its_features(): void + { + $plan = factory(Plan::class)->create(); + $plan->features()->saveMany([ + new Feature([ + 'name' => 'Limited feature', + 'code' => 'feature.limited', + 'description' => 'Some limited feature', + 'type' => 'limit', + 'limit' => 10, + ]), + new Feature([ + 'name' => 'Unlimited feature', + 'code' => 'feature.feature', + 'description' => 'Some unlimited feature', + 'type' => 'feature', + 'limit' => 20, + ]) + ]); + $this->assertTrue($plan->hasFeature('feature.limited')); + $this->assertTrue($plan->hasFeature('feature.feature')); + $this->assertFalse($plan->hasFeature('some.feature.that.does.not.exist')); + } }