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,22 +1,23 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
4
- class MergePullRequestsJobTest < ActiveSupport::TestCase
5
+ class ProcessMergeRequestsJobTest < ActiveSupport::TestCase
5
6
  setup do
6
7
  @stack = shipit_stacks(:shipit)
7
- @job = MergePullRequestsJob.new
8
+ @job = ProcessMergeRequestsJob.new
8
9
 
9
- @pending_pr = shipit_pull_requests(:shipit_pending)
10
- @unmergeable_pr = shipit_pull_requests(:shipit_pending_unmergeable)
11
- @not_ready_pr = shipit_pull_requests(:shipit_pending_not_mergeable_yet)
12
- @closed_pr = shipit_pull_requests(:shipit_pending_closed)
13
- @merged_pr = shipit_pull_requests(:shipit_pending_merged)
14
- @expired_pr = shipit_pull_requests(:shipit_pending_expired)
15
- @mergable_pending_ci = shipit_pull_requests(:shipit_mergeable_pending_ci)
10
+ @pending_pr = shipit_merge_requests(:shipit_pending)
11
+ @unmergeable_pr = shipit_merge_requests(:shipit_pending_unmergeable)
12
+ @not_ready_pr = shipit_merge_requests(:shipit_pending_not_mergeable_yet)
13
+ @closed_pr = shipit_merge_requests(:shipit_pending_closed)
14
+ @merged_pr = shipit_merge_requests(:shipit_pending_merged)
15
+ @expired_pr = shipit_merge_requests(:shipit_pending_expired)
16
+ @mergable_pending_ci = shipit_merge_requests(:shipit_mergeable_pending_ci)
16
17
  end
17
18
 
18
19
  test "#perform rejects unmergeable PRs and merge the others" do
