Skip to content

Commit 8858ecc

Browse files
committed
Merge branch 'MAGETWO-63159' into BUGS
2 parents 1e02e2d + 92facdd commit 8858ecc

File tree

3 files changed

+75
-10
lines changed

3 files changed

+75
-10
lines changed

app/code/Magento/SalesRule/Model/Converter/ToDataModel.php

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\SalesRule\Model\Converter;
77

8+
use Magento\SalesRule\Api\Data\RuleExtensionFactory;
9+
use Magento\SalesRule\Api\Data\RuleExtensionInterface;
810
use Magento\SalesRule\Model\Data\Condition;
911
use Magento\SalesRule\Api\Data\RuleInterface;
1012
use Magento\SalesRule\Model\Data\Rule as RuleDataModel;
@@ -43,38 +45,52 @@ class ToDataModel
4345
*/
4446
private $serializer;
4547

48+
/**
49+
* @var RuleExtensionFactory
50+
*/
51+
private $extensionFactory;
52+
4653
/**
4754
* @param \Magento\SalesRule\Model\RuleFactory $ruleFactory
4855
* @param \Magento\SalesRule\Api\Data\RuleInterfaceFactory $ruleDataFactory
4956
* @param \Magento\SalesRule\Api\Data\ConditionInterfaceFactory $conditionDataFactory
5057
* @param \Magento\SalesRule\Api\Data\RuleLabelInterfaceFactory $ruleLabelFactory
5158
* @param \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor
5259
* @param Json $serializer Optional parameter for backward compatibility
60+
* @param RuleExtensionFactory|null $extensionFactory
5361
*/
5462
public function __construct(
5563
\Magento\SalesRule\Model\RuleFactory $ruleFactory,
5664
\Magento\SalesRule\Api\Data\RuleInterfaceFactory $ruleDataFactory,
5765
\Magento\SalesRule\Api\Data\ConditionInterfaceFactory $conditionDataFactory,
5866
\Magento\SalesRule\Api\Data\RuleLabelInterfaceFactory $ruleLabelFactory,
5967
\Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor,
60-
Json $serializer = null
68+
Json $serializer = null,
69+
RuleExtensionFactory $extensionFactory = null
6170
) {
6271
$this->ruleFactory = $ruleFactory;
6372
$this->ruleDataFactory = $ruleDataFactory;
6473
$this->conditionDataFactory = $conditionDataFactory;
6574
$this->ruleLabelFactory = $ruleLabelFactory;
6675
$this->dataObjectProcessor = $dataObjectProcessor;
6776
$this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()->get(Json::class);
77+
$this->extensionFactory = $extensionFactory ?:
78+
\Magento\Framework\App\ObjectManager::getInstance()->get(RuleExtensionFactory::class);
6879
}
6980

