shipit-engine 0.38.0 → 0.40.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 (323) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -4
  3. data/Rakefile +2 -1
  4. data/app/assets/javascripts/shipit/continuous_delivery_schedule.js.coffee +15 -0
  5. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
  6. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  7. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  8. data/app/controllers/concerns/shipit/api/rendering.rb +1 -0
  9. data/app/controllers/concerns/shipit/authentication.rb +1 -0
  10. data/app/controllers/concerns/shipit/pagination.rb +3 -2
  11. data/app/controllers/shipit/api/base_controller.rb +12 -10
  12. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  13. data/app/controllers/shipit/api/commits_controller.rb +2 -3
  14. data/app/controllers/shipit/api/deploys_controller.rb +6 -1
  15. data/app/controllers/shipit/api/hooks_controller.rb +4 -3
  16. data/app/controllers/shipit/api/locks_controller.rb +1 -0
  17. data/app/controllers/shipit/api/merge_requests_controller.rb +6 -5
  18. data/app/controllers/shipit/api/outputs_controller.rb +1 -0
  19. data/app/controllers/shipit/api/release_statuses_controller.rb +2 -1
  20. data/app/controllers/shipit/api/rollbacks_controller.rb +1 -0
  21. data/app/controllers/shipit/api/stacks_controller.rb +15 -14
  22. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  23. data/app/controllers/shipit/api_clients_controller.rb +6 -7
  24. data/app/controllers/shipit/ccmenu_url_controller.rb +3 -2
  25. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  26. data/app/controllers/shipit/commits_controller.rb +1 -0
  27. data/app/controllers/shipit/continuous_delivery_schedules_controller.rb +42 -0
  28. data/app/controllers/shipit/deploys_controller.rb +6 -5
  29. data/app/controllers/shipit/github_authentication_controller.rb +6 -0
  30. data/app/controllers/shipit/merge_requests_controller.rb +1 -0
  31. data/app/controllers/shipit/merge_status_controller.rb +30 -26
  32. data/app/controllers/shipit/release_statuses_controller.rb +1 -0
  33. data/app/controllers/shipit/repositories_controller.rb +4 -7
  34. data/app/controllers/shipit/rollbacks_controller.rb +2 -1
  35. data/app/controllers/shipit/shipit_controller.rb +1 -0
  36. data/app/controllers/shipit/stacks_controller.rb +27 -31
  37. data/app/controllers/shipit/status_controller.rb +1 -0
  38. data/app/controllers/shipit/tasks_controller.rb +3 -1
  39. data/app/controllers/shipit/webhooks_controller.rb +2 -1
  40. data/app/helpers/shipit/api_clients_helper.rb +1 -0
  41. data/app/helpers/shipit/chunks_helper.rb +3 -1
  42. data/app/helpers/shipit/deploys_helper.rb +7 -3
  43. data/app/helpers/shipit/github_url_helper.rb +5 -4
  44. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  45. data/app/helpers/shipit/shipit_helper.rb +11 -10
  46. data/app/helpers/shipit/stacks_helper.rb +10 -11
  47. data/app/helpers/shipit/tasks_helper.rb +2 -1
  48. data/app/jobs/shipit/background_job/unique.rb +3 -2
  49. data/app/jobs/shipit/background_job.rb +9 -1
  50. data/app/jobs/shipit/cache_deploy_spec_job.rb +2 -1
  51. data/app/jobs/shipit/chunk_rollup_job.rb +1 -0
  52. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  53. data/app/jobs/shipit/continuous_delivery_job.rb +5 -0
  54. data/app/jobs/shipit/create_on_github_job.rb +1 -0
  55. data/app/jobs/shipit/create_release_statuses_job.rb +2 -0
  56. data/app/jobs/shipit/deferred_touch_job.rb +1 -0
  57. data/app/jobs/shipit/deliver_hook_job.rb +1 -0
  58. data/app/jobs/shipit/destroy_job.rb +1 -0
  59. data/app/jobs/shipit/destroy_repository_job.rb +1 -0
  60. data/app/jobs/shipit/destroy_stack_job.rb +36 -15
  61. data/app/jobs/shipit/emit_event_job.rb +1 -0
  62. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  63. data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
  64. data/app/jobs/shipit/github_sync_job.rb +4 -2
  65. data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
  66. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  67. data/app/jobs/shipit/perform_task_job.rb +1 -0
  68. data/app/jobs/shipit/process_merge_requests_job.rb +2 -0
  69. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  70. data/app/jobs/shipit/reap_dead_tasks_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  72. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  73. data/app/jobs/shipit/refresh_merge_request_job.rb +1 -0
  74. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  75. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  76. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  77. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -7
  78. data/app/models/concerns/shipit/deferred_touch.rb +5 -2
  79. data/app/models/shipit/anonymous_user.rb +4 -5
  80. data/app/models/shipit/api_client.rb +5 -3
  81. data/app/models/shipit/application_record.rb +1 -0
  82. data/app/models/shipit/check_run.rb +7 -6
  83. data/app/models/shipit/command_line_user.rb +4 -5
  84. data/app/models/shipit/commit.rb +46 -32
  85. data/app/models/shipit/commit_checks.rb +4 -2
  86. data/app/models/shipit/commit_deployment.rb +7 -5
  87. data/app/models/shipit/commit_deployment_status.rb +5 -3
  88. data/app/models/shipit/commit_message.rb +2 -0
  89. data/app/models/shipit/continuous_delivery_schedule.rb +84 -0
  90. data/app/models/shipit/delivery.rb +5 -4
  91. data/app/models/shipit/deploy.rb +46 -26
  92. data/app/models/shipit/deploy_spec/bundler_discovery.rb +3 -1
  93. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  94. data/app/models/shipit/deploy_spec/file_system.rb +48 -17
  95. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +4 -3
  96. data/app/models/shipit/deploy_spec/lerna_discovery.rb +32 -31
  97. data/app/models/shipit/deploy_spec/npm_discovery.rb +18 -13
  98. data/app/models/shipit/deploy_spec/pypi_discovery.rb +5 -4
  99. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  100. data/app/models/shipit/deploy_spec.rb +25 -30
  101. data/app/models/shipit/deploy_stats.rb +6 -1
  102. data/app/models/shipit/duration.rb +5 -3
  103. data/app/models/shipit/ephemeral_commit_checks.rb +8 -7
  104. data/app/models/shipit/github_hook.rb +1 -0
  105. data/app/models/shipit/github_status.rb +1 -0
  106. data/app/models/shipit/hook.rb +9 -7
  107. data/app/models/shipit/membership.rb +1 -0
  108. data/app/models/shipit/merge_request.rb +26 -16
  109. data/app/models/shipit/output_chunk.rb +1 -0
  110. data/app/models/shipit/provisioning_handler.rb +1 -0
  111. data/app/models/shipit/pull_request.rb +2 -2
  112. data/app/models/shipit/record.rb +1 -0
  113. data/app/models/shipit/release_status.rb +4 -3
  114. data/app/models/shipit/repository.rb +12 -11
  115. data/app/models/shipit/review_stack.rb +3 -1
  116. data/app/models/shipit/review_stack_provisioning_queue.rb +2 -2
  117. data/app/models/shipit/rollback.rb +2 -0
  118. data/app/models/shipit/stack.rb +71 -60
  119. data/app/models/shipit/status/common.rb +1 -0
  120. data/app/models/shipit/status/group.rb +5 -3
  121. data/app/models/shipit/status/missing.rb +2 -1
  122. data/app/models/shipit/status/unknown.rb +1 -0
  123. data/app/models/shipit/status.rb +5 -4
  124. data/app/models/shipit/task.rb +40 -31
  125. data/app/models/shipit/task_definition.rb +10 -7
  126. data/app/models/shipit/task_execution_strategy/default.rb +13 -13
  127. data/app/models/shipit/team.rb +13 -12
  128. data/app/models/shipit/undeployed_commit.rb +8 -3
  129. data/app/models/shipit/unlimited_api_client.rb +2 -2
  130. data/app/models/shipit/user.rb +23 -16
  131. data/app/models/shipit/variable_definition.rb +2 -1
  132. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
  133. data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
  134. data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
  135. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +10 -10
  136. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +1 -1
  137. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +10 -10
  138. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +2 -2
  139. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +2 -2
  140. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +1 -1
  141. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +3 -3
  142. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +1 -1
  143. data/app/models/shipit/webhooks/handlers/push_handler.rb +2 -1
  144. data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
  145. data/app/models/shipit/webhooks.rb +3 -2
  146. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  147. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  148. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  149. data/app/serializers/shipit/commit_serializer.rb +2 -1
  150. data/app/serializers/shipit/deploy_serializer.rb +1 -0
  151. data/app/serializers/shipit/hook_serializer.rb +1 -0
  152. data/app/serializers/shipit/merge_request_serializer.rb +2 -1
  153. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  154. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  155. data/app/serializers/shipit/stack_serializer.rb +4 -3
  156. data/app/serializers/shipit/tail_task_serializer.rb +4 -1
  157. data/app/serializers/shipit/task_serializer.rb +1 -0
  158. data/app/serializers/shipit/user_serializer.rb +1 -0
  159. data/app/validators/ascii_only_validator.rb +4 -3
  160. data/app/validators/subset_validator.rb +1 -0
  161. data/app/views/shipit/_variables.html.erb +1 -1
  162. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  163. data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
  164. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  165. data/app/views/shipit/missing_settings.html.erb +1 -1
  166. data/app/views/shipit/stacks/_settings_form.erb +1 -0
  167. data/config/initializers/inflections.rb +1 -0
  168. data/config/locales/en.yml +1 -0
  169. data/config/routes.rb +21 -18
  170. data/config/secrets.development.example.yml +1 -1
  171. data/config/secrets.development.shopify.yml +1 -1
  172. data/db/migrate/20240821003007_add_continuous_delivery_schedules.rb +13 -0
  173. data/db/migrate/20250207203053_embiggen_github_ids.rb +8 -0
  174. data/lib/shipit/cast_value.rb +1 -0
  175. data/lib/shipit/command.rb +29 -9
  176. data/lib/shipit/commands.rb +4 -2
  177. data/lib/shipit/csv_serializer.rb +3 -0
  178. data/lib/shipit/deploy_commands.rb +2 -1
  179. data/lib/shipit/engine.rb +6 -5
  180. data/lib/shipit/environment_variables.rb +2 -0
  181. data/lib/shipit/first_parent_commits_iterator.rb +2 -3
  182. data/lib/shipit/flock.rb +11 -9
  183. data/lib/shipit/github_app.rb +14 -16
  184. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  185. data/lib/shipit/null_serializer.rb +1 -0
  186. data/lib/shipit/octokit_check_runs.rb +2 -3
  187. data/lib/shipit/octokit_iterator.rb +2 -0
  188. data/lib/shipit/paginator.rb +1 -0
  189. data/lib/shipit/rollback_commands.rb +2 -1
  190. data/lib/shipit/same_site_cookie_middleware.rb +1 -0
  191. data/lib/shipit/simple_message_verifier.rb +1 -0
  192. data/lib/shipit/stack_commands.rb +35 -27
  193. data/lib/shipit/stat.rb +1 -0
  194. data/lib/shipit/task_commands.rb +7 -6
  195. data/lib/shipit/version.rb +2 -1
  196. data/lib/shipit.rb +30 -17
  197. data/lib/tasks/cron.rake +2 -1
  198. data/lib/tasks/dev.rake +3 -2
  199. data/lib/tasks/shipit.rake +3 -2
  200. data/lib/tasks/teams.rake +3 -2
  201. data/test/controllers/api/base_controller_test.rb +1 -0
  202. data/test/controllers/api/ccmenu_controller_test.rb +4 -3
  203. data/test/controllers/api/commits_controller_test.rb +1 -0
  204. data/test/controllers/api/deploys_controller_test.rb +26 -1
  205. data/test/controllers/api/hooks_controller_test.rb +6 -5
  206. data/test/controllers/api/locks_controller_test.rb +1 -0
  207. data/test/controllers/api/merge_requests_controller_test.rb +1 -0
  208. data/test/controllers/api/outputs_controller_test.rb +1 -0
  209. data/test/controllers/api/release_statuses_controller_test.rb +4 -3
  210. data/test/controllers/api/rollback_controller_test.rb +3 -2
  211. data/test/controllers/api/stacks_controller_test.rb +13 -12
  212. data/test/controllers/api/tasks_controller_test.rb +7 -6
  213. data/test/controllers/api_clients_controller_test.rb +10 -10
  214. data/test/controllers/ccmenu_controller_test.rb +1 -0
  215. data/test/controllers/commit_checks_controller_test.rb +1 -0
  216. data/test/controllers/commits_controller_test.rb +9 -8
  217. data/test/controllers/continuous_delivery_schedules_controller_test.rb +66 -0
  218. data/test/controllers/deploys_controller_test.rb +4 -2
  219. data/test/controllers/github_authentication_controller_test.rb +6 -4
  220. data/test/controllers/merge_requests_controller_test.rb +1 -0
  221. data/test/controllers/merge_status_controller_test.rb +5 -4
  222. data/test/controllers/release_statuses_controller_test.rb +1 -0
  223. data/test/controllers/repositories_controller_test.rb +6 -5
  224. data/test/controllers/rollbacks_controller_test.rb +3 -2
  225. data/test/controllers/stacks_controller_test.rb +8 -6
  226. data/test/controllers/status_controller_test.rb +1 -0
  227. data/test/controllers/tasks_controller_test.rb +13 -5
  228. data/test/controllers/webhooks_controller_test.rb +10 -9
  229. data/test/dummy/config/application.rb +2 -1
  230. data/test/dummy/config/initializers/0_load_development_secrets.rb +2 -2
  231. data/test/dummy/config/secrets.development.json +3 -0
  232. data/test/dummy/config/secrets.test.json +21 -0
  233. data/test/dummy/db/schema.rb +33 -6
  234. data/test/fixtures/shipit/commits.yml +7 -7
  235. data/test/fixtures/shipit/stacks.yml +4 -10
  236. data/test/fixtures/shipit/tasks.yml +3 -3
  237. data/test/helpers/api_helper.rb +2 -3
  238. data/test/helpers/fixture_aliases_helper.rb +1 -0
  239. data/test/helpers/hooks_helper.rb +1 -0
  240. data/test/helpers/json_helper.rb +4 -3
  241. data/test/helpers/links_helper.rb +2 -1
  242. data/test/helpers/payloads_helper.rb +1 -0
  243. data/test/helpers/queries_helper.rb +4 -3
  244. data/test/jobs/cache_deploy_spec_job_test.rb +3 -2
  245. data/test/jobs/chunk_rollup_job_test.rb +3 -2
  246. data/test/jobs/deliver_hook_job_test.rb +1 -0
  247. data/test/jobs/destroy_repository_job_test.rb +1 -0
  248. data/test/jobs/destroy_stack_job_test.rb +12 -0
  249. data/test/jobs/emit_event_job_test.rb +1 -0
  250. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  251. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  252. data/test/jobs/github_sync_job_test.rb +22 -21
  253. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  254. data/test/jobs/perform_task_job_test.rb +3 -3
  255. data/test/jobs/process_merge_requests_job_test.rb +7 -6
  256. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  257. data/test/jobs/reap_dead_tasks_job_test.rb +1 -0
  258. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  259. data/test/jobs/refresh_status_job_test.rb +1 -0
  260. data/test/jobs/shipit/background_job_test.rb +35 -0
  261. data/test/jobs/shipit/continuous_delivery_job_test.rb +31 -0
  262. data/test/jobs/unique_job_test.rb +3 -1
  263. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  264. data/test/middleware/same_site_cookie_middleware_test.rb +2 -2
  265. data/test/models/api_client_test.rb +1 -0
  266. data/test/models/commit_checks_test.rb +2 -1
  267. data/test/models/commit_deployment_status_test.rb +2 -2
  268. data/test/models/commit_deployment_test.rb +4 -3
  269. data/test/models/commits_test.rb +72 -70
  270. data/test/models/delivery_test.rb +3 -2
  271. data/test/models/deploy_spec_test.rb +113 -109
  272. data/test/models/deploy_stats_test.rb +1 -0
  273. data/test/models/deploys_test.rb +65 -56
  274. data/test/models/duration_test.rb +1 -1
  275. data/test/models/github_hook_test.rb +1 -0
  276. data/test/models/hook_test.rb +7 -4
  277. data/test/models/membership_test.rb +1 -0
  278. data/test/models/merge_request_test.rb +26 -20
  279. data/test/models/release_statuses_test.rb +2 -1
  280. data/test/models/rollbacks_test.rb +4 -3
  281. data/test/models/shipit/check_run_test.rb +16 -15
  282. data/test/models/shipit/continuous_delivery_schedule_test.rb +109 -0
  283. data/test/models/shipit/deploy_spec/file_system_test.rb +54 -10
  284. data/test/models/shipit/pull_request_test.rb +9 -9
  285. data/test/models/shipit/repository_test.rb +3 -2
  286. data/test/models/shipit/review_stack_provisioning_queue_test.rb +2 -2
  287. data/test/models/shipit/{stacks_test.rb → stack_test.rb} +48 -34
  288. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +36 -34
  289. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +28 -28
  290. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +42 -42
  291. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +33 -33
  292. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +37 -37
  293. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +1 -1
  294. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +44 -42
  295. data/test/models/shipit/webhooks/handlers_test.rb +1 -0
  296. data/test/models/status/group_test.rb +3 -2
  297. data/test/models/status/missing_test.rb +1 -0
  298. data/test/models/status_test.rb +2 -1
  299. data/test/models/task_definitions_test.rb +7 -6
  300. data/test/models/tasks_test.rb +5 -4
  301. data/test/models/team_test.rb +5 -4
  302. data/test/models/undeployed_commits_test.rb +10 -9
  303. data/test/models/users_test.rb +29 -20
  304. data/test/test_command_integration.rb +1 -1
  305. data/test/test_helper.rb +12 -10
  306. data/test/unit/anonymous_user_serializer_test.rb +1 -0
  307. data/test/unit/command_test.rb +10 -1
  308. data/test/unit/commands_test.rb +1 -0
  309. data/test/unit/commit_serializer_test.rb +1 -0
  310. data/test/unit/csv_serializer_test.rb +3 -2
  311. data/test/unit/deploy_commands_test.rb +33 -23
  312. data/test/unit/deploy_serializer_test.rb +1 -0
  313. data/test/unit/environment_variables_test.rb +2 -1
  314. data/test/unit/github_app_test.rb +11 -10
  315. data/test/unit/github_apps_test.rb +19 -18
  316. data/test/unit/github_url_helper_test.rb +1 -0
  317. data/test/unit/line_buffer_test.rb +1 -1
  318. data/test/unit/rollback_commands_test.rb +2 -1
  319. data/test/unit/shipit_helper_test.rb +1 -0
  320. data/test/unit/shipit_test.rb +47 -1
  321. data/test/unit/user_serializer_test.rb +1 -0
  322. data/test/unit/variable_definition_test.rb +4 -3
  323. metadata +61 -47
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -21,7 +22,7 @@ module Shipit
21
22
  post :create, params: {
22
23
  stack_id: @stack.to_param,
23
24
  deploy_id: @deploy.id,
24
- status: 'foo',
25
+ status: 'foo'
25
26
  }