19
- PullRequest.any_instance.stubs(:refresh!)
20
+ MergeRequest.any_instance.stubs(:refresh!)
20
21
  stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(200 OK), body: {
21
22
  sha: "6dcb09b5b57875f334f61aebed695e2e4193db5e",
22
23
  merged: true,
@@ -34,7 +35,7 @@ module Shipit
34
35
  end
35
36
 
36
37
  test "#perform rejects PRs if the merge attempt fails" do
37
- PullRequest.any_instance.stubs(:refresh!)
38
+ MergeRequest.any_instance.stubs(:refresh!)
38
39
  stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(405 Method not allowed), body: {
39
40
  message: "Pull Request is not mergeable",
40
41
  documentation_url: "https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button",
@@ -46,24 +47,24 @@ module Shipit
46
47
  end
47
48
 
48
49
  test "#perform rejects PRs but do not attempt to merge any if the stack doesn't allow merges" do
49
- PullRequest.any_instance.stubs(:refresh!)
50
+ MergeRequest.any_instance.stubs(:refresh!)
50
51
  @stack.update!(lock_reason: 'Maintenance')
51
52
  @job.perform(@stack)
52
53
  assert_predicate @pending_pr.reload, :pending?
53
54
  end
54
55
 
55
56
  test "#perform revalidate PRs but do not attempt to merge any if the stack doesn't allow merges" do
56
- PullRequest.any_instance.stubs(:refresh!)
57
+ MergeRequest.any_instance.stubs(:refresh!)
57
58
  @stack.update!(lock_reason: 'Maintenance')
58
59
  @job.perform(@stack)
59
60
  assert_predicate @expired_pr.reload, :revalidating?
60
61
  end
61
62
 
62
63
  test "#perform schedules a new job if the first PR in the queue is not mergeable yet" do
63
- PullRequest.any_instance.stubs(:refresh!)
64
+ MergeRequest.any_instance.stubs(:refresh!)
64
65
 
65
66
  @pending_pr.update!(mergeable: nil)
66
- assert_enqueued_with(job: MergePullRequestsJob) do
67
+ assert_enqueued_with(job: ProcessMergeRequestsJob) do
67
68
  @job.perform(@stack)
68
69
  end
69
70
  assert_predicate @pending_pr.reload, :pending?
@@ -71,21 +72,21 @@ module Shipit
71
72
 
72
73
  test "#perform cancels merge requests for closed PRs" do
73
74
  @pending_pr.cancel!
74
- PullRequest.any_instance.stubs(:refresh!)
75
+ MergeRequest.any_instance.stubs(:refresh!)
75
76
  @job.perform(@stack)
76
77
  assert_predicate @closed_pr.reload, :canceled?
77
78
  end
78
79
 
79
80
  test "#perform cancels merge requests for manually merged PRs" do
80
81
  @pending_pr.cancel!
81
- PullRequest.any_instance.stubs(:refresh!)
82
+ MergeRequest.any_instance.stubs(:refresh!)
82
83
  @job.perform(@stack)
83
84
  assert_predicate @merged_pr.reload, :canceled?
84
85
  end
85
86
 
86
87
  test "#perform does not reject pull requests with pending statuses" do
87
88
  @pending_pr.cancel!
88
- PullRequest.any_instance.stubs(:refresh!)
89
+ MergeRequest.any_instance.stubs(:refresh!)
89
90
  @job.perform(@stack)
90
91
  refute_predicate @mergable_pending_ci.reload, :rejected?
91
92
  refute_predicate @mergable_pending_ci.reload, :merged?
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class ReapDeadTasksJobTest < ActiveSupport::TestCase
6
+ setup do
7
+ Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
8
+
9
+ not_recently = Shipit::Task.recently_created_at - 1.minute
10
+ @deploy = shipit_deploys(:shipit)
11
+ @deploy.status = 'success'
12
+ @deploy.created_at = not_recently
13
+ @deploy.save!
14
+
15
+ @rollback = @deploy.build_rollback
16
+ @rollback.status = 'running'
17
+ @rollback.created_at = not_recently
18
+ @rollback.save!
19
+
20
+ @zombie_deploy = shipit_deploys(:shipit2)
21
+ @zombie_deploy.status = 'running'
22
+ @zombie_deploy.created_at = not_recently
23
+ @zombie_deploy.save!
24
+ end
25
+
26
+ test 'reaps only zombie tasks' do
27
+ refute_predicate @zombie_deploy, :error?
28
+
29
+ Shipit::Deploy.any_instance.expects(:alive?).returns(false)
30
+ Shipit::Rollback.any_instance.expects(:alive?).returns(true)
31
+ ReapDeadTasksJob.perform_now
32
+
33
+ @zombie_deploy.reload
34
+ assert_predicate @zombie_deploy, :error?
35
+
36
+ @deploy.reload
37
+ assert_predicate @deploy, :finished?
38
+
39
+ @rollback.reload
40
+ assert_predicate @rollback, :running?
41
+ end
42
+
43
+ test "does reap recently created tasks" do
44
+ Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
45
+ recently = Time.current
46
+ @deploy = shipit_deploys(:shipit)
47
+ @deploy.created_at = recently
48
+ @deploy.status = 'running'
49
+ @deploy.save!
50
+ Shipit::Deploy.any_instance.expects(:alive?).never
51
+
52
+ ReapDeadTasksJob.perform_now
53
+
54
+ @deploy.reload
55
+ assert_predicate @deploy, :running?
56
+ end
57
+
58
+ test 'reaps zombie aborting tasks' do
59
+ deploy = shipit_deploys(:shipit2)
60
+ deploy.status = 'aborting'
61
+ deploy.save!
62
+
63
+ ReapDeadTasksJob.perform_now
64
+
65
+ assert_predicate deploy.reload, :error?
66
+ end
67
+ end
68
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class DeployCommandsTest < ActiveSupport::TestCase
6
+ test "#env includes the stack's pull request labels" do
7
+ stack = shipit_stacks(:review_stack)
8
+ deploy = stack.trigger_continuous_delivery
9
+ stack.pull_request.labels = ["wip", "bug"]
10
+
11
+ env = Shipit::DeployCommands.new(deploy).env
12
+
13
+ assert_equal env["WIP"], "true"
14
+ assert_equal env["BUG"], "true"
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class TaskCommandsTest < ActiveSupport::TestCase
6
+ test "#env includes a ReviewStack's pull request labels" do
7
+ stack = shipit_stacks(:review_stack)
8
+ stack.pull_request.labels = ["wip", "bug"]
9
+ task = shipit_tasks(:shipit_restart)
10
+ task.stack = stack
11
+
12
+ env = Shipit::TaskCommands.new(task).env
13
+
14
+ assert_equal env["WIP"], "true"
15
+ assert_equal env["BUG"], "true"
16
+ end
17
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class SameSiteCookieMiddlewareTest < ActiveSupport::TestCase
6
+ def app
7
+ Rack::Lint.new(lambda { |_env|
8
+ response = Rack::Response.new("", 200, "Content-Type" => "text/yaml")
9
+
10
+ response.set_cookie("session_test", value: "session_test", domain: ".test.com", path: "/")
11
+ response.set_cookie("another_cookie", value: "123abc", domain: ".test.com", path: "/")
12
+ response.finish
13
+ })
14
+ end
15
+
16
+ def env_for_url(url)
17
+ env = Rack::MockRequest.env_for(url)
18
+ env
19
+ end
20
+
21
+ def middleware
22
+ Shipit::SameSiteCookieMiddleware.new(app)
23
+ end
24
+
25
+ test 'SameSite cookie attributes should be added on SSL' do
26
+ env = env_for_url("https://test.com/")
27
+
28
+ _status, headers, _body = middleware.call(env)
29
+
30
+ assert_includes headers['Set-Cookie'], 'SameSite'
31
+ end
32
+
33
+ test 'SameSite cookie attributes should be added when multiple cookies are present' do
34
+ env = env_for_url("https://test.com/")
35
+
36
+ _status, headers, _body = middleware.call(env)
37
+
38
+ session_cookie, other_cookie = headers['Set-Cookie'].split("\n")
39
+
40
+ assert_includes session_cookie, 'SameSite'
41
+ assert_includes other_cookie, 'SameSite'
42
+ end
43
+
44
+ test 'SameSite cookie attributes should not be added on non SSL requests' do
45
+ env = env_for_url("http://test.com/")
46
+
47
+ _status, headers, _body = middleware.call(env)
48
+
49
+ assert_not_includes headers['Set-Cookie'], 'SameSite'
50
+ end
51
+ end
52
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
  require 'tmpdir'
3
4
 
@@ -1,12 +1,12 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
4
5
  class CommitDeploymentStatusTest < ActiveSupport::TestCase
5
6
  setup do
6
- @status = shipit_commit_deployment_statuses(:shipit2_deploy_third_pending)
7
+ @status = shipit_commit_deployment_statuses(:shipit2_deploy_third_in_progress)
7
8
  @deployment = @status.commit_deployment
8
9
  @task = @deployment.task
9
- @commit = @deployment.commit
10
10
  @author = @deployment.author
11
11
  end
12
12
 
@@ -14,14 +14,44 @@ module Shipit
14
14
  response = stub(id: 44, url: 'https://example.com')
15
15
  @author.github_api.expects(:create_deployment_status).with(
16
16
  @deployment.api_url,
17
- 'pending',
17
+ 'in_progress',
18
+ accept: "application/vnd.github.flash-preview+json",
18
19
  target_url: "http://shipit.com/shopify/shipit-engine/production/deploys/#{@task.id}",
19
- description: "walrus triggered the deploy of shopify/shipit-engine/production to #{@commit.sha}",
20
+ description: "walrus triggered the deploy of shopify/shipit-engine/production to #{@deployment.short_sha}",
21
+ environment_url: "https://shipit.shopify.com",
20
22
  ).returns(response)
21
23
 
22
24
  @status.create_on_github!
23
25
  assert_equal response.id, @status.github_id
24
26
  assert_equal response.url, @status.api_url
25
27
  end
28
+
29
+ test 'description is truncated to character limit' do
30
+ limit = CommitDeploymentStatus::DESCRIPTION_CHARACTER_LIMIT_ON_GITHUB
31
+ deployment = shipit_commit_deployments(:shipit_deploy_second)
32
+
33
+ status = deployment.statuses.create!(status: 'success')
34
+ status.stubs(:description).returns('desc' * limit)
35
+ create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
36
+ status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
37
+ kwargs[:description].size <= limit
38
+ end.returns(create_status_response)
39
+
40
+ status.create_on_github!
41
+ end
42
+
43
+ test 'includes deployment url when the deployment succeeds' do
44
+ deployment = shipit_commit_deployments(:shipit_deploy_second)
45
+
46
+ status = deployment.statuses.create!(status: 'success')
47
+ stack = status.stack
48
+ stack.deploy_url = "stack-deploy-url"
49
+ create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
50
+ status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
51
+ kwargs[:environment_url] == 'stack-deploy-url'
52
+ end.returns(create_status_response)
53
+
54
+ status.create_on_github!
55
+ end
26
56
  end
27
57
  end
@@ -1,33 +1,31 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
4
5
  class CommitDeploymentTest < ActiveSupport::TestCase
5
6
  setup do
6
7
  @deployment = shipit_commit_deployments(:shipit_pending_fourth)
7
- @commit = @deployment.commit
8
8
  @task = @deployment.task
9
9
  @stack = @task.stack
10
10
  @author = @deployment.author
11
11
  end
12
12
 
13
- test "there can only be one record per deploy and commit pair" do
14
- assert_raises ActiveRecord::RecordNotUnique do
15
- CommitDeployment.create!(task: @deployment.task, commit: @deployment.commit)
16
- end
17
- end
18
-
19
13
  test "creation on GitHub" do
20
- pull_request_response = stub(head: stub(sha: '6dcb09b5b57875f334f61aebed695e2e4193db5e'))
21
- @author.github_api.expects(:pull_request).with('shopify/shipit-engine', 7).returns(pull_request_response)
22
-
23
14
  deployment_response = stub(id: 42, url: 'https://example.com')
24
15
  @author.github_api.expects(:create_deployment).with(
25
16
  'shopify/shipit-engine',
26
- pull_request_response.head.sha,
17
+ @deployment.sha,
27
18
  auto_merge: false,
28
19
  required_contexts: [],
29
20
  description: "Via Shipit",
30
21
  environment: @stack.environment,
22
+ payload: {
23
+ shipit: {
24
+ task_id: 4,
25
+ from_sha: 'f890fd8b5f2be05d1fedb763a3605ee461c39074',
26
+ to_sha: '467578b362bf2b4df5903e1c7960929361c3435a',
27
+ },
28
+ }.to_json,
31
29
  ).returns(deployment_response)
32
30
 
33
31
  @deployment.create_on_github!
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -12,7 +13,7 @@ module Shipit
12
13
  stub_request(:get, "https://api.github.com/user/emails").to_return(
13
14
  status: %w(200 OK),
14
15
  body: {}.to_json,
15
- headers: {"Content-Type" => "application/json"},
16
+ headers: { "Content-Type" => "application/json" },
16
17
  )
17
18
  end
18
19
 
@@ -68,6 +69,39 @@ module Shipit
68
69
  refute_predicate commit, :revert?
69
70
  end
70
71
 
72
+ test '.create_from_github truncates long messages' do
73
+ message = 'ABCDEFGHIJ' * 7000
74
+
75
+ assert_difference -> { Commit.count }, +1 do
76
+ @stack.commits.create_from_github!(
77
+ resource(
78
+ sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
79
+ author: {},
80
+ committer: {},
81
+ commit: {
82
+ author: {
83
+ name: 'Lando Walrussian',
84
+ email: 'walrus@shopify.com',
85
+ date: Time.now,
86
+ },
87
+ committer: {
88
+ name: 'Lando Walrussian',
89
+ email: 'walrus@shopify.com',
90
+ date: Time.now,
91
+ },
92
+ message: message,
93
+ },
94
+ ),
95
+ )
96
+ end
97
+
98
+ max_message_size = Shipit::Commit.columns_hash["message"].limit
99
+ commit = Commit.last
100
+
101
+ refute_predicate commit.message, :blank?
102
+ assert(commit.message.length <= Shipit::Commit.columns_hash["message"].limit) if max_message_size
103
+ end
104
+
71
105
  test '.create_from_github handle PRs merged by another Shipit stacks' do
72
106
  assert_difference -> { Commit.count }, +1 do
73
107
  @stack.commits.create_from_github!(
@@ -96,6 +130,55 @@ module Shipit
96
130
  assert_equal shipit_users(:walrus), commit.author
97
131
  end
98
132
 
133
+ test '.create_from_github stores pull_request_head_sha' do
134
+ assert_difference -> { Commit.count }, +1 do
135
+ @stack.commits.create_from_github!(
136
+ resource(
137
+ sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
138
+ author: {},
139
+ committer: {},
140
+ commit: {
141
+ author: {
142
+ name: 'Shipit',
143
+ email: '',
144
+ date: Time.now,
145
+ },
146
+ committer: {
147
+ name: 'Shipit',
148
+ email: '',
149
+ date: Time.now,
150
+ },
151
+ message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
152
+ },
153
+ parents: [
154
+ { sha: "1864542e3d2f8a41916a2dec0f2b4d3c1bf4899b", url: '', html_url: '' },
155
+ { sha: "63d7e03e517fd2ae1caeb1b7a9f21767f84d671a", url: '', html_url: '' },
156
+ ],
157
+ ),
158
+ )
159
+ end
160
+
161
+ commit = Commit.last
162
+ assert_equal '63d7e03e517fd2ae1caeb1b7a9f21767f84d671a', commit.pull_request_head_sha
163
+ end
164
+
165
+ test "#message= truncates the message" do
166
+ skip unless Shipit::Commit.columns_hash['message'].limit
167
+ limit = Shipit::Commit.columns_hash['message'].limit
168
+
169
+ @commit.update!(message: 'a' * limit * 2)
170
+ assert_equal limit, @commit.message.bytesize
171
+ end
172
+
173
+ test "#message= truncates multibyte messages" do
174
+ skip unless Shipit::Commit.columns_hash['message'].limit
175
+ limit = Shipit::Commit.columns_hash['message'].limit
176
+
177
+ @commit.update!(message: '国' * limit)
178
+ assert_operator @commit.message.length, :<=, limit
179
+ assert_operator @commit.message.bytesize, :<=, limit
180
+ end
181
+
99
182
  test "#pull_request? detect pull request based on message format" do
100
183
  assert @pr.pull_request?
101
184
  refute @commit.pull_request?
@@ -143,7 +226,7 @@ module Shipit
143
226
 
144
227
  test "updating broadcasts an update event" do
145
228
  expect_event(@stack)
146
- @commit.update_attributes(message: "toto")
229
+ @commit.update(message: "toto")
147
230
  end
148
231
 
149
232
  test "updating state to success triggers new deploy when stack has continuous deployment" do
@@ -190,12 +273,14 @@ module Shipit
190
273
  committed_at: Time.now,
191
274
  )
192
275
 
193
- @stack.deploys.create!(
276
+ deploy = @stack.deploys.build(
194
277
  user_id: walrus.id,
195
278
  since_commit: @stack.commits.first,
196
279
  until_commit: new_commit,
197
280
  status: 'success',
198
281
  )
282
+ deploy.stubs(:pull_request_head_for_commit).returns(nil)
283
+ deploy.save!
199
284
 
200
285
  assert_no_difference "Deploy.count" do
201
286
  @commit.statuses.create!(stack_id: @stack.id, state: 'success')
@@ -248,7 +333,7 @@ module Shipit
248
333
  target_url: 'http://example.com',
249
334
  created_at: 1.day.ago,
250
335
  )
251
- Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha).returns([status])
336
+ Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha, per_page: 100).returns([status])
252
337
  assert_difference '@commit.statuses.count', 1 do
