shipit-engine 0.28.1 → 0.33.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 (410) 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/images/magic-solid.svg +1 -0
  6. data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
  7. data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
  8. data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
  9. data/app/assets/stylesheets/_pages/_stacks.scss +95 -3
  10. data/app/assets/stylesheets/merge_status.scss +0 -3
  11. data/app/assets/stylesheets/shipit.scss +1 -0
  12. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +13 -0
  13. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  14. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  15. data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
  16. data/app/controllers/concerns/shipit/authentication.rb +3 -2
  17. data/app/controllers/concerns/shipit/pagination.rb +2 -1
  18. data/app/controllers/shipit/api/base_controller.rb +11 -6
  19. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  20. data/app/controllers/shipit/api/commits_controller.rb +2 -1
  21. data/app/controllers/shipit/api/deploys_controller.rb +4 -3
  22. data/app/controllers/shipit/api/hooks_controller.rb +6 -5
  23. data/app/controllers/shipit/api/locks_controller.rb +5 -4
  24. data/app/controllers/shipit/api/merge_requests_controller.rb +37 -0
  25. data/app/controllers/shipit/api/outputs_controller.rb +2 -1
  26. data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
  27. data/app/controllers/shipit/api/rollbacks_controller.rb +33 -0
  28. data/app/controllers/shipit/api/stacks_controller.rb +50 -5
  29. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  30. data/app/controllers/shipit/api_clients_controller.rb +50 -0
  31. data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
  32. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  33. data/app/controllers/shipit/commits_controller.rb +2 -1
  34. data/app/controllers/shipit/deploys_controller.rb +5 -4
  35. data/app/controllers/shipit/github_authentication_controller.rb +4 -3
  36. data/app/controllers/shipit/merge_requests_controller.rb +31 -0
  37. data/app/controllers/shipit/merge_status_controller.rb +33 -28
  38. data/app/controllers/shipit/release_statuses_controller.rb +3 -2
  39. data/app/controllers/shipit/repositories_controller.rb +74 -0
  40. data/app/controllers/shipit/rollbacks_controller.rb +3 -2
  41. data/app/controllers/shipit/shipit_controller.rb +2 -1
  42. data/app/controllers/shipit/stacks_controller.rb +78 -14
  43. data/app/controllers/shipit/status_controller.rb +2 -1
  44. data/app/controllers/shipit/tasks_controller.rb +9 -8
  45. data/app/controllers/shipit/webhooks_controller.rb +5 -132
  46. data/app/helpers/shipit/chunks_helper.rb +3 -2
  47. data/app/helpers/shipit/deploys_helper.rb +4 -3
  48. data/app/helpers/shipit/github_url_helper.rb +9 -0
  49. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  50. data/app/helpers/shipit/shipit_helper.rb +1 -0
  51. data/app/helpers/shipit/stacks_helper.rb +9 -0
  52. data/app/helpers/shipit/tasks_helper.rb +1 -0
  53. data/app/jobs/shipit/background_job.rb +4 -0
  54. data/app/jobs/shipit/background_job/unique.rb +4 -1
  55. data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
  56. data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
  57. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  58. data/app/jobs/shipit/continuous_delivery_job.rb +3 -1
  59. data/app/jobs/shipit/create_on_github_job.rb +7 -1
  60. data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
  61. data/app/jobs/shipit/deferred_touch_job.rb +4 -0
  62. data/app/jobs/shipit/deliver_hook_job.rb +1 -0
  63. data/app/jobs/shipit/destroy_job.rb +1 -0
  64. data/app/jobs/shipit/destroy_repository_job.rb +24 -0
  65. data/app/jobs/shipit/destroy_stack_job.rb +5 -4
  66. data/app/jobs/shipit/emit_event_job.rb +2 -1
  67. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  68. data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
  69. data/app/jobs/shipit/github_sync_job.rb +2 -1
  70. data/app/jobs/shipit/{mark_deploy_healty_job.rb → mark_deploy_healthy_job.rb} +1 -0
  71. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  72. data/app/jobs/shipit/perform_task_job.rb +5 -90
  73. data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
  74. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  75. data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
  76. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  77. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  78. data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
  79. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  80. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  81. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  82. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +4 -3
  83. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  84. data/app/models/shipit/anonymous_user.rb +9 -0
  85. data/app/models/shipit/api_client.rb +3 -2
  86. data/app/models/shipit/application_record.rb +2 -1
  87. data/app/models/shipit/check_run.rb +5 -4
  88. data/app/models/shipit/command_line_user.rb +5 -0
  89. data/app/models/shipit/commit.rb +41 -22
  90. data/app/models/shipit/commit_checks.rb +2 -0
  91. data/app/models/shipit/commit_deployment.rb +17 -12
  92. data/app/models/shipit/commit_deployment_status.rb +8 -3
  93. data/app/models/shipit/commit_message.rb +1 -0
  94. data/app/models/shipit/delivery.rb +4 -3
  95. data/app/models/shipit/deploy.rb +41 -10
  96. data/app/models/shipit/deploy_spec.rb +38 -7
  97. data/app/models/shipit/deploy_spec/bundler_discovery.rb +2 -1
  98. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  99. data/app/models/shipit/deploy_spec/file_system.rb +20 -7
  100. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
  101. data/app/models/shipit/deploy_spec/lerna_discovery.rb +1 -0
  102. data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
  103. data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
  104. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  105. data/app/models/shipit/deploy_stats.rb +58 -0
  106. data/app/models/shipit/duration.rb +3 -2
  107. data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
  108. data/app/models/shipit/github_hook.rb +2 -1
  109. data/app/models/shipit/github_status.rb +2 -1
  110. data/app/models/shipit/hook.rb +8 -5
  111. data/app/models/shipit/membership.rb +3 -2
  112. data/app/models/shipit/merge_request.rb +302 -0
  113. data/app/models/shipit/output_chunk.rb +7 -2
  114. data/app/models/shipit/provisioning_handler.rb +32 -0
  115. data/app/models/shipit/provisioning_handler/base.rb +30 -0
  116. data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
  117. data/app/models/shipit/pull_request.rb +27 -260
  118. data/app/models/shipit/pull_request_assignment.rb +10 -0
  119. data/app/models/shipit/record.rb +18 -0
  120. data/app/models/shipit/release_status.rb +3 -2
  121. data/app/models/shipit/repository.rb +97 -0
  122. data/app/models/shipit/review_stack.rb +116 -0
  123. data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
  124. data/app/models/shipit/rollback.rb +1 -0
  125. data/app/models/shipit/stack.rb +130 -57
  126. data/app/models/shipit/status.rb +3 -2
  127. data/app/models/shipit/status/common.rb +7 -6
  128. data/app/models/shipit/status/group.rb +1 -0
  129. data/app/models/shipit/status/missing.rb +2 -1
  130. data/app/models/shipit/status/unknown.rb +2 -1
  131. data/app/models/shipit/task.rb +118 -14
  132. data/app/models/shipit/task_definition.rb +1 -0
  133. data/app/models/shipit/task_execution_strategy/base.rb +20 -0
  134. data/app/models/shipit/task_execution_strategy/default.rb +110 -0
  135. data/app/models/shipit/team.rb +2 -1
  136. data/app/models/shipit/undeployed_commit.rb +1 -0
  137. data/app/models/shipit/unlimited_api_client.rb +1 -0
  138. data/app/models/shipit/user.rb +15 -8
  139. data/app/models/shipit/variable_definition.rb +1 -0
  140. data/app/models/shipit/webhooks.rb +43 -0
  141. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +20 -0
  142. data/app/models/shipit/webhooks/handlers/handler.rb +41 -0
  143. data/app/models/shipit/webhooks/handlers/membership_handler.rb +46 -0
  144. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
  145. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
  146. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
  147. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
  148. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
  149. data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
  150. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
  151. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
  152. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
  153. data/app/models/shipit/webhooks/handlers/push_handler.rb +21 -0
  154. data/app/models/shipit/webhooks/handlers/status_handler.rb +27 -0
  155. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  156. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  157. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  158. data/app/serializers/shipit/commit_serializer.rb +1 -0
  159. data/app/serializers/shipit/deploy_serializer.rb +8 -1
  160. data/app/serializers/shipit/hook_serializer.rb +1 -0
  161. data/app/serializers/shipit/merge_request_serializer.rb +21 -0
  162. data/app/serializers/shipit/pull_request_serializer.rb +6 -8
  163. data/app/serializers/shipit/review_stack_serializer.rb +7 -0
  164. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  165. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  166. data/app/serializers/shipit/stack_serializer.rb +12 -5
  167. data/app/serializers/shipit/tail_task_serializer.rb +11 -2
  168. data/app/serializers/shipit/task_serializer.rb +2 -17
  169. data/app/serializers/shipit/user_serializer.rb +6 -1
  170. data/app/validators/ascii_only_validator.rb +4 -3
  171. data/app/validators/subset_validator.rb +1 -0
  172. data/app/views/layouts/_head.html.erb +0 -0
  173. data/app/views/layouts/shipit.html.erb +5 -3
  174. data/app/views/shipit/_variables.html.erb +1 -1
  175. data/app/views/shipit/api_clients/index.html.erb +36 -0
  176. data/app/views/shipit/api_clients/new.html.erb +33 -0
  177. data/app/views/shipit/api_clients/show.html.erb +35 -0
  178. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  179. data/app/views/shipit/deploys/show.html.erb +2 -2
  180. data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
  181. data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
  182. data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
  183. data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
  184. data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
  185. data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
  186. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  187. data/app/views/shipit/merge_status/locked.html.erb +1 -1
  188. data/app/views/shipit/merge_status/logged_out.erb +1 -1
  189. data/app/views/shipit/merge_status/success.html.erb +2 -2
  190. data/app/views/shipit/repositories/_header.html.erb +19 -0
  191. data/app/views/shipit/repositories/index.html.erb +31 -0
  192. data/app/views/shipit/repositories/new.html.erb +23 -0
  193. data/app/views/shipit/repositories/settings.html.erb +53 -0
  194. data/app/views/shipit/repositories/show.html.erb +30 -0
  195. data/app/views/shipit/stacks/_banners.html.erb +13 -0
  196. data/app/views/shipit/stacks/_header.html.erb +30 -12
  197. data/app/views/shipit/stacks/_links.html.erb +1 -0
  198. data/app/views/shipit/stacks/_stack.html.erb +8 -0
  199. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  200. data/app/views/shipit/stacks/index.html.erb +9 -3
  201. data/app/views/shipit/stacks/settings.html.erb +22 -3
  202. data/app/views/shipit/stacks/show.html.erb +1 -1
  203. data/app/views/shipit/stacks/statistics.html.erb +82 -0
  204. data/app/views/shipit/tasks/_task_output.html.erb +1 -1
  205. data/app/views/shipit/tasks/show.html.erb +1 -1
  206. data/config/initializers/inflections.rb +2 -1
  207. data/config/locales/en.yml +18 -5
  208. data/config/routes.rb +29 -7
  209. data/db/migrate/20191209231045_create_shipit_repositories.rb +12 -0
  210. data/db/migrate/20191209231307_add_repository_reference_to_stacks.rb +15 -0
  211. data/db/migrate/20191216162728_backfill_repository_data.rb +22 -0
  212. data/db/migrate/20191216163010_remove_repository_information_from_stacks.rb +20 -0
  213. data/db/migrate/20191219205202_add_archived_since_to_stacks.rb +6 -0
  214. data/db/migrate/20200102175621_optional_task_commits.rb +6 -0
  215. data/db/migrate/20200109132519_add_sha_to_commit_deployments.rb +5 -0
  216. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  217. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  218. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  219. data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
  220. data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
  221. data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
  222. data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
  223. data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
  224. data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
  225. data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
  226. data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
  227. data/lib/shipit.rb +23 -3
  228. data/lib/shipit/cast_value.rb +1 -0
  229. data/lib/shipit/command.rb +14 -18
  230. data/lib/shipit/commands.rb +5 -4
  231. data/lib/shipit/csv_serializer.rb +1 -0
  232. data/lib/shipit/deploy_commands.rb +1 -0
  233. data/lib/shipit/engine.rb +11 -2
  234. data/lib/shipit/environment_variables.rb +11 -1
  235. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  236. data/lib/shipit/flock.rb +1 -0
  237. data/lib/shipit/github_app.rb +41 -10
  238. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  239. data/lib/shipit/null_serializer.rb +1 -0
  240. data/lib/shipit/octokit_check_runs.rb +3 -2
  241. data/lib/shipit/octokit_iterator.rb +3 -2
  242. data/lib/shipit/paginator.rb +3 -2
  243. data/lib/shipit/review_stack_commands.rb +8 -0
  244. data/lib/shipit/rollback_commands.rb +1 -0
  245. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  246. data/lib/shipit/simple_message_verifier.rb +1 -0
  247. data/lib/shipit/stack_commands.rb +12 -4
  248. data/lib/shipit/stat.rb +1 -0
  249. data/lib/shipit/task_commands.rb +23 -14
  250. data/lib/shipit/version.rb +2 -1
  251. data/lib/snippets/release-gem +5 -1
  252. data/lib/tasks/cron.rake +13 -2
  253. data/lib/tasks/dev.rake +3 -2
  254. data/lib/tasks/shipit.rake +16 -17
  255. data/lib/tasks/teams.rake +1 -0
  256. data/test/controllers/api/base_controller_test.rb +3 -2
  257. data/test/controllers/api/ccmenu_controller_test.rb +9 -8
  258. data/test/controllers/api/commits_controller_test.rb +3 -2
  259. data/test/controllers/api/deploys_controller_test.rb +15 -14
  260. data/test/controllers/api/hooks_controller_test.rb +8 -7
  261. data/test/controllers/api/locks_controller_test.rb +7 -6
  262. data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +17 -16
  263. data/test/controllers/api/outputs_controller_test.rb +4 -2
  264. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  265. data/test/controllers/api/rollback_controller_test.rb +113 -0
  266. data/test/controllers/api/stacks_controller_test.rb +65 -16
  267. data/test/controllers/api/tasks_controller_test.rb +13 -12
  268. data/test/controllers/api_clients_controller_test.rb +104 -0
  269. data/test/controllers/ccmenu_controller_test.rb +4 -3
  270. data/test/controllers/commit_checks_controller_test.rb +4 -3
  271. data/test/controllers/commits_controller_test.rb +3 -2
  272. data/test/controllers/deploys_controller_test.rb +33 -22
  273. data/test/controllers/github_authentication_controller_test.rb +1 -0
  274. data/test/controllers/merge_requests_controller_test.rb +32 -0
  275. data/test/controllers/merge_status_controller_test.rb +27 -9
  276. data/test/controllers/release_statuses_controller_test.rb +3 -2
  277. data/test/controllers/repositories_controller_test.rb +71 -0
  278. data/test/controllers/rollbacks_controller_test.rb +9 -8
  279. data/test/controllers/stacks_controller_test.rb +72 -15
  280. data/test/controllers/status_controller_test.rb +1 -0
  281. data/test/controllers/tasks_controller_test.rb +33 -20
  282. data/test/controllers/webhooks_controller_test.rb +36 -9
  283. data/test/dummy/config/application.rb +7 -2
  284. data/test/dummy/config/environments/development.rb +23 -6
  285. data/test/dummy/config/environments/test.rb +2 -5
  286. data/test/dummy/db/schema.rb +76 -24
  287. data/test/dummy/db/seeds.rb +30 -16
  288. data/test/fixtures/payloads/check_suite_master.json +2 -2
  289. data/test/fixtures/payloads/invalid_pull_request.json +117 -0
  290. data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
  291. data/test/fixtures/payloads/pull_request_assigned.json +480 -0
  292. data/test/fixtures/payloads/pull_request_closed.json +454 -0
  293. data/test/fixtures/payloads/pull_request_labeled.json +461 -0
  294. data/test/fixtures/payloads/pull_request_opened.json +454 -0
  295. data/test/fixtures/payloads/pull_request_reopened.json +454 -0
  296. data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
  297. data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
  298. data/test/fixtures/shipit/commit_deployment_statuses.yml +4 -4
  299. data/test/fixtures/shipit/commit_deployments.yml +8 -8
  300. data/test/fixtures/shipit/commits.yml +52 -1
  301. data/test/fixtures/shipit/merge_requests.yml +141 -0
  302. data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
  303. data/test/fixtures/shipit/pull_requests.yml +10 -131
  304. data/test/fixtures/shipit/repositories.yml +28 -0
  305. data/test/fixtures/shipit/stacks.yml +335 -30
  306. data/test/fixtures/shipit/statuses.yml +9 -0
  307. data/test/fixtures/shipit/tasks.yml +69 -3
  308. data/test/fixtures/shipit/users.yml +7 -0
  309. data/test/fixtures/timeout +2 -1
  310. data/test/helpers/api_helper.rb +1 -0
  311. data/test/helpers/fixture_aliases_helper.rb +1 -0
  312. data/test/helpers/hooks_helper.rb +2 -1
  313. data/test/helpers/json_helper.rb +15 -11
  314. data/test/helpers/links_helper.rb +4 -3
  315. data/test/helpers/payloads_helper.rb +5 -0
  316. data/test/helpers/queries_helper.rb +3 -2
  317. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  318. data/test/jobs/chunk_rollup_job_test.rb +16 -1
  319. data/test/jobs/deliver_hook_job_test.rb +1 -0
  320. data/test/jobs/destroy_repository_job_test.rb +27 -0
  321. data/test/jobs/destroy_stack_job_test.rb +10 -0
  322. data/test/jobs/emit_event_job_test.rb +2 -1
  323. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  324. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  325. data/test/jobs/github_sync_job_test.rb +1 -0
  326. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  327. data/test/jobs/perform_task_job_test.rb +12 -11
  328. data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +19 -18
  329. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  330. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  331. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  332. data/test/jobs/refresh_status_job_test.rb +1 -0
  333. data/test/jobs/unique_job_test.rb +1 -0
  334. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  335. data/test/lib/shipit/deploy_commands_test.rb +16 -0
  336. data/test/lib/shipit/task_commands_test.rb +17 -0
  337. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  338. data/test/models/api_client_test.rb +1 -0
  339. data/test/models/commit_checks_test.rb +1 -0
  340. data/test/models/commit_deployment_status_test.rb +34 -4
  341. data/test/models/commit_deployment_test.rb +9 -11
  342. data/test/models/commits_test.rb +116 -21
  343. data/test/models/delivery_test.rb +2 -1
  344. data/test/models/deploy_spec_test.rb +103 -65
  345. data/test/models/deploy_stats_test.rb +113 -0
  346. data/test/models/deploys_test.rb +207 -26
  347. data/test/models/duration_test.rb +1 -0
  348. data/test/models/github_hook_test.rb +1 -0
  349. data/test/models/hook_test.rb +20 -16
  350. data/test/models/membership_test.rb +1 -0
  351. data/test/models/{pull_request_test.rb → merge_request_test.rb} +48 -41
  352. data/test/models/pull_request_assignment_test.rb +16 -0
  353. data/test/models/release_statuses_test.rb +1 -0
  354. data/test/models/rollbacks_test.rb +1 -0
  355. data/test/models/shipit/check_run_test.rb +1 -0
  356. data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
  357. data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
  358. data/test/models/shipit/provisioning_handler_test.rb +64 -0
  359. data/test/models/shipit/pull_request_test.rb +52 -0
  360. data/test/models/shipit/repository_test.rb +81 -0
  361. data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
  362. data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
  363. data/test/models/shipit/review_stack_test.rb +59 -0
  364. data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +120 -60
  365. data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
  366. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
  367. data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
  368. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
  369. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
  370. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
  371. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
  372. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +83 -0
  373. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
  374. data/test/models/shipit/webhooks/handlers_test.rb +27 -0
  375. data/test/models/status/group_test.rb +1 -0
  376. data/test/models/status/missing_test.rb +1 -0
  377. data/test/models/status_test.rb +1 -0
  378. data/test/models/task_definitions_test.rb +9 -8
  379. data/test/models/tasks_test.rb +59 -1
  380. data/test/models/team_test.rb +4 -2
  381. data/test/models/undeployed_commits_test.rb +14 -0
  382. data/test/models/users_test.rb +13 -5
  383. data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
  384. data/test/test_command_integration.rb +3 -2
  385. data/test/test_helper.rb +37 -32
  386. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  387. data/test/unit/command_test.rb +15 -10
  388. data/test/unit/commands_test.rb +1 -0
  389. data/test/unit/commit_serializer_test.rb +16 -0
  390. data/test/unit/csv_serializer_test.rb +3 -2
  391. data/test/unit/deploy_commands_test.rb +14 -4
  392. data/test/unit/deploy_serializer_test.rb +17 -0
  393. data/test/unit/environment_variables_test.rb +5 -4
  394. data/test/unit/github_app_test.rb +137 -0
  395. data/test/unit/github_url_helper_test.rb +6 -0
  396. data/test/unit/rollback_commands_test.rb +2 -1
  397. data/test/unit/shipit_helper_test.rb +17 -0
  398. data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
  399. data/test/unit/shipit_test.rb +1 -0
  400. data/test/unit/user_serializer_test.rb +14 -0
  401. data/test/unit/variable_definition_test.rb +1 -0
  402. metadata +334 -169
  403. data/app/controllers/shipit/api/pull_requests_controller.rb +0 -36
  404. data/app/controllers/shipit/pull_requests_controller.rb +0 -30
  405. data/app/jobs/shipit/merge_pull_requests_job.rb +0 -31
  406. data/app/jobs/shipit/refresh_pull_request_job.rb +0 -10
  407. data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
  408. data/test/controllers/pull_requests_controller_test.rb +0 -31
  409. data/test/fixtures/shipit/output_chunks.yml +0 -47
  410. data/test/models/output_chunk_test.rb +0 -20
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class MergeRequestsControllerTest < ActionController::TestCase
6
+ setup do
7
+ @stack = shipit_stacks(:shipit)
8
+ @pr = shipit_merge_requests(:shipit_pending)
9
+ session[:user_id] = shipit_users(:walrus).id
10
+ end
11
+
12
+ test "#index shows pending pull requests" do
13
+ get :index, params: { stack_id: @stack.to_param }
14
+ assert_response :success
15
+ assert_select '.pr-list .pr', @stack.merge_requests.pending.count
16
+ end
17
+
18
+ test "#add can enqueue a pull request" do
19
+ assert_difference -> { MergeRequest.count }, +1 do
20
+ post :create, params: { stack_id: @stack.to_param, number_or_url: '#5' }
21
+ end
22
+ assert_redirected_to stack_merge_requests_path(@stack)
23
+ end
24
+
25
+ test "#destroy can cancel a pending pull request" do
26
+ assert_predicate @pr, :pending?
27
+ delete :destroy, params: { stack_id: @stack.to_param, id: @pr.id }
28
+ assert_redirected_to stack_merge_requests_path(@stack)
29
+ assert_predicate @pr.reload, :canceled?
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -9,27 +10,27 @@ module Shipit
9
10
  end
