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
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class RepositoryTest < ActiveSupport::TestCase
6
+ setup do
7
+ @repository = shipit_repositories(:shipit)
8
+ end
9
+
10
+ test "owner, and name uniqueness is enforced" do
11
+ clone = Repository.new(@repository.attributes.except('id'))
12
+ refute clone.save
13
+ assert_equal ["cannot be used more than once"], clone.errors[:name]
14
+ end
15
+
16
+ test "owner, name, and environment can only be ASCII" do
17
+ @repository.update(owner: 'héllò', name: 'wørld')
18
+ refute_predicate @repository, :valid?
19
+ end
20
+
21
+ test "owner and name are case insensitive" do
22
+ assert_no_difference -> { Repository.count } do
23
+ error = assert_raises(ActiveRecord::RecordInvalid) do
24
+ Repository.create!(
25
+ owner: @repository.owner.upcase,
26
+ name: @repository.name.upcase,
27
+ )
28
+ end
29
+ assert_equal 'Validation failed: Name cannot be used more than once', error.message
30
+ end
31
+
32
+ new_repository = Repository.create!(owner: 'FOO', name: 'BAR')
33
+ assert_equal new_repository, Repository.find_by(owner: 'foo', name: 'bar')
34
+ end
35
+
36
+ test "owner is automatically downcased" do
37
+ @repository.owner = 'George'
38
+ assert_equal 'george', @repository.owner
39
+ end
40
+
41
+ test "name is automatically downcased" do
42
+ @repository.name = 'Cyclim.se'
43
+ assert_equal 'cyclim.se', @repository.name
44
+ end
45
+
46
+ test "owner cannot contain a `/`" do
47
+ assert @repository.valid?
48
+ @repository.owner = 'foo/bar'
49
+ refute @repository.valid?
50
+ end
51
+
52
+ test "name cannot contain a `/`" do
53
+ assert @repository.valid?
54
+ @repository.name = 'foo/bar'
55
+ refute @repository.valid?
56
+ end
57
+
58
+ test "http_url" do
59
+ assert_equal "https://github.com/#{@repository.owner}/#{@repository.name}", @repository.http_url
60
+ end
61
+
62
+ test "git_url" do
63
+ assert_equal "https://github.com/#{@repository.owner}/#{@repository.name}.git", @repository.git_url
64
+ end
65
+
66
+ test "review_stacks_enabled defaults to false" do
67
+ assert_equal false, Repository.new.review_stacks_enabled
68
+ end
69
+
70
+ test "from_github_repo_name" do
71
+ owner = "repository-owner"
72
+ name = "repository-name"
73
+ github_repo_name = [owner, name].join("/")
74
+ expected_repository = Repository.create(owner: owner, name: name)
75
+
76
+ found_repository = Repository.from_github_repo_name(github_repo_name)
77
+
78
+ assert_equal(expected_repository, found_repository)
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module Shipit
6
+ class ReviewStackProvisionStatusTest < ActiveSupport::TestCase
7
+ test "stacks default to deprovisioned state" do
8
+ stack = Shipit::ReviewStack.new
9
+
10
+ assert_equal 'deprovisioned', stack.provision_status
11
+ end
12
+
13
+ test "non-review stacks don't transition" do
14
+ stack = Shipit::ReviewStack.new
15
+ stack.provision
16
+
17
+ assert_equal 'deprovisioned', stack.provision_status
18
+ end
19
+
20
+ test "review stacks that are deprovisioned can be provisioned" do
21
+ stack = review_stack(provision_status: :deprovisioned)
22
+
23
+ stack.provision
24
+
25
+ assert_equal 'provisioning', stack.provision_status
26
+ end
27
+
28
+ test "review stacks that are provisioning can succeed" do
29
+ stack = review_stack(provision_status: :provisioning)
30
+
31
+ stack.provision_success
32
+
33
+ assert_equal 'provisioned', stack.provision_status
34
+ end
35
+
36
+ test "review stacks that are provisioning can fail" do
37
+ stack = review_stack(provision_status: :provisioning)
38
+
39
+ stack.provision_failure
40
+
41
+ assert_equal 'deprovisioned', stack.provision_status
42
+ end
43
+
44
+ test "review stacks are provisioned can be deprovisioned" do
45
+ stack = review_stack(provision_status: :provisioned)
46
+
47
+ stack.deprovision
48
+
49
+ assert 'deprovisioning', stack.provision_status
50
+ end
51
+
52
+ test "review stacks that are deprovisioning can succeed" do
53
+ stack = review_stack(provision_status: :deprovisioning)
54
+
55
+ stack.deprovision_success
56
+
57
+ assert_equal 'deprovisioned', stack.provision_status
58
+ end
59
+
60
+ test "review stacks that are deprovisioning can fail" do
61
+ stack = review_stack(provision_status: :deprovisioning)
62
+
63
+ stack.deprovision_failure
64
+
65
+ assert_equal 'provisioned', stack.provision_status
66
+ end
67
+
68
+ def review_stack(provision_status: :deprovisioned)
69
+ stack = shipit_stacks(:review_stack)
70
+ stack.provision_status = provision_status
71
+
72
+ stack.save!
73
+
74
+ stack
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Shipit
6
+ class ReviewStackProvisioningQueueTest < ActiveSupport::TestCase
7
+ test ".add en-queues a stack for provisioning" do
8
+ review_stack = shipit_stacks(:review_stack)
9
+ review_stack.update(lock_reason: nil)
10
+
11
+ assert_changes -> { review_stack.awaiting_provision }, from: false, to: true do
12
+ queue.add(review_stack)
13
+ end
14
+ end
15
+
16
+ test ".work provisions resource stacks when they are provision-able" do
17
+ review_stack = provisionable_review_stack
18
+ setup_provisioning_handler(for_stack: review_stack, provision: true)
19
+ queue.add(review_stack)
20
+
21
+ assert_changes -> { review_stack.reload.provision_status }, from: "deprovisioned", to: "provisioning" do
22
+ queue.work
23
+ end
24
+ end
25
+
26
+ test ".work does not provision resource stacks when they are not provisionable" do
27
+ review_stack = provisionable_review_stack
28
+ setup_provisioning_handler(for_stack: review_stack, provision: false)
29
+ queue.add(review_stack)
30
+
31
+ assert_equal "deprovisioned", review_stack.provision_status
32
+ assert_no_changes -> { review_stack.reload.provision_status } do
33
+ queue.work
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def setup_provisioning_handler(for_stack:, provision:)
40
+ provisioning_handler_instance = mock("ProvisioningHandler instance")
41
+ provisioning_handler_instance.expects(:provision?).returns(provision)
42
+ provisioning_handler_instance.expects(:up).returns(true) if !!provision
43
+ provisioning_handler_class = mock("ProvisioningHandler class")
44
+ provisioning_handler_class.expects(:new).at_least_once.with(for_stack).returns(provisioning_handler_instance)
45
+ Shipit::ProvisioningHandler.expects(:fetch).at_least_once.returns(provisioning_handler_class)
46
+
47
+ provisioning_handler_instance
48
+ end
49
+
50
+ def provisionable_review_stack
51
+ review_stack = shipit_stacks(:review_stack)
52
+ review_stack.update(
53
+ provision_status: :deprovisioned,
54
+ )
55
+
56
+ review_stack
57
+ end
58
+
59
+ def queue
60
+ ReviewStackProvisioningQueue
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Shipit
6
+ class ReviewStackTest < ActiveSupport::TestCase
7
+ setup do
8
+ @review_stack = shipit_stacks(:review_stack)
9
+ end
10
+
11
+ test "clearing stale caches" do
12
+ # Asserting that :archived_25hours_ago, :archived_30minutes_ago and :shipit are not queued.
13
+ assert_enqueued_jobs 1 do
14
+ assert_enqueued_with(job: Shipit::ClearGitCacheJob, args: [shipit_stacks(:archived_6hours_ago)]) do
15
+ ReviewStack.clear_stale_caches
16
+ end
17
+ end
18
+ end
19
+
20
+ test "creating a review stack emits a hook" do
21
+ new_review_stack = @review_stack.dup
22
+ new_review_stack.environment = "new-review-stack-environment"
23
+
24
+ expect_hook(:review_stack, new_review_stack, action: :added, review_stack: new_review_stack) do
25
+ new_review_stack.save!
26
+ end
27
+ end
28
+
29
+ test "updating a review stack emit a hook" do
30
+ expect_hook(:review_stack, @review_stack, action: :updated, review_stack: @review_stack) do
31
+ @review_stack.update(environment: 'foo')
32
+ end
33
+ end
34
+
35
+ test "updating a review stack doesn't emit a hook if only `updated_at` is changed" do
36
+ # force a save to make sure `cached_deploy_spec` serialization is consistent with how Active Record would
37
+ # serialize it.
38
+ @review_stack.update(updated_at: 2.days.ago)
39
+
40
+ expect_no_hook(:review_stack) do
41
+ @review_stack.update(updated_at: Time.zone.now)
42
+ end
43
+ end
44
+
45
+ test "deleteing a review stack emits a hook" do
46
+ expect_hook(:review_stack, @review_stack, action: :removed, review_stack: @review_stack) do
47
+ @review_stack.destroy!
48
+ end
49
+ end
50
+
51
+ test "#env includes the stack's pull request labels" do
52
+ stack = shipit_stacks(:review_stack)
53
+ stack.pull_request.labels = ["wip", "bug"]
54
+
55
+ assert_equal stack.env["WIP"], "true"
56
+ assert_equal stack.env["BUG"], "true"
57
+ end
58
+ end
59
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
  require 'securerandom'
