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.

276 lines
7.6 KiB

  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. """Contains test cases for the DownloadList 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. import mock
  12. from youtube_dl_gui.downloadmanager import DownloadList, synchronized
  13. except ImportError as error:
  14. print error
  15. sys.exit(1)
  16. class TestInit(unittest.TestCase):
  17. """Test case for the DownloadList init."""
  18. def test_init(self):
  19. mocks = [mock.Mock(object_id=0), mock.Mock(object_id=1)]
  20. dlist = DownloadList(mocks)
  21. self.assertEqual(dlist._items_list, [0, 1])
  22. self.assertEqual(dlist._items_dict, {0: mocks[0], 1: mocks[1]})
  23. def test_init_empty(self):
  24. dlist = DownloadList()
  25. self.assertEqual(dlist._items_list, [])
  26. self.assertEqual(dlist._items_dict, {})
  27. def test_init_invalid_args(self):
  28. self.assertRaises(AssertionError, DownloadList, {})
  29. self.assertRaises(AssertionError, DownloadList, ())
  30. self.assertRaises(AssertionError, DownloadList, False)
  31. class TestInsert(unittest.TestCase):
  32. """Test case for the DownloadList insert method."""
  33. def test_insert(self):
  34. mock_ditem = mock.Mock(object_id=0)
  35. dlist = DownloadList()
  36. dlist.insert(mock_ditem)
  37. self.assertEqual(dlist._items_list, [0])
  38. self.assertEqual(dlist._items_dict, {0: mock_ditem})
  39. class TestRemove(unittest.TestCase):
  40. """Test case for the DownloadList remove method."""
  41. def setUp(self):
  42. self.mocks = [mock.Mock(object_id=0), mock.Mock(object_id=1), mock.Mock(object_id=2)]
  43. self.dlist = DownloadList(self.mocks)
  44. def test_remove(self):
  45. self.assertTrue(self.dlist.remove(1))
  46. self.assertEqual(self.dlist._items_list, [0, 2])
  47. self.assertEqual(self.dlist._items_dict, {0: self.mocks[0], 2: self.mocks[2]})
  48. def test_remove_not_exist(self):
  49. self.assertRaises(KeyError, self.dlist.remove, 3)
  50. def test_remove_active(self):
  51. self.mocks[1].stage = "Active"
  52. self.assertFalse(self.dlist.remove(1))
  53. self.assertEqual(self.dlist._items_list, [0, 1, 2])
  54. self.assertEqual(self.dlist._items_dict, {0: self.mocks[0], 1: self.mocks[1], 2: self.mocks[2]})
  55. class TestFetchNext(unittest.TestCase):
  56. """Test case for the DownloadList fetch_next method."""
  57. def test_fetch_next(self):
  58. items_count = 3
  59. mocks = [mock.Mock(object_id=i, stage="Queued") for i in range(items_count)]
  60. dlist = DownloadList(mocks)
  61. for i in range(items_count):
  62. self.assertEqual(dlist.fetch_next(), mocks[i])
  63. mocks[i].stage = "Active"
  64. self.assertIsNone(dlist.fetch_next())
  65. for i in range(items_count):
  66. mocks[i].stage = "Completed"
  67. self.assertIsNone(dlist.fetch_next())
  68. mocks[1].stage = "Queued" # Re-queue item
  69. self.assertEqual(dlist.fetch_next(), mocks[1])
  70. def test_fetch_next_empty_list(self):
  71. dlist = DownloadList()
  72. self.assertIsNone(dlist.fetch_next())
  73. class TestMoveUp(unittest.TestCase):
  74. """Test case for the DownloadList move_up method."""
  75. def setUp(self):
  76. mocks = [mock.Mock(object_id=i, stage="Queued") for i in range(3)]
  77. self.dlist = DownloadList(mocks)
  78. def test_move_up(self):
  79. self.assertTrue(self.dlist.move_up(1))
  80. self.assertEqual(self.dlist._items_list, [1, 0, 2])
  81. def test_move_up_already_on_top(self):
  82. self.assertFalse(self.dlist.move_up(0))
  83. self.assertEqual(self.dlist._items_list, [0, 1, 2])
  84. def test_move_up_not_exist(self):
  85. self.assertRaises(ValueError, self.dlist.move_up, 666)
  86. class TestMoveDown(unittest.TestCase):
  87. """Test case for the DownloadList move_down method."""
  88. def setUp(self):
  89. mocks = [mock.Mock(object_id=i, stage="Queued") for i in range(3)]
  90. self.dlist = DownloadList(mocks)
  91. def test_move_down(self):
  92. self.assertTrue(self.dlist.move_down(1))
  93. self.assertEqual(self.dlist._items_list, [0, 2, 1])
  94. def test_move_down_already_on_bottom(self):
  95. self.assertFalse(self.dlist.move_down(2))
  96. self.assertEqual(self.dlist._items_list, [0, 1, 2])
  97. def test_move_down_not_exist(self):
  98. self.assertRaises(ValueError, self.dlist.move_down, 666)
  99. class TestGetItem(unittest.TestCase):
  100. """Test case for the DownloadList get_item method."""
  101. def test_get_item(self):
  102. mocks = [mock.Mock(object_id=i) for i in range(3)]
  103. dlist = DownloadList(mocks)
  104. self.assertEqual(dlist.get_item(0), mocks[0])
  105. self.assertEqual(dlist.get_item(2), mocks[2])
  106. def test_get_item_not_exist(self):
  107. dlist = DownloadList()
  108. self.assertRaises(KeyError, dlist.get_item, 0)
  109. class TestGetLength(unittest.TestCase):
  110. """Test case for the DownloadList __len__ method."""
  111. def test_get_length(self):
  112. dlist = DownloadList([mock.Mock(), mock.Mock()])
  113. self.assertEqual(len(dlist), 2)
  114. def test_get_length_empty_list(self):
  115. dlist = DownloadList()
  116. self.assertEqual(len(dlist), 0)
  117. class TestHasItem(unittest.TestCase):
  118. """Test case for the DownloadList has_item method."""
  119. def setUp(self):
  120. mock_ditem = mock.Mock(object_id=1337)
  121. self.dlist = DownloadList([mock_ditem])
  122. def test_has_item_true(self):
  123. self.assertTrue(self.dlist.has_item(1337))
  124. def test_has_item_false(self):
  125. self.assertFalse(self.dlist.has_item(1000))
  126. class TestGetItems(unittest.TestCase):
  127. """Test case for the DownloadList get_items method."""
  128. def test_get_items(self):
  129. mocks = [mock.Mock() for _ in range(3)]
  130. dlist = DownloadList(mocks)
  131. self.assertEqual(dlist.get_items(), mocks)
  132. def test_get_items_empty_list(self):
  133. dlist = DownloadList()
  134. self.assertEqual(dlist.get_items(), [])
  135. class TestClear(unittest.TestCase):
  136. """Test case for the DownloadList clear method."""
  137. def test_clear(self):
  138. dlist = DownloadList([mock.Mock() for _ in range(3)])
  139. self.assertEqual(len(dlist), 3)
  140. dlist.clear()
  141. self.assertEqual(len(dlist), 0)
  142. class TestChangeStage(unittest.TestCase):
  143. """Test case for the DownloadList change_stage method."""
  144. def setUp(self):
  145. self.mocks = [mock.Mock(object_id=i, stage="Queued") for i in range(3)]
  146. self.dlist = DownloadList(self.mocks)
  147. def test_change_stage(self):
  148. self.dlist.change_stage(0, "Active")
  149. self.assertEqual(self.mocks[0].stage, "Active")
  150. def test_change_stage_id_not_exist(self):
  151. self.assertRaises(KeyError, self.dlist.change_stage, 3, "Active")
  152. class TestIndex(unittest.TestCase):
  153. """Test case for the DownloadList index method."""
  154. def setUp(self):
  155. self.mocks = [mock.Mock(object_id=i) for i in range(3)]
  156. self.dlist = DownloadList(self.mocks)
  157. def test_index(self):
  158. self.assertEqual(self.dlist.index(2), 2)
  159. def test_index_not_exist(self):
  160. self.assertEqual(self.dlist.index(3), -1)
  161. class TestSynchronizeDecorator(unittest.TestCase):
  162. def test_synchronize(self):
  163. mock_func = mock.Mock()
  164. mock_lock = mock.Mock()
  165. decorated_func = synchronized(mock_lock)(mock_func)
  166. self.assertEqual(decorated_func(1, a=2), mock_func.return_value)
  167. mock_func.assert_called_once_with(1, a=2)
  168. mock_lock.acquire.assert_called_once()
  169. mock_lock.release.assert_called_once()
  170. def main():
  171. unittest.main()
  172. if __name__ == '__main__':
  173. main()