10
11
 
11
12
  test "GET show" do
12
- get :show, params: {referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master'}
13
+ get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
13
14
  assert_response :ok
14
15
  assert_includes response.body, 'Ready to ship!'
15
16
  end
16
17
 
17
18
  test "GET show when there is no matching stacks" do
18
- get :show, params: {referrer: 'https://github.com/Shopify/unknown-repo/pull/42', branch: 'master'}
19
+ get :show, params: { referrer: 'https://github.com/Shopify/unknown-repo/pull/42', branch: 'master' }
19
20
  assert_response :ok
20
21
  assert_predicate response.body, :blank?
21
22
  end
22
23
 
23
24
  test "GET anonymous show returns a login message" do
24
25
  session.delete(:user_id)
25
- get :show, params: {referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master'}
26
+ get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
26
27
  assert_response :ok
27
28
  assert_includes response.body.downcase, 'please log in'
28
29
  end
29
30
 
30
31
  test "GET anonymous show when there is no matching stack is blank" do
31
32
  session.delete(:user_id)
32
- get :show, params: {referrer: 'https://github.com/Shopify/unknown-repo/pull/42', branch: 'master'}
33
+ get :show, params: { referrer: 'https://github.com/Shopify/unknown-repo/pull/42', branch: 'master' }
33
34
  assert_response :ok
34
35
  assert_predicate response.body, :blank?
35
36
  end
@@ -37,21 +38,38 @@ module Shipit
37
38
  test "GET show prefers stacks with merge_queue_enabled" do
38
39
  existing = shipit_stacks(:shipit)
39
40
  Shipit::Stack.where(
40
- repo_owner: existing.repo_owner,
41
- repo_name: existing.repo_name,
41
+ repository: existing.repository,
42
42
  ).update_all(merge_queue_enabled: false)
43
43
 
44
44
  Shipit::Stack.create(
45
- repo_owner: existing.repo_owner,
46
- repo_name: existing.repo_name,
45
+ repository: existing.repository,
47
46
  environment: 'foo',
48
47
  branch: existing.branch,
49
48
  merge_queue_enabled: true,
50
49
  )
51
50
 
52
- get :show, params: {referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master'}
51
+ get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
53
52
  assert_response :ok
54
53
  assert_includes response.body, 'shipit-engine/foo'
55
54
  end
55
+
56
+ test "GET show prefers locked stacks above all else" do
57
+ existing = shipit_stacks(:shipit)
58
+ Shipit::Stack.where(
59
+ repository: existing.repository,
60
+ ).update_all(lock_reason: 'testing', merge_queue_enabled: false, locked_since: Time.now.utc)
61
+
62
+ # Shipit would otherwise prefer this, because it has the merge queue enabled
63
+ Shipit::Stack.create(
64
+ repository: existing.repository,
65
+ environment: 'foo',
66
+ branch: existing.branch,
67
+ merge_queue_enabled: true,
68
+ )
69
+
70
+ get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
71
+ assert_response :ok
72
+ assert_includes response.body, 'locked'
73
+ end
56
74
  end
57
75
  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
 
11
12
  test ":create allow users to append release statuses and mark the deploy as success" do
12
13
  assert_difference -> { ReleaseStatus.count }, +1 do
13
- post :create, params: {stack_id: @stack, deploy_id: @deploy.id, status: 'success'}
14
+ post :create, params: { stack_id: @stack, deploy_id: @deploy.id, status: 'success' }
14
15
  assert_response :created
15
16
  end
16
17
 
@@ -23,7 +24,7 @@ module Shipit
23
24
 
24
25
  test ":create allow users to append release statuses and mark the deploy as faulty" do
25
26
  assert_difference -> { ReleaseStatus.count }, +1 do
26
- post :create, params: {stack_id: @stack, deploy_id: @deploy.id, status: 'failure'}
27
+ post :create, params: { stack_id: @stack, deploy_id: @deploy.id, status: 'failure' }
27
28
  assert_response :created
28
29
  end
29
30
 
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class RepositoriesControllerTest < ActionController::TestCase
6
+ setup do
7
+ @routes = Shipit::Engine.routes
8
+ @repository = shipit_repositories(:shipit)
9
+ session[:user_id] = shipit_users(:walrus).id
10
+ end
11
+
12
+ test "GitHub authentication is mandatory" do
13
+ session[:user_id] = nil
14
+ get :index
15
+ assert_redirected_to '/github/auth/github?origin=http%3A%2F%2Ftest.host%2Frepositories'
16
+ end
17
+
18
+ test "current_user must be a member of at least a Shipit.github_teams" do
19
+ session[:user_id] = shipit_users(:bob).id
20
+ Shipit.stubs(:github_teams).returns([shipit_teams(:cyclimse_cooks), shipit_teams(:shopify_developers)])
21
+ get :index
22
+ assert_response :forbidden
23
+ assert_equal(
24
+ 'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
25
+ response.body,
26
+ )
27
+ end
28
+
29
+ test "#show is success" do
30
+ get :show, params: { id: @repository.to_param }
31
+ assert_response :ok
32
+ end
33
+
34
+ test "#create creates a repository and redirects to it" do
35
+ assert_difference "Repository.count" do
36
+ post :create, params: {
37
+ repository: {
38
+ name: 'valid',
39
+ owner: 'repository',
40
+ },
41
+ }
42
+ end
43
+ assert_redirected_to repository_path(Repository.last)
44
+ end
45
+
46
+ test "#create when not valid renders new" do
47
+ assert_no_difference "Repository.count" do
48
+ post :create, params: {
49
+ repository: {
50
+ owner: 'some',
51
+ name: 'owner/path',
52
+ },
53
+ }
54
+ end
55
+ assert_response :success
56
+ end
57
+
58
+ test "#destroy enqueues a DestroyRepositoryJob" do
59
+ assert_enqueued_with(job: DestroyRepositoryJob, args: [@repository]) do
60
+ delete :destroy, params: { id: @repository.to_param }
61
+ end
62
+
63
+ assert_redirected_to repositories_path
64
+ end
65
+
66
+ test "#settings is success" do
67
+ get :settings, params: { id: @repository.to_param }
68
+ assert_response :success
69
+ end
70
+ end
71
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -11,37 +12,37 @@ module Shipit
11
12
 
12
13
  test ":create persists a new rollback" do
13
14
  assert_difference '@stack.rollbacks.count', 1 do
14
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
15
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
15
16
  end
16
17
  end
17
18
 
18
19
  test ":create can receive an :env hash" do
19
- env = {'SAFETY_DISABLED' => '1'}
20
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id, env: env}}
20
+ env = { 'SAFETY_DISABLED' => '1' }
21
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env: env } }
21
22
  new_rollback = Rollback.last
