shipit-engine 0.28.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -2
  3. data/Rakefile +4 -2
  4. data/app/assets/images/archive-solid.svg +1 -0
  5. data/app/assets/stylesheets/_pages/_stacks.scss +76 -3
  6. data/app/assets/stylesheets/_structure/_main.scss +2 -1
  7. data/app/assets/stylesheets/merge_status.scss +0 -3
  8. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +13 -0
  9. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  10. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  11. data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
  12. data/app/controllers/concerns/shipit/authentication.rb +3 -2
  13. data/app/controllers/concerns/shipit/pagination.rb +2 -1
  14. data/app/controllers/shipit/api/base_controller.rb +11 -6
  15. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  16. data/app/controllers/shipit/api/commits_controller.rb +2 -1
  17. data/app/controllers/shipit/api/deploys_controller.rb +4 -3
  18. data/app/controllers/shipit/api/hooks_controller.rb +6 -5
  19. data/app/controllers/shipit/api/locks_controller.rb +5 -4
  20. data/app/controllers/shipit/api/outputs_controller.rb +2 -1
  21. data/app/controllers/shipit/api/pull_requests_controller.rb +7 -6
  22. data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
  23. data/app/controllers/shipit/api/rollbacks_controller.rb +33 -0
  24. data/app/controllers/shipit/api/stacks_controller.rb +37 -5
  25. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  26. data/app/controllers/shipit/api_clients_controller.rb +50 -0
  27. data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
  28. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  29. data/app/controllers/shipit/commits_controller.rb +2 -1
  30. data/app/controllers/shipit/deploys_controller.rb +3 -2
  31. data/app/controllers/shipit/github_authentication_controller.rb +4 -3
  32. data/app/controllers/shipit/merge_status_controller.rb +19 -14
  33. data/app/controllers/shipit/pull_requests_controller.rb +3 -2
  34. data/app/controllers/shipit/release_statuses_controller.rb +3 -2
  35. data/app/controllers/shipit/rollbacks_controller.rb +3 -2
  36. data/app/controllers/shipit/shipit_controller.rb +2 -1
  37. data/app/controllers/shipit/stacks_controller.rb +78 -14
  38. data/app/controllers/shipit/status_controller.rb +2 -1
  39. data/app/controllers/shipit/tasks_controller.rb +6 -5
  40. data/app/controllers/shipit/webhooks_controller.rb +5 -132
  41. data/app/helpers/shipit/chunks_helper.rb +1 -0
  42. data/app/helpers/shipit/deploys_helper.rb +4 -3
  43. data/app/helpers/shipit/github_url_helper.rb +1 -0
  44. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  45. data/app/helpers/shipit/shipit_helper.rb +1 -0
  46. data/app/helpers/shipit/stacks_helper.rb +5 -0
  47. data/app/helpers/shipit/tasks_helper.rb +1 -0
  48. data/app/jobs/shipit/background_job.rb +4 -0
  49. data/app/jobs/shipit/background_job/unique.rb +4 -1
  50. data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
  51. data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
  52. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  53. data/app/jobs/shipit/continuous_delivery_job.rb +3 -1
  54. data/app/jobs/shipit/create_on_github_job.rb +6 -1
  55. data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
  56. data/app/jobs/shipit/deferred_touch_job.rb +4 -0
  57. data/app/jobs/shipit/deliver_hook_job.rb +1 -0
  58. data/app/jobs/shipit/destroy_job.rb +1 -0
  59. data/app/jobs/shipit/destroy_stack_job.rb +3 -2
  60. data/app/jobs/shipit/emit_event_job.rb +2 -1
  61. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  62. data/app/jobs/shipit/fetch_deployed_revision_job.rb +2 -1
  63. data/app/jobs/shipit/github_sync_job.rb +3 -2
  64. data/app/jobs/shipit/{mark_deploy_healty_job.rb → mark_deploy_healthy_job.rb} +1 -0
  65. data/app/jobs/shipit/merge_pull_requests_job.rb +1 -0
  66. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  67. data/app/jobs/shipit/perform_task_job.rb +14 -5
  68. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  69. data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
  70. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  72. data/app/jobs/shipit/refresh_pull_request_job.rb +1 -0
  73. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  74. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  75. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  76. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -3
  77. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  78. data/app/models/shipit/anonymous_user.rb +5 -0
  79. data/app/models/shipit/api_client.rb +3 -2
  80. data/app/models/shipit/application_record.rb +2 -1
  81. data/app/models/shipit/check_run.rb +4 -3
  82. data/app/models/shipit/command_line_user.rb +1 -0
  83. data/app/models/shipit/commit.rb +31 -12
  84. data/app/models/shipit/commit_checks.rb +1 -0
  85. data/app/models/shipit/commit_deployment.rb +17 -12
  86. data/app/models/shipit/commit_deployment_status.rb +8 -3
  87. data/app/models/shipit/commit_message.rb +1 -0
  88. data/app/models/shipit/delivery.rb +4 -3
  89. data/app/models/shipit/deploy.rb +40 -10
  90. data/app/models/shipit/deploy_spec.rb +22 -3
  91. data/app/models/shipit/deploy_spec/bundler_discovery.rb +2 -1
  92. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  93. data/app/models/shipit/deploy_spec/file_system.rb +10 -3
  94. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
  95. data/app/models/shipit/deploy_spec/lerna_discovery.rb +1 -0
  96. data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
  97. data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
  98. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  99. data/app/models/shipit/deploy_stats.rb +58 -0
  100. data/app/models/shipit/duration.rb +3 -2
  101. data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
  102. data/app/models/shipit/github_hook.rb +2 -1
  103. data/app/models/shipit/github_status.rb +3 -2
  104. data/app/models/shipit/hook.rb +6 -5
  105. data/app/models/shipit/membership.rb +3 -2
  106. data/app/models/shipit/output_chunk.rb +7 -2
  107. data/app/models/shipit/pull_request.rb +13 -7
  108. data/app/models/shipit/record.rb +18 -0
  109. data/app/models/shipit/release_status.rb +3 -2
  110. data/app/models/shipit/repository.rb +43 -0
  111. data/app/models/shipit/rollback.rb +1 -0
  112. data/app/models/shipit/stack.rb +109 -50
  113. data/app/models/shipit/status.rb +3 -2
  114. data/app/models/shipit/status/common.rb +7 -6
  115. data/app/models/shipit/status/group.rb +1 -0
  116. data/app/models/shipit/status/missing.rb +2 -1
  117. data/app/models/shipit/status/unknown.rb +2 -1
  118. data/app/models/shipit/task.rb +64 -9
  119. data/app/models/shipit/task_definition.rb +1 -0
  120. data/app/models/shipit/team.rb +2 -1
  121. data/app/models/shipit/undeployed_commit.rb +1 -0
  122. data/app/models/shipit/unlimited_api_client.rb +1 -0
  123. data/app/models/shipit/user.rb +29 -5
  124. data/app/models/shipit/variable_definition.rb +1 -0
  125. data/app/models/shipit/webhooks.rb +33 -0
  126. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +20 -0
  127. data/app/models/shipit/webhooks/handlers/handler.rb +41 -0
  128. data/app/models/shipit/webhooks/handlers/membership_handler.rb +46 -0
  129. data/app/models/shipit/webhooks/handlers/push_handler.rb +21 -0
  130. data/app/models/shipit/webhooks/handlers/status_handler.rb +27 -0
  131. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  132. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  133. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  134. data/app/serializers/shipit/commit_serializer.rb +1 -0
  135. data/app/serializers/shipit/deploy_serializer.rb +2 -1
  136. data/app/serializers/shipit/hook_serializer.rb +1 -0
  137. data/app/serializers/shipit/pull_request_serializer.rb +1 -0
  138. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  139. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  140. data/app/serializers/shipit/stack_serializer.rb +7 -1
  141. data/app/serializers/shipit/tail_task_serializer.rb +1 -0
  142. data/app/serializers/shipit/task_serializer.rb +2 -17
  143. data/app/serializers/shipit/user_serializer.rb +6 -1
  144. data/app/validators/ascii_only_validator.rb +4 -3
  145. data/app/validators/subset_validator.rb +1 -0
  146. data/app/views/layouts/_head.html.erb +0 -0
  147. data/app/views/layouts/shipit.html.erb +6 -4
  148. data/app/views/shipit/_variables.html.erb +1 -1
  149. data/app/views/shipit/api_clients/index.html.erb +36 -0
  150. data/app/views/shipit/api_clients/new.html.erb +33 -0
  151. data/app/views/shipit/api_clients/show.html.erb +35 -0
  152. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  153. data/app/views/shipit/deploys/new.html.erb +17 -12
  154. data/app/views/shipit/deploys/show.html.erb +2 -2
  155. data/app/views/shipit/merge_status/logged_out.erb +1 -1
  156. data/app/views/shipit/stacks/_header.html.erb +27 -12
  157. data/app/views/shipit/stacks/_links.html.erb +1 -0
  158. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  159. data/app/views/shipit/stacks/index.html.erb +7 -2
  160. data/app/views/shipit/stacks/settings.html.erb +19 -0
  161. data/app/views/shipit/stacks/statistics.html.erb +82 -0
  162. data/app/views/shipit/tasks/show.html.erb +1 -1
  163. data/config/initializers/inflections.rb +2 -1
  164. data/config/locales/en.yml +18 -5
  165. data/config/routes.rb +14 -2
  166. data/db/migrate/20191209231045_create_shipit_repositories.rb +12 -0
  167. data/db/migrate/20191209231307_add_repository_reference_to_stacks.rb +15 -0
  168. data/db/migrate/20191216162728_backfill_repository_data.rb +22 -0
  169. data/db/migrate/20191216163010_remove_repository_information_from_stacks.rb +20 -0
  170. data/db/migrate/20191219205202_add_archived_since_to_stacks.rb +6 -0
  171. data/db/migrate/20200102175621_optional_task_commits.rb +6 -0
  172. data/db/migrate/20200109132519_add_sha_to_commit_deployments.rb +5 -0
  173. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  174. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  175. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  176. data/lib/shipit.rb +18 -20
  177. data/lib/shipit/cast_value.rb +1 -0
  178. data/lib/shipit/command.rb +14 -18
  179. data/lib/shipit/commands.rb +5 -4
  180. data/lib/shipit/csv_serializer.rb +1 -0
  181. data/lib/shipit/deploy_commands.rb +1 -0
  182. data/lib/shipit/engine.rb +11 -2
  183. data/lib/shipit/environment_variables.rb +11 -1
  184. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  185. data/lib/shipit/flock.rb +1 -0
  186. data/lib/shipit/github_app.rb +60 -6
  187. data/lib/shipit/github_http_cache_middleware.rb +57 -0
  188. data/lib/shipit/null_serializer.rb +1 -0
  189. data/lib/shipit/octokit_check_runs.rb +3 -2
  190. data/lib/shipit/octokit_iterator.rb +3 -2
  191. data/lib/shipit/paginator.rb +3 -2
  192. data/lib/shipit/rollback_commands.rb +1 -0
  193. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  194. data/lib/shipit/simple_message_verifier.rb +1 -0
  195. data/lib/shipit/stack_commands.rb +6 -3
  196. data/lib/shipit/stat.rb +1 -0
  197. data/lib/shipit/task_commands.rb +22 -14
  198. data/lib/shipit/version.rb +2 -1
  199. data/lib/snippets/release-gem +5 -1
  200. data/lib/tasks/cron.rake +2 -0
  201. data/lib/tasks/dev.rake +3 -2
  202. data/lib/tasks/shipit.rake +16 -17
  203. data/lib/tasks/teams.rake +1 -0
  204. data/test/controllers/api/base_controller_test.rb +3 -2
  205. data/test/controllers/api/ccmenu_controller_test.rb +9 -8
  206. data/test/controllers/api/commits_controller_test.rb +3 -2
  207. data/test/controllers/api/deploys_controller_test.rb +15 -14
  208. data/test/controllers/api/hooks_controller_test.rb +8 -7
  209. data/test/controllers/api/locks_controller_test.rb +7 -6
  210. data/test/controllers/api/outputs_controller_test.rb +3 -2
  211. data/test/controllers/api/pull_requests_controller_test.rb +8 -7
  212. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  213. data/test/controllers/api/rollback_controller_test.rb +113 -0
  214. data/test/controllers/api/stacks_controller_test.rb +44 -15
  215. data/test/controllers/api/tasks_controller_test.rb +13 -12
  216. data/test/controllers/api_clients_controller_test.rb +104 -0
  217. data/test/controllers/ccmenu_controller_test.rb +4 -3
  218. data/test/controllers/commit_checks_controller_test.rb +4 -3
  219. data/test/controllers/commits_controller_test.rb +3 -2
  220. data/test/controllers/deploys_controller_test.rb +33 -22
  221. data/test/controllers/github_authentication_controller_test.rb +1 -0
  222. data/test/controllers/merge_status_controller_test.rb +27 -9
  223. data/test/controllers/pull_requests_controller_test.rb +4 -3
  224. data/test/controllers/release_statuses_controller_test.rb +3 -2
  225. data/test/controllers/rollbacks_controller_test.rb +9 -8
  226. data/test/controllers/stacks_controller_test.rb +64 -15
  227. data/test/controllers/status_controller_test.rb +1 -0
  228. data/test/controllers/tasks_controller_test.rb +20 -19
  229. data/test/controllers/webhooks_controller_test.rb +36 -9
  230. data/test/dummy/config/application.rb +1 -1
  231. data/test/dummy/config/environments/development.rb +24 -4
  232. data/test/dummy/config/environments/test.rb +2 -0
  233. data/test/dummy/db/schema.rb +25 -11
  234. data/test/dummy/db/seeds.rb +34 -17
  235. data/test/fixtures/shipit/commit_deployment_statuses.yml +4 -4
  236. data/test/fixtures/shipit/commit_deployments.yml +8 -8
  237. data/test/fixtures/shipit/commits.yml +38 -0
  238. data/test/fixtures/shipit/repositories.yml +27 -0
  239. data/test/fixtures/shipit/stacks.yml +190 -30
  240. data/test/fixtures/shipit/tasks.yml +66 -3
  241. data/test/fixtures/timeout +2 -1
  242. data/test/helpers/api_helper.rb +1 -0
  243. data/test/helpers/fixture_aliases_helper.rb +1 -0
  244. data/test/helpers/hooks_helper.rb +2 -1
  245. data/test/helpers/json_helper.rb +15 -11
  246. data/test/helpers/links_helper.rb +4 -3
  247. data/test/helpers/payloads_helper.rb +1 -0
  248. data/test/helpers/queries_helper.rb +3 -2
  249. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  250. data/test/jobs/chunk_rollup_job_test.rb +1 -0
  251. data/test/jobs/deliver_hook_job_test.rb +2 -1
  252. data/test/jobs/destroy_stack_job_test.rb +10 -0
  253. data/test/jobs/emit_event_job_test.rb +2 -1
  254. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  255. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  256. data/test/jobs/github_sync_job_test.rb +1 -0
  257. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  258. data/test/jobs/merge_pull_requests_job_test.rb +5 -4
  259. data/test/jobs/perform_task_job_test.rb +4 -3
  260. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  261. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  262. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  263. data/test/jobs/refresh_status_job_test.rb +1 -0
  264. data/test/jobs/unique_job_test.rb +1 -0
  265. data/test/jobs/update_github_last_deployed_ref_job_test.rb +13 -11
  266. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  267. data/test/models/api_client_test.rb +1 -0
  268. data/test/models/commit_checks_test.rb +1 -0
  269. data/test/models/commit_deployment_status_test.rb +34 -4
  270. data/test/models/commit_deployment_test.rb +9 -11
  271. data/test/models/commits_test.rb +99 -7
  272. data/test/models/delivery_test.rb +3 -2
  273. data/test/models/deploy_spec_test.rb +47 -42
  274. data/test/models/deploy_stats_test.rb +113 -0
  275. data/test/models/deploys_test.rb +60 -13
  276. data/test/models/duration_test.rb +1 -0
  277. data/test/models/github_hook_test.rb +1 -0
  278. data/test/models/hook_test.rb +20 -16
  279. data/test/models/membership_test.rb +1 -0
  280. data/test/models/output_chunk_test.rb +1 -0
  281. data/test/models/pull_request_test.rb +18 -11
  282. data/test/models/release_statuses_test.rb +1 -0
  283. data/test/models/rollbacks_test.rb +1 -0
  284. data/test/models/shipit/check_run_test.rb +1 -0
  285. data/test/models/shipit/repository_test.rb +77 -0
  286. data/test/models/shipit/wehbooks/handlers_test.rb +27 -0
  287. data/test/models/stacks_test.rb +110 -56
  288. data/test/models/status/group_test.rb +1 -0
  289. data/test/models/status/missing_test.rb +1 -0
  290. data/test/models/status_test.rb +1 -0
  291. data/test/models/task_definitions_test.rb +9 -8
  292. data/test/models/tasks_test.rb +18 -1
  293. data/test/models/team_test.rb +4 -2
  294. data/test/models/undeployed_commits_test.rb +14 -0
  295. data/test/models/users_test.rb +109 -1
  296. data/test/test_command_integration.rb +3 -2
  297. data/test/test_helper.rb +38 -34
  298. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  299. data/test/unit/command_test.rb +12 -7
  300. data/test/unit/commands_test.rb +1 -0
  301. data/test/unit/commit_serializer_test.rb +16 -0
  302. data/test/unit/csv_serializer_test.rb +3 -2
  303. data/test/unit/deploy_commands_test.rb +14 -4
  304. data/test/unit/deploy_serializer_test.rb +17 -0
  305. data/test/unit/environment_variables_test.rb +5 -4
  306. data/test/unit/github_app_test.rb +165 -0
  307. data/test/unit/github_url_helper_test.rb +1 -0
  308. data/test/unit/rollback_commands_test.rb +2 -1
  309. data/test/unit/shipit_helper_test.rb +17 -0
  310. data/test/unit/shipit_test.rb +1 -0
  311. data/test/unit/user_serializer_test.rb +14 -0
  312. data/test/unit/variable_definition_test.rb +1 -0
  313. metadata +215 -157
  314. data/lib/shipit/strip_cache_control.rb +0 -40
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -9,7 +10,7 @@ module Shipit
9
10
  end