7081
/**
82+
* Converts Sale Rule model to Sale Rule DTO
83+
*
7184
* @param Rule $ruleModel
7285
* @return RuleDataModel
7386
*/
74-
public function toDataModel(\Magento\SalesRule\Model\Rule $ruleModel)
87+
public function toDataModel(Rule $ruleModel)
7588
{
89+
$modelData = $ruleModel->getData();
90+
$modelData = $this->convertExtensionAttributesToObject($modelData);
91+
7692
/** @var \Magento\SalesRule\Model\Data\Rule $dataModel */
77-
$dataModel = $this->ruleDataFactory->create(['data' => $ruleModel->getData()]);
93+
$dataModel = $this->ruleDataFactory->create(['data' => $modelData]);
7894

7995
$this->mapFields($dataModel, $ruleModel);
8096

@@ -83,10 +99,10 @@ public function toDataModel(\Magento\SalesRule\Model\Rule $ruleModel)
8399

84100
/**
85101
* @param RuleDataModel $dataModel
86-
* @param \Magento\SalesRule\Model\Rule $ruleModel
102+
* @param Rule $ruleModel
87103
* @return $this
88104
*/
89-
protected function mapConditions(RuleDataModel $dataModel, \Magento\SalesRule\Model\Rule $ruleModel)
105+
protected function mapConditions(RuleDataModel $dataModel, Rule $ruleModel)
90106
{
91107
$conditionSerialized = $ruleModel->getConditionsSerialized();
92108
if ($conditionSerialized) {
@@ -101,10 +117,10 @@ protected function mapConditions(RuleDataModel $dataModel, \Magento\SalesRule\Mo
101117

102118
/**
103119
* @param RuleDataModel $dataModel
104-
* @param \Magento\SalesRule\Model\Rule $ruleModel
120+
* @param Rule $ruleModel
105121
* @return $this
106122
*/
107-
protected function mapActionConditions(RuleDataModel $dataModel, \Magento\SalesRule\Model\Rule $ruleModel)
123+
protected function mapActionConditions(RuleDataModel $dataModel, Rule $ruleModel)
108124
{
109125
$actionConditionSerialized = $ruleModel->getActionsSerialized();
110126
if ($actionConditionSerialized) {
@@ -162,12 +178,27 @@ protected function mapCouponType(RuleDataModel $dataModel)
162178
return $this;
163179
}
164180

181+
/**
182+
* Convert extension attributes of model to object if it is an array
183+
*
184+
* @param array $data
185+
* @return array
186+
*/
187+
private function convertExtensionAttributesToObject(array $data)
188+
{
189+
if (isset($data['extension_attributes']) && is_array($data['extension_attributes'])) {
190+
/** @var RuleExtensionInterface $attributes */
191+
$data['extension_attributes'] = $this->extensionFactory->create(['data' => $data['extension_attributes']]);
192+
}
193+
return $data;
194+
}
195+
165196
/**
166197
* @param RuleDataModel $dataModel
167-
* @param \Magento\SalesRule\Model\Rule $ruleModel
198+
* @param Rule $ruleModel
168199
* @return $this
169200
*/
170-
protected function mapFields(RuleDataModel $dataModel, \Magento\SalesRule\Model\Rule $ruleModel)
201+
protected function mapFields(RuleDataModel $dataModel, Rule $ruleModel)
171202
{
172203
$this->mapConditions($dataModel, $ruleModel);
173204
$this->mapActionConditions($dataModel, $ruleModel);

app/code/Magento/SalesRule/Test/Unit/Model/Converter/ToDataModelTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
*/
66
namespace Magento\SalesRule\Test\Unit\Model\Converter;
77

8+
use Magento\SalesRule\Api\Data\RuleExtensionFactory;
9+
use Magento\SalesRule\Api\Data\RuleExtensionInterface;
10+
811
/**
912
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1013
*/
@@ -50,6 +53,11 @@ class ToDataModelTest extends \PHPUnit_Framework_TestCase
5053
*/
5154
protected $serializer;
5255

56+
/**
57+
* @var RuleExtensionFactory|\PHPUnit_Framework_MockObject_MockObject
58+
*/
59+
private $extensionFactoryMock;
60+
5361
protected function setUp()
5462
{
5563
$this->ruleFactory = $this->getMockBuilder(\Magento\SalesRule\Model\RuleFactory::class)
@@ -87,6 +95,11 @@ protected function setUp()
8795
->setMethods(null)
8896
->getMock();
8997

98+
$this->extensionFactoryMock = $this->getMockBuilder(RuleExtensionFactory::class)
99+
->setMethods(['create'])
100+
->disableOriginalConstructor()
101+
->getMock();
102+
90103
$helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
91104
$this->model = $helper->getObject(
92105
\Magento\SalesRule\Model\Converter\ToDataModel::class,
@@ -97,6 +110,7 @@ protected function setUp()
97110
'ruleLabelFactory' => $this->ruleLabelFactory,
98111
'dataObjectProcessor' => $this->dataObjectProcessor,
99112
'serializer' => $this->serializer,
113+
'extensionFactory' => $this->extensionFactoryMock,
100114
]
101115
);
102116
}
@@ -147,12 +161,27 @@ private function getArrayData()
147161
0 => 'TestRule',
148162
1 => 'TestRuleForDefaultStore',
149163
],
164+
'extension_attributes' => [
165+
'some_extension_attributes' => 123,
166+
],
150167
];
151168
}
152169

153170
public function testToDataModel()
154171
{
155172
$array = $this->getArrayData();
173+
$arrayAttributes = $array;
174+
175+
/** @var RuleExtensionInterface|\PHPUnit_Framework_MockObject_MockObject $attributesMock */
176+
$attributesMock = $this->getMockBuilder(RuleExtensionInterface::class)
177+
->getMock();
178+
$arrayAttributes['extension_attributes'] = $attributesMock;
179+
180+
$this->extensionFactoryMock->expects($this->any())
181+
->method('create')
182+
->with(['data' => $array['extension_attributes']])
183+
->willReturn($attributesMock);
184+
156185
$dataModel = $this->getMockBuilder(\Magento\SalesRule\Model\Data\Rule::class)
157186
->disableOriginalConstructor()
158187
->setMethods(['create', 'getStoreLabels', 'setStoreLabels', 'getCouponType', 'setCouponType'])
@@ -181,6 +210,7 @@ public function testToDataModel()
181210
$this->ruleDataFactory
182211
->expects($this->any())
183212
->method('create')
213+
->with(['data' => $arrayAttributes])
184214
->willReturn($dataModel);
185215

186216
$this->salesRule

dev/tests/api-functional/testsuite/Magento/SalesRule/Api/RuleRepositoryTest.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected function getSalesRuleData()
4343
'website_ids' => [1],
4444
'customer_group_ids' => [0, 1, 3],
4545
'uses_per_customer' => 2,
46-
'is_active' => 1,
46+
'is_active' => true,
4747
'condition' => [
4848
'condition_type' => \Magento\SalesRule\Model\Rule\Condition\Combine::class,
4949
'conditions' => [
@@ -99,11 +99,13 @@ public function testCrud()
9999
$this->assertArrayHasKey('rule_id', $result);
100100
$this->assertEquals($ruleId, $result['rule_id']);
101101
unset($result['rule_id']);
102+
unset($result['extension_attributes']);
102103
$this->assertEquals($inputData, $result);
103104

104105
//test getList
105106
$result = $this->verifyGetList($ruleId);
106107
unset($result['rule_id']);
108+
unset($result['extension_attributes']);
107109
$this->assertEquals($inputData, $result);
108110

109111
//test update
@@ -112,11 +114,13 @@ public function testCrud()
112114
$inputData['discount_amount'] = 30;
113115
$result = $this->updateRule($ruleId, $inputData);
114116
unset($result['rule_id']);
117+
unset($result['extension_attributes']);
115118
$this->assertEquals($inputData, $result);
116119

117120
//test get
118121
$result = $this->getRule($ruleId);
119122
unset($result['rule_id']);
123+
unset($result['extension_attributes']);
120124
$this->assertEquals($inputData, $result);
121125

122126
//test delete

0 commit comments

Comments
 (0)