22
23
  assert_equal env, new_rollback.env
23
24
  end
24
25
 
25
26
  test ":create ignore :env keys not declared in the deploy spec" do
26
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id, env: {'H4X0R' => '1'}}}
27
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env: { 'H4X0R' => '1' } } }
27
28
  new_rollback = Rollback.last
28
29
  assert_equal({}, new_rollback.env)
29
30
  end
30
31
 
31
32
  test ":create redirects to the new deploy" do
32
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
33
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
33
34
  assert_redirected_to stack_deploy_path(@stack, Rollback.last)
34
35
  end
35
36
 
36
37
  test ":create locks deploys" do
37
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
38
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
38
39
  assert @stack.reload.locked?
39
40
  end
40
41
 
41
42
  test ":create redirects back to the :new page if there is an active deploy" do
42
43
  shipit_deploys(:shipit_running).update!(allow_concurrency: false, status: 'running')
43
44
  assert_no_difference '@stack.deploys.count' do
44
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
45
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
45
46
  end
46
47
  assert_redirected_to rollback_stack_deploy_path(@stack, @deploy)
47
48
  end
@@ -49,7 +50,7 @@ module Shipit
49
50
  test ":create with `force` option ignore the active deploys" do
50
51
  shipit_deploys(:shipit_running).update_column(:status, 'running')
