sort_service_test.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. from .. import unittest
  2. from compose.config.types import VolumeFromSpec
  3. from compose.project import DependencyError
  4. from compose.project import sort_service_dicts
  5. class SortServiceTest(unittest.TestCase):
  6. def test_sort_service_dicts_1(self):
  7. services = [
  8. {
  9. 'links': ['redis'],
  10. 'name': 'web'
  11. },
  12. {
  13. 'name': 'grunt'
  14. },
  15. {
  16. 'name': 'redis'
  17. }
  18. ]
  19. sorted_services = sort_service_dicts(services)
  20. self.assertEqual(len(sorted_services), 3)
  21. self.assertEqual(sorted_services[0]['name'], 'grunt')
  22. self.assertEqual(sorted_services[1]['name'], 'redis')
  23. self.assertEqual(sorted_services[2]['name'], 'web')
  24. def test_sort_service_dicts_2(self):
  25. services = [
  26. {
  27. 'links': ['redis', 'postgres'],
  28. 'name': 'web'
  29. },
  30. {
  31. 'name': 'postgres',
  32. 'links': ['redis']
  33. },
  34. {
  35. 'name': 'redis'
  36. }
  37. ]
  38. sorted_services = sort_service_dicts(services)
  39. self.assertEqual(len(sorted_services), 3)
  40. self.assertEqual(sorted_services[0]['name'], 'redis')
  41. self.assertEqual(sorted_services[1]['name'], 'postgres')
  42. self.assertEqual(sorted_services[2]['name'], 'web')
  43. def test_sort_service_dicts_3(self):
  44. services = [
  45. {
  46. 'name': 'child'
  47. },
  48. {
  49. 'name': 'parent',
  50. 'links': ['child']
  51. },
  52. {
  53. 'links': ['parent'],
  54. 'name': 'grandparent'
  55. },
  56. ]
  57. sorted_services = sort_service_dicts(services)
  58. self.assertEqual(len(sorted_services), 3)
  59. self.assertEqual(sorted_services[0]['name'], 'child')
  60. self.assertEqual(sorted_services[1]['name'], 'parent')
  61. self.assertEqual(sorted_services[2]['name'], 'grandparent')
  62. def test_sort_service_dicts_4(self):
  63. services = [
  64. {
  65. 'name': 'child'
  66. },
  67. {
  68. 'name': 'parent',
  69. 'volumes_from': [VolumeFromSpec('child', 'rw')]
  70. },
  71. {
  72. 'links': ['parent'],
  73. 'name': 'grandparent'
  74. },
  75. ]
  76. sorted_services = sort_service_dicts(services)
  77. self.assertEqual(len(sorted_services), 3)
  78. self.assertEqual(sorted_services[0]['name'], 'child')
  79. self.assertEqual(sorted_services[1]['name'], 'parent')
  80. self.assertEqual(sorted_services[2]['name'], 'grandparent')
  81. def test_sort_service_dicts_5(self):
  82. services = [
  83. {
  84. 'links': ['parent'],
  85. 'name': 'grandparent'
  86. },
  87. {
  88. 'name': 'parent',
  89. 'net': 'container:child'
  90. },
  91. {
  92. 'name': 'child'
  93. }
  94. ]
  95. sorted_services = sort_service_dicts(services)
  96. self.assertEqual(len(sorted_services), 3)
  97. self.assertEqual(sorted_services[0]['name'], 'child')
  98. self.assertEqual(sorted_services[1]['name'], 'parent')
  99. self.assertEqual(sorted_services[2]['name'], 'grandparent')
  100. def test_sort_service_dicts_6(self):
  101. services = [
  102. {
  103. 'links': ['parent'],
  104. 'name': 'grandparent'
  105. },
  106. {
  107. 'name': 'parent',
  108. 'volumes_from': [VolumeFromSpec('child', 'ro')]
  109. },
  110. {
  111. 'name': 'child'
  112. }
  113. ]
  114. sorted_services = sort_service_dicts(services)
  115. self.assertEqual(len(sorted_services), 3)
  116. self.assertEqual(sorted_services[0]['name'], 'child')
  117. self.assertEqual(sorted_services[1]['name'], 'parent')
  118. self.assertEqual(sorted_services[2]['name'], 'grandparent')
  119. def test_sort_service_dicts_7(self):
  120. services = [
  121. {
  122. 'net': 'container:three',
  123. 'name': 'four'
  124. },
  125. {
  126. 'links': ['two'],
  127. 'name': 'three'
  128. },
  129. {
  130. 'name': 'two',
  131. 'volumes_from': [VolumeFromSpec('one', 'rw')]
  132. },
  133. {
  134. 'name': 'one'
  135. }
  136. ]
  137. sorted_services = sort_service_dicts(services)
  138. self.assertEqual(len(sorted_services), 4)
  139. self.assertEqual(sorted_services[0]['name'], 'one')
  140. self.assertEqual(sorted_services[1]['name'], 'two')
  141. self.assertEqual(sorted_services[2]['name'], 'three')
  142. self.assertEqual(sorted_services[3]['name'], 'four')
  143. def test_sort_service_dicts_circular_imports(self):
  144. services = [
  145. {
  146. 'links': ['redis'],
  147. 'name': 'web'
  148. },
  149. {
  150. 'name': 'redis',
  151. 'links': ['web']
  152. },
  153. ]
  154. try:
  155. sort_service_dicts(services)
  156. except DependencyError as e:
  157. self.assertIn('redis', e.msg)
  158. self.assertIn('web', e.msg)
  159. else:
  160. self.fail('Should have thrown an DependencyError')
  161. def test_sort_service_dicts_circular_imports_2(self):
  162. services = [
  163. {
  164. 'links': ['postgres', 'redis'],
  165. 'name': 'web'
  166. },
  167. {
  168. 'name': 'redis',
  169. 'links': ['web']
  170. },
  171. {
  172. 'name': 'postgres'
  173. }
  174. ]
  175. try:
  176. sort_service_dicts(services)
  177. except DependencyError as e:
  178. self.assertIn('redis', e.msg)
  179. self.assertIn('web', e.msg)
  180. else:
  181. self.fail('Should have thrown an DependencyError')
  182. def test_sort_service_dicts_circular_imports_3(self):
  183. services = [
  184. {
  185. 'links': ['b'],
  186. 'name': 'a'
  187. },
  188. {
  189. 'name': 'b',
  190. 'links': ['c']
  191. },
  192. {
  193. 'name': 'c',
  194. 'links': ['a']
  195. }
  196. ]
  197. try:
  198. sort_service_dicts(services)
  199. except DependencyError as e:
  200. self.assertIn('a', e.msg)
  201. self.assertIn('b', e.msg)
  202. else:
  203. self.fail('Should have thrown an DependencyError')
  204. def test_sort_service_dicts_self_imports(self):
  205. services = [
  206. {
  207. 'links': ['web'],
  208. 'name': 'web'
  209. },
  210. ]
  211. try:
  212. sort_service_dicts(services)
  213. except DependencyError as e:
  214. self.assertIn('web', e.msg)
  215. else:
  216. self.fail('Should have thrown an DependencyError')