26
27
  end
27
28
 
@@ -34,7 +35,7 @@ module Shipit
34
35
  post :create, params: {
35
36
  stack_id: @stack.to_param,
36
37
  deploy_id: @deploy.id,
37
- status: 'success',
38
+ status: 'success'
38
39
  }
39
40
  assert_response :created
40
41
  end
@@ -51,7 +52,7 @@ module Shipit
51
52
  post :create, params: {
52
53
  stack_id: @stack.to_param,
53
54
  deploy_id: @deploy.id,
54
- status: 'failure',
55
+ status: 'failure'
55
56
  }
56
57
  assert_response :created
57
58
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -38,14 +39,14 @@ module Shipit
38
39
  request.headers['X-Shipit-User'] = @user.login
39
40
  post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
40
41
  rollback = Rollback.last
41
- rollback.user == @user
42
+ assert_equal @user, rollback.user
42
43
  end
43
44
 
44
45
  test "#create normalises the claimed user" do
45
46
  request.headers['X-Shipit-User'] = @user.login.swapcase
46
47
  post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
47
48
  rollback = Rollback.last
48
- rollback.user == @user
49
+ assert_equal @user, rollback.user
49
50
  end
50
51
 
51
52
  test "#create renders a 422 if the sha isn't found" do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -41,24 +42,24 @@ module Shipit