51
52
  assert_difference '@stack.deploys.count', 1 do
52
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}, force: 'true'}
53
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id }, force: 'true' }
53
54
  end
54
55
  assert_redirected_to stack_deploy_path(@stack, Rollback.last)
55
56
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -46,13 +47,32 @@ module Shipit
46
47
  )
47
48
  end
48
49
 
50
+ test "#index list all stacks" do
51
+ get :index, params: { show_archived: true }
52
+ assert_response :ok
53
+ assert_select ".stack", count: Stack.count
54
+ end
55
+
56
+ test "#index list all not archived stacks" do
57
+ get :index
58
+ assert_response :ok
59
+ assert_select ".stack", count: Stack.not_archived.count
60
+ end
61
+
62
+ test "#index list a repo stacks if the :repo params is passed" do
63
+ repo = shipit_repositories(:shipit)
64
+ get :index, params: { repo: repo.full_name }
65
+ assert_response :ok
66
+ assert_select ".stack", count: repo.stacks.count
67
+ end
68
+
49
69
  test "#show is success" do
50
- get :show, params: {id: @stack.to_param}
70
+ get :show, params: { id: @stack.to_param }
51
71
  assert_response :ok
52
72
  end
53
73
 
54
74
  test "#show with faulty and validating deploys is success" do