253
338
  @commit.refresh_statuses!
254
339
  end
@@ -385,10 +470,10 @@ module Shipit
385
470
  commit = shipit_commits(:second)
386
471
  assert_predicate commit.status, :group?
387
472
  assert_equal 3, commit.status.size
388
- commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => {'hide' => [
473
+ commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => { 'hide' => [
389
474
  'Travis CI',
390
475
  'metrics/coveralls',
391
- ]}))
476
+ ] }))
392
477
  commit.reload
393
478
  refute_predicate commit.status, :group?
394
479
  end
@@ -518,7 +603,7 @@ module Shipit
518
603
  'error' => %w(success),
519
604
  }
520
605
  expected_webhook_transitions.each do |initial_state, firing_states|
521
- initial_status_attributes = {state: initial_state, description: 'abc', context: 'ci/travis'}
606
+ initial_status_attributes = { state: initial_state, description: 'abc', context: 'ci/travis' }
522
607
  (expected_webhook_transitions.keys - %w(unknown)).each do |new_state|
523
608
  should_fire = firing_states.include?(new_state)
524
609
  action = should_fire ? 'fires' : 'does not fire'
@@ -537,7 +622,7 @@ module Shipit
537
622
  end
538
623
  assert_equal initial_state, commit.state