41
42
  test "#create fails to create stack if it already exists" do
42
43
  repository = shipit_repositories(:rails)
43
44
  existing_stack = Stack.create!(
44
- repository: repository,
45
+ repository:,
45
46
  environment: 'staging',
46
- branch: 'staging',
47
+ branch: 'staging'
47
48
  )
48
49
 
49
50
  assert_no_difference -> { Stack.count } do
50
51
  post :create,
51
- params: {
52
- repo_name: existing_stack.repo_name,
53
- repo_owner: existing_stack.repo_owner,
54
- environment: existing_stack.environment,
55
- branch: existing_stack.branch,
56
- }
52
+ params: {
53
+ repo_name: existing_stack.repo_name,
54
+ repo_owner: existing_stack.repo_owner,
55
+ environment: existing_stack.environment,
56
+ branch: existing_stack.branch
57
+ }
57
58
  end
58
59
 
59
60
  assert_response :unprocessable_entity
60
61
  assert_json 'errors', 'repository' => [
61
- 'cannot be used more than once with this environment. Check archived stacks.',
62
+ 'cannot be used more than once with this environment. Check archived stacks.'
62
63
  ]
63
64
  end
64
65
 
@@ -71,7 +72,7 @@ module Shipit
71
72
  id: @stack.to_param,