55
- get :show, params: {id: shipit_stacks(:shipit_canaries).to_param}
75
+ get :show, params: { id: shipit_stacks(:shipit_canaries).to_param }
56
76
  assert_response :ok
57
77
  end
58
78
 
@@ -60,18 +80,18 @@ module Shipit
60
80
  @stack = shipit_stacks(:check_runs)
61
81
  assert_not_equal 0, CheckRun.where(stack_id: @stack.id).count
62
82
 
63
- get :show, params: {id: @stack.to_param}
83
+ get :show, params: { id: @stack.to_param }
64
84
  assert_response :ok
65
85
  end
66
86
 
67
87
  test "#show handles locked stacks without a lock_author" do
68
88
  @stack.update!(lock_reason: "I am a lock with no author")
69
- get :show, params: {id: @stack.to_param}
89
+ get :show, params: { id: @stack.to_param }
70
90
  end
71
91
 
72
92
  test "#show auto-links URLs in lock reason" do
73
93
  @stack.update!(lock_reason: 'http://google.com')
74
- get :show, params: {id: @stack.to_param}
94
+ get :show, params: { id: @stack.to_param }
75
95
  assert_response :ok
76
96
  assert_select 'a[href="http://google.com"]'
77
97
  end
@@ -93,27 +113,38 @@ module Shipit
93
113
 
