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
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -11,10 +12,10 @@ module Shipit
11
12
  'steps' => ['touch tmp/restart'],
12
13
  'allow_concurrency' => true,
13
14
  'variables' => [
14
- {'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1'},
15
- {'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0'},
16
- {'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' '},
17
- {'name' => 'NODEFAULT', 'title' => 'Variable without default'},
15
+ { 'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1' },
16
+ { 'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0' },
17
+ { 'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' ' },
18
+ { 'name' => 'NODEFAULT', 'title' => 'Variable without default' },
18
19
  ],
19
20
  )
20
21
  end
@@ -43,10 +44,10 @@ module Shipit
43
44
  checklist: [],
44
45
  allow_concurrency: true,
45
46
  variables: [
46
- {'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1', 'select' => nil},
47
- {'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0', 'select' => nil},
48
- {'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' ', 'select' => nil},
49
- {'name' => 'NODEFAULT', 'title' => 'Variable without default', 'default' => '', 'select' => nil},
47
+ { 'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1', 'select' => nil },
48
+ { 'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0', 'select' => nil },
49
+ { 'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' ', 'select' => nil },
50
+ { 'name' => 'NODEFAULT', 'title' => 'Variable without default', 'default' => '', 'select' => nil },
50
51
  ],
51
52
  }
52
53
  assert_equal as_json, TaskDefinition.load(TaskDefinition.dump(@definition)).as_json
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
4
5
  class TasksTest < ActiveSupport::TestCase
5
6
  test "#title interpolates env" do
6
7
  task = shipit_tasks(:shipit_rendered_failover)
7
- assert_equal({'POD_ID' => '12'}, task.env)
8
+ assert_equal({ 'POD_ID' => '12' }, task.env)
8
9
  assert_equal 'Failover pod 12', task.title
9
10
  end
10
11
 
@@ -30,5 +31,84 @@ module Shipit
30
31
 
31
32
  task.write("hello\nworld")
32
33
  end
34
+
35
+ test "#chunk_output truncates output exceeding the storage limit" do
36
+ task = shipit_tasks(:shipit)
37
+ Shipit.redis.del(task.send(:output_key))
38
+
39
+ task.write('a' * (Task::OUTPUT_SIZE_LIMIT * 1.1))
40
+
41
+ output = task.chunk_output
42
+
43
+ assert output.size <= Task::OUTPUT_SIZE_LIMIT, "Output was not truncated to the limit"
44
+ # We don't use assert_includes because it will print the whole message
45
+ assert(
46
+ output.include?(Task::OUTPUT_TRUNCATED_MESSAGE),
47
+ "'#{Task::OUTPUT_TRUNCATED_MESSAGE.chomp}' was not present in the output",
48
+ )
49
+ end
50
+
51
+ test "#retry_if_necessary creates a duplicated task object with pending status and nil created_at and ended_at" do
52
+ task = shipit_tasks(:shipit)
53
+ task_stack = task.stack
54
+ task.retry_if_necessary
55
+
56
+ retried_task = task_stack.deploys.last
57
+
58
+ assert_not_equal task.id, retried_task.id
59
+ assert_nil retried_task.started_at
60
+ assert_nil retried_task.ended_at
61
+ assert_equal 'pending', retried_task.status
62
+ end
63
+
64
+ test "#retry_if_necessary does not create a new task object if max_retries is nil" do
65
+ task = shipit_tasks(:shipit2)
66
+
67
+ assert_no_difference 'Task.count', 'No new task should be created' do
68
+ task.retry_if_necessary
69
+ end
70
+ end
71
+
72
+ test "#retry_if_necessary does not create a new task object if the stack is locked" do
73
+ task = shipit_tasks(:shipit2)
74
+ task.stack.lock("test", task.user)
75
+
76
+ assert_no_difference 'Task.count', 'No new task should be created' do
77
+ task.retry_if_necessary
78
+ end
79
+ end
80
+
81
+ test "#retries_configured? returns true when max_retries is not nil and is greater than zero" do
82
+ task_with_three_retries = shipit_tasks(:shipit)
83
+ assert_predicate task_with_three_retries, :retries_configured?
84
+
85
+ task_with_nil_retries = shipit_tasks(:shipit2)
86
+ refute_predicate task_with_nil_retries, :retries_configured?
87
+
88
+ task_with_zero_retries = shipit_tasks(:shipit_restart)
89
+ refute_predicate task_with_zero_retries, :retries_configured?
90
+ end
91
+
92
+ test ".due_for_rollup includes tasks in successful terminal states" do
93
+ task = shipit_tasks(:shipit)
94
+ task.update(
95
+ rolled_up: false,
96
+ created_at: (60 + 1).minutes.ago.to_s(:db),
97
+ status: "success",
98
+ )
99
+
100
+ assert_includes Shipit::Task.due_for_rollup, task
101
+ end
102
+
103
+ test ".due_for_rollup includes tasks in unsuccessful terminal states" do
104
+ task = shipit_tasks(:shipit)
105
+ task.update(
106
+ rolled_up: false,
107
+ created_at: (60 + 1).minutes.ago.to_s(:db),
108
+ status: "error",
109
+ )
110
+
111
+ assert_includes Shipit::Task.due_for_rollup, task
112
+ end
33
113
  end
34
114
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -11,16 +12,17 @@ module Shipit
11
12
  end
12
13
 
13
14
  test ".find_or_create_by_handle fetch the team from github if it's not in the db already" do
14
- Shipit.github.api.expects(:org_teams).with('shopify', per_page: 100)
15
15
  response = stub(rels: {}, data: [new_team])
16
+ Shipit.github.api.expects(:org_teams).with('shopify', per_page: 100).returns(response.data)
16
17
  Shipit.github.api.expects(:last_response).returns(response)
18
+
17
19
  assert_difference -> { Team.count }, 1 do
18
20
  Team.find_or_create_by_handle('Shopify/new-team')
19
21
  end
20
22
  end
21
23
 
22
24
  test "#refresh_members! fetch all the team members from github" do
23
- response = stub(rels: {members: members_resource})
25
+ response = stub(rels: { members: members_resource })
24
26
  Shipit.github.api.expects(:get).with(@team.api_url).returns(response)
25
27
  assert_difference -> { User.count }, 1 do
26
28
  @team.refresh_members!
@@ -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
@@ -91,8 +92,8 @@ module Shipit
91
92
 
92
93
  stub_request(:get, @emails_url).to_return(
93
94
  status: %w(200 OK),
94
- body: [{email: expected_email}].to_json,
95
- headers: {"Content-Type" => "application/json"},
95
+ body: [{ email: expected_email }].to_json,
96
+ headers: { "Content-Type" => "application/json" },
96
97
  )
97
98
 
98
99
  user = User.find_or_create_from_github(@github_user)
@@ -119,7 +120,7 @@ module Shipit
119
120
  stub_request(:get, @emails_url).to_return(
120
121
  status: %w(200 OK),
121
122
  body: result_email_records.to_json,
122
- headers: {"Content-Type" => "application/json"},
123
+ headers: { "Content-Type" => "application/json" },
123
124
  )
124
125
 
125
126
  user = User.find_or_create_from_github(@github_user)
@@ -141,7 +142,7 @@ module Shipit
141
142
  stub_request(:get, @emails_url).to_return(
142
143
  status: %w(200 OK),
143
144
  body: result_email_records.to_json,
144
- headers: {"Content-Type" => "application/json"},
145
+ headers: { "Content-Type" => "application/json" },
145
146
  )
146
147
 
147
148
  user = User.find_or_create_from_github(@github_user)
@@ -162,9 +163,16 @@ module Shipit
162
163
  assert_nil user.email
163
164
  end
164
165
 
166
+ test "find_or_create_from_github handles user 401" do
167
+ Shipit.preferred_org_emails = [@org_domain]
168
+ Octokit::Client.any_instance.expects(:emails).raises(Octokit::Unauthorized)
169
+ user = User.find_or_create_from_github(@minimal_github_user)
170
+ assert_nil user.email
171
+ end
172
+
165
173
  test "#identifiers_for_ping returns a hash with the user's github_id, name, email and github_login" do
166
174
  user = shipit_users(:bob)
167
- expected_ouput = {github_id: user.github_id, name: user.name, email: user.email, github_login: user.login}
175
+ expected_ouput = { github_id: user.github_id, name: user.name, email: user.email, github_login: user.login }
168
176
  assert_equal expected_ouput, user.identifiers_for_ping
169
177
  end
170
178
 
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Shipit
6
+ class PulLRequestSerializerTest < ActiveSupport::TestCase
7
+ test "structure" do
8
+ pull_request = shipit_pull_requests(:review_stack_review)
9
+
10
+ serialized = serializer.new(pull_request).as_json
11
+
12
+ assert_includes serialized.keys, :id
13
+ assert_includes serialized.keys, :number
14
+ assert_includes serialized.keys, :title
15
+ assert_includes serialized.keys, :github_id
16
+ assert_includes serialized.keys, :additions
17
+ assert_includes serialized.keys, :deletions
18
+ assert_includes serialized.keys, :state
19
+ assert_includes serialized.keys, :html_url
20
+ assert_includes serialized.keys, :user
21
+ assert_includes serialized.keys, :assignees
22
+ assert_includes serialized.keys, :head
23
+ end
24
+
25
+ def serializer
26
+ Shipit::PullRequestSerializer
27
+ end
28
+ end
29
+ end
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  path = './fixtures/timeout'
4
5
  buffer = []
5
- command = Shipit::Command.new({path => {'timeout' => 2}}, env: {}, chdir: __dir__)
6
+ command = Shipit::Command.new({ path => { 'timeout' => 2 } }, env: {}, chdir: __dir__)
6
7
  begin
7
8
  command.stream! do |chunk|
8
9
  buffer << chunk
@@ -24,5 +25,5 @@ unless buffer.join == expected_output.join
24
25
  puts "Got: ------------"
25
26
  puts buffer.map(&:inspect).join("\n")
26
27
  puts "-----------------"
27
- exit 1
28
+ exit(1)
28
29
  end
data/test/test_helper.rb CHANGED
@@ -1,7 +1,12 @@
1
+ # frozen_string_literal: true
1
2
  ENV["RAILS_ENV"] ||= "test"
2
3
 
4
+ if Warning.respond_to?(:[]=)
5
+ Warning[:deprecated] = true
6
+ end
7
+
3
8
  require 'simplecov'
4
- SimpleCov.start 'rails' do
9
+ SimpleCov.start('rails') do
5
10
  enable_coverage :branch
6
11
  end
7
12
 
@@ -19,7 +24,7 @@ require 'spy/integration'
19
24
  # Load fixtures from the engine
20
25
  if ActiveSupport::TestCase.respond_to?(:fixture_path=)
21
26
  ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
22
- ActiveSupport::TestCase.fixtures :all
27
+ ActiveSupport::TestCase.fixtures(:all)
23
28
  end
24
29
 
25
30
  Dir[File.expand_path('../helpers/**/*.rb', __FILE__)].each do |helper|
@@ -31,41 +36,54 @@ begin
31
36
  rescue LoadError
32
37
  end
33
38
 
34
- class ActiveSupport::TestCase
35
- include PayloadsHelper
36
- include FixtureAliasesHelper
37
- include QueriesHelper
38
- include JSONHelper
39
- include LinksHelper
40
- include ApiHelper
41
- include HooksHelper
42
- include ActiveJob::TestHelper
43
-
44
- setup do
45
- @routes = Shipit::Engine.routes
46
- Shipit.github.api.stubs(:login).returns('shipit')
39
+ # FIXME: We need to get rid of active_model_serializers
40
+ # This is a monkey patch for Ruby 2.7+ compatibility
41
+ module ActionController
42
+ module SerializationAssertions
43
+ def process(*, **)
44
+ @serializers = Hash.new(0)
45
+ super
46
+ end
47
47
  end
48
+ end
48
49
 
49
- teardown do
50
- Shipit.redis.flushdb
51
- Shipit.instance_variable_names.each do |name|
52
- next if %w(@mocha @redis).include?(name)
53
- Shipit.remove_instance_variable(name)
50
+ module ActiveSupport
51
+ class TestCase
52
+ include PayloadsHelper
53
+ include FixtureAliasesHelper
54
+ include QueriesHelper
55
+ include JSONHelper
56
+ include LinksHelper
57
+ include ApiHelper
58
+ include HooksHelper
59
+ include ActiveJob::TestHelper
60
+
61
+ setup do
62
+ @routes = Shipit::Engine.routes
63
+ Shipit.github.api.stubs(:login).returns('shipit')
54
64
  end
55
- end
56
65
 
57
- ActiveRecord::Migration.check_pending!
66
+ teardown do
67
+ Shipit.redis.flushdb
68
+ Shipit.instance_variable_names.each do |name|
69
+ next if %w(@mocha @redis).include?(name)
70
+ Shipit.remove_instance_variable(name)
71
+ end
72
+ end
58
73
 
59
- # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
60
- #
61
- # Note: You'll currently still have to declare fixtures explicitly in integration tests
62
- # -- they do not yet inherit this setting
63
- fixtures :all
74
+ ActiveRecord::Migration.check_pending!
64
75
 
65
- # Add more helper methods to be used by all tests here...
66
- private
76
+ # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
77
+ #
78
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
79
+ # -- they do not yet inherit this setting
80
+ fixtures :all
67
81
 
68
- def resource(data)
69
- Sawyer::Resource.new(Sawyer::Agent.new('http://example.com'), data)
82
+ # Add more helper methods to be used by all tests here...
83
+ private
84
+
85
+ def resource(data)
86
+ Sawyer::Resource.new(Sawyer::Agent.new('http://example.com'), data)
87
+ end
70
88
  end
71
89
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class AnonymousUserSerializerTest < ActiveSupport::TestCase
6
+ test 'sets anonymous to true' do
7
+ user = AnonymousUser.new
8
+ serializer = ActiveModel::Serializer.serializer_for(user)
9
+ assert_equal AnonymousUserSerializer, serializer
10
+ serialized = serializer.new(user).to_json
11
+ assert_json_document(serialized, "anonymous", true)
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -9,32 +10,37 @@ module Shipit
9
10
  end
10
11
 
11
12
  test "#interpolate_environment_variables replace environment variables by their value" do
12
- command = Command.new('cap $ENVIRONMENT deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
13
+ command = Command.new('cap $ENVIRONMENT deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
13
14
  assert_equal [%(cap production deploy)], command.interpolated_arguments
14
15
  end
15
16
 
16
17
  test "#interpolate_environment_variables coerce nil to empty string" do
17
- command = Command.new('cap $FOO deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
18
+ command = Command.new('cap $FOO deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
18
19
  assert_equal [%(cap '' deploy)], command.interpolated_arguments
19
20
  end
20
21
 
21
22
  test '#interpolate_environment_variables escape the variable contents' do
22
23
  malicious_string = '$(echo pwnd)'
23
- command = Command.new('echo $FOO', env: {'FOO' => malicious_string}, chdir: '.')
24
+ command = Command.new('echo $FOO', env: { 'FOO' => malicious_string }, chdir: '.')
24
25
  assert_equal malicious_string, command.run.chomp
25
26
  end
26
27
 
27
28
  test "#interpolate_environment_variables fallback to ENV" do
28
29
  previous = ENV['SHIPIT_TEST']
29
30
  ENV['SHIPIT_TEST'] = 'quux'
30
- command = Command.new('cap $SHIPIT_TEST deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
31
- assert_equal [%(cap quux deploy)], command.interpolated_arguments
31
+ command = Command.new('cap $SHIPIT_TEST deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
32
+ assert_equal([%(cap quux deploy)], command.interpolated_arguments)
32
33
  ensure
33
34
  ENV['SHIPIT_TEST'] = previous
34
35
  end
35
36
 
37
+ test "#env cast to strings except for `nil`" do
38
+ command = Command.new('echo foo', env: { 'SOME_PATH' => Pathname.new('/foo'), 'HOST' => nil }, chdir: '.')
39
+ assert_equal({ 'SOME_PATH' => '/foo', 'HOST' => nil }, command.env)
40
+ end
41
+
36
42
  test "#timeout is 5 minutes by default" do
37
- command = Command.new('cap $LANG deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
43
+ command = Command.new('cap $LANG deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
38
44
  assert_equal 5.minutes.to_i, command.timeout
39
45
  end
40
46
 
@@ -44,7 +50,7 @@ module Shipit
44
50
  end
45
51
 
46
52
  test "#timeout returns the command option timeout over the `default_timeout` if present" do
47
- command = Command.new({'cap $LANG deploy' => {'timeout' => 10}}, default_timeout: 5, env: {}, chdir: '.')
53
+ command = Command.new({ 'cap $LANG deploy' => { 'timeout' => 10 } }, default_timeout: 5, env: {}, chdir: '.')
48
54
  assert_equal 10, command.timeout
49
55
  end
50
56
 
@@ -58,14 +64,14 @@ module Shipit
58
64
  end
59
65
 
60
66
  test "command not found" do
61
- error = assert_raises Command::NotFound do
67
+ error = assert_raises(Command::NotFound) do
62
68
  Command.new('does-not-exist foo bar', env: {}, chdir: '.').run
63
69
  end
64
70
  assert_equal 'does-not-exist: command not found', error.message
65
71
  end
66
72
 
67
73
  test "permission denied" do
68
- error = assert_raises Command::Denied do
74
+ error = assert_raises(Command::Denied) do
69
75
  Command.new('/etc/passwd foo bar', env: {}, chdir: '.').run
70
76
  end
71
77
  assert_equal '/etc/passwd: Permission denied', error.message
@@ -120,7 +126,7 @@ module Shipit
120
126
  signalled = true
121
127
  break
122
128
  end
123
- sleep 0.1
129
+ sleep(0.1)
124
130
  end
125
131
  signalled
126
132
  end