72
73
  merge_queue_enabled: false,
73
74
  ignore_ci: true,
74
- continuous_deployment: true,
75
+ continuous_deployment: true
75
76
  }
76
77
 
77
78
  assert_response :ok
@@ -87,7 +88,7 @@ module Shipit
87
88
 
88
89
  patch :update, params: {
89
90
  id: @stack.to_param,
90
- branch: 'test',
91
+ branch: 'test'
91
92
  }
92
93
 
93
94
  assert_response :ok
@@ -104,7 +105,7 @@ module Shipit
104
105
 
105
106
  patch :update, params: {
106
107
  id: @stack.to_param,
107
- continuous_deployment: false,
108
+ continuous_deployment: false
108
109
  }
109
110
 
110
111
  assert_response :ok
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -39,42 +40,42 @@ module Shipit
39
40
 
40
41
  expected_env = {
41
42
  "FOO" => "1",
42
- "BAR" => "0",
43
+ "BAR" => "0"
43
44
  }
44
45
  assert_equal expected_env, Shipit::Task.last.env
45
46
  end
46
47
 
47
48
  test "#trigger refuses to trigger a task with tasks not whitelisted" do
48
49
  env = { 'DANGEROUS_VARIABLE' => 'bar' }
49
- post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
50
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
50
51
  assert_response :unprocessable_entity
