sort_services_test.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import pytest
  2. from compose.config.errors import DependencyError
  3. from compose.config.sort_services import sort_service_dicts
  4. from compose.config.types import VolumeFromSpec
  5. class TestSortService:
  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. assert len(sorted_services) == 3
  21. assert sorted_services[0]['name'] == 'grunt'
  22. assert sorted_services[1]['name'] == 'redis'
  23. assert 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. assert len(sorted_services) == 3
  40. assert sorted_services[0]['name'] == 'redis'
  41. assert sorted_services[1]['name'] == 'postgres'
  42. assert 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. assert len(sorted_services) == 3
  59. assert sorted_services[0]['name'] == 'child'
  60. assert sorted_services[1]['name'] == 'parent'
  61. assert 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', 'service')]
  70. },
  71. {
  72. 'links': ['parent'],
  73. 'name': 'grandparent'
  74. },
  75. ]
  76. sorted_services = sort_service_dicts(services)
  77. assert len(sorted_services) == 3
  78. assert sorted_services[0]['name'] == 'child'
  79. assert sorted_services[1]['name'] == 'parent'
  80. assert 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. 'network_mode': 'service:child'
  90. },
  91. {
  92. 'name': 'child'
  93. }
  94. ]
  95. sorted_services = sort_service_dicts(services)
  96. assert len(sorted_services) == 3
  97. assert sorted_services[0]['name'] == 'child'
  98. assert sorted_services[1]['name'] == 'parent'
  99. assert 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', 'service')]
  109. },
  110. {
  111. 'name': 'child'
  112. }
  113. ]
  114. sorted_services = sort_service_dicts(services)
  115. assert len(sorted_services) == 3
  116. assert sorted_services[0]['name'] == 'child'
  117. assert sorted_services[1]['name'] == 'parent'
  118. assert sorted_services[2]['name'] == 'grandparent'
  119. def test_sort_service_dicts_7(self):
  120. services = [
  121. {
  122. 'network_mode': 'service:three',
  123. 'name': 'four'
  124. },
  125. {
  126. 'links': ['two'],
  127. 'name': 'three'
  128. },
  129. {
  130. 'name': 'two',
  131. 'volumes_from': [VolumeFromSpec('one', 'rw', 'service')]
  132. },
  133. {
  134. 'name': 'one'
  135. }
  136. ]
  137. sorted_services = sort_service_dicts(services)
  138. assert len(sorted_services) == 4
  139. assert sorted_services[0]['name'] == 'one'
  140. assert sorted_services[1]['name'] == 'two'
  141. assert sorted_services[2]['name'] == 'three'
  142. assert 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. with pytest.raises(DependencyError) as exc:
  155. sort_service_dicts(services)
  156. assert 'redis' in exc.exconly()
  157. assert 'web' in exc.exconly()
  158. def test_sort_service_dicts_circular_imports_2(self):
  159. services = [
  160. {
  161. 'links': ['postgres', 'redis'],
  162. 'name': 'web'
  163. },
  164. {
  165. 'name': 'redis',
  166. 'links': ['web']
  167. },
  168. {
  169. 'name': 'postgres'
  170. }
  171. ]
  172. with pytest.raises(DependencyError) as exc:
  173. sort_service_dicts(services)
  174. assert 'redis' in exc.exconly()
  175. assert 'web' in exc.exconly()
  176. def test_sort_service_dicts_circular_imports_3(self):
  177. services = [
  178. {
  179. 'links': ['b'],
  180. 'name': 'a'
  181. },
  182. {
  183. 'name': 'b',
  184. 'links': ['c']
  185. },
  186. {
  187. 'name': 'c',
  188. 'links': ['a']
  189. }
  190. ]
  191. with pytest.raises(DependencyError) as exc:
  192. sort_service_dicts(services)
  193. assert 'a' in exc.exconly()
  194. assert 'b' in exc.exconly()
  195. def test_sort_service_dicts_self_imports(self):
  196. services = [
  197. {
  198. 'links': ['web'],
  199. 'name': 'web'
  200. },
  201. ]
  202. with pytest.raises(DependencyError) as exc:
  203. sort_service_dicts(services)
  204. assert 'web' in exc.exconly()
  205. def test_sort_service_dicts_depends_on_self(self):
  206. services = [
  207. {
  208. 'depends_on': ['web'],
  209. 'name': 'web'
  210. },
  211. ]
  212. with pytest.raises(DependencyError) as exc:
  213. sort_service_dicts(services)
  214. assert 'A service can not depend on itself: web' in exc.exconly()