10
11
 
11
12
  test "#create sets a lock" do
12
- post :create, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
13
+ post :create, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
13
14
  assert_response :ok
14
15
  assert_json 'is_locked', true
15
16
  assert_json 'lock_reason', 'Just for fun!'
@@ -18,12 +19,12 @@ module Shipit
18
19
 
19
20
  test "#create fails if already locked" do
20
21
  @stack.update!(lock_reason: "Don't forget me")
21
- post :create, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
22
+ post :create, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
22
23
  assert_response :conflict
23
24
  end
24
25
 
25
26
  test "#update sets a lock" do
26
- put :update, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
27
+ put :update, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
27
28
  assert_response :ok
28
29
  assert_json 'is_locked', true
29
30
  assert_json 'lock_reason', 'Just for fun!'
@@ -31,7 +32,7 @@ module Shipit
31
32
 
32
33
  test "#update can override a previous lock" do
33
34
  @stack.update!(lock_reason: 'Meh...')
34
- put :update, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
35
+ put :update, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
35
36
  assert_response :ok
36
37
  assert_json 'is_locked', true
37
38
  assert_json 'lock_reason', 'Just for fun!'
@@ -40,14 +41,14 @@ module Shipit
40
41
  test "#update does not override previous locked_since" do
41
42
  since = Time.current.round