51
52
  assert_json 'message', 'Variables DANGEROUS_VARIABLE have not been whitelisted'
52
53
  end
53
54
 
54
55
  test "#trigger triggers a task with only whitelisted env variables" do
55
56
  env = { 'FOO' => 'bar' }
56
- post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
57
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
57
58
  assert_response :accepted
58
59
  assert_json 'type', 'task'
59
60
  assert_json 'status', 'pending'
60
61
 
61
62
  expected_env = {
62
63
  "FOO" => "bar",
63
- "BAR" => "0",
64
+ "BAR" => "0"
64
65
  }
65
66
  assert_equal expected_env, Shipit::Task.last.env
66
67
  end
67
68
 
68
69
  test "#trigger triggers a task with explicitly passed and default variables" do
69
70
  env = { 'WALRUS' => 'overridden value' }
70
- post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
71
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
71
72
  assert_response :accepted
72
73
 
73
74
  # FOO and BAR are variables with a default value
74
75
  expected_env = {
75
76
  "FOO" => "1",
76
77
  "BAR" => "0",
77
- "WALRUS" => "overridden value",
78
+ "WALRUS" => "overridden value"
78
79
  }
79
80
  assert_equal expected_env, Shipit::Task.last.env
80
81
  end
@@ -23,7 +23,7 @@ module Shipit
23
23
  assert_response :forbidden
24
24
  assert_equal(
25
25
  'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
26
- response.body,
26
+ response.body
27
27
  )