3
4
 
@@ -9,43 +10,6 @@ module Shipit
9
10
  GithubHook.any_instance.stubs(:teardown!)
10
11
  end
11
12
 
12
- test "repo_owner, repo_name and environment uniqueness is enforced" do
13
- clone = Stack.new(@stack.attributes.except('id'))
14
- refute clone.save
15
- assert_equal ["cannot be used more than once with this environment"], clone.errors[:repo_name]
16
- end
17
-
18
- test "repo_owner, repo_name, and environment can only be ASCII" do
19
- @stack.update(repo_owner: 'héllò', repo_name: 'wørld', environment: 'pródüctïòn')
20
- refute_predicate @stack, :valid?
21
- end
22
-
23
- test "repo_owner and repo_name are case insensitive" do
24
- assert_no_difference -> { Stack.count } do
25
- error = assert_raises ActiveRecord::RecordInvalid do
26
- Stack.create!(
27
- repo_owner: @stack.repo_owner.upcase,
28
- repo_name: @stack.repo_name.upcase,
29
- environment: @stack.environment,
30
- )
31
- end
32
- assert_equal 'Validation failed: Repo name cannot be used more than once with this environment', error.message
33
- end
34
-
35
- new_stack = Stack.create!(repo_owner: 'FOO', repo_name: 'BAR')
36
- assert_equal new_stack, Stack.find_by(repo_owner: 'foo', repo_name: 'bar')
37
- end
38
-
39
- test "repo_owner is automatically downcased" do
40
- @stack.repo_owner = 'George'
41
- assert_equal 'george', @stack.repo_owner
42
- end
43
-
44
- test "repo_name is automatically downcased" do
45
- @stack.repo_name = 'Cyclim.se'
46
- assert_equal 'cyclim.se', @stack.repo_name
47
- end
48
-
49
13
  test "branch defaults to master" do