42
43
  @stack.update!(lock_reason: 'Meh...', locked_since: since)
43
- put :update, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
44
+ put :update, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
44
45
  assert_response :ok
45
46
  assert_json 'locked_since', since.utc.iso8601(3)
46
47
  end
47
48
 
48
49
  test "#destroy clears the lock" do
49
50
  @stack.update!(lock_reason: 'Meh...', locked_since: Time.current)
50
- delete :destroy, params: {stack_id: @stack.to_param}
51
+ delete :destroy, params: { stack_id: @stack.to_param }
51
52
  assert_response :ok
52
53
  assert_json 'is_locked', false
53
54
  assert_json { |json| assert_nil json['locked_since'] }
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -11,9 +12,9 @@ module Shipit
11
12
  test "#show returns the task output as plain text" do
12
13
  task = @stack.tasks.last
13
14
 
14
- get :show, params: {stack_id: @stack.to_param, task_id: task.id}
15
+ get :show, params: { stack_id: @stack.to_param, task_id: task.id }
15
16
  assert_response :ok
16
- assert_equal 'text/plain', response.content_type
17
+ assert_equal 'text/plain', response.media_type
17
18
  assert_equal task.chunk_output, response.body
18
19
  end
19
20
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -12,46 +13,46 @@ module Shipit
12
13
  test "#index returns a list of pull requests" do
