Skip to content

Commit daeab6b

Browse files
authored
ENGCOM-5918: Refactor apply options of sales rule to it's own source model to simplify extending it #24665
2 parents d6ef3ef + a8ec219 commit daeab6b

File tree

4 files changed

+134
-30
lines changed

4 files changed

+134
-30
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\SalesRule\Model\Rule\Action;
9+
10+
use Magento\Framework\Data\OptionSourceInterface;
11+
use Magento\SalesRule\Model\Rule;
12+
13+
/**
14+
* Class SimpleActionOptionsProvider
15+
*/
16+
class SimpleActionOptionsProvider implements OptionSourceInterface
17+
{
18+
/**
19+
* @inheritdoc
20+
*/
21+
public function toOptionArray()
22+
{
23+
return [
24+
['label' => __('Percent of product price discount'), 'value' => Rule::BY_PERCENT_ACTION],
25+
['label' => __('Fixed amount discount'), 'value' => Rule::BY_FIXED_ACTION],
26+
['label' => __('Fixed amount discount for whole cart'), 'value' => Rule::CART_FIXED_ACTION],
27+
['label' => __('Buy X get Y free (discount amount is Y)'), 'value' => Rule::BUY_X_GET_Y_ACTION]
28+
];
29+
}
30+
}

app/code/Magento/SalesRule/Model/Rule/Metadata/ValueProvider.php

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
*/
66
namespace Magento\SalesRule\Model\Rule\Metadata;
77

8-
use Magento\SalesRule\Model\Rule;
9-
use Magento\Store\Model\System\Store;
108
use Magento\Customer\Api\GroupRepositoryInterface;
119
use Magento\Framework\Api\SearchCriteriaBuilder;
10+
use Magento\Framework\App\ObjectManager;
1211
use Magento\Framework\Convert\DataObject;
12+
use Magento\SalesRule\Model\Rule;
13+
use Magento\SalesRule\Model\Rule\Action\SimpleActionOptionsProvider;
14+
use Magento\SalesRule\Model\RuleFactory;
15+
use Magento\Store\Model\System\Store;
1316

1417
/**
1518
* Metadata provider for sales rule edit form.
@@ -37,31 +40,40 @@ class ValueProvider
3740
protected $objectConverter;
3841

3942
/**
40-
* @var \Magento\SalesRule\Model\RuleFactory
43+
* @var RuleFactory
4144
*/
4245
protected $salesRuleFactory;
4346

47+
/**
48+
* @var SimpleActionOptionsProvider
49+
*/
50+
private $simpleActionOptionsProvider;
51+
4452
/**
4553
* Initialize dependencies.
4654
*
4755
* @param Store $store
4856
* @param GroupRepositoryInterface $groupRepository
4957
* @param SearchCriteriaBuilder $searchCriteriaBuilder
5058
* @param DataObject $objectConverter
51-
* @param \Magento\SalesRule\Model\RuleFactory $salesRuleFactory
59+
* @param RuleFactory $salesRuleFactory
60+
* @param SimpleActionOptionsProvider|null $simpleActionOptionsProvider
5261
*/
5362
public function __construct(
5463
Store $store,
5564
GroupRepositoryInterface $groupRepository,
5665
SearchCriteriaBuilder $searchCriteriaBuilder,
5766
DataObject $objectConverter,
58-
\Magento\SalesRule\Model\RuleFactory $salesRuleFactory
67+
RuleFactory $salesRuleFactory,
68+
SimpleActionOptionsProvider $simpleActionOptionsProvider = null
5969
) {
6070
$this->store = $store;
6171
$this->groupRepository = $groupRepository;
6272
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
6373
$this->objectConverter = $objectConverter;
6474
$this->salesRuleFactory = $salesRuleFactory;
75+
$this->simpleActionOptionsProvider = $simpleActionOptionsProvider ?:
76+
ObjectManager::getInstance()->get(SimpleActionOptionsProvider::class);
6577
}
6678