539
624
 
540
- expected_status_attributes = {state: new_state, description: initial_state, context: 'ci/travis'}
625
+ expected_status_attributes = { state: new_state, description: initial_state, context: 'ci/travis' }
541
626
  add_status = lambda do
542
627
  attrs = expected_status_attributes.merge(created_at: 1.day.ago.to_s(:db))
543
628
  commit.create_status_from_github!(OpenStruct.new(attrs))
@@ -602,7 +687,7 @@ module Shipit
602
687
  end
603
688
  end
604
689
 
605
- test "#add_status schedule a MergePullRequests job if the commit transition to `pending` or `success`" do
690
+ test "#add_status schedule a MergeMergeRequests job if the commit transition to `pending` or `success`" do
606
691
  commit = shipit_commits(:second)
607
692
  github_status = OpenStruct.new(
608
693
  state: 'success',
@@ -612,7 +697,7 @@ module Shipit
612
697
  )
613
698
 
614
699
  assert_equal 'failure', commit.state
615
- assert_enqueued_with(job: MergePullRequestsJob, args: [@commit.stack]) do
700
+ assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@commit.stack]) do
616
701
  commit.create_status_from_github!(github_status)
617
702
  assert_equal 'success', commit.state
618
703
  end
@@ -653,12 +738,12 @@ module Shipit
653
738
  sha: '5590fd8b5f2be05d1fedb763a3605ee461c39074',