28
28
  end
29
29
 
@@ -44,9 +44,9 @@ module Shipit
44
44
  name: 'walrus_app',
45
45
  permissions: [
46
46
  'read:stack',
47
- 'lock:stack',
48
- ],
49
- },
47
+ 'lock:stack'
48
+ ]
49
+ }
50
50
  }
51
51
  end
52
52
 
@@ -59,9 +59,9 @@ module Shipit
59
59
  name: 'walrus_app',
60
60
  permissions: [
61
61
  'read:stack',
62
- 'lock:stack',
63
- ],
64
- },
62
+ 'lock:stack'
63
+ ]
64
+ }
65
65
  }
66
66
 
67
67
  assert_equal shipit_users(:walrus).id, ApiClient.last.creator.id
@@ -84,15 +84,15 @@ module Shipit
84
84
  test "#update updates an existing api_client" do
85
85
  new_permissions = [
86
86
  'read:stack',
87
- 'lock:stack',
87
+ 'lock:stack'
88
88
  ]
89
89
 
90
90
  assert_difference "ApiClient.count", 0 do
91
91
  patch :update, params: {
92
92
  id: @api_client.id,
93
93
  api_client: {
94
- permissions: new_permissions,
95
- },
94
+ permissions: new_permissions
95
+ }
96
96
  }
97
97
  end
98
98
  @api_client.reload
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'uri'
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -14,10 +15,10 @@ module Shipit
14
15
  refute_predicate(@commit, :locked?)
15
16
 
16
17
  patch(:update, params: {
17
- stack_id: @stack.to_param,
18
- id: @commit.id,
19
- commit: { locked: true },
20
- })
18
+ stack_id: @stack.to_param,
19
+ id: @commit.id,
20
+ commit: { locked: true }
21
+ })
21
22
 
22
23
  assert_response(:ok)
23
24
  @commit.reload
@@ -29,10 +30,10 @@ module Shipit
29
30
  @commit.lock(@user)
30
31
 
31
32
  patch(:update, params: {
32
- stack_id: @stack.to_param,
33
- id: @commit.id,
34
- commit: { locked: false },
35
- })
33
+ stack_id: @stack.to_param,
34
+ id: @commit.id,
35
+ commit: { locked: false }
36
+ })
36
37
 
37
38
  assert_response(:ok)
38
39
  @commit.reload
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module Shipit
6
+ class ContinuousDeliverySchedulesControllerTest < ActionController::TestCase
7
+ setup do
8
+ @routes = Shipit::Engine.routes
9
+ @stack = shipit_stacks(:shipit)
10
+ session[:user_id] = shipit_users(:walrus).id
11
+ end
12
+
13
+ def valid_params
14
+ Shipit::ContinuousDeliverySchedule::DAYS.each_with_object({}) do |day, hash|
15
+ hash[:"#{day}_enabled"] = "0"
16
+ hash[:"#{day}_start"] = "09:00"
17
+ hash[:"#{day}_end"] = "17:00"
18
+ end
19
+ end
20
+
21
+ test "#show returns a 200 response" do
22
+ get(:show, params: { id: @stack.to_param })
23
+
24
+ assert(response.ok?)
25
+ end
26
+
27
+ test "#update" do
28
+ patch(:update, params: {
29
+ id: @stack.to_param,
30
+ continuous_delivery_schedule: {
31
+ **valid_params
32
+ }
33
+ })
34
+
35
+ assert_redirected_to(stack_continuous_delivery_schedule_path(@stack))
36
+ assert_equal("Successfully updated", flash[:success])
37
+
38
+ schedule = @stack.continuous_delivery_schedule
39
+
40
+ Shipit::ContinuousDeliverySchedule::DAYS.each do |day|
41
+ refute(schedule.read_attribute("#{day}_enabled"))
42
+
43
+ day_start = schedule.read_attribute("#{day}_start")
44
+ assert_equal("09:00:00 AM", day_start.strftime("%r"))
45
+
46
+ day_end = schedule.read_attribute("#{day}_end")
47
+ assert_equal("05:00:00 PM", day_end.strftime("%r"))
48
+ end
49
+ end
50
+
51
+ test "#update renders validation errors" do
52
+ patch(:update, params: {
53
+ id: @stack.to_param,
54
+ continuous_delivery_schedule: {
55
+ # Make Sunday end before it starts
56
+ **valid_params.merge(sunday_end: "08:00")
57
+ }
58
+ })
59
+
60
+ assert_response(:unprocessable_entity)
61
+ assert_equal("Check form for errors", flash[:warning])
62
+ elements = assert_select(".validation-errors")
63
+ assert_includes(elements.sole.inner_text, "Sunday end must be after start (09:00 AM)")
64
+ end
65
+ end
66
+ end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
5
6
  class DeploysControllerTest < ActionController::TestCase
6
7
  setup do
7
- Deploy.where(status: %w(running pending)).update_all(status: 'success')
8
+ Deploy.where(status: %w[running pending]).update_all(status: 'success')
8
9
  @stack = shipit_stacks(:shipit)