50
14
  @stack.branch = ""
51
15
  assert @stack.save
@@ -64,18 +28,6 @@ module Shipit
64
28
  assert_equal 'foo:bar', @stack.environment
65
29
  end
66
30
 
67
- test "repo_owner cannot contain a `/`" do
68
- assert @stack.valid?
69
- @stack.repo_owner = 'foo/bar'
70
- refute @stack.valid?
71
- end
72
-
73
- test "repo_name cannot contain a `/`" do
74
- assert @stack.valid?
75
- @stack.repo_name = 'foo/bar'
76
- refute @stack.valid?
77
- end
78
-
79
31
  test "repo_http_url" do
80
32
  assert_equal "https://github.com/#{@stack.repo_owner}/#{@stack.repo_name}", @stack.repo_http_url
81
33
  end
@@ -104,6 +56,30 @@ module Shipit
104
56
  assert_equal shipit_deploys(:shipit_complete).until_commit_id, deploy.since_commit_id
105
57
  end
106
58
 
59
+ test "#trigger_deploy emits a hook" do
60
+ original_receivers = Shipit.internal_hook_receivers
61
+
62
+ FakeReceiver = Module.new do
63
+ mattr_accessor :hooks
64
+ self.hooks = []
65
+
66
+ def self.deliver(event, stack, payload)
67
+ hooks << [event, stack, payload]
68
+ end
69
+ end
70
+ Shipit.internal_hook_receivers = [FakeReceiver]
71
+
72
+ last_commit = shipit_commits(:third)
73
+ deploy = @stack.trigger_deploy(last_commit, AnonymousUser.new)
74
+ assert_includes(FakeReceiver.hooks, [
75
+ :deploy,
76
+ @stack,
77
+ { deploy: deploy, status: "pending", stack: @stack },
78
+ ])
79
+ ensure
80
+ Shipit.internal_hook_receivers = original_receivers
81
+ end
82
+
107
83
  test "#trigger_deploy deploy until the commit passed in argument" do