654
739
  message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
655
740
  )
656
- pull_request = shipit_pull_requests(:shipit_pending)
741
+ merge_request = shipit_merge_requests(:shipit_pending)
657
742
 
658
743
  assert_predicate commit, :pull_request?
659
744
  assert_equal 62, commit.pull_request_number
660
- assert_equal pull_request.title, commit.pull_request_title
661
- assert_equal pull_request, commit.pull_request
745
+ assert_equal merge_request.title, commit.pull_request_title
746
+ assert_equal merge_request, commit.merge_request
662
747
  end
663
748
 
664
749
  test "merge commits infer pull request number and title from the message if it's not a known pull request" do
@@ -674,7 +759,7 @@ module Shipit
674
759
  assert_predicate commit, :pull_request?
675
760
  assert_equal 99, commit.pull_request_number
676
761
  assert_equal 'yoloshipit!', commit.pull_request_title
677
- assert_nil commit.pull_request
762
+ assert_nil commit.merge_request
678
763
  end
679
764
 
680
765
  test "the merge requester if known overrides the commit author" do
@@ -703,7 +788,7 @@ module Shipit
703
788
  refute_predicate commit, :pull_request?
704
789
  assert_nil commit.pull_request_number
705
790
  assert_nil commit.pull_request_title
706
- assert_nil commit.pull_request
791
+ assert_nil commit.merge_request
707
792
  end
