You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

422 lines
14 KiB

  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. """Contains test cases for the DownloadItem object."""
  4. from __future__ import unicode_literals
  5. import sys
  6. import os.path
  7. import unittest
  8. PATH = os.path.realpath(os.path.abspath(__file__))
  9. sys.path.insert(0, os.path.dirname(os.path.dirname(PATH)))
  10. try:
  11. from youtube_dl_gui.downloadmanager import DownloadItem
  12. except ImportError as error:
  13. print error
  14. sys.exit(1)
  15. class TestItemInit(unittest.TestCase):
  16. """Test case for DownloadItem init."""
  17. def test_init(self):
  18. url = "url"
  19. options = ["-f", "flv"]
  20. ditem = DownloadItem(url, options)
  21. self.assertEqual(ditem.stage, "Queued")
  22. self.assertEqual(ditem.url, url)
  23. self.assertEqual(ditem.options, options)
  24. self.assertEqual(ditem.object_id, hash(url + unicode(options)))
  25. self.assertEqual(ditem.path, "")
  26. self.assertEqual(ditem.filenames, [])
  27. self.assertEqual(ditem.extensions, [])
  28. self.assertEqual(ditem.filesizes, [])
  29. self.assertEqual(
  30. ditem.progress_stats,
  31. {"filename": url,
  32. "extension": "-",
  33. "filesize": "-",
  34. "percent": "0%",
  35. "speed": "-",
  36. "eta": "-",
  37. "status": "Queued",
  38. "playlist_size": "",
  39. "playlist_index": ""}
  40. )
  41. class TestGetFiles(unittest.TestCase):
  42. """Test case for DownloadItem get_files method."""
  43. def setUp(self):
  44. self.ditem = DownloadItem("url", ["-f", "flv"])
  45. def test_get_files(self):
  46. path = os.path.join("/home", "user", "downloads")
  47. self.ditem.path = path
  48. self.ditem.filenames = ["file1", "file2"]
  49. self.ditem.extensions = [".mp4", ".m4a"]
  50. self.assertEqual(self.ditem.get_files(), [os.path.join(path, "file1" + ".mp4"), os.path.join(path, "file2" + ".m4a")])
  51. def test_get_files_no_data(self):
  52. self.assertEqual(self.ditem.get_files(), [])
  53. class TestItemComparison(unittest.TestCase):
  54. """Test case for DownloadItem __eq__ method."""
  55. def test_equal_true(self):
  56. ditem1 = DownloadItem("url", ["-f", "flv"])
  57. ditem2 = DownloadItem("url", ["-f", "flv"])
  58. self.assertTrue(ditem1 == ditem2)
  59. def test_equal_false(self):
  60. ditem1 = DownloadItem("url", ["-f", "flv"])
  61. ditem2 = DownloadItem("url2", ["-f", "flv"])
  62. self.assertFalse(ditem1 == ditem2)
  63. ditem1 = DownloadItem("url", ["-f", "flv"])
  64. ditem2 = DownloadItem("url", ["-f", "mp4"])
  65. self.assertFalse(ditem1 == ditem2)
  66. class TestSetItemStage(unittest.TestCase):
  67. """Test case for DownloadItem stage setter."""
  68. def setUp(self):
  69. self.ditem = DownloadItem("url", ["-f", "flv"])
  70. def test_set_stage_valid(self):
  71. self.ditem.stage = "Queued"
  72. self.assertEqual(self.ditem.stage, "Queued")
  73. self.assertEqual(self.ditem.progress_stats["status"], "Queued")
  74. self.ditem.stage = "Active"
  75. self.assertEqual(self.ditem.stage, "Active")
  76. self.assertEqual(self.ditem.progress_stats["status"], "Pre Processing")
  77. self.ditem.stage = "Completed"
  78. self.assertEqual(self.ditem.stage, "Completed")
  79. self.assertEqual(self.ditem.progress_stats["status"], "Finished")
  80. self.ditem.stage = "Paused"
  81. self.assertEqual(self.ditem.stage, "Paused")
  82. self.assertEqual(self.ditem.progress_stats["status"], "Paused")
  83. self.ditem.stage = "Error"
  84. self.assertEqual(self.ditem.stage, "Error")
  85. self.assertEqual(self.ditem.progress_stats["status"], "Error")
  86. def test_set_stage_invalid(self):
  87. raised = False
  88. try:
  89. self.ditem.stage = "some other status"
  90. except ValueError:
  91. raised = True
  92. self.assertTrue(raised)
  93. class TestUpdateStats(unittest.TestCase):
  94. """Test case for DownloadItem update_stats method."""
  95. def setUp(self):
  96. self.ditem = DownloadItem("url", ["-f", "flv"])
  97. def test_update_stats(self):
  98. path = os.path.join("/home", "user")
  99. self.ditem.update_stats({"filename": "somefilename",
  100. "extension": ".mp4",
  101. "filesize": "9.45MiB",
  102. "percent": "2.0%",
  103. "speed": "200.00KiB/s",
  104. "eta": "00:38",
  105. "status": "Downloading",
  106. "path": path,
  107. "playlist_size": "10",
  108. "playlist_index": "1"})
  109. self.assertEqual(self.ditem.path, path)
  110. self.assertEqual(self.ditem.filenames, ["somefilename"])
  111. self.assertEqual(self.ditem.extensions, [".mp4"])
  112. self.assertEqual(self.ditem.filesizes, [9909043.20])
  113. self.assertEqual(
  114. self.ditem.progress_stats,
  115. {"filename": "somefilename",
  116. "extension": ".mp4",
  117. "filesize": "9.45MiB",
  118. "percent": "2.0%",
  119. "speed": "200.00KiB/s",
  120. "eta": "00:38",
  121. "status": "Downloading",
  122. "playlist_size": "10",
  123. "playlist_index": "1"}
  124. )
  125. self.ditem.update_stats({"filename": "someotherfilename",
  126. "extension": ".m4a",
  127. "percent": "50.0%",
  128. "filesize": "2.00MiB",
  129. "playlist_index": "2"})
  130. # This update should not affect the filesizes
  131. self.ditem.update_stats({ "percent": "65.0%",
  132. "filesize": "2.00MiB",
  133. "playlist_index": "2"})
  134. self.assertEqual(self.ditem.filenames, ["somefilename", "someotherfilename"])
  135. self.assertEqual(self.ditem.extensions, [".mp4", ".m4a"])
  136. self.assertEqual(self.ditem.filesizes, [9909043.20, 2097152.00])
  137. self.assertEqual(
  138. self.ditem.progress_stats,
  139. {"filename": "someotherfilename",
  140. "extension": ".m4a",
  141. "filesize": "2.00MiB",
  142. "percent": "65.0%",
  143. "speed": "200.00KiB/s",
  144. "eta": "00:38",
  145. "status": "Downloading",
  146. "playlist_size": "10",
  147. "playlist_index": "2"}
  148. )
  149. def test_update_stats_invalid_input(self):
  150. self.assertRaises(AssertionError, self.ditem.update_stats, [])
  151. def test_update_stats_empty_strings(self):
  152. self.ditem.update_stats({"filename": "",
  153. "extension": "",
  154. "filesize": "",
  155. "percent": "",
  156. "speed": "",
  157. "eta": "",
  158. "status": "",
  159. "playlist_size": "",
  160. "playlist_index": ""})
  161. self.assertEqual(
  162. self.ditem.progress_stats,
  163. {"filename": "url",
  164. "extension": "-",
  165. "filesize": "-",
  166. "percent": "0%",
  167. "speed": "-",
  168. "eta": "-",
  169. "status": "Queued",
  170. "playlist_size": "",
  171. "playlist_index": ""}
  172. )
  173. def test_update_stats_not_string(self):
  174. self.ditem.update_stats({"filename": None, "status": 1234, "eta": False})
  175. self.assertEqual(self.ditem.progress_stats["filename"], "url")
  176. self.assertEqual(self.ditem.progress_stats["status"], "Queued")
  177. self.assertEqual(self.ditem.progress_stats["eta"], "-")
  178. class TestDownloadItemPrivate(unittest.TestCase):
  179. """Test case for private method of the DownloadItem."""
  180. def test_set_stage(self):
  181. ditem = DownloadItem("url", ["-f", "flv"])
  182. active_status = ["Pre Processing", "Downloading", "Post Processing"]
  183. complete_status = ["Finished", "Warning", "Already Downloaded"]
  184. error_status = ["Error", "Stopped", "Filesize Abort"]
  185. for status in active_status:
  186. ditem._set_stage(status)
  187. self.assertEqual(ditem.stage, "Active")
  188. for status in complete_status:
  189. ditem._set_stage(status)
  190. self.assertEqual(ditem.stage, "Completed")
  191. for status in error_status:
  192. ditem._set_stage(status)
  193. self.assertEqual(ditem.stage, "Error")
  194. def test_calc_post_proc_size(self):
  195. # REFACTOR Not an actual method
  196. # should transfer to TestUpdateStats
  197. ditem = DownloadItem("url", ["-f", "flv"])
  198. ditem.update_stats({"filename": "file.f123",
  199. "extension": ".webm",
  200. "filesize": "10.00MiB",
  201. "percent": "75.0%",
  202. "speed": "123.45KiB/s",
  203. "eta": "N/A",
  204. "status": "Downloading",
  205. "path": "/home/user"})
  206. ditem.update_stats({"filename": "file.f456",
  207. "extension": ".m4a",
  208. "filesize": "3.45MiB",
  209. "percent": "96.0%",
  210. "speed": "222.22KiB/s",
  211. "eta": "N/A",
  212. "status": "Downloading",
  213. "path": "/home/user"})
  214. # Mimic youtube-dl post process behaviour
  215. ditem.update_stats({"filename": "file",
  216. "extension": ".webm",
  217. "percent": "100%",
  218. "speed": "",
  219. "eta": "",
  220. "status": "Post Processing"})
  221. self.assertEqual(ditem.filesizes, [10485760.00, 3617587.20, 14103347.20])
  222. self.assertEqual(
  223. ditem.progress_stats,
  224. {"filename": "file",
  225. "extension": ".webm",
  226. "filesize": "13.45MiB",
  227. "percent": "100%",
  228. "speed": "-",
  229. "eta": "-",
  230. "status": "Post Processing",
  231. "playlist_size": "",
  232. "playlist_index": ""}
  233. )
  234. class TestReset(unittest.TestCase):
  235. """Test case for the DownloadItem reset method."""
  236. def setUp(self):
  237. self.ditem = DownloadItem("url", ["-f", "flv"])
  238. def test_reset_completed_stage(self):
  239. self.ditem._stage = "Completed"
  240. self.ditem.path = os.path.join("/home", "user")
  241. self.ditem.filenames = ["file"]
  242. self.ditem.extensions = [".mp4"]
  243. self.ditem.filesizes = [123456.00]
  244. self.ditem.progress_stats = {
  245. "filename": "file",
  246. "extension": ".mp4",
  247. "filsize": "6.66MiB",
  248. "percent": "100%",
  249. "speed": "-",
  250. "eta": "00:00",
  251. "status": "Finished",
  252. "playlist_size": "",
  253. "playlist_index": ""
  254. }
  255. self.ditem.reset()
  256. self.assertEqual(self.ditem._stage, "Queued")
  257. self.assertEqual(self.ditem.path, "")
  258. self.assertEqual(self.ditem.filenames, [])
  259. self.assertEqual(self.ditem.extensions, [])
  260. self.assertEqual(self.ditem.filesizes, [])
  261. self.assertEqual(
  262. self.ditem.progress_stats,
  263. {"filename": "url",
  264. "extension": "-",
  265. "filesize": "-",
  266. "percent": "0%",
  267. "speed": "-",
  268. "eta": "-",
  269. "status": "Queued",
  270. "playlist_size": "",
  271. "playlist_index": ""}
  272. )
  273. def test_reset_error_stage(self):
  274. self.ditem._stage = "Error"
  275. self.ditem.path = os.path.join("/home", "user")
  276. self.ditem.filenames = ["file1", "file2", "file"]
  277. self.ditem.extensions = [".mp4", ".m4a", ".mp4"]
  278. self.ditem.filesizes = [1234.00, 3421.00, 4655.00]
  279. self.ditem.progress_stats = {
  280. "filename": "file",
  281. "extension": ".mp4",
  282. "filsize": "9.45MiB",
  283. "percent": "100%",
  284. "speed": "-",
  285. "eta": "00:00",
  286. "status": "Error",
  287. "playlist_size": "10",
  288. "playlist_index": "8"
  289. }
  290. self.ditem.reset()
  291. self.assertEqual(self.ditem._stage, "Queued")
  292. self.assertEqual(self.ditem.path, "")
  293. self.assertEqual(self.ditem.filenames, [])
  294. self.assertEqual(self.ditem.extensions, [])
  295. self.assertEqual(self.ditem.filesizes, [])
  296. self.assertEqual(
  297. self.ditem.progress_stats,
  298. {"filename": "url",
  299. "extension": "-",
  300. "filesize": "-",
  301. "percent": "0%",
  302. "speed": "-",
  303. "eta": "-",
  304. "status": "Queued",
  305. "playlist_size": "",
  306. "playlist_index": ""}
  307. )
  308. def test_reset_paused_stage(self):
  309. self.ditem._stage = "Paused"
  310. # No need to change filanames, extension, etc
  311. # since everything in pause state has the default value
  312. self.ditem.reset()
  313. self.assertEqual(self.ditem._stage, "Queued")
  314. def test_reset_active_stage(self):
  315. self.ditem._stage = "Active"
  316. self.ditem.path = os.path.join("/home", "user")
  317. self.ditem.filenames = ["file1"]
  318. self.ditem.extensions = [".mp4"]
  319. self.ditem.filesizes = [1234.00]
  320. self.ditem.progress_stats = {
  321. "filename": "file1",
  322. "extension": ".mp4",
  323. "filsize": "9.45MiB",
  324. "percent": "75.5%",
  325. "speed": "200.00KiB/s",
  326. "eta": "00:10",
  327. "status": "Downloading"
  328. }
  329. self.assertRaises(RuntimeError, self.ditem.reset)
  330. def main():
  331. unittest.main()
  332. if __name__ == '__main__':
  333. main()