9
10
  @deploy = shipit_deploys(:shipit)
10
11
  @commit = shipit_commits(:second)
@@ -31,6 +32,7 @@ module Shipit
31
32
  test ":new works for not yet deployed stacks" do
32
33
  @stack = shipit_stacks(:undeployed_stack)
33
34
  get :new, params: { stack_id: @stack.to_param, sha: @stack.commits.last.sha }
35
+ assert_response :success
34
36
  end
35
37
 
36
38
  test ":new shows a warning if a deploy is already running" do
@@ -62,7 +64,7 @@ module Shipit
62
64
 
63
65
  test ":create can receive an :env hash" do
64
66
  env = { 'SAFETY_DISABLED' => '1' }
65
- post :create, params: { stack_id: @stack.to_param, deploy: { until_commit_id: @commit.id, env: env } }
67
+ post :create, params: { stack_id: @stack.to_param, deploy: { until_commit_id: @commit.id, env: } }
66
68
  new_deploy = Deploy.last
67
69
  assert_equal env, new_deploy.env
68
70
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -6,7 +7,7 @@ module Shipit
6
7
  test ":callback can sign in to github" do
7
8
  auth = OmniAuth::AuthHash.new(
8
9
  credentials: OmniAuth::AuthHash.new(
9
- token: 's3cr3t',
10
+ token: 's3cr3t'
10
11
  ),
11
12
  extra: OmniAuth::AuthHash.new(
12
13
  raw_info: OmniAuth::AuthHash.new(
@@ -15,9 +16,9 @@ module Shipit
15
16
  email: 'shipit-user@example.com',
16
17
  login: 'shipit-user',
17
18
  avatar_url: 'https://example.com',
18
- api_url: 'https://github.com/api/v3/users/shipit-user',
19
- ),
20
- ),
19
+ api_url: 'https://github.com/api/v3/users/shipit-user'
20
+ )
21
+ )
21
22
  )
22
23
  @request.env['omniauth.auth'] = auth
23
24
 
@@ -28,6 +29,7 @@ module Shipit
28
29
  user = User.find_by(login: 'shipit-user')
29
30
  assert_equal 's3cr3t', user.github_access_token
30
31
  assert_equal 44, user.github_id
32
+ assert session[:authenticated], "Expected session[:authenticated] to be true"
31
33
  end
32
34
  end
33
35
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -38,14 +39,14 @@ module Shipit
38
39
  test "GET show prefers stacks with merge_queue_enabled" do
39
40
  existing = shipit_stacks(:shipit)
40
41
  Shipit::Stack.where(
41
- repository: existing.repository,
42
+ repository: existing.repository
42
43
  ).update_all(merge_queue_enabled: false)
43
44
 
44
45
  Shipit::Stack.create(
45
46
  repository: existing.repository,
46
47
  environment: 'foo',
47
48
  branch: existing.branch,
48
- merge_queue_enabled: true,
49
+ merge_queue_enabled: true
49
50
  )
50
51
 
51
52
  get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
@@ -56,7 +57,7 @@ module Shipit
56
57
  test "GET show prefers locked stacks above all else" do
57
58
  existing = shipit_stacks(:shipit)
58
59
  Shipit::Stack.where(
59
- repository: existing.repository,
60
+ repository: existing.repository
60
61
  ).update_all(lock_reason: 'testing', merge_queue_enabled: false, locked_since: Time.now.utc)
61
62
 
62
63
  # Shipit would otherwise prefer this, because it has the merge queue enabled
@@ -64,7 +65,7 @@ module Shipit
64
65
  repository: existing.repository,
65
66
  environment: 'foo',
66
67
  branch: existing.branch,
67
- merge_queue_enabled: true,
68
+ merge_queue_enabled: true
68
69
  )
69
70
 
70
71
  get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -22,7 +23,7 @@ module Shipit
22
23
  assert_response :forbidden
23
24
  assert_equal(
24
25
  'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
25
- response.body,
26
+ response.body
26
27
  )
27
28
  end
28
29
 
@@ -36,8 +37,8 @@ module Shipit
36
37
  post :create, params: {
37
38
  repository: {
38
39
  name: 'valid',
39
- owner: 'repository',
40
- },
40
+ owner: 'repository'
41
+ }
41
42
  }
42
43
  end
43
44
  assert_redirected_to repository_path(Repository.last)
@@ -48,8 +49,8 @@ module Shipit
48
49
  post :create, params: {
49
50
  repository: {
50
51
  owner: 'some',
51
- name: 'owner/path',
52
- },
52
+ name: 'owner/path'
53
+ }
53
54
  }
54
55
  end
55
56
  assert_response :success
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
5
6
  class RollbacksControllerTest < ActionController::TestCase
6
7
  setup do
7
- Deploy.where(status: %w(running pending)).update_all(status: 'success')
8
+ Deploy.where(status: %w[running pending]).update_all(status: 'success')
8
9
  @stack = shipit_stacks(:shipit)
