test_dt.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. # -*- coding: utf-8 -*-
  2. """
  3. Unit-tests for pytils.dt
  4. """
  5. import datetime
  6. import time
  7. import unittest
  8. import pytils
  9. class DistanceOfTimeInWordsTestCase(unittest.TestCase):
  10. """
  11. Test case for pytils.dt.distance_of_time_in_words
  12. """
  13. def setUp(self):
  14. """
  15. Setting up environment for tests
  16. """
  17. self.time = 1156862275.7711999
  18. self.dtime = {}
  19. self.updateTime(self.time)
  20. def updateTime(self, _time):
  21. """Update all time-related values for current time """
  22. self.dtime['10sec_ago'] = _time - 10
  23. self.dtime['1min_ago'] = _time - 60
  24. self.dtime['10min_ago'] = _time - 600
  25. self.dtime['59min_ago'] = _time - 3540
  26. self.dtime['59min59sec_ago'] = _time - 3599
  27. self.dtime['1hr_ago'] = _time - 3600
  28. self.dtime['1hr1sec_ago'] = _time - 3601
  29. self.dtime['1hr59sec_ago'] = _time - 3659
  30. self.dtime['1hr1min_ago'] = _time - 3660
  31. self.dtime['1hr2min_ago'] = _time - 3720
  32. self.dtime['10hr_ago'] = _time - 36600
  33. self.dtime['1day_ago'] = _time - 87600
  34. self.dtime['1day1hr_ago'] = _time - 90600
  35. self.dtime['2day_ago'] = _time - 87600*2
  36. self.dtime['4day1min_ago'] = _time - 87600*4 - 60
  37. self.dtime['in_10sec'] = _time + 10
  38. self.dtime['in_1min'] = _time + 61
  39. self.dtime['in_10min'] = _time + 601
  40. self.dtime['in_1hr'] = _time + 3721
  41. self.dtime['in_10hr'] = _time + 36601
  42. self.dtime['in_1day'] = _time + 87601
  43. self.dtime['in_1day1hr'] = _time + 90601
  44. self.dtime['in_2day'] = _time + 87600*2 + 1
  45. def ckDefaultAccuracy(self, typ, estimated):
  46. """
  47. Checks with default value for accuracy
  48. """
  49. t0 = time.time()
  50. # --- change state !!! attention
  51. self.updateTime(t0)
  52. # ---
  53. t1 = self.dtime[typ]
  54. res = pytils.dt.distance_of_time_in_words(from_time=t1, to_time=t0)
  55. # --- revert state to original value
  56. self.updateTime(self.time)
  57. # ---
  58. self.assertEqual(res, estimated)
  59. def ckDefaultTimeAndAccuracy(self, typ, estimated):
  60. """
  61. Checks with default accuracy and default time
  62. """
  63. t0 = time.time()
  64. # --- change state !!! attention
  65. self.updateTime(t0)
  66. # ---
  67. t1 = self.dtime[typ]
  68. res = pytils.dt.distance_of_time_in_words(t1)
  69. # --- revert state to original value
  70. self.updateTime(self.time)
  71. # ---
  72. self.assertEqual(res, estimated)
  73. def ckDefaultToTime(self, typ, accuracy, estimated):
  74. """
  75. Checks with default value of time
  76. """
  77. t0 = time.time()
  78. # --- change state !!! attention
  79. self.updateTime(t0)
  80. # ---
  81. t1 = self.dtime[typ]
  82. res = pytils.dt.distance_of_time_in_words(t1, accuracy)
  83. # --- revert state to original value
  84. self.updateTime(self.time)
  85. # ---
  86. self.assertEqual(res, estimated)
  87. def testDOTIWDefaultAccuracy(self):
  88. """
  89. Unit-test for distance_of_time_in_words with default accuracy
  90. """
  91. self.ckDefaultAccuracy("10sec_ago", "менее минуты назад")
  92. self.ckDefaultAccuracy("1min_ago", "1 минуту назад")
  93. self.ckDefaultAccuracy("10min_ago", "10 минут назад")
  94. self.ckDefaultAccuracy("59min_ago", "59 минут назад")
  95. self.ckDefaultAccuracy("59min59sec_ago", "59 минут назад")
  96. self.ckDefaultAccuracy("1hr_ago", "1 час назад")
  97. self.ckDefaultAccuracy("1hr1sec_ago", "1 час назад")
  98. self.ckDefaultAccuracy("1hr59sec_ago", "1 час назад")
  99. self.ckDefaultAccuracy("1hr1min_ago", "1 час назад")
  100. self.ckDefaultAccuracy("1hr2min_ago", "1 час назад")
  101. self.ckDefaultAccuracy("10hr_ago", "10 часов назад")
  102. self.ckDefaultAccuracy("1day_ago", "1 день назад")
  103. self.ckDefaultAccuracy("1day1hr_ago", "1 день назад")
  104. self.ckDefaultAccuracy("2day_ago", "2 дня назад")
  105. self.ckDefaultAccuracy("in_10sec", "менее чем через минуту")
  106. self.ckDefaultAccuracy("in_1min", "через 1 минуту")
  107. self.ckDefaultAccuracy("in_10min", "через 10 минут")
  108. self.ckDefaultAccuracy("in_1hr", "через 1 час")
  109. self.ckDefaultAccuracy("in_10hr", "через 10 часов")
  110. self.ckDefaultAccuracy("in_1day", "через 1 день")
  111. self.ckDefaultAccuracy("in_1day1hr", "через 1 день")
  112. self.ckDefaultAccuracy("in_2day", "через 2 дня")
  113. def testDOTIWDefaultAccuracyDayAndMinute(self):
  114. """
  115. Unit-tests for distance_of_time_in_words with default accuracy and to_time
  116. """
  117. self.ckDefaultTimeAndAccuracy("4day1min_ago", "4 дня назад")
  118. self.ckDefaultTimeAndAccuracy("10sec_ago", "менее минуты назад")
  119. self.ckDefaultTimeAndAccuracy("1min_ago", "минуту назад")
  120. self.ckDefaultTimeAndAccuracy("10min_ago", "10 минут назад")
  121. self.ckDefaultTimeAndAccuracy("59min_ago", "59 минут назад")
  122. self.ckDefaultTimeAndAccuracy("59min59sec_ago", "59 минут назад")
  123. self.ckDefaultTimeAndAccuracy("1hr_ago", "час назад")
  124. self.ckDefaultTimeAndAccuracy("1hr1sec_ago", "час назад")
  125. self.ckDefaultTimeAndAccuracy("1hr59sec_ago", "час назад")
  126. self.ckDefaultTimeAndAccuracy("1hr1min_ago", "час назад")
  127. self.ckDefaultTimeAndAccuracy("1hr2min_ago", "час назад")
  128. self.ckDefaultTimeAndAccuracy("10hr_ago", "10 часов назад")
  129. self.ckDefaultTimeAndAccuracy("1day_ago", "вчера")
  130. self.ckDefaultTimeAndAccuracy("1day1hr_ago", "вчера")
  131. self.ckDefaultTimeAndAccuracy("2day_ago", "позавчера")
  132. self.ckDefaultTimeAndAccuracy("in_10sec", "менее чем через минуту")
  133. self.ckDefaultTimeAndAccuracy("in_1min", "через минуту")
  134. self.ckDefaultTimeAndAccuracy("in_10min", "через 10 минут")
  135. self.ckDefaultTimeAndAccuracy("in_1hr", "через час")
  136. self.ckDefaultTimeAndAccuracy("in_10hr", "через 10 часов")
  137. self.ckDefaultTimeAndAccuracy("in_1day", "завтра")
  138. self.ckDefaultTimeAndAccuracy("in_1day1hr", "завтра")
  139. self.ckDefaultTimeAndAccuracy("in_2day", "послезавтра")
  140. def test4Days1MinuteDaytimeBug2(self):
  141. from_time = datetime.datetime.now() - datetime.timedelta(days=4, minutes=1)
  142. res = pytils.dt.distance_of_time_in_words(from_time)
  143. self.assertEqual(res, "4 дня назад")
  144. def testDOTIWDefaultToTimeAcc1(self):
  145. """
  146. Unit-tests for distance_of_time_in_words with default to_time and accuracy=1
  147. """
  148. # accuracy = 1
  149. self.ckDefaultToTime("10sec_ago", 1, "менее минуты назад")
  150. self.ckDefaultToTime("1min_ago", 1, "минуту назад")
  151. self.ckDefaultToTime("10min_ago", 1, "10 минут назад")
  152. self.ckDefaultToTime("59min_ago", 1, "59 минут назад")
  153. self.ckDefaultToTime("59min59sec_ago", 1, "59 минут назад")
  154. self.ckDefaultToTime("1hr_ago", 1, "час назад")
  155. self.ckDefaultToTime("1hr1sec_ago", 1, "час назад")
  156. self.ckDefaultToTime("1hr59sec_ago", 1, "час назад")
  157. self.ckDefaultToTime("1hr1min_ago", 1, "час назад")
  158. self.ckDefaultToTime("1hr2min_ago", 1, "час назад")
  159. self.ckDefaultToTime("10hr_ago", 1, "10 часов назад")
  160. self.ckDefaultToTime("1day_ago", 1, "вчера")
  161. self.ckDefaultToTime("1day1hr_ago", 1, "вчера")
  162. self.ckDefaultToTime("2day_ago", 1, "позавчера")
  163. self.ckDefaultToTime("in_10sec", 1, "менее чем через минуту")
  164. self.ckDefaultToTime("in_1min", 1, "через минуту")
  165. self.ckDefaultToTime("in_10min", 1, "через 10 минут")
  166. self.ckDefaultToTime("in_1hr", 1, "через час")
  167. self.ckDefaultToTime("in_10hr", 1, "через 10 часов")
  168. self.ckDefaultToTime("in_1day", 1, "завтра")
  169. self.ckDefaultToTime("in_1day1hr", 1, "завтра")
  170. self.ckDefaultToTime("in_2day", 1, "послезавтра")
  171. def testDOTIWDefaultToTimeAcc2(self):
  172. """
  173. Unit-tests for distance_of_time_in_words with default to_time and accuracy=2
  174. """
  175. # accuracy = 2
  176. self.ckDefaultToTime("10sec_ago", 2, "менее минуты назад")
  177. self.ckDefaultToTime("1min_ago", 2, "минуту назад")
  178. self.ckDefaultToTime("10min_ago", 2, "10 минут назад")
  179. self.ckDefaultToTime("59min_ago", 2, "59 минут назад")
  180. self.ckDefaultToTime("59min59sec_ago", 2, "59 минут назад")
  181. self.ckDefaultToTime("1hr_ago", 2, "час назад")
  182. self.ckDefaultToTime("1hr1sec_ago", 2, "час назад")
  183. self.ckDefaultToTime("1hr59sec_ago", 2, "час назад")
  184. self.ckDefaultToTime("1hr1min_ago", 2, "1 час 1 минуту назад")
  185. self.ckDefaultToTime("1hr2min_ago", 2, "1 час 2 минуты назад")
  186. self.ckDefaultToTime("10hr_ago", 2, "10 часов 10 минут назад")
  187. self.ckDefaultToTime("1day_ago", 2, "вчера")
  188. self.ckDefaultToTime("1day1hr_ago", 2, "1 день 1 час назад")
  189. self.ckDefaultToTime("2day_ago", 2, "позавчера")
  190. self.ckDefaultToTime("in_10sec", 2, "менее чем через минуту")
  191. self.ckDefaultToTime("in_1min", 2, "через минуту")
  192. self.ckDefaultToTime("in_10min", 2, "через 10 минут")
  193. self.ckDefaultToTime("in_1hr", 2, "через 1 час 2 минуты")
  194. self.ckDefaultToTime("in_10hr", 2, "через 10 часов 10 минут")
  195. self.ckDefaultToTime("in_1day", 2, "завтра")
  196. self.ckDefaultToTime("in_1day1hr", 2, "через 1 день 1 час")
  197. self.ckDefaultToTime("in_2day", 2, "послезавтра")
  198. def testDOTIWDefaultToTimeAcc3(self):
  199. """
  200. Unit-tests for distance_of_time_in_words with default to_time and accuracy=3
  201. """
  202. # accuracy = 3
  203. self.ckDefaultToTime("10sec_ago", 3, "менее минуты назад")
  204. self.ckDefaultToTime("1min_ago", 3, "минуту назад")
  205. self.ckDefaultToTime("10min_ago", 3, "10 минут назад")
  206. self.ckDefaultToTime("59min_ago", 3, "59 минут назад")
  207. self.ckDefaultToTime("59min59sec_ago", 3, "59 минут назад")
  208. self.ckDefaultToTime("1hr_ago", 3, "час назад")
  209. self.ckDefaultToTime("1hr1sec_ago", 3, "час назад")
  210. self.ckDefaultToTime("1hr59sec_ago", 3, "час назад")
  211. self.ckDefaultToTime("1hr1min_ago", 3, "1 час 1 минуту назад")
  212. self.ckDefaultToTime("1hr2min_ago", 3, "1 час 2 минуты назад")
  213. self.ckDefaultToTime("10hr_ago", 3, "10 часов 10 минут назад")
  214. self.ckDefaultToTime("1day_ago", 3, "1 день 0 часов 20 минут назад")
  215. self.ckDefaultToTime("1day1hr_ago", 3, "1 день 1 час 10 минут назад")
  216. self.ckDefaultToTime("2day_ago", 3, "2 дня 0 часов 40 минут назад")
  217. self.ckDefaultToTime("in_10sec", 3, "менее чем через минуту")
  218. self.ckDefaultToTime("in_1min", 3, "через минуту")
  219. self.ckDefaultToTime("in_10min", 3, "через 10 минут")
  220. self.ckDefaultToTime("in_1hr", 3, "через 1 час 2 минуты")
  221. self.ckDefaultToTime("in_10hr", 3, "через 10 часов 10 минут")
  222. self.ckDefaultToTime("in_1day", 3, "через 1 день 0 часов 20 минут")
  223. self.ckDefaultToTime("in_1day1hr", 3, "через 1 день 1 час 10 минут")
  224. self.ckDefaultToTime("in_2day", 3, "через 2 дня 0 часов 40 минут")
  225. def testDOTWDatetimeType(self):
  226. """
  227. Unit-tests for testing datetime.datetime as input values
  228. """
  229. first_time = datetime.datetime.now()
  230. second_time = first_time + datetime.timedelta(0, 1000)
  231. self.assertEqual(
  232. pytils.dt.distance_of_time_in_words(
  233. from_time=first_time,
  234. accuracy=1,
  235. to_time=second_time
  236. ),
  237. "16 минут назад"
  238. )
  239. def testDOTIWExceptions(self):
  240. """
  241. Unit-tests for testings distance_of_time_in_words' exceptions
  242. """
  243. self.assertRaises(ValueError, pytils.dt.distance_of_time_in_words, time.time(), 0)
  244. def testIssue25DaysFixed(self):
  245. """
  246. Unit-test for testing that Issue#25 is fixed (err when accuracy==1, days<>0, hours==1)
  247. """
  248. d_days = datetime.datetime.now() - datetime.timedelta(13, 3620)
  249. self.assertEqual(
  250. pytils.dt.distance_of_time_in_words(d_days),
  251. "13 дней назад"
  252. )
  253. def testIssue25HoursFixed(self):
  254. """
  255. Unit-test for testing that Issue#25 is fixed (err when accuracy==1, hours<>0, minutes==1)
  256. """
  257. d_hours = datetime.datetime.now() - datetime.timedelta(0, 46865)
  258. self.assertEqual(
  259. pytils.dt.distance_of_time_in_words(d_hours),
  260. "13 часов назад"
  261. )
  262. class RuStrftimeTestCase(unittest.TestCase):
  263. """
  264. Test case for pytils.dt.ru_strftime
  265. """
  266. def setUp(self):
  267. """
  268. Setting up environment for tests
  269. """
  270. self.date = datetime.date(2006, 8, 25)
  271. def ck(self, format, estimates, date=None):
  272. """
  273. Checks w/o inflected
  274. """
  275. if date is None:
  276. date = self.date
  277. res = pytils.dt.ru_strftime(format, date)
  278. self.assertEqual(res, estimates)
  279. def ckInflected(self, format, estimates, date=None):
  280. """
  281. Checks with inflected
  282. """
  283. if date is None:
  284. date = self.date
  285. res = pytils.dt.ru_strftime(format, date, True)
  286. self.assertEqual(res, estimates)
  287. def ckInflectedDay(self, format, estimates, date=None):
  288. """
  289. Checks with inflected day
  290. """
  291. if date is None:
  292. date = self.date
  293. res = pytils.dt.ru_strftime(format, date, inflected_day=True)
  294. self.assertEqual(res, estimates)
  295. def ckPreposition(self, format, estimates, date=None):
  296. """
  297. Checks with inflected day
  298. """
  299. if date is None:
  300. date = self.date
  301. res = pytils.dt.ru_strftime(format, date, preposition=True)
  302. self.assertEqual(res, estimates)
  303. def testRuStrftime(self):
  304. """
  305. Unit-tests for pytils.dt.ru_strftime
  306. """
  307. self.ck("тест %a", "тест пт")
  308. self.ck("тест %A", "тест пятница")
  309. self.ck("тест %b", "тест авг")
  310. self.ck("тест %B", "тест август")
  311. self.ckInflected("тест %B", "тест августа")
  312. self.ckInflected("тест выполнен %d %B %Y года", "тест выполнен 25 августа 2006 года")
  313. self.ckInflectedDay("тест выполнен в %A", "тест выполнен в пятницу")
  314. def testRuStrftimeWithPreposition(self):
  315. """
  316. Unit-tests for pytils.dt.ru_strftime with preposition option
  317. """
  318. self.ckPreposition("тест %a", "тест в\xa0пт")
  319. self.ckPreposition("тест %A", "тест в\xa0пятницу")
  320. self.ckPreposition("тест %A", "тест во\xa0вторник", datetime.date(2007, 6, 5))
  321. def testRuStrftimeZeros(self):
  322. """
  323. Unit-test for testing that Issue#24 is correctly implemented
  324. It means, 1 April 2007, but 01.04.2007
  325. """
  326. self.ck("%d.%m.%Y", "01.04.2007", datetime.date(2007, 4, 1))
  327. self.ckInflected("%d %B %Y", "1 апреля 2007", datetime.date(2007, 4, 1))
  328. def testIssue20Fixed(self):
  329. """
  330. Unit-test for testing that Issue#20 is fixed (typo)
  331. """
  332. self.assertEqual(
  333. "воскресенье",
  334. pytils.dt.ru_strftime(
  335. "%A",
  336. datetime.date(2007, 3, 18),
  337. inflected_day=True
  338. )
  339. )
  340. def test_special_case(self):
  341. self.assertEqual(
  342. "октябрь",
  343. pytils.dt.ru_strftime(
  344. '%B',
  345. inflected=False,
  346. date=datetime.datetime.fromtimestamp(1540209256)
  347. ),
  348. )
  349. if __name__ == '__main__':
  350. unittest.main()