13
14
  pull_request = @stack.pull_requests.last
14
15
 
15
- get :index, params: {stack_id: @stack.to_param}
16
+ get :index, params: { stack_id: @stack.to_param }
16
17
  assert_response :ok
17
18
  assert_json '0.id', pull_request.id
18
19
  end
19
20
 
20
21
  test "#show returns a single pull requests" do
21
- get :show, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
22
+ get :show, params: { stack_id: @stack.to_param, id: @pull_request.number.to_s }
22
23
  assert_response :ok
23
24
  assert_json 'id', @pull_request.id
24
25
  end
25
26
 
26
27
  test "#update responds with Accepted if the pull request was queued" do
27
28
  assert_enqueued_with(job: RefreshPullRequestJob) do
28
- put :update, params: {stack_id: @stack.to_param, id: '64'}
29
+ put :update, params: { stack_id: @stack.to_param, id: '64' }
29
30
  end
30
31
  assert_response :accepted
31
32
  end
32
33
 
33
34
  test "#update responds with Accepted if the pull request was already queued" do
34
35
  assert_enqueued_with(job: RefreshPullRequestJob) do
35
- put :update, params: {stack_id: @stack.to_param, id: '65'}
36
+ put :update, params: { stack_id: @stack.to_param, id: '65' }
36
37
  end
