shipit-engine 0.30.0 → 0.34.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 +19 -4
  3. data/Rakefile +4 -2
  4. data/app/assets/images/magic-solid.svg +1 -0
  5. data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
  6. data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
  7. data/app/assets/stylesheets/_pages/_deploy.scss +0 -2
  8. data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
  9. data/app/assets/stylesheets/_pages/_stacks.scss +19 -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 +1 -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 +6 -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 +34 -0
  28. data/app/controllers/shipit/api/stacks_controller.rb +32 -5
  29. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  30. data/app/controllers/shipit/api_clients_controller.rb +4 -3
  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 +4 -3
  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 +31 -30
  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 +24 -9
  43. data/app/controllers/shipit/status_controller.rb +2 -1
  44. data/app/controllers/shipit/tasks_controller.rb +7 -6
  45. data/app/controllers/shipit/webhooks_controller.rb +26 -6
  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 -1
  51. data/app/helpers/shipit/stacks_helper.rb +5 -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 +1 -0
  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 +2 -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 +2 -1
  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 +3 -2
  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 +15 -10
  70. data/app/jobs/shipit/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 -92
  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 +5 -4
  83. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  84. data/app/models/shipit/anonymous_user.rb +15 -2
  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 +41 -4
  88. data/app/models/shipit/command_line_user.rb +5 -0
  89. data/app/models/shipit/commit.rb +42 -24
  90. data/app/models/shipit/commit_checks.rb +15 -13
  91. data/app/models/shipit/commit_deployment.rb +6 -5
  92. data/app/models/shipit/commit_deployment_status.rb +5 -4
  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 +23 -28
  96. data/app/models/shipit/deploy_spec.rb +38 -7
  97. data/app/models/shipit/deploy_spec/bundler_discovery.rb +1 -0
  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 +13 -4
  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 +2 -1
  106. data/app/models/shipit/duration.rb +5 -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 +34 -7
  111. data/app/models/shipit/membership.rb +3 -2
  112. data/app/models/shipit/merge_request.rb +304 -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 +28 -266
  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 +4 -3
  121. data/app/models/shipit/repository.rb +71 -6
  122. data/app/models/shipit/review_stack.rb +130 -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 +144 -44
  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 +2 -1
  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 +98 -12
  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 +109 -0
  135. data/app/models/shipit/team.rb +6 -3
  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 +19 -8
  139. data/app/models/shipit/variable_definition.rb +1 -0
  140. data/app/models/shipit/webhooks.rb +11 -0
  141. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
  142. data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
  143. data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -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 +5 -1
  154. data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -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 +8 -6
  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 +1 -0
  171. data/app/validators/subset_validator.rb +2 -1
  172. data/app/views/layouts/merge_status.html.erb +1 -1
  173. data/app/views/layouts/shipit.html.erb +1 -1
  174. data/app/views/shipit/_variables.html.erb +1 -1
  175. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  176. data/app/views/shipit/deploys/show.html.erb +2 -2
  177. data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
  178. data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
  179. data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
  180. data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
  181. data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
  182. data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
  183. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  184. data/app/views/shipit/merge_status/locked.html.erb +1 -1
  185. data/app/views/shipit/merge_status/success.html.erb +2 -2
  186. data/app/views/shipit/repositories/_header.html.erb +19 -0
  187. data/app/views/shipit/repositories/index.html.erb +31 -0
  188. data/app/views/shipit/repositories/new.html.erb +23 -0
  189. data/app/views/shipit/repositories/settings.html.erb +53 -0
  190. data/app/views/shipit/repositories/show.html.erb +30 -0
  191. data/app/views/shipit/stacks/_banners.html.erb +15 -1
  192. data/app/views/shipit/stacks/_header.html.erb +20 -7
  193. data/app/views/shipit/stacks/_stack.html.erb +8 -0
  194. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  195. data/app/views/shipit/stacks/index.html.erb +3 -2
  196. data/app/views/shipit/stacks/new.html.erb +1 -1
  197. data/app/views/shipit/stacks/settings.html.erb +5 -5
  198. data/app/views/shipit/stacks/show.html.erb +1 -1
  199. data/app/views/shipit/tasks/_task_output.html.erb +1 -1
  200. data/app/views/shipit/tasks/show.html.erb +1 -1
  201. data/config/initializers/inflections.rb +2 -1
  202. data/config/locales/en.yml +4 -3
  203. data/config/routes.rb +25 -7
  204. data/config/secrets.development.example.yml +24 -0
  205. data/config/secrets.development.shopify.yml +20 -9
  206. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  207. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  208. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  209. data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
  210. data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
  211. data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
  212. data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
  213. data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
  214. data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
  215. data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
  216. data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
  217. data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
  218. data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
  219. data/lib/shipit.rb +61 -17
  220. data/lib/shipit/cast_value.rb +1 -0
  221. data/lib/shipit/command.rb +20 -21
  222. data/lib/shipit/commands.rb +14 -6
  223. data/lib/shipit/csv_serializer.rb +1 -0
  224. data/lib/shipit/deploy_commands.rb +1 -0
  225. data/lib/shipit/engine.rb +9 -2
  226. data/lib/shipit/environment_variables.rb +11 -1
  227. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  228. data/lib/shipit/flock.rb +9 -1
  229. data/lib/shipit/github_app.rb +15 -12
  230. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  231. data/lib/shipit/null_serializer.rb +1 -0
  232. data/lib/shipit/octokit_check_runs.rb +3 -2
  233. data/lib/shipit/octokit_iterator.rb +4 -3
  234. data/lib/shipit/paginator.rb +3 -2
  235. data/lib/shipit/review_stack_commands.rb +8 -0
  236. data/lib/shipit/rollback_commands.rb +1 -0
  237. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  238. data/lib/shipit/simple_message_verifier.rb +3 -2
  239. data/lib/shipit/stack_commands.rb +37 -7
  240. data/lib/shipit/stat.rb +1 -0
  241. data/lib/shipit/task_commands.rb +23 -16
  242. data/lib/shipit/version.rb +2 -1
  243. data/lib/snippets/publish-lerna-independent-packages +35 -34
  244. data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
  245. data/lib/snippets/release-gem +5 -1
  246. data/lib/tasks/cron.rake +13 -2
  247. data/lib/tasks/dev.rake +3 -2
  248. data/lib/tasks/shipit.rake +15 -14
  249. data/lib/tasks/teams.rake +1 -0
  250. data/test/controllers/api/base_controller_test.rb +3 -2
  251. data/test/controllers/api/ccmenu_controller_test.rb +9 -8
  252. data/test/controllers/api/commits_controller_test.rb +3 -2
  253. data/test/controllers/api/deploys_controller_test.rb +32 -14
  254. data/test/controllers/api/hooks_controller_test.rb +8 -7
  255. data/test/controllers/api/locks_controller_test.rb +7 -6
  256. data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +17 -16
  257. data/test/controllers/api/outputs_controller_test.rb +3 -1
  258. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  259. data/test/controllers/api/rollback_controller_test.rb +113 -0
  260. data/test/controllers/api/stacks_controller_test.rb +71 -16
  261. data/test/controllers/api/tasks_controller_test.rb +13 -12
  262. data/test/controllers/api_clients_controller_test.rb +5 -4
  263. data/test/controllers/ccmenu_controller_test.rb +4 -3
  264. data/test/controllers/commit_checks_controller_test.rb +4 -3
  265. data/test/controllers/commits_controller_test.rb +3 -2
  266. data/test/controllers/deploys_controller_test.rb +32 -21
  267. data/test/controllers/github_authentication_controller_test.rb +1 -0
  268. data/test/controllers/merge_requests_controller_test.rb +32 -0
  269. data/test/controllers/merge_status_controller_test.rb +7 -6
  270. data/test/controllers/release_statuses_controller_test.rb +3 -2
  271. data/test/controllers/repositories_controller_test.rb +71 -0
  272. data/test/controllers/rollbacks_controller_test.rb +9 -8
  273. data/test/controllers/stacks_controller_test.rb +41 -19
  274. data/test/controllers/status_controller_test.rb +1 -0
  275. data/test/controllers/tasks_controller_test.rb +32 -19
  276. data/test/controllers/webhooks_controller_test.rb +33 -17
  277. data/test/dummy/app/assets/config/manifest.js +3 -0
  278. data/test/dummy/config/application.rb +7 -2
  279. data/test/dummy/config/database.yml +9 -0
  280. data/test/dummy/config/environments/development.rb +3 -4
  281. data/test/dummy/config/environments/test.rb +2 -5
  282. data/test/dummy/config/secrets_double_github_app.yml +79 -0
  283. data/test/dummy/db/schema.rb +59 -17
  284. data/test/dummy/db/seeds.rb +2 -1
  285. data/test/fixtures/payloads/check_suite_master.json +4 -32
  286. data/test/fixtures/payloads/invalid_pull_request.json +117 -0
  287. data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
  288. data/test/fixtures/payloads/pull_request_assigned.json +480 -0
  289. data/test/fixtures/payloads/pull_request_closed.json +454 -0
  290. data/test/fixtures/payloads/pull_request_labeled.json +461 -0
  291. data/test/fixtures/payloads/pull_request_opened.json +454 -0
  292. data/test/fixtures/payloads/pull_request_reopened.json +454 -0
  293. data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
  294. data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
  295. data/test/fixtures/payloads/push_master.json +1 -1
  296. data/test/fixtures/payloads/push_not_master.json +1 -1
  297. data/test/fixtures/shipit/commits.yml +31 -3
  298. data/test/fixtures/shipit/hooks.yml +1 -0
  299. data/test/fixtures/shipit/merge_requests.yml +141 -0
  300. data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
  301. data/test/fixtures/shipit/pull_requests.yml +10 -131
  302. data/test/fixtures/shipit/repositories.yml +5 -0
  303. data/test/fixtures/shipit/stacks.yml +235 -14
  304. data/test/fixtures/shipit/statuses.yml +9 -0
  305. data/test/fixtures/shipit/tasks.yml +4 -1
  306. data/test/fixtures/shipit/users.yml +7 -0
  307. data/test/fixtures/timeout +2 -1
  308. data/test/helpers/api_helper.rb +1 -0
  309. data/test/helpers/fixture_aliases_helper.rb +1 -0
  310. data/test/helpers/hooks_helper.rb +2 -1
  311. data/test/helpers/json_helper.rb +20 -12
  312. data/test/helpers/links_helper.rb +4 -3
  313. data/test/helpers/payloads_helper.rb +5 -0
  314. data/test/helpers/queries_helper.rb +3 -2
  315. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  316. data/test/jobs/chunk_rollup_job_test.rb +16 -1
  317. data/test/jobs/deliver_hook_job_test.rb +1 -0
  318. data/test/jobs/destroy_repository_job_test.rb +27 -0
  319. data/test/jobs/destroy_stack_job_test.rb +1 -0
  320. data/test/jobs/emit_event_job_test.rb +2 -1
  321. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  322. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  323. data/test/jobs/github_sync_job_test.rb +3 -1
  324. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  325. data/test/jobs/perform_task_job_test.rb +12 -11
  326. data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +19 -18
  327. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  328. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  329. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  330. data/test/jobs/refresh_status_job_test.rb +1 -0
  331. data/test/jobs/unique_job_test.rb +1 -0
  332. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  333. data/test/lib/shipit/deploy_commands_test.rb +16 -0
  334. data/test/lib/shipit/task_commands_test.rb +17 -0
  335. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  336. data/test/models/api_client_test.rb +1 -0
  337. data/test/models/commit_checks_test.rb +1 -0
  338. data/test/models/commit_deployment_status_test.rb +4 -3
  339. data/test/models/commit_deployment_test.rb +2 -1
  340. data/test/models/commits_test.rb +96 -19
  341. data/test/models/delivery_test.rb +2 -1
  342. data/test/models/deploy_spec_test.rb +110 -65
  343. data/test/models/deploy_stats_test.rb +1 -0
  344. data/test/models/deploys_test.rb +197 -36
  345. data/test/models/duration_test.rb +1 -0
  346. data/test/models/github_hook_test.rb +1 -0
  347. data/test/models/hook_test.rb +47 -10
  348. data/test/models/membership_test.rb +1 -0
  349. data/test/models/{pull_request_test.rb → merge_request_test.rb} +53 -37
  350. data/test/models/pull_request_assignment_test.rb +16 -0
  351. data/test/models/release_statuses_test.rb +1 -0
  352. data/test/models/rollbacks_test.rb +1 -0
  353. data/test/models/shipit/check_run_test.rb +125 -5
  354. data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
  355. data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
  356. data/test/models/shipit/provisioning_handler_test.rb +64 -0
  357. data/test/models/shipit/pull_request_test.rb +52 -0
  358. data/test/models/shipit/repository_test.rb +6 -1
  359. data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
  360. data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
  361. data/test/models/shipit/review_stack_test.rb +91 -0
  362. data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +121 -16
  363. data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
  364. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
  365. data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
  366. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
  367. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
  368. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
  369. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
  370. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +107 -0
  371. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
  372. data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +1 -0
  373. data/test/models/status/group_test.rb +1 -0
  374. data/test/models/status/missing_test.rb +1 -0
  375. data/test/models/status_test.rb +1 -0
  376. data/test/models/task_definitions_test.rb +9 -8
  377. data/test/models/tasks_test.rb +81 -1
  378. data/test/models/team_test.rb +4 -2
  379. data/test/models/undeployed_commits_test.rb +1 -0
  380. data/test/models/users_test.rb +13 -5
  381. data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
  382. data/test/test_command_integration.rb +3 -2
  383. data/test/test_helper.rb +49 -31
  384. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  385. data/test/unit/command_test.rb +16 -10
  386. data/test/unit/commands_test.rb +1 -0
  387. data/test/unit/commit_serializer_test.rb +16 -0
  388. data/test/unit/csv_serializer_test.rb +3 -2
  389. data/test/unit/deploy_commands_test.rb +75 -18
  390. data/test/unit/deploy_serializer_test.rb +17 -0
  391. data/test/unit/environment_variables_test.rb +5 -4
  392. data/test/unit/github_app_test.rb +3 -3
  393. data/test/unit/github_apps_test.rb +416 -0
  394. data/test/unit/github_url_helper_test.rb +6 -0
  395. data/test/unit/rollback_commands_test.rb +2 -1
  396. data/test/unit/shipit_deployment_checks_test.rb +77 -0
  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 +15 -0
  400. data/test/unit/user_serializer_test.rb +14 -0
  401. data/test/unit/variable_definition_test.rb +1 -0
  402. metadata +320 -178
  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,332 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Shipit
