FileTest.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Eav\Test\Unit\Model\Attribute\Data;
  7. class FileTest extends \PHPUnit\Framework\TestCase
  8. {
  9. /**
  10. * @var \Magento\Eav\Model\Attribute\Data\File
  11. */
  12. protected $model;
  13. /**
  14. * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Url\EncoderInterface
  15. */
  16. protected $urlEncoder;
  17. /**
  18. * @var \PHPUnit_Framework_MockObject_MockObject
  19. */
  20. protected $fileValidatorMock;
  21. protected function setUp()
  22. {
  23. $timezoneMock = $this->createMock(\Magento\Framework\Stdlib\DateTime\TimezoneInterface::class);
  24. $loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
  25. $localeResolverMock = $this->createMock(\Magento\Framework\Locale\ResolverInterface::class);
  26. $this->urlEncoder = $this->createMock(\Magento\Framework\Url\EncoderInterface::class);
  27. $this->fileValidatorMock = $this->createPartialMock(
  28. \Magento\MediaStorage\Model\File\Validator\NotProtectedExtension::class,
  29. ['isValid', 'getMessages']
  30. );
  31. $filesystemMock = $this->createMock(\Magento\Framework\Filesystem::class);
  32. $this->model = new \Magento\Eav\Model\Attribute\Data\File(
  33. $timezoneMock,
  34. $loggerMock,
  35. $localeResolverMock,
  36. $this->urlEncoder,
  37. $this->fileValidatorMock,
  38. $filesystemMock
  39. );
  40. }
  41. /**
  42. * @covers \Magento\Eav\Model\Attribute\Data\File::outputValue
  43. *
  44. * @param string $format
  45. * @param mixed $value
  46. * @param mixed $expectedResult
  47. * @param int $callTimes
  48. * @dataProvider outputValueDataProvider
  49. */
  50. public function testOutputValue($format, $value, $callTimes, $expectedResult)
  51. {
  52. $entityMock = $this->createMock(\Magento\Framework\Model\AbstractModel::class);
  53. $entityMock->expects($this->once())->method('getData')->will($this->returnValue($value));
  54. $attributeMock = $this->createMock(\Magento\Eav\Model\Attribute::class);
  55. $this->urlEncoder->expects($this->exactly($callTimes))
  56. ->method('encode')
  57. ->will($this->returnValue('url_key'));
  58. $this->model->setEntity($entityMock);
  59. $this->model->setAttribute($attributeMock);
  60. $this->assertEquals($expectedResult, $this->model->outputValue($format));
  61. }
  62. /**
  63. * @return array
  64. */
  65. public function outputValueDataProvider()
  66. {
  67. return [
  68. [
  69. 'format' => \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_JSON,
  70. 'value' => 'value',
  71. 'callTimes' => 1,
  72. 'expectedResult' => ['value' => 'value', 'url_key' => 'url_key'],
  73. ],
  74. [
  75. 'format' => \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_TEXT,
  76. 'value' => 'value',
  77. 'callTimes' => 0,
  78. 'expectedResult' => ''
  79. ],
  80. [
  81. 'format' => \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_TEXT,
  82. 'value' => false,
  83. 'callTimes' => 0,
  84. 'expectedResult' => ''
  85. ],
  86. ];
  87. }
  88. /**
  89. * @covers \Magento\Eav\Model\Attribute\Data\File::validateValue
  90. * @covers \Magento\Eav\Model\Attribute\Data\File::_validateByRules
  91. *
  92. * @param mixed $value
  93. * @param mixed $originalValue
  94. * @param bool $isRequired
  95. * @param bool $isAjaxRequest
  96. * @param array $rules
  97. * @param bool $fileIsValid
  98. * @param array $expectedResult
  99. * @dataProvider validateValueDataProvider
  100. */
  101. public function testValidateValue(
  102. $value,
  103. $originalValue,
  104. $isRequired,
  105. $isAjaxRequest,
  106. $rules,
  107. $fileIsValid,
  108. $expectedResult
  109. ) {
  110. $this->markTestSkipped('MAGETWO-34751: Test fails after being moved. Might have hidden dependency.');
  111. $entityMock = $this->createMock(\Magento\Framework\Model\AbstractModel::class);
  112. $entityMock->expects($this->any())->method('getData')->will($this->returnValue($originalValue));
  113. $attributeMock = $this->createMock(\Magento\Eav\Model\Attribute::class);
  114. $attributeMock->expects($this->any())->method('getStoreLabel')->will($this->returnValue('Label'));
  115. $attributeMock->expects($this->any())->method('getIsRequired')->will($this->returnValue($isRequired));
  116. $attributeMock->expects($this->any())->method('getIsAjaxRequest')->will($this->returnValue($isAjaxRequest));
  117. $attributeMock->expects($this->any())->method('getValidateRules')->will($this->returnValue($rules));
  118. $this->fileValidatorMock->expects($this->any())->method('isValid')->will($this->returnValue($fileIsValid));
  119. $this->fileValidatorMock->expects($this->any())->method('getMessages')->will($this->returnValue(['m1', 'm2']));
  120. $this->model->setEntity($entityMock);
  121. $this->model->setAttribute($attributeMock);
  122. $this->model->setIsAjaxRequest($isAjaxRequest);
  123. $this->assertEquals($expectedResult, $this->model->validateValue($value));
  124. }
  125. /**
  126. * @return array
  127. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  128. */
  129. public function validateValueDataProvider()
  130. {
  131. return [
  132. [
  133. 'value' => false,
  134. 'originalValue' => false,
  135. 'isRequired' => true,
  136. 'isAjaxRequest' => true,
  137. 'rules' => [],
  138. 'fileIsValid' => true,
  139. 'expectedResult' => true,
  140. ],
  141. [
  142. 'value' => ['delete' => '', 'tmp_name' => ''],
  143. 'originalValue' => 'value',
  144. 'isRequired' => true,
  145. 'isAjaxRequest' => false,
  146. 'rules' => [],
  147. 'fileIsValid' => true,
  148. 'expectedResult' => true
  149. ],
  150. [
  151. 'value' => ['delete' => 'delete', 'tmp_name' => ''],
  152. 'originalValue' => 'value',
  153. 'isRequired' => false,
  154. 'isAjaxRequest' => false,
  155. 'rules' => [],
  156. 'fileIsValid' => true,
  157. 'expectedResult' => true
  158. ],
  159. [
  160. 'value' => ['delete' => 'delete', 'tmp_name' => ''],
  161. 'originalValue' => 'value',
  162. 'isRequired' => true,
  163. 'isAjaxRequest' => false,
  164. 'rules' => [],
  165. 'fileIsValid' => true,
  166. 'expectedResult' => ['"Label" is a required value.']
  167. ],
  168. [
  169. 'value' => [
  170. 'delete' => 'delete', 'tmp_name' => 'tmp_name', 'name' => 'name',
  171. ],
  172. 'originalValue' => 'value',
  173. 'isRequired' => true,
  174. 'isAjaxRequest' => false,
  175. 'rules' => [],
  176. 'fileIsValid' => true,
  177. 'expectedResult' => true
  178. ],
  179. [
  180. 'value' => [
  181. 'delete' => 'delete',
  182. 'tmp_name' => 'tmp_name',
  183. 'name' => 'name.txt',
  184. ],
  185. 'originalValue' => 'value',
  186. 'isRequired' => true,
  187. 'isAjaxRequest' => false,
  188. 'rules' => ['file_extensions' => 'txt,png'],
  189. 'fileIsValid' => true,
  190. 'expectedResult' => true
  191. ],
  192. [
  193. 'value' => [
  194. 'delete' => 'delete',
  195. 'tmp_name' => 'tmp_name',
  196. 'name' => 'name.rpg',
  197. ],
  198. 'originalValue' => 'value',
  199. 'isRequired' => true,
  200. 'isAjaxRequest' => false,
  201. 'rules' => ['file_extensions' => ' txt , png '],
  202. 'fileIsValid' => true,
  203. 'expectedResult' => ['"Label" is not a valid file extension.']
  204. ],
  205. [
  206. 'value' => [
  207. 'delete' => 'delete',
  208. 'tmp_name' => 'tmp_name',
  209. 'name' => 'name.txt',
  210. ],
  211. 'originalValue' => 'value',
  212. 'isRequired' => true,
  213. 'isAjaxRequest' => false,
  214. 'rules' => ['file_extensions' => ''],
  215. 'fileIsValid' => false,
  216. 'expectedResult' => ['m1', 'm2']
  217. ],
  218. [
  219. 'value' => [
  220. 'delete' => 'delete',
  221. 'tmp_name' => 'NotUploaded',
  222. 'name' => '',
  223. ],
  224. 'originalValue' => 'value',
  225. 'isRequired' => true,
  226. 'isAjaxRequest' => false,
  227. 'rules' => [],
  228. 'fileIsValid' => true,
  229. 'expectedResult' => ['"Label" is not a valid file.']
  230. ],
  231. [
  232. 'value' => [
  233. 'delete' => 'delete',
  234. 'tmp_name' => 'tmp_name',
  235. 'name' => 'name.txt',
  236. 'size' => 20,
  237. ],
  238. 'originalValue' => 'value',
  239. 'isRequired' => true,
  240. 'isAjaxRequest' => false,
  241. 'rules' => ['max_file_size' => 10],
  242. 'fileIsValid' => true,
  243. 'expectedResult' => ['"Label" exceeds the allowed file size.']
  244. ],
  245. [
  246. 'value' => [
  247. 'delete' => 'delete',
  248. 'tmp_name' => 'tmp_name',
  249. 'name' => 'name.txt',
  250. 'size' => 5,
  251. ],
  252. 'originalValue' => 'value',
  253. 'isRequired' => true,
  254. 'isAjaxRequest' => false,
  255. 'rules' => ['max_file_size' => 10],
  256. 'fileIsValid' => true,
  257. 'expectedResult' => true
  258. ],
  259. ];
  260. }
  261. }
  262. /**
  263. * Mocking of std function to test validation
  264. *
  265. * @param string $name
  266. * @return bool
  267. */
  268. function is_uploaded_file($name)
  269. {
  270. return ($name == 'NotUploaded') ? false : true;
  271. }