94
114
  test "#create when not valid renders new" do
95
115
  assert_no_difference "Stack.count" do
96
- post :create, params: {stack: {repo_owner: 'some', repo_name: 'owner/path'}}
116
+ post :create, params: { stack: { repo_owner: 'some', repo_name: 'owner/path' } }
97
117
  end
98
118
  assert_response :success
99
119
  end
100
120
 
101
121
  test "#destroy enqueues a DestroyStackJob" do
102
122
  assert_enqueued_with(job: DestroyStackJob, args: [@stack]) do
103
- delete :destroy, params: {id: @stack.to_param}
123
+ delete :destroy, params: { id: @stack.to_param }
104
124
  end
105
125
  assert_redirected_to stacks_path
106
126
  end
107
127
 
108
128
  test "#settings is success" do
109
- get :settings, params: {id: @stack.to_param}
129
+ get :settings, params: { id: @stack.to_param }
110
130
  assert_response :success
111
131
  end
112
132
 
133
+ test "#statistics is success" do
134
+ get :statistics, params: { id: @stack.to_param }
135
+ assert_response :success
136
+ end
137
+
138
+ test "#statistics redirects to #show if no deploys are present" do
139
+ @stack.deploys.destroy_all
140
+ get :statistics, params: { id: @stack.to_param }
141
+ assert_redirected_to stack_path(@stack)
142
+ end
143
+
113
144
  test "#update allows to lock the stack" do