6779
/**
@@ -71,15 +83,10 @@ public function __construct(
7183
* @return array
7284
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
7385
*/
74-
public function getMetadataValues(\Magento\SalesRule\Model\Rule $rule)
86+
public function getMetadataValues(Rule $rule)
7587
{
7688
$customerGroups = $this->groupRepository->getList($this->searchCriteriaBuilder->create())->getItems();
77-
$applyOptions = [
78-
['label' => __('Percent of product price discount'), 'value' => Rule::BY_PERCENT_ACTION],
79-
['label' => __('Fixed amount discount'), 'value' => Rule::BY_FIXED_ACTION],
80-
['label' => __('Fixed amount discount for whole cart'), 'value' => Rule::CART_FIXED_ACTION],
81-
['label' => __('Buy X get Y free (discount amount is Y)'), 'value' => Rule::BUY_X_GET_Y_ACTION]
82-
];
89+
$applyOptions = $this->simpleActionOptionsProvider->toOptionArray();
8390

8491
$couponTypesOptions = [];
8592
$couponTypes = $this->salesRuleFactory->create()->getCouponTypes();
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\SalesRule\Test\Unit\Model\Rule\Action;
8+
9+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
10+
use Magento\SalesRule\Model\Rule;
11+
use Magento\SalesRule\Model\Rule\Action\SimpleActionOptionsProvider;
12+
use PHPUnit\Framework\MockObject\MockObject;
13+
use PHPUnit\Framework\TestCase;
14+
15+
/**
16+
* @covers Magento\SalesRule\Model\Rule\Action\SimpleActionOptionsProvider
17+
*/
18+
class SimpleActionOptionsProviderTest extends TestCase
19+
{
20+
/**
21+
* @var SimpleActionOptionsProvider|MockObject
22+
*/
23+
protected $model;
24+
25+
protected function setUp()
26+
{
27+
$objectManager = new ObjectManager($this);
28+
29+
$this->model = $objectManager->getObject(SimpleActionOptionsProvider::class);
30+
}
31+
32+
public function testToOptionArray()
33+
{
34+
$expected = [
35+
['label' => __('Percent of product price discount'), 'value' => Rule::BY_PERCENT_ACTION],
36+
['label' => __('Fixed amount discount'), 'value' => Rule::BY_FIXED_ACTION],
37+
['label' => __('Fixed amount discount for whole cart'), 'value' => Rule::CART_FIXED_ACTION],
38+
['label' => __('Buy X get Y free (discount amount is Y)'), 'value' => Rule::BUY_X_GET_Y_ACTION]
39+
];
40+
41+
$this->assertEquals($expected, $this->model->toOptionArray());
42+
}
43+
}

app/code/Magento/SalesRule/Test/Unit/Model/Rule/Metadata/ValueProviderTest.php

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,72 @@
55
*/
66
namespace Magento\SalesRule\Test\Unit\Model\Rule\Metadata;
77

8+
use Magento\Customer\Api\Data\GroupInterface;
9+
use Magento\Customer\Api\Data\GroupSearchResultsInterface;
10+
use Magento\Customer\Api\GroupRepositoryInterface;
11+
use Magento\Framework\Api\SearchCriteriaBuilder;
12+
use Magento\Framework\Api\SearchCriteriaInterface;
13+
use Magento\Framework\Convert\DataObject;
814
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
15+
use Magento\SalesRule\Model\Rule;
16+
use Magento\SalesRule\Model\Rule\Action\SimpleActionOptionsProvider;
17+
use Magento\SalesRule\Model\Rule\Metadata\ValueProvider;
18+
use Magento\SalesRule\Model\RuleFactory;
19+
use Magento\Store\Model\System\Store;
20+
use PHPUnit\Framework\TestCase;
21+
use PHPUnit\Framework\MockObject\MockObject;
922

1023
/**
1124
* @covers Magento\SalesRule\Model\Rule\Metadata\ValueProvider
1225
*/
13-
class ValueProviderTest extends \PHPUnit\Framework\TestCase
26+
class ValueProviderTest extends TestCase
1427
{
1528
/**
16-
* @var \Magento\SalesRule\Model\Rule\Metadata\ValueProvider
29+
* @var ValueProvider
1730
*/
1831
protected $model;
1932

2033
/**
21-
* @var \PHPUnit_Framework_MockObject_MockObject
34+
* @var Store|MockObject
2235
*/
2336
protected $storeMock;
2437

2538
/**
26-
* @var \PHPUnit_Framework_MockObject_MockObject
39+
* @var GroupRepositoryInterface|MockObject
2740
*/
2841
protected $groupRepositoryMock;
2942

3043
/**
31-
* @var \PHPUnit_Framework_MockObject_MockObject
44+
* @var SearchCriteriaBuilder|MockObject
3245
*/
3346
protected $searchCriteriaBuilderMock;
3447

3548
/**
36-
* @var \PHPUnit_Framework_MockObject_MockObject
49+
* @var DataObject|MockObject
3750
*/
3851
protected $dataObjectMock;
3952

4053
/**
41-
* @var \Magento\SalesRule\Model\RuleFactory|\PHPUnit_Framework_MockObject_MockObject
54+
* @var RuleFactory|MockObject
4255
*/
4356
protected $ruleFactoryMock;
4457

58+
/**
59+
* @var SimpleActionOptionsProvider|MockObject
60+
*/
61+
private $simpleActionOptionsProviderMock;
62+
4563
protected function setUp()
4664
{
47-
$this->searchCriteriaBuilderMock = $this->createMock(\Magento\Framework\Api\SearchCriteriaBuilder::class);
48-
$this->storeMock = $this->createMock(\Magento\Store\Model\System\Store::class);
49-
$this->groupRepositoryMock = $this->createMock(\Magento\Customer\Api\GroupRepositoryInterface::class);
50-
$this->dataObjectMock = $this->createMock(\Magento\Framework\Convert\DataObject::class);
51-
$searchCriteriaMock = $this->createMock(\Magento\Framework\Api\SearchCriteriaInterface::class);
52-
$groupSearchResultsMock = $this->createMock(\Magento\Customer\Api\Data\GroupSearchResultsInterface::class);
53-
$groupsMock = $this->createMock(\Magento\Customer\Api\Data\GroupInterface::class);
65+
$expectedData = include __DIR__ . '/_files/MetaData.php';
66+
$this->searchCriteriaBuilderMock = $this->createMock(SearchCriteriaBuilder::class);
67+
$this->storeMock = $this->createMock(Store::class);
68+
$this->groupRepositoryMock = $this->createMock(GroupRepositoryInterface::class);
69+
$this->dataObjectMock = $this->createMock(DataObject::class);
70+
$this->simpleActionOptionsProviderMock = $this->createMock(SimpleActionOptionsProvider::class);
71+
$searchCriteriaMock = $this->createMock(SearchCriteriaInterface::class);
72+
$groupSearchResultsMock = $this->createMock(GroupSearchResultsInterface::class);
73+
$groupsMock = $this->createMock(GroupInterface::class);
5474

5575
$this->searchCriteriaBuilderMock->expects($this->once())->method('create')->willReturn($searchCriteriaMock);
5676
$this->groupRepositoryMock->expects($this->once())->method('getList')->with($searchCriteriaMock)
@@ -59,15 +79,19 @@ protected function setUp()
5979
$this->storeMock->expects($this->once())->method('getWebsiteValuesForForm')->willReturn([]);
6080
$this->dataObjectMock->expects($this->once())->method('toOptionArray')->with([$groupsMock], 'id', 'code')
6181
->willReturn([]);
62-
$this->ruleFactoryMock = $this->createPartialMock(\Magento\SalesRule\Model\RuleFactory::class, ['create']);
82+
$this->ruleFactoryMock = $this->createPartialMock(RuleFactory::class, ['create']);
83+
$this->simpleActionOptionsProviderMock->method('toOptionArray')->willReturn(
84+
$expectedData['actions']['children']['simple_action']['arguments']['data']['config']['options']
85+
);
6386
$this->model = (new ObjectManager($this))->getObject(
64-
\Magento\SalesRule\Model\Rule\Metadata\ValueProvider::class,
87+
ValueProvider::class,
6588
[
6689
'store' => $this->storeMock,
6790
'groupRepository' => $this->groupRepositoryMock,
6891
'searchCriteriaBuilder' => $this->searchCriteriaBuilderMock,
6992
'objectConverter' => $this->dataObjectMock,
7093
'salesRuleFactory' => $this->ruleFactoryMock,
94+
'simpleActionOptionsProvider' => $this->simpleActionOptionsProviderMock
7195
]
7296
);
7397
}
@@ -76,8 +100,8 @@ public function testGetMetadataValues()
76100
{
77101
$expectedData = include __DIR__ . '/_files/MetaData.php';
78102

79-
/** @var \Magento\SalesRule\Model\Rule|\PHPUnit_Framework_MockObject_MockObject $ruleMock */
80-
$ruleMock = $this->createMock(\Magento\SalesRule\Model\Rule::class);
103+
/** @var Rule|MockObject $ruleMock */
104+
$ruleMock = $this->createMock(Rule::class);
81105
$this->ruleFactoryMock->expects($this->once())
82106
->method('create')
83107
->willReturn($ruleMock);

0 commit comments

Comments
 (0)