37
38
  assert_response :accepted
38
39
  end
39
40
 
40
41
  test "#update responds with method not allowed if the pull request was already merged" do
41
42
  @pull_request.complete!
42
- put :update, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
43
+ put :update, params: { stack_id: @stack.to_param, id: @pull_request.number.to_s }
43
44
  assert_response :method_not_allowed
44
45
  assert_json 'message', 'This pull request was already merged.'
45
46
  end
46
47
 
47
48
  test "#destroy cancels the merge if the pull request was waiting" do
48
- delete :destroy, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
49
+ delete :destroy, params: { stack_id: @stack.to_param, id: @pull_request.number.to_s }
49
50
  assert_response :no_content
50
51
  assert_predicate @pull_request.reload, :canceled?
51
52
  end
52
53
 
53
54
  test "#destroy silently fail if the pull request was unknown" do
54
- delete :destroy, params: {stack_id: @stack.to_param, id: '83453489'}
55
+ delete :destroy, params: { stack_id: @stack.to_param, id: '83453489' }
55
56
  assert_response :no_content
56
57
  end
57
58
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -10,7 +11,7 @@ module Shipit
10
11
  end
11
12
 
12
13
  test "#create renders a 422 if status is not found" do
13
- post :create, params: {stack_id: @stack.to_param, deploy_id: @deploy.id}
14
+ post :create, params: { stack_id: @stack.to_param, deploy_id: @deploy.id }
14
15
  assert_response :unprocessable_entity
