Skip to content

Commit 5a81884

Browse files
committed
MAGETWO-63159: Fix Sales Rule Data Model convertor to support extension attributes
1 parent 25bf998 commit 5a81884

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

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

Lines changed: 33 additions & 2 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
*/
7487
public function toDataModel(\Magento\SalesRule\Model\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

@@ -162,6 +178,21 @@ 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) : array
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
167198
* @param \Magento\SalesRule\Model\Rule $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
@@ -4,6 +4,8 @@
44
* See COPYING.txt for license details.
55
*/
66
namespace Magento\SalesRule\Test\Unit\Model\Converter;
7+
use Magento\SalesRule\Api\Data\RuleExtensionFactory;
8+
use Magento\SalesRule\Api\Data\RuleExtensionInterface;
79

810
/**
911
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -50,6 +52,11 @@ class ToDataModelTest extends \PHPUnit_Framework_TestCase
5052
*/
5153
protected $serializer;
5254

55+
/**
56+
* @var RuleExtensionFactory|\PHPUnit_Framework_MockObject_MockObject
57+
*/
58+
private $extensionFactoryMock;
59+
5360
protected function setUp()
5461
{
5562
$this->ruleFactory = $this->getMockBuilder(\Magento\SalesRule\Model\RuleFactory::class)
@@ -87,6 +94,11 @@ protected function setUp()
8794
->setMethods(null)
8895
->getMock();
8996

97+
$this->extensionFactoryMock = $this->getMockBuilder(RuleExtensionFactory::class)
98+
->setMethods(['create'])
99+
->disableOriginalConstructor()
100+
->getMock();
101+
90102
$helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
91103
$this->model = $helper->getObject(
92104
\Magento\SalesRule\Model\Converter\ToDataModel::class,
@@ -97,6 +109,7 @@ protected function setUp()
97109
'ruleLabelFactory' => $this->ruleLabelFactory,
98110
'dataObjectProcessor' => $this->dataObjectProcessor,
99111
'serializer' => $this->serializer,
112+
'extensionFactory' => $this->extensionFactoryMock,
100113
]
101114
);
102115
}
@@ -147,12 +160,28 @@ private function getArrayData()
147160
0 => 'TestRule',
148161
1 => 'TestRuleForDefaultStore',
149162
],
163+
'extension_attributes' => [
164+
'some_extension_attributes' => 123,
165+
],
150166
];
151167
}
152168

153169
public function testToDataModel()
154170
{
155171
$array = $this->getArrayData();
172+
$arrayAttributes = $array;
173+
174+
/** @var RuleExtensionInterface|\PHPUnit_Framework_MockObject_MockObject $attributesMock */
175+
$attributesMock = $this->getMockBuilder(RuleExtensionInterface::class)
176+
->getMock();
177+
$arrayAttributes['extension_attributes'] = $attributesMock;
178+
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

0 commit comments

Comments
 (0)