108
84
  last_commit = shipit_commits(:third)
109
85
  deploy = @stack.trigger_deploy(last_commit, AnonymousUser.new)
@@ -225,7 +201,7 @@ module Shipit
225
201
 
226
202
  test "#create queues a GithubSyncJob" do
227
203
  assert_enqueued_with(job: GithubSyncJob) do
228
- Stack.create!(repo_name: 'rails', repo_owner: 'rails')
204
+ Stack.create!(repository: shipit_repositories(:rails))
229
205
  end
230
206
  end
231
207
 
@@ -273,7 +249,10 @@ module Shipit
273
249
  end
274
250
 
275
251
  test ".run_deploy_in_foreground triggers a deploy" do
276
- stack = Stack.create!(repo_owner: 'foo', repo_name: 'bar', environment: 'production')
252
+ stack = Stack.create!(
253
+ repository: Repository.new(owner: "foo", name: "bar"),
254
+ environment: 'production',
255
+ )
277
256
  commit = shipit_commits(:first)
278
257
  stack.commits << commit
279
258
 
@@ -288,8 +267,9 @@ module Shipit
288
267
  end
289
268
  end
290
269
 
291
- test "#deployable? returns true if the stack is not locked and is not deploying" do
270
+ test "#deployable? returns true if the stack is not locked, not awaiting provision, and is not deploying" do
292
271
  @stack.deploys.destroy_all
272
+ @stack.update!(lock_reason: nil, awaiting_provision: false)
293
273
  assert_predicate @stack, :deployable?
294
274
  end
295
275
 
@@ -303,6 +283,11 @@ module Shipit
303
283
  refute_predicate @stack, :deployable?
304
284
  end
305
285
 
286
+ test "#deployable? returns false if the stack is awaiting provisioning" do
287
+ @stack.update!(lock_reason: nil, awaiting_provision: true)
288
+ refute_predicate @stack, :deployable?
289
+ end
290
+
306
291
  test "#allows_merges? returns true if the stack is not locked and the branch is green" do
307
292
  assert_predicate @stack, :allows_merges?
308
293
  end
@@ -328,7 +313,7 @@ module Shipit
328
313
  end
329
314
 
330
315
  test "#monitoring returns deploy_spec's content" do
331
- assert_equal [{'image' => 'https://example.com/monitor.png', 'width' => 200, 'height' => 300}], @stack.monitoring
316
+ assert_equal [{ 'image' => 'https://example.com/monitor.png', 'width' => 200, 'height' => 300 }], @stack.monitoring
332
317
  end
333
318
 
334
319
  test "#destroy deletes the related commits" do
@@ -360,18 +345,18 @@ module Shipit
360
345
  time = Time.current
361
346
  @stack.update(lock_reason: "Just for fun", lock_author: shipit_users(:walrus))
362
347
  travel 1.day
363
- expect_hook(:lock, @stack, locked: false, lock_details: {from: time, until: Time.current}, stack: @stack) do
348
+ expect_hook(:lock, @stack, locked: false, lock_details: { from: time, until: Time.current }, stack: @stack) do
364
349
  @stack.update(lock_reason: nil)
365
350
  end
366
351
  end
367
352
  end
368
353
 
369
- test "unlocking the stack triggers a MergePullRequests job" do
370
- assert_no_enqueued_jobs(only: MergePullRequestsJob) do
354
+ test "unlocking the stack triggers a MergeMergeRequests job" do
355
+ assert_no_enqueued_jobs(only: ProcessMergeRequestsJob) do
371
356
  @stack.update(lock_reason: "Just for fun", lock_author: shipit_users(:walrus))
372
357
  end
373
358
 
374
- assert_enqueued_with(job: MergePullRequestsJob, args: [@stack]) do
359
+ assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@stack]) do
375
360
  @stack.update(lock_reason: nil)
376
361
  end
377
362
  end
@@ -411,7 +396,7 @@ module Shipit
411
396
 
412
397
  test "updating the stack emit a hook" do
413
398
  expect_hook(:stack, @stack, action: :updated, stack: @stack) do
414
- @stack.update(repo_name: 'foo')
399
+ @stack.update(environment: 'foo')
415
400
  end
416
401
  end
417
402
 
@@ -505,7 +490,9 @@ module Shipit
505
490
 
506
491
  assert_no_enqueued_jobs do
507
492
  assert_no_difference -> { Deploy.count } do
508
- @stack.trigger_continuous_delivery
493
+ value = @stack.trigger_continuous_delivery
494
+
495
+ assert_nil value
509
496
  end
