AbstractResourceTest.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Model\Test\Unit\ResourceModel;
  7. use Magento\Framework\DataObject;
  8. use Magento\Framework\DB\Adapter\AdapterInterface;
  9. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  10. use Magento\Framework\Serialize\Serializer\Json;
  11. class AbstractResourceTest extends \PHPUnit\Framework\TestCase
  12. {
  13. /**
  14. * @var AbstractResourceStub
  15. */
  16. private $abstractResource;
  17. /**
  18. * @var Json|\PHPUnit_Framework_MockObject_MockObject
  19. */
  20. private $serializerMock;
  21. /**
  22. * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject
  23. */
  24. private $loggerMock;
  25. protected function setUp()
  26. {
  27. $objectManager = new ObjectManager($this);
  28. $this->serializerMock = $this->createMock(Json::class);
  29. $this->loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
  30. $this->abstractResource = $objectManager->getObject(AbstractResourceStub::class);
  31. $objectManager->setBackwardCompatibleProperty($this->abstractResource, 'serializer', $this->serializerMock);
  32. $objectManager->setBackwardCompatibleProperty($this->abstractResource, '_logger', $this->loggerMock);
  33. }
  34. /**
  35. * @param array $arguments
  36. * @param string $expected
  37. * @param array|string|int $serializeCalledWith
  38. * @param int $numSerializeCalled
  39. * @dataProvider serializeFieldsDataProvider
  40. */
  41. public function testSerializeFields(
  42. array $arguments,
  43. $expected,
  44. $serializeCalledWith,
  45. $numSerializeCalled = 1
  46. ) {
  47. /** @var DataObject $dataObject */
  48. list($dataObject, $field, $defaultValue, $unsetEmpty) = $arguments;
  49. $this->serializerMock->expects($this->exactly($numSerializeCalled))
  50. ->method('serialize')
  51. ->with($serializeCalledWith)
  52. ->willReturn($expected);
  53. $this->abstractResource->_serializeField($dataObject, $field, $defaultValue, $unsetEmpty);
  54. $this->assertEquals($expected, $dataObject->getData($field));
  55. }
  56. /**
  57. * @return array
  58. */
  59. public function serializeFieldsDataProvider()
  60. {
  61. $array = ['a', 'b', 'c'];
  62. $string = 'i am string';
  63. $integer = 969;
  64. $empty = '';
  65. $dataObject = new DataObject(
  66. [
  67. 'array' => $array,
  68. 'string' => $string,
  69. 'integer' => $integer,
  70. 'empty' => $empty,
  71. 'empty_with_default' => ''
  72. ]
  73. );
  74. return [
  75. [
  76. [$dataObject, 'array', null, false],
  77. '["a","b","c"]',
  78. $array
  79. ],
  80. [
  81. [$dataObject, 'string', null, false],
  82. '"i am string"',
  83. $string
  84. ],
  85. [
  86. [$dataObject, 'integer', null, false],
  87. '969',
  88. $integer
  89. ],
  90. [
  91. [$dataObject, 'empty', null, true],
  92. null,
  93. $empty,
  94. 0
  95. ],
  96. [
  97. [$dataObject, 'empty_with_default', 'default', false],
  98. '"default"',
  99. 'default'
  100. ]
  101. ];
  102. }
  103. /**
  104. * @param array $arguments
  105. * @param array|string|int|boolean $expected
  106. * @dataProvider unserializeFieldsDataProvider
  107. */
  108. public function testUnserializeFields(array $arguments, $expected)
  109. {
  110. /** @var DataObject $dataObject */
  111. list($dataObject, $field, $defaultValue) = $arguments;
  112. $this->serializerMock->expects($this->once())
  113. ->method('unserialize')
  114. ->with($dataObject->getData($field))
  115. ->willReturn($expected);
  116. $this->abstractResource->_unserializeField($dataObject, $field, $defaultValue);
  117. $this->assertEquals($expected, $dataObject->getData($field));
  118. }
  119. /**
  120. * @return array
  121. */
  122. public function unserializeFieldsDataProvider()
  123. {
  124. $dataObject = new DataObject(
  125. [
  126. 'array' => '["a","b","c"]',
  127. 'string' => '"i am string"',
  128. 'integer' => '969',
  129. 'empty_with_default' => '""',
  130. 'not_serialized_string' => 'i am string',
  131. 'serialized_boolean_false' => 'false'
  132. ]
  133. );
  134. return [
  135. [
  136. [$dataObject, 'array', null],
  137. ['a', 'b', 'c']
  138. ],
  139. [
  140. [$dataObject, 'string', null],
  141. 'i am string'
  142. ],
  143. [
  144. [$dataObject, 'integer', null],
  145. 969
  146. ],
  147. [
  148. [$dataObject, 'empty_with_default', 'default', false],
  149. 'default'
  150. ],
  151. [
  152. [$dataObject, 'not_serialized_string', null],
  153. 'i am string'
  154. ],
  155. [
  156. [$dataObject, 'serialized_boolean_false', null],
  157. false,
  158. ]
  159. ];
  160. }
  161. public function testCommitZeroLevel()
  162. {
  163. /** @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject $connection */
  164. $connection = $this->createMock(AdapterInterface::class);
  165. /** @var DataObject|\PHPUnit_Framework_MockObject_MockObject $closureExpectation */
  166. $closureExpectation = $this->getMockBuilder(DataObject::class)
  167. ->disableOriginalConstructor()
  168. ->getMock();
  169. $this->abstractResource->setConnection($connection);
  170. $this->abstractResource->addCommitCallback(
  171. function () use ($closureExpectation) {
  172. $closureExpectation->setData(1);
  173. }
  174. );
  175. $this->abstractResource->addCommitCallback(
  176. function () use ($closureExpectation) {
  177. $closureExpectation->getData();
  178. }
  179. );
  180. $connection->expects($this->once())
  181. ->method('commit');
  182. $connection->expects($this->once())
  183. ->method('getTransactionLevel')
  184. ->willReturn(0);
  185. $closureExpectation->expects($this->once())
  186. ->method('setData')
  187. ->with(1);
  188. $closureExpectation->expects($this->once())
  189. ->method('getData');
  190. $this->abstractResource->commit();
  191. }
  192. public function testCommitZeroLevelCallbackException()
  193. {
  194. /** @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject $connection */
  195. $connection = $this->createMock(AdapterInterface::class);
  196. $this->abstractResource->setConnection($connection);
  197. $this->abstractResource->addCommitCallback(
  198. function () {
  199. throw new \Exception();
  200. }
  201. );
  202. $connection->expects($this->once())
  203. ->method('commit');
  204. $connection->expects($this->once())
  205. ->method('getTransactionLevel')
  206. ->willReturn(0);
  207. $this->loggerMock->expects($this->once())
  208. ->method('critical');
  209. $this->abstractResource->commit();
  210. }
  211. public function testCommitNotCompletedTransaction()
  212. {
  213. /** @var AdapterInterface|\PHPUnit_Framework_MockObject_MockObject $connection */
  214. $connection = $this->createMock(AdapterInterface::class);
  215. /** @var DataObject|\PHPUnit_Framework_MockObject_MockObject $closureExpectation */
  216. $closureExpectation = $this->getMockBuilder(DataObject::class)
  217. ->disableOriginalConstructor()
  218. ->getMock();
  219. $this->abstractResource->setConnection($connection);
  220. $this->abstractResource->addCommitCallback(
  221. function () use ($closureExpectation) {
  222. $closureExpectation->setData(1);
  223. }
  224. );
  225. $connection->expects($this->once())
  226. ->method('commit');
  227. $connection->expects($this->once())
  228. ->method('getTransactionLevel')
  229. ->willReturn(1);
  230. $closureExpectation->expects($this->never())
  231. ->method('setData')
  232. ->with(1);
  233. $this->abstractResource->commit();
  234. }
  235. }