TimezoneTest.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Stdlib\Test\Unit\DateTime;
  7. use Magento\Framework\App\Config\ScopeConfigInterface;
  8. use Magento\Framework\App\ScopeResolverInterface;
  9. use Magento\Framework\Locale\ResolverInterface;
  10. use Magento\Framework\Stdlib\DateTime;
  11. use Magento\Framework\Stdlib\DateTime\Timezone;
  12. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  13. /**
  14. * Test for @see Timezone
  15. */
  16. class TimezoneTest extends \PHPUnit\Framework\TestCase
  17. {
  18. /**
  19. * @var string|null
  20. */
  21. private $defaultTimeZone;
  22. /**
  23. * @var ObjectManager
  24. */
  25. private $objectManager;
  26. /**
  27. * @var ScopeResolverInterface|\PHPUnit_Framework_MockObject_MockObject
  28. */
  29. private $scopeResolver;
  30. /**
  31. * @var ResolverInterface|\PHPUnit_Framework_MockObject_MockObject
  32. */
  33. private $localeResolver;
  34. /**
  35. * @var ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject
  36. */
  37. private $scopeConfig;
  38. /**
  39. * @inheritdoc
  40. */
  41. protected function setUp()
  42. {
  43. $this->defaultTimeZone = date_default_timezone_get();
  44. date_default_timezone_set('UTC');
  45. $this->objectManager = new ObjectManager($this);
  46. $this->scopeResolver = $this->getMockBuilder(ScopeResolverInterface::class)->getMock();
  47. $this->localeResolver = $this->getMockBuilder(ResolverInterface::class)->getMock();
  48. $this->scopeConfig = $this->getMockBuilder(ScopeConfigInterface::class)->getMock();
  49. }
  50. /**
  51. * @inheritdoc
  52. */
  53. protected function tearDown()
  54. {
  55. date_default_timezone_set($this->defaultTimeZone);
  56. }
  57. /**
  58. * Test date parsing with different includeTime options
  59. *
  60. * @param string $date
  61. * @param string $locale
  62. * @param bool $includeTime
  63. * @param int $expectedTimestamp
  64. * @dataProvider dateIncludeTimeDataProvider
  65. */
  66. public function testDateIncludeTime($date, $locale, $includeTime, $expectedTimestamp)
  67. {
  68. $this->scopeConfig->method('getValue')->willReturn('America/Chicago');
  69. /** @var Timezone $timezone */
  70. $timezone = $this->objectManager->getObject(Timezone::class, ['scopeConfig' => $this->scopeConfig]);
  71. /** @var \DateTime $dateTime */
  72. $dateTime = $timezone->date($date, $locale, true, $includeTime);
  73. $this->assertEquals($expectedTimestamp, $dateTime->getTimestamp());
  74. }
  75. /**
  76. * DataProvider for testDateIncludeTime
  77. * @return array
  78. */
  79. public function dateIncludeTimeDataProvider()
  80. {
  81. return [
  82. 'Parse d/m/y date without time' => [
  83. '19/05/2017', // date
  84. 'ar_KW', // locale
  85. false, // include time
  86. 1495170000 // expected timestamp
  87. ],
  88. 'Parse d/m/y date with time' => [
  89. '19/05/2017 00:01 صباحاً', // datetime (00:01 am)
  90. 'ar_KW', // locale
  91. true, // include time
  92. 1495170060 // expected timestamp
  93. ],
  94. 'Parse m/d/y date without time' => [
  95. '05/19/2017', // date
  96. 'en_US', // locale
  97. false, // include time
  98. 1495170000 // expected timestamp
  99. ],
  100. 'Parse m/d/y date with time' => [
  101. '05/19/2017 00:01 am', // datetime
  102. 'en_US', // locale
  103. true, // include time
  104. 1495170060 // expected timestamp
  105. ],
  106. ];
  107. }
  108. /**
  109. * @param string $date
  110. * @param string $configuredTimezone
  111. * @param string $expectedResult
  112. * @dataProvider getConvertConfigTimeToUtcFixtures
  113. */
  114. public function testConvertConfigTimeToUtc($date, $configuredTimezone, $expectedResult)
  115. {
  116. $this->scopeConfigWillReturnConfiguredTimezone($configuredTimezone);
  117. $this->assertEquals($expectedResult, $this->getTimezone()->convertConfigTimeToUtc($date));
  118. }
  119. /**
  120. * Data provider for testConvertConfigTimeToUtc
  121. * @return array
  122. */
  123. public function getConvertConfigTimeToUtcFixtures()
  124. {
  125. return [
  126. 'string' => [
  127. '2016-10-10 10:00:00',
  128. 'UTC',
  129. '2016-10-10 10:00:00'
  130. ],
  131. 'datetime' => [
  132. new \DateTime('2016-10-10 10:00:00', new \DateTimeZone('UTC')),
  133. 'UTC',
  134. '2016-10-10 10:00:00'
  135. ],
  136. 'datetimeimmutable' => [
  137. new \DateTimeImmutable('2016-10-10 10:00:00', new \DateTimeZone('UTC')),
  138. 'UTC',
  139. '2016-10-10 10:00:00'
  140. ]
  141. ];
  142. }
  143. /**
  144. * Test configuration of the different timezones.
  145. */
  146. public function testDate()
  147. {
  148. $dateFixtures = $this->getDateFixtures();
  149. foreach ($dateFixtures as $dateFixture) {
  150. $expectedResult = $dateFixture[0];
  151. $timezone = $dateFixture[1];
  152. $date = $dateFixture[2];
  153. $this->localeResolver->method('getLocale')->willReturn('en_GB');
  154. $this->scopeConfigWillReturnConfiguredTimezone($timezone);
  155. $this->assertEquals(
  156. $expectedResult(),
  157. $this->getTimezone()->date($date, null, true),
  158. '',
  159. 1
  160. );
  161. }
  162. }
  163. /**
  164. * DataProvider for testDate
  165. * @return array
  166. */
  167. private function getDateFixtures()
  168. {
  169. return [
  170. 'now_datetime_utc' => [
  171. function () {
  172. return new \DateTime('now', new \DateTimeZone('UTC'));
  173. },
  174. 'UTC',
  175. null
  176. ],
  177. 'fixed_datetime_utc' => [
  178. function () {
  179. return new \DateTime('2017-01-01 10:00:00', new \DateTimeZone('UTC'));
  180. },
  181. 'UTC',
  182. new \DateTime('2017-01-01 10:00:00')
  183. ],
  184. 'now_datetime_vancouver' => [
  185. function () {
  186. return new \DateTime('now', new \DateTimeZone('America/Vancouver'));
  187. },
  188. 'America/Vancouver',
  189. null
  190. ],
  191. 'now_datetimeimmutable_utc' => [
  192. function () {
  193. return new \DateTimeImmutable('now', new \DateTimeZone('UTC'));
  194. },
  195. 'UTC',
  196. null
  197. ],
  198. 'fixed_datetimeimmutable_utc' => [
  199. function () {
  200. return new \DateTime('2017-01-01 10:00:00', new \DateTimeZone('UTC'));
  201. },
  202. 'UTC',
  203. new \DateTimeImmutable('2017-01-01 10:00:00')
  204. ],
  205. 'now_datetimeimmutable_vancouver' => [
  206. function () {
  207. return new \DateTimeImmutable('now', new \DateTimeZone('America/Vancouver'));
  208. },
  209. 'America/Vancouver',
  210. null
  211. ],
  212. ];
  213. }
  214. /**
  215. * @return Timezone
  216. */
  217. private function getTimezone()
  218. {
  219. return new Timezone(
  220. $this->scopeResolver,
  221. $this->localeResolver,
  222. $this->getMockBuilder(DateTime::class)->getMock(),
  223. $this->scopeConfig,
  224. '',
  225. ''
  226. );
  227. }
  228. /**
  229. * @param string $configuredTimezone
  230. */
  231. private function scopeConfigWillReturnConfiguredTimezone($configuredTimezone)
  232. {
  233. $this->scopeConfig->method('getValue')->with('', '', null)->willReturn($configuredTimezone);
  234. }
  235. }