510
497
  end
511
498
  end
@@ -573,7 +560,24 @@ module Shipit
573
560
  end
574
561
  end
575
562
 
563
+ test "#trigger_continuous_delivery bails out if no DeploySpec has been cached" do
564
+ @stack = shipit_stacks(:check_deploy_spec)
565
+ deploy_spec = @stack.cached_deploy_spec
566
+
567
+ assert_predicate @stack, :deployable?
568
+ refute_predicate @stack, :deployed_too_recently?
569
+ assert(deploy_spec.blank?, "DeploySpec blank? returned false")
570
+
571
+ assert_no_enqueued_jobs(only: Shipit::PerformTaskJob) do
572
+ assert_no_difference -> { Deploy.count } do
573
+ @stack.trigger_continuous_delivery
574
+ end
575
+ end
576
+ end
577
+
576
578
  test "#trigger_continuous_delivery enqueues deployment ref update job" do
579
+ Shipit.stubs(:update_latest_deployed_ref).returns(true)
580
+
577
581
  @stack = shipit_stacks(:shipit_canaries)
578
582
  shipit_tasks(:canaries_running).delete
579
583
 
@@ -589,6 +593,8 @@ module Shipit
589
593
  end
590
594
 
591
595
  test "#trigger_continuous_delivery executes ref update job with correct sha" do
596
+ Shipit.stubs(:update_latest_deployed_ref).returns(true)
597
+
592
598
  @stack = shipit_stacks(:shipit_canaries)
593
599
  shipit_tasks(:canaries_running).delete
594
600
 
@@ -620,7 +626,7 @@ module Shipit
620
626
  @stack.tasks.delete_all
621
627
 
622
628
  deploy = @stack.trigger_continuous_delivery
623
- assert_equal({'SAFETY_DISABLED' => '0'}, deploy.env)
629
+ assert_equal({ 'SAFETY_DISABLED' => '0' }, deploy.env)
624
630
  end
625
631
 
626
632
  test "#continuous_delivery_delayed! bumps updated_at" do
@@ -870,6 +876,56 @@ module Shipit
870
876
  )
871
877
  end
872
878
 
879
+ test "#trigger_continuous_delivery sets delay if commit was pushed recently" do
880
+ freeze_time do
881
+ @stack.tasks.delete_all
882
+
883
+ commit = @stack.next_commit_to_deploy
884
+ commit.touch(:created_at)
885
+
886
+ assert_no_enqueued_jobs(only: Shipit::PerformTaskJob) do
887
+ assert_no_difference -> { Deploy.count } do
888
+ @stack.trigger_continuous_delivery
889
+ end
890
+ end
891
+ end
892
+ end
893
+
894
+ test "#links performs template substitutions" do
895
+ @stack.repo_name = "expected-repository-name"
896
+ @stack.environment = "expected-environment"
897
+ @stack.cached_deploy_spec = create_deploy_spec(
898
+ "links" => {
899
+ "logs" => "http://logs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com",
900
+ "monitoring" => "https://graphs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com",
901
+ },
902
+ )
903
+
904
+ assert_equal(
905
+ {
906
+ "logs" => "http://logs.expected-repository-name.expected-environment.domain.com",
907
+ "monitoring" => "https://graphs.expected-repository-name.expected-environment.domain.com",
908
+ },
909
+ @stack.links,
910
+ )
911
+ end
912
+
913
+ test "#env includes the stack's environment" do
914
+ expected_environment = {
915
+ 'ENVIRONMENT' => @stack.environment,
916
+ 'LAST_DEPLOYED_SHA' => @stack.last_deployed_commit.sha,
917
+ 'GITHUB_REPO_OWNER' => @stack.repository.owner,
918
+ 'GITHUB_REPO_NAME' => @stack.repository.name,
919
+ 'DEPLOY_URL' => @stack.deploy_url,
920
+ 'BRANCH' => @stack.branch,
921
+ }
922
+
923
+ assert_equal(
924
+ @stack.env,
925
+ expected_environment,
926
+ )
927
+ end
928
+
873
929
  private
874
930
 
875
931
  def generate_revert_commit(stack:, reverted_commit:, author: reverted_commit.author)
@@ -882,5 +938,9 @@ module Shipit
882
938
  committed_at: Time.zone.now,
883
939
  )
884
940
  end
941
+
942
+ def create_deploy_spec(spec)
943
+ Shipit::DeploySpec.new(spec.stringify_keys)
944
+ end
885
945
  end
886
946
  end