114
145
  refute @stack.locked?
115
146
 
116
- patch :update, params: {id: @stack.to_param, stack: {lock_reason: 'Went out to eat some chips!'}}
147
+ patch :update, params: { id: @stack.to_param, stack: { lock_reason: 'Went out to eat some chips!' } }
117
148
  @stack.reload
118
149
  assert @stack.locked?
119
150
  assert_equal shipit_users(:walrus), @stack.lock_author
@@ -123,9 +154,35 @@ module Shipit
123
154
  @stack.update!(lock_reason: 'Went out to eat some chips!')
124
155
  assert @stack.locked?
125
156
 
126
- patch :update, params: {id: @stack.to_param, stack: {lock_reason: ''}}
157
+ patch :update, params: { id: @stack.to_param, stack: { lock_reason: '' } }
158
+ @stack.reload
159
+ refute @stack.locked?
160
+ assert_instance_of AnonymousUser, @stack.lock_author
161
+ end
162
+
163
+ test "#update allows to archive the stack" do
164
+ refute @stack.archived?
165
+ refute @stack.locked?
166
+
167
+ patch :update, params: { id: @stack.to_param, stack: { archived: "true" } }
168
+ @stack.reload
169
+ assert @stack.archived?
170
+ assert @stack.locked?
171
+ assert_equal shipit_users(:walrus), @stack.lock_author
172
+ assert_equal "Archived", @stack.lock_reason
173
+ end
174
+
175
+ test "#update allows to dearchive the stack" do
176
+ @stack.archive!(shipit_users(:walrus))
177
+ assert @stack.locked?
178
+ assert @stack.archived?
179
+
180
+ patch :update, params: { id: @stack.to_param, stack: { archived: "false" } }
127
181
  @stack.reload