9
10
  @deploy = shipit_deploys(:shipit)
10
11
  session[:user_id] = shipit_users(:walrus).id
@@ -18,7 +19,7 @@ module Shipit
18
19
 
19
20
  test ":create can receive an :env hash" do
20
21
  env = { 'SAFETY_DISABLED' => '1' }
21
- post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env: env } }
22
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env: } }
22
23
  new_rollback = Rollback.last
23
24
  assert_equal env, new_rollback.env
24
25
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -10,7 +11,7 @@ module Shipit
10
11
  end
11
12
 
12
13
  test "validates that Shipit.github is present" do
13
- Rails.application.secrets.stubs(:github).returns(nil)
14
+ Rails.application.credentials.stubs(:github).returns(nil)
14
15
  get :index
15
16
  assert_select "#github_app .missing"
16
17
  assert_select ".missing", count: 1
@@ -54,7 +55,7 @@ module Shipit
54
55
  assert_response :forbidden
55
56
  assert_equal(
56
57
  'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
57
- response.body,
58
+ response.body
58
59
  )
59
60
  end
60
61
 
@@ -98,6 +99,7 @@ module Shipit
98
99
  test "#show handles locked stacks without a lock_author" do
99
100
  @stack.update!(lock_reason: "I am a lock with no author")
100
101
  get :show, params: { id: @stack.to_param }
102
+ assert_response :ok
101
103
  end
102
104
 
103
105
  test "#show auto-links URLs in lock reason" do
@@ -114,8 +116,8 @@ module Shipit
114
116
  repo_name: 'rails',
115
117
  repo_owner: 'rails',
116
118
  environment: 'staging',
117
- branch: 'staging',
118
- },
119
+ branch: 'staging'
120
+ }
119
121
  }
120
122
  end
121
123
 
@@ -240,8 +242,8 @@ module Shipit
240
242
  repo_owner: 'rails',
241
243
  environment: 'staging',
242
244
  branch: 'staging',
243
- deploy_url: 'Javascript:alert(1);',
244
- },
245
+ deploy_url: 'Javascript:alert(1);'
246
+ }
245
247
  }
246
248
  assert_response :success
247
249
  assert_equal 'Deploy url is invalid', flash[:warning]
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -11,9 +12,16 @@ module Shipit
11
12
  session[:user_id] = shipit_users(:walrus).id
12
13
  end
13
14
 
14
- test "tasks defined in the shipit.yml can be displayed" do
15
+ test "tasks defined in the shipit.yml can be displayed with default variable values" do
15
16
  get :new, params: { stack_id: @stack, definition_id: @definition.id }
16
17
  assert_response :ok
18
+ assert_select 'input[name="task[env][FOO]"][value="1"]'
19
+ end
20
+
21
+ test "it is possible to provide a default value override for a task" do
22
+ get :new, params: { stack_id: @stack, definition_id: @definition.id, FOO: '42' }
23
+ assert_response :ok
24
+ assert_select 'input[name="task[env][FOO]"][value="42"]'
17
25
  end
18
26
 
19
27
  test "tasks defined in the shipit.yml can't be triggered if the stack is being deployed" do
@@ -47,7 +55,7 @@ module Shipit
47
55
  test "tasks with variables defined in the shipit.yml can be triggered with their variables set" do
48
56
  env = { "FOO" => "0" }
49
57
 
50
- post :create, params: { stack_id: @stack, definition_id: @definition.id, task: { env: env }, force: 'true' }
58
+ post :create, params: { stack_id: @stack, definition_id: @definition.id, task: { env: }, force: 'true' }
51
59
 
52
60
  assert_redirected_to stack_tasks_path(@stack, Task.last)
53
61
  end
@@ -106,7 +114,7 @@ module Shipit
106
114
 
107
115
  get :tail, params: { stack_id: @stack.to_param, id: @task.id }, format: :json
108
116
  assert_response :success
109
- assert_json_keys %w(url status output)
117
+ assert_json_keys %w[url status output]
110
118
  assert_json 'status', @task.status
111
119
  assert_json 'output', @task.chunk_output
112
120
  assert_json 'url', "/shopify/shipit-engine/production/tasks/#{@task.id}/tail?last_byte=#{last_chunk}"
@@ -118,7 +126,7 @@ module Shipit
118
126
 
119
127
  get :tail, params: { stack_id: @stack.to_param, id: @task.id, last_byte: "50" }, format: :json
120
128
  assert_response :success
121
- assert_json_keys %w(url status output)
129
+ assert_json_keys %w[url status output]
122
130
  end
123
131
 
124
132
  test ":tail doesn't returns the next url if the task is finished" do
@@ -134,7 +142,7 @@ module Shipit
134
142
 
135
143
  get :tail, params: { stack_id: @stack.to_param, id: @task.id }, format: :json
136
144
  assert_response :success
137
- assert_json_keys %w(status output rollback_url)
145
+ assert_json_keys %w[status output rollback_url]
138
146
  end
139
147
 
140
148
  test ":lookup returns stack task url if the task is an instance of Task" do