ColumnTest.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\Test\Unit\Block\Widget\Grid;
  7. use Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer;
  8. use Magento\Framework\DataObject;
  9. class ColumnTest extends \PHPUnit\Framework\TestCase
  10. {
  11. /**
  12. * @var \Magento\Backend\Block\Widget\Grid\Column
  13. */
  14. protected $_block;
  15. /**
  16. * @var \PHPUnit_Framework_MockObject_MockObject
  17. */
  18. protected $_layoutMock;
  19. /**
  20. * @var \PHPUnit_Framework_MockObject_MockObject
  21. */
  22. protected $_blockMock;
  23. protected function setUp()
  24. {
  25. $this->_layoutMock = $this->createMock(\Magento\Framework\View\Layout::class);
  26. $this->_blockMock = $this->createPartialMock(
  27. \Magento\Framework\View\Element\Template::class,
  28. ['setColumn', 'getHtml']
  29. );
  30. $arguments = [
  31. 'layout' => $this->_layoutMock,
  32. 'urlBuilder' => $this->createMock(\Magento\Backend\Model\Url::class),
  33. ];
  34. $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  35. $this->_block = $objectManagerHelper->getObject(\Magento\Backend\Block\Widget\Grid\Column::class, $arguments);
  36. $this->_block->setId('id');
  37. }
  38. public function testGetFilterWhenFilterSetFalse()
  39. {
  40. $this->_block->setData('filter', false);
  41. $this->assertFalse($this->_block->getFilter());
  42. }
  43. public function testGetFilterWhenFilterSetZero()
  44. {
  45. $this->_block->setData('filter', '0');
  46. $this->assertFalse($this->_block->getFilter());
  47. }
  48. /**
  49. * Check that default filter will be used if filter was not set
  50. */
  51. public function testGetFilterWhenFilterIsNotSet()
  52. {
  53. $this->_layoutMock->expects(
  54. $this->once()
  55. )->method(
  56. 'createBlock'
  57. )->with(
  58. \Magento\Backend\Block\Widget\Grid\Column\Filter\Text::class
  59. )->will(
  60. $this->returnValue($this->_blockMock)
  61. );
  62. $this->_block->getFilter();
  63. }
  64. public function testGetSortableNotSet()
  65. {
  66. $this->assertTrue($this->_block->getSortable());
  67. }
  68. /**
  69. * @dataProvider getSortableDataProvider
  70. */
  71. public function testGetSortable($value)
  72. {
  73. $this->_block->setData('sortable', $value);
  74. $this->assertFalse($this->_block->getSortable());
  75. }
  76. /**
  77. * @return array
  78. */
  79. public function getSortableDataProvider()
  80. {
  81. return ['zero' => ['0'], 'false' => [false], 'null' => [null]];
  82. }
  83. /**
  84. * @covers \Magento\Backend\Block\Widget\Grid\Column::getFilter
  85. * @covers \Magento\Backend\Block\Widget\Grid\Column::setFilterType
  86. */
  87. public function testGetFilterWithSetEmptyCustomFilterType()
  88. {
  89. $this->_block->setData('type', 'custom_type');
  90. $this->_block->setFilterType('custom_type', false);
  91. $this->assertFalse($this->_block->getFilter());
  92. }
  93. /**
  94. * @covers \Magento\Backend\Block\Widget\Grid\Column::getFilter
  95. */
  96. public function testGetFilterWithInvalidFilterTypeWhenUseDefaultFilter()
  97. {
  98. $this->_block->setData('type', 'invalid_filter_type');
  99. $this->_layoutMock->expects(
  100. $this->once()
  101. )->method(
  102. 'createBlock'
  103. )->with(
  104. \Magento\Backend\Block\Widget\Grid\Column\Filter\Text::class
  105. )->will(
  106. $this->returnValue($this->_blockMock)
  107. );
  108. $this->_block->getFilter();
  109. }
  110. /**
  111. * @covers \Magento\Backend\Block\Widget\Grid\Column::getFilter
  112. */
  113. public function testGetFilterWhenUseCustomFilter()
  114. {
  115. $this->_block->setData('type', 'custom_type');
  116. $this->_block->setFilterType('custom_type', 'StdClass');
  117. $this->_layoutMock->expects(
  118. $this->once()
  119. )->method(
  120. 'createBlock'
  121. )->with(
  122. 'StdClass'
  123. )->will(
  124. $this->returnValue($this->_blockMock)
  125. );
  126. $this->_block->getFilter();
  127. }
  128. /**
  129. * @covers \Magento\Backend\Block\Widget\Grid\Column::getFilter
  130. * @covers \Magento\Backend\Block\Widget\Grid\Column::setFilter
  131. */
  132. public function testGetFilterWhenFilterWasSetPreviously()
  133. {
  134. $this->_layoutMock->expects(
  135. $this->once()
  136. )->method(
  137. 'createBlock'
  138. )->with(
  139. 'StdClass'
  140. )->will(
  141. $this->returnValue($this->_blockMock)
  142. );
  143. $this->_block->setFilter('StdClass');
  144. $this->assertNotEmpty($this->_block->getFilter());
  145. }
  146. public function testGetFilterHtmlWhenFilterExist()
  147. {
  148. $this->_blockMock->expects($this->once())->method('getHtml')->will($this->returnValue('test'));
  149. $this->_layoutMock->expects(
  150. $this->once()
  151. )->method(
  152. 'createBlock'
  153. )->with(
  154. 'StdClass'
  155. )->will(
  156. $this->returnValue($this->_blockMock)
  157. );
  158. $this->_block->setFilter('StdClass');
  159. $this->assertEquals('test', $this->_block->getFilterHtml());
  160. }
  161. public function testGetFilterHtmlWhenFilterNotExist()
  162. {
  163. $this->_block->setData('type', 'custom_type');
  164. $this->_block->setFilterType('custom_type', false);
  165. $this->assertEquals('&nbsp;', $this->_block->getFilterHtml());
  166. }
  167. public function testGetRendererWhenRendererIsSet()
  168. {
  169. $this->_block->setData('renderer', 'StdClass');
  170. $this->_blockMock->expects($this->once())->method('setColumn')->will($this->returnSelf());
  171. $this->_layoutMock->expects(
  172. $this->once()
  173. )->method(
  174. 'createBlock'
  175. )->with(
  176. 'StdClass'
  177. )->will(
  178. $this->returnValue($this->_blockMock)
  179. );
  180. $this->assertNotEmpty($this->_block->getRenderer());
  181. }
  182. /**
  183. * @covers \Magento\Backend\Block\Widget\Grid\Column::getRenderer
  184. */
  185. public function testGetRendererWheRendererSetFalse()
  186. {
  187. $this->_block->setData('renderer', false);
  188. $this->_blockMock->expects($this->once())->method('setColumn')->will($this->returnSelf());
  189. $this->_layoutMock->expects(
  190. $this->once()
  191. )->method(
  192. 'createBlock'
  193. )->with(
  194. \Magento\Backend\Block\Widget\Grid\Column\Renderer\Text::class
  195. )->will(
  196. $this->returnValue($this->_blockMock)
  197. );
  198. $this->assertEquals($this->_blockMock, $this->_block->getRenderer());
  199. }
  200. /**
  201. * @covers \Magento\Backend\Block\Widget\Grid\Column::getRenderer
  202. * @covers \Magento\Backend\Block\Widget\Grid\Column::setRendererType
  203. */
  204. public function testGetRendererWhenUseCustomRenderer()
  205. {
  206. $this->_block->setData('type', 'custom_type');
  207. $this->_block->setRendererType('custom_type', 'StdClass');
  208. $this->_blockMock->expects($this->once())->method('setColumn')->will($this->returnSelf());
  209. $this->_layoutMock->expects(
  210. $this->once()
  211. )->method(
  212. 'createBlock'
  213. )->with(
  214. 'StdClass'
  215. )->will(
  216. $this->returnValue($this->_blockMock)
  217. );
  218. $this->assertEquals($this->_blockMock, $this->_block->getRenderer());
  219. }
  220. /**
  221. * @covers \Magento\Backend\Block\Widget\Grid\Column::getRenderer
  222. * @covers \Magento\Backend\Block\Widget\Grid\Column::setRenderer
  223. */
  224. public function testGetRendererWhenRendererWasSetPreviously()
  225. {
  226. $this->_block->setRenderer($this->_blockMock);
  227. $this->assertEquals($this->_blockMock, $this->_block->getRenderer());
  228. }
  229. public function testGetExportHeaderWhenExportHeaderIsSet()
  230. {
  231. $this->_block->setData('header_export', 'test');
  232. $this->assertEquals('test', $this->_block->getExportHeader());
  233. }
  234. public function testGetExportHeaderWhenExportHeaderIsNotSetAndHeaderIsSet()
  235. {
  236. $this->_block->setData('header', 'test');
  237. $this->assertEquals('test', $this->_block->getExportHeader());
  238. }
  239. public function testGetHeaderHtmlPropertyWhenHeaderCssClassEmpty()
  240. {
  241. $this->assertEquals(' class=" col-id"', $this->_block->getHeaderHtmlProperty());
  242. }
  243. public function testGetHeaderHtmlPropertyWhenHeaderCssClassIsSet()
  244. {
  245. $this->_block->setData('header_css_class', 'test');
  246. $this->assertEquals(' class="test col-id"', $this->_block->getHeaderHtmlProperty());
  247. }
  248. public function testAddHeaderCssClassWhenHeaderCssClassEmpty()
  249. {
  250. $this->_block->addHeaderCssClass('test');
  251. $this->assertEquals(' class="test col-id"', $this->_block->getHeaderHtmlProperty());
  252. }
  253. public function testAddHeaderCssClassWhenHeaderCssClassIsSet()
  254. {
  255. $this->_block->setData('header_css_class', 'test1');
  256. $this->_block->addHeaderCssClass('test2');
  257. $this->assertEquals(' class="test1 test2 col-id"', $this->_block->getHeaderHtmlProperty());
  258. }
  259. public function testGetHeaderCssClassWhenNotSortable()
  260. {
  261. $this->_block->setData('header_css_class', 'test');
  262. $this->_block->setSortable(false);
  263. $this->assertEquals('test no-link col-id', $this->_block->getHeaderCssClass());
  264. }
  265. public function testGetHeaderCssClassWhenIsSortable()
  266. {
  267. $this->_block->setData('header_css_class', 'test');
  268. $this->_block->setSortable(true);
  269. $this->assertEquals('test col-id', $this->_block->getHeaderCssClass());
  270. }
  271. public function testGetCssClassWithAlignAndEditableAndWithoutColumnCssClass()
  272. {
  273. $this->_block->setAlign('left');
  274. $this->_block->setEditable(true);
  275. $this->assertEquals('a-left editable col-id', $this->_block->getCssClass());
  276. }
  277. public function testGetCssClassWithAlignAndEditableAndWithColumnCssClass()
  278. {
  279. $this->_block->setAlign('left');
  280. $this->_block->setEditable(true);
  281. $this->_block->setData('column_css_class', 'test');
  282. $this->assertEquals('a-left test editable col-id', $this->_block->getCssClass());
  283. }
  284. public function testGetCssClassWithoutAlignEditableAndColumnCssClass()
  285. {
  286. $this->assertEquals(' col-id', $this->_block->getCssClass());
  287. }
  288. public function testSetGetGrid()
  289. {
  290. /**
  291. * Check that getFilter will be executed
  292. */
  293. $this->_layoutMock->expects(
  294. $this->once()
  295. )->method(
  296. 'createBlock'
  297. )->with(
  298. 'StdClass'
  299. )->will(
  300. $this->returnValue($this->_blockMock)
  301. );
  302. $this->_block->setFilter('StdClass');
  303. $grid = new \stdClass();
  304. $this->_block->setGrid($grid);
  305. $this->assertEquals($grid, $this->_block->getGrid());
  306. }
  307. /**
  308. * @param $groupedData
  309. * @param $expected
  310. * @dataProvider columnGroupedDataProvider
  311. */
  312. public function testColumnIsGrouped($groupedData, $expected)
  313. {
  314. $arguments = [
  315. 'layout' => $this->_layoutMock,
  316. 'urlBuilder' => $this->createMock(\Magento\Backend\Model\Url::class),
  317. 'data' => $groupedData,
  318. ];
  319. $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  320. $block = $objectManagerHelper->getObject(\Magento\Backend\Block\Widget\Grid\Column::class, $arguments);
  321. $this->assertEquals($expected, $block->isGrouped());
  322. }
  323. /**
  324. * @return array
  325. */
  326. public function columnGroupedDataProvider()
  327. {
  328. return [[[], false], [['grouped' => 0], false], [['grouped' => 1], true]];
  329. }
  330. /**
  331. * Testing row field export with valid frame callback
  332. */
  333. public function testGetRowFieldAndExportWithFrameCallback()
  334. {
  335. $row = new DataObject(['id' => '2', 'title' => 'some item']);
  336. /** @var $rendererMock */
  337. $rendererMock = $this->getMockBuilder(AbstractRenderer::class)
  338. ->disableOriginalConstructor()
  339. ->setMethods(['renderExport', 'render'])
  340. ->getMock();
  341. $rendererMock->expects($this->any())->method('renderExport')->willReturnCallback(
  342. function (DataObject $row) {
  343. return $row->getData('title');
  344. }
  345. );
  346. $rendererMock->expects($this->any())->method('render')->willReturnCallback(
  347. function (DataObject $row) {
  348. return $row->getData('title');
  349. }
  350. );
  351. $frameCallbackHostObject = $this->getMockBuilder(\Magento\Backend\Block\Widget::class)
  352. ->disableOriginalConstructor()
  353. ->setMethods(['decorate'])
  354. ->getMock();
  355. $frameCallbackHostObject->expects($this->any())
  356. ->method('decorate')
  357. ->willReturnCallback(
  358. function ($renderValue) {
  359. return '__callback_decorated_' . $renderValue;
  360. }
  361. );
  362. $this->_block->setRenderer($rendererMock);
  363. $this->_block->setFrameCallback([$frameCallbackHostObject, 'decorate']);
  364. $renderResult = $this->_block->getRowField($row);
  365. $exportResult = $this->_block->getRowFieldExport($row);
  366. $this->assertEquals('__callback_decorated_some item', $exportResult);
  367. $this->assertEquals('__callback_decorated_some item', $renderResult);
  368. }
  369. /**
  370. * @expectedException \InvalidArgumentException
  371. * @expectedExceptionMessage Frame callback host must be instance of Magento\Backend\Block\Widget
  372. */
  373. public function testGetRowFieldExportWithInvalidCallback()
  374. {
  375. $row = new DataObject(['id' => '2', 'title' => 'some item']);
  376. /** @var $rendererMock */
  377. $rendererMock = $this->getMockBuilder(AbstractRenderer::class)
  378. ->disableOriginalConstructor()
  379. ->setMethods(['renderExport', 'render'])
  380. ->getMock();
  381. $rendererMock->expects($this->any())->method('renderExport')->willReturnCallback(
  382. function (DataObject $row) {
  383. return $row->getData('title');
  384. }
  385. );
  386. $this->_block->setRenderer($rendererMock);
  387. $this->_block->setFrameCallback([$this, 'testGetRowFieldExportWithFrameCallback']);
  388. $this->_block->getRowFieldExport($row);
  389. }
  390. /**
  391. * @expectedException \InvalidArgumentException
  392. * @expectedExceptionMessage Frame callback host must be instance of Magento\Backend\Block\Widget
  393. */
  394. public function testGetRowFieldWithInvalidCallback()
  395. {
  396. $row = new DataObject(['id' => '2', 'title' => 'some item']);
  397. /** @var $rendererMock */
  398. $rendererMock = $this->getMockBuilder(AbstractRenderer::class)
  399. ->disableOriginalConstructor()
  400. ->setMethods(['render'])
  401. ->getMock();
  402. $rendererMock->expects($this->any())->method('render')->willReturnCallback(
  403. function (DataObject $row) {
  404. return $row->getData('title');
  405. }
  406. );
  407. $this->_block->setRenderer($rendererMock);
  408. $this->_block->setFrameCallback([$this, 'testGetRowFieldExportWithFrameCallback']);
  409. $this->_block->getRowField($row);
  410. }
  411. }