6
+ module Webhooks
7
+ module Handlers
8
+ module PullRequest
9
+ class LabeledHandlerTest < ActiveSupport::TestCase
10
+ test "validates payload" do
11
+ assert_raise(StandardError) { LabeledHandler.new(payload_parsed(:invalid_pull_request)) }
12
+ end
13
+
14
+ test "ignores Github webhooks when the event is NOT 'labeled'" do
15
+ assert_no_difference -> { Shipit::Stack.count } do
16
+ LabeledHandler.new(payload_parsed(:pull_request_labeled).merge(action: "assigned")).process
17
+ end
18
+ end
19
+
20
+ test "ignores Github PullRequest webhooks by default" do
21
+ assert_no_difference -> { Shipit::Stack.count } do
22
+ LabeledHandler.new(payload_parsed(:pull_request_with_no_repo)).process
23
+ end
24
+ end
25
+
26
+ test "ignores Github PullRequest webhooks when the Repository has disabled the Review Stacks feature" do
27
+ repository = shipit_repositories(:shipit)
28
+ configure_provisioning_behavior(
29
+ repository: repository,
30
+ provisioning_enabled: false,
31
+ behavior: :allow_with_label,
32
+ label: "pull-requests-label"
33
+ )
34
+
35
+ assert_no_difference -> { Shipit::Stack.count } do
36
+ LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
37
+ end
38
+ end
39
+
40
+ test "ignores Github PullRequest webhooks when the repository allows_all PullRequests to create ReviewStacks" do
41
+ repository = shipit_repositories(:shipit)
42
+ configure_provisioning_behavior(
43
+ repository: repository,
44
+ behavior: :allow_all
45
+ )
46
+
47
+ assert_no_difference -> { Shipit::Stack.count } do
48
+ LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
49
+ end
50
+ end
51
+
52
+ test "unarchives existing review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
53
+ stack = create_archived_stack
54
+ repository = shipit_repositories(:shipit)
55
+ configure_provisioning_behavior(
56
+ repository: repository,
57
+ behavior: :allow_with_label,
58
+ label: "pull-requests-label"
59
+ )
60
+ payload = payload_parsed(:pull_request_labeled)
61
+ payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
62
+
63
+ LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
64
+
65
+ assert_not stack.reload.archived?, "Expected stack to be NOT be archived"
66
+ assert_pending_provision(stack)
67
+ end
68
+
69
+ test "creates and provisions a new review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
70
+ repository = shipit_repositories(:shipit)
71
+ configure_provisioning_behavior(
72
+ repository: repository,
73
+ behavior: :allow_with_label,
74
+ label: "pull-requests-label"
75
+ )
76
+ payload = payload_parsed(:pull_request_labeled)
77
+ payload["pull_request"]["labels"] = [{ "name" => "pull-requests-label" }]
78
+
79
+ LabeledHandler.new(payload).process
80
+
81
+ stack = shipit_repositories(:shipit).stacks.last
82
+ assert_equal stack.environment, "pr#{payload['number']}"
83
+ assert_equal stack.continuous_deployment, false
84
+ assert_equal stack.ignore_ci, false
85
+ assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
86
+ assert_not stack.archived?, "Expected stack to be NOT be archived"
87
+ assert_pending_provision(stack)
88
+ end
89
+
90
+ test "archives an existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
91
+ stack = create_stack
92
+ repository = shipit_repositories(:shipit)
93
+ configure_provisioning_behavior(
94
+ repository: repository,
95
+ behavior: :allow_with_label,
96
+ label: "pull-requests-label"
97
+ )
98
+ payload = payload_parsed(:pull_request_labeled)
99
+ payload["pull_request"]["labels"] = []
100
+
101
+ LabeledHandler.new(payload).process
102
+
103
+ assert stack.reload.archived?, "Expected stack to be archived"
104
+ end
105
+
106
+ test "deprovisions an existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
107
+ stack = create_stack
108
+ repository = shipit_repositories(:shipit)
109
+ configure_provisioning_behavior(
110
+ repository: repository,
111
+ behavior: :allow_with_label,
112
+ label: "pull-requests-label"
113
+ )
114
+ payload = payload_parsed(:pull_request_labeled)
115
+ payload["pull_request"]["labels"] = []
116
+
117
+ LabeledHandler.new(payload).process
118
+
119
+ assert_equal stack.reload.provision_status, "deprovisioning"
120
+ end
121
+
122
+ test "ignores Github PullRequest webhooks when the repository allow_with_label to create ReviewStacks and the label is absent" do
123
+ repository = shipit_repositories(:shipit)
124
+ configure_provisioning_behavior(
125
+ repository: repository,
126
+ behavior: :allow_with_label,
127
+ label: "pull-requests-label"
128
+ )
129
+ payload = payload_parsed(:pull_request_labeled)
130
+ payload["pull_request"]["labels"] = []
131
+
132
+ assert_no_difference -> { Shipit::Stack.count } do
133
+ LabeledHandler.new(payload).process
134
+ end
135
+ end
136
+
137
+ test "archives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
138
+ stack = create_stack
139
+ repository = shipit_repositories(:shipit)
140
+ configure_provisioning_behavior(
141
+ repository: repository,
142
+ behavior: :prevent_with_label,
143
+ label: "pull-requests-label"
144
+ )
145
+
146
+ LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
147
+
148
+ assert stack.reload.archived?, "Expected stack to be archived"
149
+ end
150
+
151
+ test "deprovisions an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
152
+ stack = create_stack
153
+ repository = shipit_repositories(:shipit)
154
+ configure_provisioning_behavior(
155
+ repository: repository,
156
+ behavior: :prevent_with_label,
157
+ label: "pull-requests-label"
158
+ )
159
+
160
+ LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
161
+
162
+ assert_equal stack.reload.provision_status, "deprovisioning"
163
+ end
164
+
165
+ test "ignores Github PullRequest webhooks when the repository prevent_with_label to create ReviewStacks and the label is present" do
166
+ repository = shipit_repositories(:shipit)
167
+ configure_provisioning_behavior(
168
+ repository: repository,
169
+ behavior: :prevent_with_label,
170
+ label: "pull-requests-label"
171
+ )
172
+
173
+ assert_no_difference -> { Shipit::Stack.count } do
174
+ LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
175
+ end
176
+ end
177
+
178
+ test "unarchives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
179
+ stack = create_archived_stack
180
+ repository = shipit_repositories(:shipit)
181
+ configure_provisioning_behavior(
182
+ repository: repository,
183
+ behavior: :prevent_with_label,
184
+ label: "pull-requests-label"
185
+ )
186
+ payload = payload_parsed(:pull_request_labeled)
187
+ payload["pull_request"]["labels"] = []
188
+
189
+ LabeledHandler.new(payload).process
190
+
191
+ assert_not stack.reload.archived?, "Expected stack to NOT be archived"
192
+ assert_pending_provision(stack)
193
+ end
194
+
195
+ test "creates and provisions a new review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
196
+ repository = shipit_repositories(:shipit)
197
+ configure_provisioning_behavior(
198
+ repository: repository,
199
+ behavior: :prevent_with_label,
200
+ label: "pull-requests-label"
201
+ )
202
+ payload = payload_parsed(:pull_request_labeled)
203
+ payload["pull_request"]["labels"] = []
204
+
205
+ LabeledHandler.new(payload).process
206
+
207
+ stack = shipit_repositories(:shipit).stacks.last
208
+ assert_equal stack.environment, "pr#{payload['number']}"
209
+ assert_equal stack.continuous_deployment, false
210
+ assert_equal stack.ignore_ci, false
211
+ assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
212
+ assert_not stack.archived?, "Expected stack to be NOT be archived"
213
+ assert_pending_provision(stack)
214
+ end
215
+
216
+ test "assigns the PullRequest to newly created stacks" do
217
+ repository = shipit_repositories(:shipit)
218
+ configure_provisioning_behavior(
219
+ repository: repository,
220
+ behavior: :prevent_with_label,
221
+ label: "pull-requests-label"
222
+ )
223
+ payload = payload_parsed(:pull_request_labeled)
224
+ payload["pull_request"]["labels"] = []
225
+
226
+ assert_difference -> { Shipit::PullRequest.count } do
227
+ LabeledHandler.new(payload).process
228
+ end
229
+ end
230
+
231
+ test "ignores Github Webhooks for closed PullRequests" do
232
+ create_archived_stack
233
+ repository = shipit_repositories(:shipit)
234
+ configure_provisioning_behavior(
235
+ repository: repository,
236
+ behavior: :allow_with_label,
237
+ label: "pull-requests-label"
238
+ )
239
+ payload = payload_parsed(:pull_request_labeled)
240
+ payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
241
+ payload["pull_request"]["state"] = "closed"
242
+
243
+ Shipit::ReviewStackProvisioningQueue.expects(:add).never
244
+
245
+ LabeledHandler.new(payload).process
246
+ end
247
+
248
+ def configure_provisioning_behavior(repository:, provisioning_enabled: true, behavior: :allow_all, label: nil)
249
+ repository.review_stacks_enabled = provisioning_enabled
250
+ repository.provisioning_behavior = behavior
251
+ repository.provisioning_label_name = label
252
+ repository.save!
253
+
254
+ repository
255
+ end
256
+
257
+ def create_archived_stack
258
+ stack = create_stack
259
+ stack.update(provision_status: :deprovisioned)
260
+ stack.archive!(shipit_users(:codertocat))
261
+
262
+ stack
263
+ end
264
+
265
+ def create_stack
266
+ repository = shipit_repositories(:shipit)
267
+ repository.provisioning_behavior = :allow_all
268
+ repository.save!
269
+
270
+ payload = payload_parsed(:pull_request_labeled)
271
+ payload["action"] = "opened"
272
+
273
+ OpenedHandler.new(payload).process
274
+
275
+ stack = repository.review_stacks.last
276
+ stack.update(provision_status: :provisioned)
277
+ complete_active_tasks(stack)
278
+
279
+ stack
280
+ end
281
+
282
+ def complete_active_tasks(stack)
283
+ active_tasks = stack
284
+ .tasks
285
+ .active
286
+
287
+ active_tasks.map(&:run)
288
+ active_tasks.reload
289
+ active_tasks.map(&:complete)
290
+ end
291
+
292
+ def assert_pending_provision(stack)
293
+ stack.reload
294
+
295
+ assert(stack.awaiting_provision?, "Stack #{stack.environment} should be in the provisioning queue")
296
+ assert(stack.deprovisioned?, "Stack #{stack.environment} should be pending provision")
297
+ end
298
+
299
+ setup do
300
+ Shipit.github.api.stubs(:commit)
301
+ .with("shopify/shipit-engine", "ec26c3e57ca3a959ca5aad62de7213c562f8c821")
302
+ .returns(
303
+ resource(
304
+ {
305
+ sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
306
+ commit: {
307
+ author: {
308
+ name: "Codertocat",
309
+ email: "21031067+Codertocat@users.noreply.github.com",
310
+ date: "2019-05-15 15:20:30",
311
+ },
312
+ committer: {
313
+ name: "Codertocat",
314
+ email: "21031067+Codertocat@users.noreply.github.com",
315
+ date: "2019-05-15 15:20:30",
316
+ },
317
+ message: "Update README.md",
318
+ },
319
+ stats: {
320
+ total: 2,
321
+ additions: 1,
322
+ deletions: 1,
323
+ },
324
+ }
325
+ )
326
+ )
327
+ end
328
+ end
329
+ end
330
+ end
331
+ end
332
+ end
@@ -0,0 +1,238 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Shipit
6
+ module Webhooks
7
+ module Handlers
8
+ module PullRequest
9
+ class OpenedHandlerTest < ActiveSupport::TestCase
10
+ test "validates payload" do
11
+ assert_raise(StandardError) { OpenedHandler.new(payload_parsed(:invalid_pull_request)) }
12
+ end
13
+
14
+ test "ignores irrelevant PR actions" do
15
+ assert_no_difference -> { Shipit::Stack.count } do
16
+ OpenedHandler.new(payload_parsed(:pull_request_opened).merge(action: "assigned")).process
17
+ end
18
+ end
19
+
20
+ test "does not create stacks for repos that are not tracked" do
21
+ assert_no_difference -> { Shipit::Stack.count } do
22
+ OpenedHandler.new(payload_parsed(:pull_request_with_no_repo)).process
23
+ end
24
+ end
25
+
26
+ test "does not create a stack when the Pull Request data can be saved" do
27
+ Shipit::PullRequest
28
+ .any_instance
29
+ .expects(:update!)
30
+ .raises(ActiveRecord::StatementInvalid)
31
+
32
+ assert_no_difference -> { Shipit::Stack.count } do
33
+ OpenedHandler.new(payload_parsed(:pull_request_opened)).process
34
+ rescue ActiveRecord::StatementInvalid # We expect this to be raised, so it shouldn't fail the test
35
+ end
36
+ end
37
+
38
+ test "creates stacks for repos that are tracked" do
39
+ assert_difference -> { Shipit::Stack.count } do
40
+ OpenedHandler.new(payload_parsed(:pull_request_opened)).process
41
+ end
42
+ end
43
+
44
+ test "creates Shipit::Users when they're not already present" do
45
+ github_user = stub(
46
+ id: 42,
47
+ name: "Somenew Userlogin",
48
+ login: "some-new-user-login",
49
+ email: "somenewuser@login.com",
50
+ avatar_url: "https://avatars.githubusercontent.com/u/42?v=3",
51
+ url: "https://api.github.com/user/some-new-user-login"
52
+ )
53
+ Shipit.github.api.expects(:user).with("some-new-user-login")
54
+ .returns(github_user)
55
+ payload = payload_parsed(:pull_request_opened)
56
+ payload["pull_request"]["user"]["login"] = github_user.login
57
+
58
+ OpenedHandler.new(payload).process
59
+
60
+ user = Shipit::User.find_by(login: "some-new-user-login")
61
+ assert_equal github_user.login, user.login
62
+ assert_equal github_user.name, user.name
63
+ assert_equal github_user.email, user.email
64
+ assert_equal github_user.url, user.api_url
65
+ assert_equal github_user.avatar_url, user.avatar_url
66
+ end
67
+
68
+ test "does not create Shipit::Users when they're already present" do
69
+ payload = payload_parsed(:pull_request_opened)
70
+ user_login = payload["pull_request"]["user"]["login"]
71
+
72
+ assert_no_difference -> { Shipit::User.where(login: user_login).count } do
73
+ OpenedHandler.new(payload).process
74
+ end
75
+ end
76
+
77
+ test "auto-created stack should have default configuration values" do
78
+ payload = payload_parsed(:pull_request_opened)
79
+ OpenedHandler.new(payload).process
80
+ stack = shipit_repositories(:shipit).stacks.last
81
+ assert_equal stack.environment, "pr2"
82
+ assert_equal stack.continuous_deployment, false
83
+ assert_equal stack.ignore_ci, false
84
+ assert_equal stack.branch, payload_parsed(:pull_request_opened)["pull_request"]["head"]["ref"]
85
+ assert_pending_provision(stack)
86
+ end
87
+
88
+ test "auto-created stack should have pull request assigned" do
89
+ payload = payload_parsed(:pull_request_opened)
90
+
91
+ assert_difference -> { Shipit::PullRequest.count } do
92
+ OpenedHandler.new(payload).process
93
+ end
94
+ end
95
+
96
+ test "only provision stacks for repos with auto-provisioning enabled" do
97
+ repository = shipit_repositories(:shipit)
98
+ configure_provisioning_behavior(
99
+ repository: repository,
100
+ provisioning_enabled: false,
101
+ behavior: :allow_all
102
+ )
103
+
104
+ assert_no_difference -> { Shipit::Stack.count } do
105
+ OpenedHandler.new(payload_parsed(:provision_disabled_pull_request)).process
106
+ end
107
+ end
108
+
109
+ test "ignored duplicate deliveries" do
110
+ OpenedHandler.new(payload_parsed(:pull_request_opened)).process
111
+ assert_no_difference -> { Shipit::Stack.count } do
112
+ OpenedHandler.new(payload_parsed(:pull_request_opened)).process
113
+ end
114
+ end
115
+
116
+ test "creates stacks for repos that allow_all" do
117
+ repository = shipit_repositories(:shipit)
118
+ configure_provisioning_behavior(
119
+ repository: repository,
120
+ behavior: :allow_all,
121
+ label: "pull-requests-label"
122
+ )
123
+
124
+ assert_difference -> { Shipit::Stack.count } do
125
+ OpenedHandler.new(payload_parsed(:pull_request_opened)).process
126
+ end
127
+ end
128
+
129
+ test "creates stacks for repos that allow_with_label when label is present" do
130
+ repository = shipit_repositories(:shipit)
131
+ configure_provisioning_behavior(
132
+ repository: repository,
133
+ behavior: :allow_with_label,
134
+ label: "pull-requests-label"
135
+ )
136
+ payload = payload_parsed(:pull_request_opened)
137
+ payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
138
+
139
+ assert_difference -> { Shipit::Stack.count } do
140
+ OpenedHandler.new(payload).process
141
+ end
142
+ end
143
+
144
+ test "does not create stacks for repos that allow_with_label when label is absent" do
145
+ repository = shipit_repositories(:shipit)
146
+ configure_provisioning_behavior(
147
+ repository: repository,
148
+ behavior: :allow_with_label,
149
+ label: "pull-requests-label"
150
+ )
151
+ payload = payload_parsed(:pull_request_opened)
152
+ payload["pull_request"]["labels"] = []
153
+
154
+ assert_no_difference -> { Shipit::Stack.count } do
155
+ OpenedHandler.new(payload).process
156
+ end
157
+ end
158
+
159
+ test "create stacks for repos what prevent_with_label when label is absent" do
160
+ repository = shipit_repositories(:shipit)
161
+ configure_provisioning_behavior(
162
+ repository: repository,
163
+ behavior: :prevent_with_label,
164
+ label: "pull-requests-label"
165
+ )
166
+ payload = payload_parsed(:pull_request_opened)
167
+ payload["pull_request"]["labels"] = []
168
+
169
+ assert_difference -> { Shipit::Stack.count } do
170
+ OpenedHandler.new(payload).process
171
+ end
172
+ end
173
+
174
+ test "does not create stacks for repos what prevent_with_label when label is present" do
175
+ repository = shipit_repositories(:shipit)
176
+ configure_provisioning_behavior(
177
+ repository: repository,
178
+ behavior: :prevent_with_label,
179
+ label: "pull-requests-label"
180
+ )
181
+ payload = payload_parsed(:pull_request_opened)
182
+ payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
183
+
184
+ assert_no_difference -> { Shipit::Stack.count } do
185
+ OpenedHandler.new(payload).process
186
+ end
187
+ end
188
+
189
+ def configure_provisioning_behavior(repository:, provisioning_enabled: true, behavior: :allow_all, label: nil)
190
+ repository.review_stacks_enabled = provisioning_enabled
191
+ repository.provisioning_behavior = behavior
192
+ repository.provisioning_label_name = label
193
+ repository.save!
194
+
195
+ repository
196
+ end
197
+
198
+ def assert_pending_provision(stack)
199
+ stack.reload
200
+
201
+ assert(stack.awaiting_provision?, "Stack #{stack.environment} should be in the provisioning queue")
202
+ assert(stack.deprovisioned?, "Stack #{stack.environment} should be pending provision")
203
+ end
204
+
205
+ setup do
206
+ Shipit.github.api.stubs(:commit)
207
+ .with("shopify/shipit-engine", "ec26c3e57ca3a959ca5aad62de7213c562f8c821")
208
+ .returns(
209
+ resource(
210
+ {
211
+ sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
212
+ commit: {
213
+ author: {
214
+ name: "Codertocat",
215
+ email: "21031067+Codertocat@users.noreply.github.com",
216
+ date: "2019-05-15 15:20:30",
217
+ },
218
+ committer: {
219
+ name: "Codertocat",
220
+ email: "21031067+Codertocat@users.noreply.github.com",
221
+ date: "2019-05-15 15:20:30",
222
+ },
223
+ message: "Update README.md",
224
+ },
225
+ stats: {
226
+ total: 2,
227
+ additions: 1,
228
+ deletions: 1,
229
+ },
230
+ }
231
+ )
232
+ )
233
+ end
234
+ end
235
+ end
236
+ end
237
+ end
238
+ end