708
793
 
709
794
  test "#revert? returns false if the message doesn't follow the revert convention" do
@@ -762,17 +847,27 @@ module Shipit
762
847
  test "when merged via the queue, deploy_requested_at is merge_requested_at" do
763
848
  commit = shipit_commits(:cyclimse_merged)
764
849
  assert_predicate commit, :pull_request?
765
- assert_equal commit.pull_request, shipit_pull_requests(:cyclimse_pending_merged)
766
- assert_equal commit.deploy_requested_at, commit.pull_request.merge_requested_at
850
+ assert_equal commit.merge_request, shipit_merge_requests(:cyclimse_pending_merged)
851
+ assert_equal commit.deploy_requested_at, commit.merge_request.merge_requested_at
767
852
  end
768
853
 
769
854
  test "when merged manually after being queued, deploy_requested_at is created_at" do
770
- pr = shipit_pull_requests(:cyclimse_pending_merged)
855
+ pr = shipit_merge_requests(:cyclimse_pending_merged)
771
856
  pr.cancel!
772
857
  commit = shipit_commits(:cyclimse_merged)
773
858
  assert_equal commit.deploy_requested_at, commit.created_at
774
859
  end
775
860
 
861
+ test "#recently_pushed?" do
862
+ freeze_time do
863
+ commit = Commit.new(message: "abcd", created_at: Time.now.utc)
864
+ assert_predicate commit, :recently_pushed?
865
+
866
+ commit = Commit.new(message: "abcd", created_at: 10.minutes.ago)
867
+ refute_predicate commit, :recently_pushed?
868
+ end
869
+ end
870
+
776
871
  private
777
872
 
778
873
  def expect_event(stack)
@@ -784,9 +879,9 @@ module Shipit
784
879
 
785
880
  def expect_hook_emit(commit, event, status_attributes, &block)
786
881
  matches = lambda do |payload|
787
- assert_equal commit, payload[:commit]
788
- assert_equal commit.stack, payload[:stack]
789
- assert_equal status_attributes[:state], payload[:status]
882
+ assert_equal(commit, payload[:commit])
883
+ assert_equal(commit.stack, payload[:stack])
884
+ assert_equal(status_attributes[:state], payload[:status])
790
885
  end
791
886
  expect_hook(event, commit.stack, matches, &block)
792
887
  end