15
16
  assert_json 'errors', 'status' => ['is required', 'is not included in the list']
16
17
  end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ module Api
6
+ class RollbacksControllerTest < ActionController::TestCase
7
+ setup do
8
+ authenticate!
9
+ @user = shipit_users(:walrus)
10
+ @stack = shipit_stacks(:shipit)
11
+ @commit = shipit_commits(:fourth)
12
+ end
13
+
14
+ test "#create triggers a new rollback for the stack" do
15
+ assert_difference -> { @stack.deploys.count }, 1 do
16
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
17
+ end
18
+ assert_response :accepted
19
+ assert_json 'status', 'pending'
20
+ end
21
+
22
+ test "#create triggers a new rollback for whitelisted variables" do
23
+ correct_env = { 'SAFETY_DISABLED' => 1 }
24
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, env: correct_env }
25
+ assert_response :accepted
26
+ assert_json 'type', 'rollback'
27
+ assert_json 'status', 'pending'
28
+ end
29
+
30
+ test "#create refuses to trigger a new rollback with incorrect variables" do
31
+ incorrect_env = { 'DANGEROUS_VARIABLE' => 1 }
32
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, env: incorrect_env }
33
+ assert_response :unprocessable_entity
34
+ assert_json 'message', 'Variables DANGEROUS_VARIABLE have not been whitelisted'
35
+ end
36
+
37
+ test "#create use the claimed user as author" do
38
+ request.headers['X-Shipit-User'] = @user.login
39
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
40
+ rollback = Rollback.last
41
+ rollback.user == @user
42
+ end
43
+
44
+ test "#create normalises the claimed user" do
45
+ request.headers['X-Shipit-User'] = @user.login.swapcase
46
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
47
+ rollback = Rollback.last
48
+ rollback.user == @user
49
+ end
50
+
51
+ test "#create renders a 422 if the sha isn't found" do
52
+ post :create, params: { stack_id: @stack.to_param, sha: '123443543545' }
53
+ assert_response :unprocessable_entity
54
+ assert_json 'errors', 'sha' => ['Unknown revision']
55
+ end
56
+
57
+ test "#create renders a 422 if the sha format is invalid" do
58
+ post :create, params: { stack_id: @stack.to_param, sha: '1' }
59
+ assert_response :unprocessable_entity
60
+ assert_json 'errors', 'sha' => ['is too short (minimum is 6 characters)']
61
+ end
62
+
63
+ test "#create renders a 422 if deploy attached to sha isn't found" do
64
+ post :create, params: { stack_id: @stack.to_param, sha: shipit_commits(:fifth).sha }
65
+ assert_response :unprocessable_entity
66
+ assert_json 'errors', 'sha' => ['Cant find associated deploy']
67
+ end
68
+
69
+ test "#create refuses to rollback on locked stacks" do
70
+ @stack.update!(lock_reason: 'Something broken')
71
+
72
+ assert_no_difference -> { @stack.deploys.count } do
73
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
74
+ end
75
+ assert_response :unprocessable_entity
76
+ assert_json 'errors.force', ["Can't rollback a locked stack"]
77
+ end
78
+
79
+ test "#create rollbacks on locked stack if force mode is enabled" do
80
+ @stack.update!(lock_reason: 'Something broken')
81
+
82
+ assert_difference -> { @stack.deploys.count }, 1 do
83
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, force: 'true' }
84
+ end
85
+ assert_response :accepted
86
+ assert_json 'status', 'pending'
87
+ end
88
+
89
+ test "#create refuses to rollback if active task" do
90
+ @stack.deploys.last.update!(status: 'running')
91
+
92
+ assert_no_difference -> { @stack.deploys.count } do
93
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
94
+ end
95
+ assert_response :unprocessable_entity
96
+ assert_json 'errors.force', ["Can't rollback, deploy in progress"]
97
+ end
98
+
99
+ test "#create aborts active task and sets rollback to" do
100
+ last_deploy = @stack.deploys.last
101
+ last_deploy.update!(status: 'running')
102
+
103
+ assert_no_difference -> { @stack.deploys.count } do
104
+ post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, force: 'true' }
105
+ end
106
+ last_deploy.reload
107
+ assert_response :accepted
108
+ refute_predicate last_deploy, :active?
109
+ assert_json 'rollback_once_aborted_to.until_commit_id', @commit.id
110
+ end
111
+ end
112
+ end
113
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -13,7 +14,7 @@ module Shipit
13
14
  @client.save!
