DataObjectTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /**
  7. * \Magento\Framework\DataObject test case.
  8. */
  9. namespace Magento\Framework\Test\Unit;
  10. class DataObjectTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var \Magento\Framework\DataObject
  14. */
  15. private $dataObject;
  16. /**
  17. * Prepares the environment before running a test.
  18. */
  19. protected function setUp()
  20. {
  21. parent::setUp();
  22. $this->dataObject = new \Magento\Framework\DataObject();
  23. }
  24. /**
  25. * Cleans up the environment after running a test.
  26. */
  27. protected function tearDown()
  28. {
  29. $this->dataObject = null;
  30. parent::tearDown();
  31. }
  32. /**
  33. * Tests \Magento\Framework\DataObject->__construct()
  34. */
  35. public function testConstruct()
  36. {
  37. $object = new \Magento\Framework\DataObject();
  38. $this->assertEquals([], $object->getData());
  39. $data = ['test' => 'test'];
  40. $object = new \Magento\Framework\DataObject($data);
  41. $this->assertEquals($data, $object->getData());
  42. }
  43. /**
  44. * Tests \Magento\Framework\DataObject->addData()
  45. */
  46. public function testAddData()
  47. {
  48. $this->dataObject->addData(['test' => 'value']);
  49. $this->assertEquals('value', $this->dataObject->getData('test'));
  50. $this->dataObject->addData(['test' => 'value1']);
  51. $this->assertEquals('value1', $this->dataObject->getData('test'));
  52. $this->dataObject->addData(['test2' => 'value2']);
  53. $this->assertEquals(['test' => 'value1', 'test2' => 'value2'], $this->dataObject->getData());
  54. }
  55. /**
  56. * Tests \Magento\Framework\DataObject->setData()
  57. */
  58. public function testSetData()
  59. {
  60. $data = ['key1' => 'value1', 'key2' => 'value2', 'key3' => 3];
  61. $this->dataObject->setData($data);
  62. $this->assertEquals($data, $this->dataObject->getData());
  63. $data['key1'] = 1;
  64. $this->dataObject->setData('key1', 1);
  65. $this->assertEquals($data, $this->dataObject->getData());
  66. $this->dataObject->setData('key1');
  67. $data['key1'] = null;
  68. $this->assertEquals($data, $this->dataObject->getData());
  69. }
  70. /**
  71. * Tests \Magento\Framework\DataObject->unsetData()
  72. */
  73. public function testUnsetData()
  74. {
  75. $data = ['key1' => 'value1', 'key2' => 'value2', 'key3' => 3, 'key4' => 4];
  76. $this->dataObject->setData($data);
  77. $this->dataObject->unsetData('key1');
  78. unset($data['key1']);
  79. $this->assertEquals($data, $this->dataObject->getData());
  80. $this->dataObject->unsetData(['key2', 'key3']);
  81. unset($data['key2']);
  82. unset($data['key3']);
  83. $this->assertEquals($data, $this->dataObject->getData());
  84. $this->dataObject->unsetData();
  85. $this->assertEquals([], $this->dataObject->getData());
  86. }
  87. /**
  88. * Tests \Magento\Framework\DataObject->getData()
  89. */
  90. public function testGetData()
  91. {
  92. $data = [
  93. 'key1' => 'value1',
  94. 'key2' => [
  95. 'subkey2.1' => 'value2.1',
  96. 'subkey2.2' => 'multiline' . PHP_EOL . 'string',
  97. 'subkey2.3' => new \Magento\Framework\DataObject(['test_key' => 'test_value']),
  98. ],
  99. 'key3' => 5,
  100. ];
  101. foreach ($data as $key => $value) {
  102. $this->dataObject->setData($key, $value);
  103. }
  104. $this->assertEquals($data, $this->dataObject->getData());
  105. $this->assertEquals('value1', $this->dataObject->getData('key1'));
  106. $this->assertEquals('value2.1', $this->dataObject->getData('key2/subkey2.1'));
  107. $this->assertEquals('value2.1', $this->dataObject->getData('key2', 'subkey2.1'));
  108. $this->assertEquals('string', $this->dataObject->getData('key2/subkey2.2', 1));
  109. $this->assertEquals('test_value', $this->dataObject->getData('key2/subkey2.3', 'test_key'));
  110. $this->assertNull($this->dataObject->getData('key3', 'test_key'));
  111. }
  112. public function testGetDataByPath()
  113. {
  114. $data = [
  115. 'key1' => 'value1',
  116. 'key2' => [
  117. 'subkey2.1' => 'value2.1',
  118. 'subkey2.2' => 'multiline
  119. string',
  120. 'subkey2.3' => new \Magento\Framework\DataObject(['test_key' => 'test_value']),
  121. ],
  122. ];
  123. foreach ($data as $key => $value) {
  124. $this->dataObject->setData($key, $value);
  125. }
  126. $this->assertEquals('value1', $this->dataObject->getDataByPath('key1'));
  127. $this->assertEquals('value2.1', $this->dataObject->getDataByPath('key2/subkey2.1'));
  128. $this->assertEquals('test_value', $this->dataObject->getDataByPath('key2/subkey2.3/test_key'));
  129. $this->assertNull($this->dataObject->getDataByPath('empty'));
  130. $this->assertNull($this->dataObject->getDataByPath('empty/path'));
  131. }
  132. public function testGetDataByKey()
  133. {
  134. $this->dataObject->setData('key', 'value');
  135. $this->assertEquals('value', $this->dataObject->getDataByKey('key'));
  136. $this->assertNull($this->dataObject->getDataByKey('empty'));
  137. }
  138. /**
  139. * Tests \Magento\Framework\DataObject->setDataUsingMethod()
  140. */
  141. public function testSetGetDataUsingMethod()
  142. {
  143. $mock = $this->createPartialMock(\Magento\Framework\DataObject::class, ['setTestData', 'getTestData']);
  144. $mock->expects($this->once())->method('setTestData')->with($this->equalTo('data'));
  145. $mock->expects($this->once())->method('getTestData');
  146. $mock->setDataUsingMethod('test_data', 'data');
  147. $mock->getDataUsingMethod('test_data');
  148. }
  149. /**
  150. * Test documenting current behaviour of getDataUsingMethod
  151. * _underscore assumes an underscore before any digit
  152. */
  153. public function testGetDataUsingMethodWithoutUnderscore()
  154. {
  155. $this->dataObject->setData('key_1', 'value1');
  156. $this->assertTrue($this->dataObject->hasData('key_1'));
  157. $this->assertEquals('value1', $this->dataObject->getDataUsingMethod('key_1'));
  158. $this->dataObject->setData('key2', 'value2');
  159. $this->assertEquals('value2', $this->dataObject->getData('key2'));
  160. $this->assertEquals(null, $this->dataObject->getKey2());
  161. $this->assertEquals(null, $this->dataObject->getDataUsingMethod('key2'));
  162. }
  163. /**
  164. * Tests \Magento\Framework\DataObject->hasData()
  165. */
  166. public function testHasData()
  167. {
  168. $this->assertFalse($this->dataObject->hasData());
  169. $this->assertFalse($this->dataObject->hasData('key'));
  170. $this->dataObject->setData('key', 'value');
  171. $this->assertTrue($this->dataObject->hasData('key'));
  172. }
  173. /**
  174. * Tests \Magento\Framework\DataObject->toArray()
  175. */
  176. public function testToArray()
  177. {
  178. $this->assertEquals([], $this->dataObject->toArray());
  179. $this->assertEquals(['key' => null], $this->dataObject->toArray(['key']));
  180. $this->dataObject->setData('key1', 'value1');
  181. $this->dataObject->setData('key2', 'value2');
  182. $this->assertEquals(['key1' => 'value1'], $this->dataObject->toArray(['key1']));
  183. $this->assertEquals(['key2' => 'value2'], $this->dataObject->convertToArray(['key2']));
  184. }
  185. /**
  186. * Tests \Magento\Framework\DataObject->toXml()
  187. */
  188. public function testToXml()
  189. {
  190. $this->dataObject->setData('key1', 'value1');
  191. $this->dataObject->setData('key2', 'value2');
  192. $xml = '<item>
  193. <key1><![CDATA[value1]]></key1>
  194. <key2><![CDATA[value2]]></key2>
  195. </item>
  196. ';
  197. $this->assertEquals($xml, $this->dataObject->toXml());
  198. $xml = '<item>
  199. <key2><![CDATA[value2]]></key2>
  200. </item>
  201. ';
  202. $this->assertEquals($xml, $this->dataObject->toXml(['key2']));
  203. $xml = '<my_item>
  204. <key1><![CDATA[value1]]></key1>
  205. <key2><![CDATA[value2]]></key2>
  206. </my_item>
  207. ';
  208. $this->assertEquals($xml, $this->dataObject->toXml([], 'my_item'));
  209. $xml = '<key1><![CDATA[value1]]></key1>
  210. <key2><![CDATA[value2]]></key2>
  211. ';
  212. $this->assertEquals($xml, $this->dataObject->toXml([], false));
  213. $xml = '<?xml version="1.0" encoding="UTF-8"?>
  214. <item>
  215. <key1><![CDATA[value1]]></key1>
  216. <key2><![CDATA[value2]]></key2>
  217. </item>
  218. ';
  219. $this->assertEquals($xml, $this->dataObject->toXml([], 'item', true));
  220. $xml = '<?xml version="1.0" encoding="UTF-8"?>
  221. <item>
  222. <key1>value1</key1>
  223. <key2>value2</key2>
  224. </item>
  225. ';
  226. $this->assertEquals($xml, $this->dataObject->convertToXml([], 'item', true, false));
  227. }
  228. /**
  229. * Tests \Magento\Framework\DataObject->toJson()
  230. */
  231. public function testToJson()
  232. {
  233. $this->dataObject->setData('key1', 'value1');
  234. $this->dataObject->setData('key2', 'value2');
  235. $this->assertEquals('{"key1":"value1","key2":"value2"}', $this->dataObject->toJson());
  236. $this->assertEquals('{"key1":"value1"}', $this->dataObject->toJson(['key1']));
  237. $this->assertEquals('{"key1":"value1","key":null}', $this->dataObject->convertToJson(['key1', 'key']));
  238. }
  239. /**
  240. * Tests \Magento\Framework\DataObject->toString()
  241. */
  242. public function testToString()
  243. {
  244. $this->dataObject->setData('key1', 'value1');
  245. $this->dataObject->setData('key2', 'value2');
  246. $this->assertEquals('value1, value2', $this->dataObject->toString());
  247. $this->assertEquals('test value1 with value2', $this->dataObject->toString('test {{key1}} with {{key2}}'));
  248. }
  249. /**
  250. * Tests \Magento\Framework\DataObject->__call()
  251. *
  252. * @expectedException \Magento\Framework\Exception\LocalizedException
  253. */
  254. public function testCall()
  255. {
  256. $this->dataObject->setData('key', 'value');
  257. $this->dataObject->setTest('test');
  258. $this->assertEquals('test', $this->dataObject->getData('test'));
  259. $this->assertEquals($this->dataObject->getData('test'), $this->dataObject->getTest());
  260. $this->assertTrue($this->dataObject->hasTest());
  261. $this->dataObject->unsTest();
  262. $this->assertNull($this->dataObject->getData('test'));
  263. $this->dataObject->testTest();
  264. }
  265. /**
  266. * Tests \Magento\Framework\DataObject->__get()
  267. */
  268. public function testGetSet()
  269. {
  270. /** @noinspection PhpUndefinedFieldInspection */
  271. $this->dataObject->test = 'test';
  272. /** @noinspection PhpUndefinedFieldInspection */
  273. $this->assertEquals('test', $this->dataObject->test);
  274. /** @noinspection PhpUndefinedFieldInspection */
  275. $this->dataObject->testTest = 'test';
  276. /** @noinspection PhpUndefinedFieldInspection */
  277. $this->assertEquals('test', $this->dataObject->testTest);
  278. }
  279. /**
  280. * Tests \Magento\Framework\DataObject->isEmpty()
  281. */
  282. public function testIsEmpty()
  283. {
  284. $this->assertTrue($this->dataObject->isEmpty());
  285. $this->dataObject->setData('test', 'test');
  286. $this->assertFalse($this->dataObject->isEmpty());
  287. }
  288. /**
  289. * Tests \Magento\Framework\DataObject->serialize()
  290. */
  291. public function testSerialize()
  292. {
  293. $this->dataObject->setData('key1', 'value1');
  294. $this->dataObject->setData('key2', 'value2');
  295. $this->assertEquals('key1="value1" key2="value2"', $this->dataObject->serialize());
  296. $this->assertEquals(
  297. 'key1:\'value1\'_key2:\'value2\'',
  298. $this->dataObject->serialize(['key', 'key1', 'key2'], ':', '_', '\'')
  299. );
  300. }
  301. /**
  302. * Tests \Magento\Framework\DataObject->debug()
  303. */
  304. public function testDebug()
  305. {
  306. $data = ['key1' => 'value1', 'key2' => ['test'], 'key3' => $this->dataObject];
  307. foreach ($data as $key => $value) {
  308. $this->dataObject->setData($key, $value);
  309. }
  310. $debug = $data;
  311. unset($debug['key3']);
  312. $debug['key3 (Magento\Framework\DataObject)'] = '*** RECURSION ***';
  313. $this->assertEquals($debug, $this->dataObject->debug());
  314. }
  315. /**
  316. * Tests \Magento\Framework\DataObject->offsetSet()
  317. */
  318. public function testOffset()
  319. {
  320. $this->dataObject->offsetSet('key1', 'value1');
  321. $this->assertTrue($this->dataObject->offsetExists('key1'));
  322. $this->assertFalse($this->dataObject->offsetExists('key2'));
  323. $this->assertEquals('value1', $this->dataObject->offsetGet('key1'));
  324. $this->assertNull($this->dataObject->offsetGet('key2'));
  325. $this->dataObject->offsetUnset('key1');
  326. $this->assertFalse($this->dataObject->offsetExists('key1'));
  327. }
  328. /**
  329. * Tests _underscore method directly
  330. *
  331. * @dataProvider underscoreDataProvider
  332. */
  333. public function testUnderscore($input, $expectedOutput)
  334. {
  335. $refObject = new \ReflectionObject($this->dataObject);
  336. $refMethod = $refObject->getMethod('_underscore');
  337. $refMethod->setAccessible(true);
  338. $output = $refMethod->invoke($this->dataObject, $input);
  339. $this->assertEquals($expectedOutput, $output);
  340. }
  341. /**
  342. * @return array
  343. */
  344. public function underscoreDataProvider()
  345. {
  346. return [
  347. 'Test 1' => ['Stone1Color', 'stone_1_color'],
  348. 'Test 2' => ['StoneColor', 'stone_color'],
  349. 'Test 3' => ['StoneToXml', 'stone_to_xml'],
  350. 'Test 4' => ['1StoneColor', '1_stone_color'],
  351. 'Test 5' => ['getCcLast4', 'get_cc_last_4'],
  352. 'Test 6' => ['99Bottles', '99_bottles'],
  353. 'Test 7' => ['XApiLogin', 'x_api_login']
  354. ];
  355. }
  356. }