From 058a6a8003cf19321827207529088ff4cbec2574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Wis=CC=81niewski?= Date: Tue, 19 Mar 2024 12:01:02 +0100 Subject: [PATCH 1/2] Changed registerProductableClass --- src/Contracts/Productable.php | 2 ++ src/Contracts/ProductableTrait.php | 5 +++++ src/Services/ProductService.php | 5 ++--- tests/Mocks/ExampleProductable.php | 5 +++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Contracts/Productable.php b/src/Contracts/Productable.php index 7f94188..c4963f9 100644 --- a/src/Contracts/Productable.php +++ b/src/Contracts/Productable.php @@ -105,4 +105,6 @@ public function getProductableAuthors(): Collection; * Get productable duration in seconds */ public function getProductableDuration(): int; + + public static function getMorphClassStatic(): string; } diff --git a/src/Contracts/ProductableTrait.php b/src/Contracts/ProductableTrait.php index 8a0b331..63ab8bd 100644 --- a/src/Contracts/ProductableTrait.php +++ b/src/Contracts/ProductableTrait.php @@ -165,4 +165,9 @@ public function getProductableDuration(): int { return (int) ($this->duration ?? 0); } + + public static function getMorphClassStatic(): string + { + return self::class; + } } diff --git a/src/Services/ProductService.php b/src/Services/ProductService.php index 790658c..fc0f61f 100644 --- a/src/Services/ProductService.php +++ b/src/Services/ProductService.php @@ -50,9 +50,8 @@ public function registerProductableClass(string $productableClass): void } if (!in_array($productableClass, $this->productables)) { $this->productables[] = $productableClass; - $model = new $productableClass(); - assert($model instanceof Model); - $this->productablesMorphs[$model->getMorphClass()] = $productableClass; + assert(is_subclass_of($productableClass, Model::class)); + $this->productablesMorphs[$productableClass::getMorphClassStatic()] = $productableClass; } } diff --git a/tests/Mocks/ExampleProductable.php b/tests/Mocks/ExampleProductable.php index e038463..b2bbfed 100644 --- a/tests/Mocks/ExampleProductable.php +++ b/tests/Mocks/ExampleProductable.php @@ -33,4 +33,9 @@ protected static function newFactory(): ExampleProductableFactory { return ExampleProductableFactory::new(); } + + public static function getMorphClassStatic(): string + { + return parent::class; + } } From d5338eace01b22187e0197eb586ad653bca71c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Wis=CC=81niewski?= Date: Tue, 19 Mar 2024 12:20:44 +0100 Subject: [PATCH 2/2] added tests --- tests/Services/ProductServiceTest.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/Services/ProductServiceTest.php b/tests/Services/ProductServiceTest.php index e23818e..f0d495f 100644 --- a/tests/Services/ProductServiceTest.php +++ b/tests/Services/ProductServiceTest.php @@ -8,6 +8,7 @@ use EscolaLms\Cart\Models\Product; use EscolaLms\Cart\Models\ProductUser; use EscolaLms\Cart\Services\Contracts\ProductServiceContract; +use EscolaLms\Cart\Tests\Mocks\ExampleProductable; use EscolaLms\Cart\Tests\TestCase; use EscolaLms\Core\Models\User; use EscolaLms\Core\Tests\CreatesUsers; @@ -92,6 +93,13 @@ public function testAttachProductToUserSubscriptionChargeOnceTrailPeriod(): void $this->assertHasProductsUsers($product, $user, $endDate); } + public function testRegisterProductable(): void + { + $this->productService->registerProductableClass(ExampleProductable::class); + $this->assertContains(ExampleProductable::class, $this->productService->listRegisteredProductableClasses()); + $this->assertArrayHasKey(ExampleProductable::getMorphClassStatic(), $this->productService->listRegisteredMorphClasses()); + } + private function assertHasProductsUsers(Product $product, User $user, ?Carbon $endDate = null): void { $result = ProductUser::query()->where('product_id', $product->getKey())->where('user_id', $user->getKey())->first();