14
15
 
15
16
  assert_no_difference 'Stack.count' do
16
- post :create, params: {repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging'}
17
+ post :create, params: { repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging' }
17
18
  end
18
19
 
19
20
  assert_response :forbidden
@@ -22,15 +23,15 @@ module Shipit
22
23
 
23
24
  test "#create fails with invalid stack" do
24
25
  assert_no_difference "Stack.count" do
25
- post :create, params: {repo_owner: 'some', repo_name: 'owner/path'}
26
+ post :create, params: { repo_owner: 'some', repo_name: 'owner/path' }
26
27
  end
27
28
  assert_response :unprocessable_entity
28
- assert_json 'errors', 'repo_name' => ['is invalid']
29
+ assert_json 'errors', 'repository' => ['is invalid']
29
30
  end
30
31
 
31
32
  test "#create creates a stack and renders it back" do
32
33
  assert_difference -> { Stack.count } do
33
- post :create, params: {repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging'}
34
+ post :create, params: { repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging' }
34
35
  end
35
36
 
36
37
  assert_response :ok
@@ -38,19 +39,47 @@ module Shipit
38
39
  end
39
40
 
40
41
  test "#create fails to create stack if it already exists" do
41
- Stack.create!(
42
- repo_name: 'rails',
43
- repo_owner: 'rails',
42
+ repository = shipit_repositories(:rails)
43
+ existing_stack = Stack.create!(
44
+ repository: repository,
44
45
  environment: 'staging',
45
46
  branch: 'staging',
46
47
  )
47
48
 
48
49
  assert_no_difference -> { Stack.count } do
49
- post :create, params: {repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging'}
50
+ post :create,
51
+ params: {
52
+ repo_name: existing_stack.repo_name,
53
+ repo_owner: existing_stack.repo_owner,
54
+ environment: existing_stack.environment,
55
+ branch: existing_stack.branch,
56
+ }
50
57
  end
51
58
 
52
59
  assert_response :unprocessable_entity
53
- assert_json 'errors', 'repo_name' => ['cannot be used more than once with this environment']
60
+ assert_json 'errors', 'repository' => [
61
+ 'cannot be used more than once with this environment. Check archived stacks.',
62
+ ]
63
+ end
64
+
65
+ test "#update updates a stack and renders it back" do
66
+ assert_equal true, @stack.merge_queue_enabled
67
+ assert_equal false, @stack.ignore_ci
68
+ assert_equal false, @stack.continuous_deployment
69
+
70
+ patch :update, params: {
71
+ id: @stack.to_param,
72
+ merge_queue_enabled: false,
73
+ ignore_ci: true,
74
+ continuous_deployment: true,
75
+ }
76
+
77
+ assert_response :ok
78
+ @stack.reload
79
+
80
+ assert_equal false, @stack.merge_queue_enabled
81
+ assert_equal true, @stack.ignore_ci
82
+ assert_equal true, @stack.continuous_deployment
54
83
  end
55
84
 
56
85
  test "#index returns a list of stacks" do
@@ -65,7 +94,7 @@ module Shipit
65
94
  end
66
95
 
67
96
  test "#index is paginable" do
68
- get :index, params: {page_size: 1}
97
+ get :index, params: { page_size: 1 }
69
98
  assert_json do |list|
70
99
  assert_instance_of Array, list
71
100
  assert_equal 1, list.size
@@ -77,7 +106,7 @@ module Shipit
77
106
  end
78
107
 
79
108
  test "the `next` link is not provided when the last page is reached" do
80
- get :index, params: {page_size: Stack.count}
109
+ get :index, params: { page_size: Stack.count }
81
110
  assert_no_link 'next'
82
111
  end
83
112
 
@@ -97,20 +126,20 @@ module Shipit
97
126
  end
98
127
 
99
128
  test "#show renders the stack" do
100
- get :show, params: {id: @stack.to_param}
129
+ get :show, params: { id: @stack.to_param }
101
130
  assert_response :ok
102
131
  assert_json 'id', @stack.id
103
132
  end
104
133
 
105
134
  test "#show returns last_deployed_at column for stack" do
106
- get :show, params: {id: @stack.to_param}
135
+ get :show, params: { id: @stack.to_param }
107
136
  assert_response :ok
108
137
  assert_json 'last_deployed_at', @stack.last_deployed_at
109
138
  end
110
139
 
111
140
  test "#destroy schedules stack deletion job" do
112
141
  assert_enqueued_with(job: DestroyStackJob) do
113
- delete :destroy, params: {id: @stack.to_param}
142
+ delete :destroy, params: { id: @stack.to_param }
114
143
  end
115
144
  assert_response :accepted
116
145
  end
@@ -120,7 +149,7 @@ module Shipit
120
149
  @client.save!
121
150
 
122
151
  assert_no_difference 'Stack.count' do
123
- delete :destroy, params: {id: @stack.to_param}
152
+ delete :destroy, params: { id: @stack.to_param }
124
153
  end
125
154
 
126
155
  assert_response :forbidden
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -11,7 +12,7 @@ module Shipit
11
12
  test "#index returns a list of tasks" do
12
13
  task = @stack.tasks.last
13
14
 
14
- get :index, params: {stack_id: @stack.to_param}
15
+ get :index, params: { stack_id: @stack.to_param }
15
16
  assert_response :ok
16
17
  assert_json '0.id', task.id
17
18
  end
@@ -19,18 +20,18 @@ module Shipit
19
20
  test "#show returns a task" do
20
21
  task = @stack.tasks.last
21
22
 
22
- get :show, params: {stack_id: @stack.to_param, id: task.id}
23
+ get :show, params: { stack_id: @stack.to_param, id: task.id }
23
24
  assert_response :ok
24
25
  assert_json 'id', task.id
25
26
  end
26
27
 
27
28
  test "#trigger returns 404 with unknown task" do
28
- post :trigger, params: {stack_id: @stack.to_param, task_name: 'shave_the_yak'}
29
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'shave_the_yak' }
29
30
  assert_response :not_found
30
31
  end
31
32
 
32
33
  test "#trigger triggers a custom task" do
33
- post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart'}
34
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart' }
34
35
  assert_response :accepted
35
36
  assert_json 'type', 'task'
36
37
  assert_json 'status', 'pending'
@@ -43,15 +44,15 @@ module Shipit
43
44
  end
44
45
 
45
46
  test "#trigger refuses to trigger a task with tasks not whitelisted" do
46
- env = {'DANGEROUS_VARIABLE' => 'bar'}
47
- post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart', env: env}
47
+ env = { 'DANGEROUS_VARIABLE' => 'bar' }
48
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
48
49
  assert_response :unprocessable_entity
49
50
  assert_json 'message', 'Variables DANGEROUS_VARIABLE have not been whitelisted'
50
51
  end
51
52
 
52
53
  test "#trigger triggers a task with only whitelisted env variables" do
53
- env = {'FOO' => 'bar'}
54
- post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart', env: env}
54
+ env = { 'FOO' => 'bar' }
55
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
55
56
  assert_response :accepted
56
57
  assert_json 'type', 'task'
57
58
  assert_json 'status', 'pending'
@@ -64,8 +65,8 @@ module Shipit
64
65
  end
65
66
 
66
67
  test "#trigger triggers a task with explicitly passed and default variables" do
67
- env = {'WALRUS' => 'overridden value'}
68
- post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart', env: env}
68
+ env = { 'WALRUS' => 'overridden value' }
69
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
69
70
  assert_response :accepted
70
71
 
71
72
  # FOO and BAR are variables with a default value
@@ -78,14 +79,14 @@ module Shipit
78
79
  end
79
80
 
80
81
  test "#trigger returns a 404 when the task doesn't exist" do
81
- post :trigger, params: {stack_id: @stack.to_param, task_name: 'doesnt_exist'}
82
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'doesnt_exist' }
82
83
  assert_response :not_found
83
84
  end
84
85
 
85
86
  test "#trigger returns 409 when a task is already running" do
86
87
  shipit_deploys(:shipit_running).update!(allow_concurrency: false, status: 'running')
87
88
  assert_predicate @stack, :active_task?
88
- post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart'}
89
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart' }
89
90
  assert_response :conflict
90
91
  assert_json 'message', 'A task is already running.'
91
92
  end