182
+ refute @stack.archived?
128
183
  refute @stack.locked?
184
+ assert_nil @stack.locked_since
185
+ assert_nil @stack.lock_reason
129
186
  assert_instance_of AnonymousUser, @stack.lock_author
130
187
  end
131
188
 
@@ -135,7 +192,7 @@ module Shipit
135
192
  assert_enqueued_with(job: RefreshStatusesJob, args: [stack_id: @stack.id]) do
136
193
  assert_enqueued_with(job: RefreshCheckRunsJob, args: [stack_id: @stack.id]) do
137
194
  assert_enqueued_with(job: GithubSyncJob, args: [stack_id: @stack.id]) do
138
- post :refresh, params: {id: @stack.to_param}
195
+ post :refresh, params: { id: @stack.to_param }
139
196
  end
140
197
  end
141
198
  end
@@ -145,23 +202,23 @@ module Shipit
145
202
 
146
203
  test "#clear_git_cache queues a ClearGitCacheJob" do
147
204
  assert_enqueued_with(job: ClearGitCacheJob, args: [@stack]) do
148
- post :clear_git_cache, params: {id: @stack.to_param}
205
+ post :clear_git_cache, params: { id: @stack.to_param }
149
206
  end
150
207
  assert_redirected_to stack_settings_path(@stack)
151
208
  end
152
209
 
153
210
  test "#clear_git_cache displays a flash message" do
154
- post :clear_git_cache, params: {id: @stack.to_param}
211
+ post :clear_git_cache, params: { id: @stack.to_param }
155
212
  assert_equal 'Git Cache clearing scheduled', flash[:success]
156
213
  end
157
214
 
158
215
  test "#update redirects to return_to parameter" do
159
- patch :update, params: {id: @stack.to_param, stack: {ignore_ci: false}, return_to: stack_path(@stack)}
216
+ patch :update, params: { id: @stack.to_param, stack: { ignore_ci: false }, return_to: stack_path(@stack) }
160
217
  assert_redirected_to stack_path(@stack)
161
218
  end
162
219
 
163
220
  test "#lookup redirects to the canonical URL" do
164
- get :lookup, params: {id: @stack.id}
221
+ get :lookup, params: { id: @stack.id }
165
222
  assert_redirected_to stack_path(@stack)
166
223
  end
167
224