-
-
Notifications
You must be signed in to change notification settings - Fork 102
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added the CartPercentageDiscount promotion action class
- Loading branch information
1 parent
555b52b
commit a81be8d
Showing
6 changed files
with
179 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
/** | ||
* Contains the CartPercentageDiscount class. | ||
* | ||
* @copyright Copyright (c) 2024 Attila Fulop | ||
* @author Attila Fulop | ||
* @license MIT | ||
* @since 2024-08-25 | ||
* | ||
*/ | ||
|
||
namespace Vanilo\Promotion\Actions; | ||
|
||
use Nette\Schema\Expect; | ||
use Nette\Schema\Processor; | ||
use Nette\Schema\Schema; | ||
use Vanilo\Adjustments\Adjusters\PercentDiscount; | ||
use Vanilo\Adjustments\Contracts\Adjustable; | ||
use Vanilo\Adjustments\Contracts\Adjuster; | ||
use Vanilo\Promotion\Contracts\PromotionActionType; | ||
|
||
class CartPercentageDiscount implements PromotionActionType | ||
{ | ||
public const DEFAULT_ID = 'cart_percentage_discount'; | ||
|
||
public static function getName(): string | ||
{ | ||
return __('Cart Percentage Discount'); | ||
} | ||
|
||
public function getTitle(array $configuration): string | ||
{ | ||
if (null === $percent = $configuration['percent'] ?? null) { | ||
return __('X% discount on the entire cart. Invalid Configuration: the `:parameter` parameter is missing', ['parameter' => 'percent']); | ||
} | ||
|
||
return __(':percent% discount on the entire cart', ['percent' => $percent]); | ||
} | ||
|
||
public function getAdjuster(array $configuration): Adjuster | ||
{ | ||
$configuration = (new Processor())->process($this->getSchema(), $configuration); | ||
|
||
return new PercentDiscount($configuration['percent']); | ||
} | ||
|
||
public function apply(object $subject, array $configuration): array | ||
{ | ||
$result = []; | ||
if ($subject instanceof Adjustable) { | ||
$result[] = $subject->adjustments()->create($this->getAdjuster($configuration)); | ||
} | ||
//@todo also set the origin | ||
|
||
return $result; | ||
} | ||
|
||
public function getSchema(): Schema | ||
{ | ||
return Expect::structure([ | ||
'percent' => Expect::anyOf( | ||
Expect::float(0)->min(0)->max(100), | ||
Expect::int(0)->min(0)->max(100) | ||
)->required() | ||
]) | ||
->castTo('array'); | ||
} | ||
|
||
public function getSchemaSample(array $mergeWith = null): array | ||
{ | ||
$sample = ['percent' => 10]; | ||
|
||
return is_null($mergeWith) ? $sample : array_merge($sample, $mergeWith); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
src/Promotion/Tests/Actions/CartPercentageDiscountTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace Vanilo\Promotion\Tests\Actions; | ||
|
||
use Nette\Schema\ValidationException; | ||
use Vanilo\Adjustments\Adjusters\PercentDiscount; | ||
use Vanilo\Promotion\Actions\CartPercentageDiscount; | ||
use Vanilo\Promotion\PromotionActionTypes; | ||
use Vanilo\Promotion\Tests\Examples\SampleAdjustable; | ||
use Vanilo\Promotion\Tests\TestCase; | ||
|
||
class CartPercentageDiscountTest extends TestCase | ||
{ | ||
/** @test */ | ||
public function it_has_a_name() | ||
{ | ||
$this->assertNotEmpty(CartPercentageDiscount::getName()); | ||
} | ||
|
||
/** @test */ | ||
public function it_can_be_created_from_the_registry() | ||
{ | ||
$fixedDiscount = PromotionActionTypes::make(CartPercentageDiscount::DEFAULT_ID); | ||
|
||
$this->assertInstanceOf(CartPercentageDiscount::class, $fixedDiscount); | ||
} | ||
|
||
/** @test */ | ||
public function it_throws_a_validation_exception_if_the_percent_is_missing_from_the_configuration() | ||
{ | ||
$this->expectException(ValidationException::class); | ||
|
||
$discount = new CartPercentageDiscount(); | ||
|
||
$discount->getAdjuster([]); | ||
} | ||
|
||
/** @test */ | ||
public function it_throws_a_validation_exception_if_the_configured_percent_is_higher_than_100() | ||
{ | ||
$this->expectException(ValidationException::class); | ||
|
||
$discount = new CartPercentageDiscount(); | ||
|
||
$discount->getAdjuster(['percent' => 101]); | ||
} | ||
|
||
/** @test */ | ||
public function it_throws_a_validation_exception_if_the_configured_percent_is_negative() | ||
{ | ||
$this->expectException(ValidationException::class); | ||
|
||
$discount = new CartPercentageDiscount(); | ||
|
||
$discount->getAdjuster(['percent' => -3]); | ||
} | ||
|
||
/** @test */ | ||
public function the_title_contains_the_configured_percent() | ||
{ | ||
$this->assertStringContainsString('7%', (new CartPercentageDiscount())->getTitle(['percent' => 7])); | ||
} | ||
|
||
/** @test */ | ||
public function the_title_warns_if_the_percent_configuration_is_missing() | ||
{ | ||
$this->assertStringContainsString('Invalid', (new CartPercentageDiscount())->getTitle([])); | ||
} | ||
|
||
/** @test */ | ||
public function it_returns_a_percent_discount_adjuster_if_the_configuration_is_correct() | ||
{ | ||
$this->assertInstanceOf(PercentDiscount::class, (new CartPercentageDiscount())->getAdjuster(['percent' => 20])); | ||
} | ||
|
||
/** @test */ | ||
public function it_adds_a_promotion_adjustment_to_the_subject_if_applied() | ||
{ | ||
$discount = new CartPercentageDiscount(); | ||
$subject = new SampleAdjustable(179); | ||
|
||
$discount->apply($subject, ['percent' => 10]); | ||
|
||
$this->assertCount(1, $subject->adjustments()); | ||
$adjustment = $subject->adjustments()->first(); | ||
$this->assertInstanceOf(PercentDiscount::class, $adjustment->getAdjuster()); | ||
$this->assertEquals(-17.9, $adjustment->getAmount()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters