shipit-engine 0.28.0 → 0.32.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 (314) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -2
  3. data/Rakefile +4 -2
  4. data/app/assets/images/archive-solid.svg +1 -0
  5. data/app/assets/stylesheets/_pages/_stacks.scss +76 -3
  6. data/app/assets/stylesheets/_structure/_main.scss +2 -1
  7. data/app/assets/stylesheets/merge_status.scss +0 -3
  8. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +13 -0
  9. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  10. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  11. data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
  12. data/app/controllers/concerns/shipit/authentication.rb +3 -2
  13. data/app/controllers/concerns/shipit/pagination.rb +2 -1
  14. data/app/controllers/shipit/api/base_controller.rb +11 -6
  15. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  16. data/app/controllers/shipit/api/commits_controller.rb +2 -1
  17. data/app/controllers/shipit/api/deploys_controller.rb +4 -3
  18. data/app/controllers/shipit/api/hooks_controller.rb +6 -5
  19. data/app/controllers/shipit/api/locks_controller.rb +5 -4
  20. data/app/controllers/shipit/api/outputs_controller.rb +2 -1
  21. data/app/controllers/shipit/api/pull_requests_controller.rb +7 -6
  22. data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
  23. data/app/controllers/shipit/api/rollbacks_controller.rb +33 -0
  24. data/app/controllers/shipit/api/stacks_controller.rb +37 -5
  25. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  26. data/app/controllers/shipit/api_clients_controller.rb +50 -0
  27. data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
  28. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  29. data/app/controllers/shipit/commits_controller.rb +2 -1
  30. data/app/controllers/shipit/deploys_controller.rb +3 -2
  31. data/app/controllers/shipit/github_authentication_controller.rb +4 -3
  32. data/app/controllers/shipit/merge_status_controller.rb +19 -14
  33. data/app/controllers/shipit/pull_requests_controller.rb +3 -2
  34. data/app/controllers/shipit/release_statuses_controller.rb +3 -2
  35. data/app/controllers/shipit/rollbacks_controller.rb +3 -2
  36. data/app/controllers/shipit/shipit_controller.rb +2 -1
  37. data/app/controllers/shipit/stacks_controller.rb +78 -14
  38. data/app/controllers/shipit/status_controller.rb +2 -1
  39. data/app/controllers/shipit/tasks_controller.rb +6 -5
  40. data/app/controllers/shipit/webhooks_controller.rb +5 -132
  41. data/app/helpers/shipit/chunks_helper.rb +1 -0
  42. data/app/helpers/shipit/deploys_helper.rb +4 -3
  43. data/app/helpers/shipit/github_url_helper.rb +1 -0
  44. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  45. data/app/helpers/shipit/shipit_helper.rb +1 -0
  46. data/app/helpers/shipit/stacks_helper.rb +5 -0
  47. data/app/helpers/shipit/tasks_helper.rb +1 -0
  48. data/app/jobs/shipit/background_job.rb +4 -0
  49. data/app/jobs/shipit/background_job/unique.rb +4 -1
  50. data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
  51. data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
  52. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  53. data/app/jobs/shipit/continuous_delivery_job.rb +3 -1
  54. data/app/jobs/shipit/create_on_github_job.rb +6 -1
  55. data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
  56. data/app/jobs/shipit/deferred_touch_job.rb +4 -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_stack_job.rb +3 -2
  60. data/app/jobs/shipit/emit_event_job.rb +2 -1
  61. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  62. data/app/jobs/shipit/fetch_deployed_revision_job.rb +2 -1
  63. data/app/jobs/shipit/github_sync_job.rb +3 -2
  64. data/app/jobs/shipit/{mark_deploy_healty_job.rb → mark_deploy_healthy_job.rb} +1 -0
  65. data/app/jobs/shipit/merge_pull_requests_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 +14 -5
  68. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  69. data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
  70. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  72. data/app/jobs/shipit/refresh_pull_request_job.rb +1 -0
  73. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  74. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  75. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  76. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -3
  77. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  78. data/app/models/shipit/anonymous_user.rb +5 -0
  79. data/app/models/shipit/api_client.rb +3 -2
  80. data/app/models/shipit/application_record.rb +2 -1
  81. data/app/models/shipit/check_run.rb +4 -3
  82. data/app/models/shipit/command_line_user.rb +1 -0
  83. data/app/models/shipit/commit.rb +31 -12
  84. data/app/models/shipit/commit_checks.rb +1 -0
  85. data/app/models/shipit/commit_deployment.rb +17 -12
  86. data/app/models/shipit/commit_deployment_status.rb +8 -3
  87. data/app/models/shipit/commit_message.rb +1 -0
  88. data/app/models/shipit/delivery.rb +4 -3
  89. data/app/models/shipit/deploy.rb +40 -10
  90. data/app/models/shipit/deploy_spec.rb +22 -3
  91. data/app/models/shipit/deploy_spec/bundler_discovery.rb +2 -1
  92. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  93. data/app/models/shipit/deploy_spec/file_system.rb +10 -3
  94. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
  95. data/app/models/shipit/deploy_spec/lerna_discovery.rb +1 -0
  96. data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
  97. data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
  98. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  99. data/app/models/shipit/deploy_stats.rb +58 -0
  100. data/app/models/shipit/duration.rb +3 -2
  101. data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
  102. data/app/models/shipit/github_hook.rb +2 -1
  103. data/app/models/shipit/github_status.rb +3 -2
  104. data/app/models/shipit/hook.rb +6 -5
  105. data/app/models/shipit/membership.rb +3 -2
  106. data/app/models/shipit/output_chunk.rb +7 -2
  107. data/app/models/shipit/pull_request.rb +13 -7
  108. data/app/models/shipit/record.rb +18 -0
  109. data/app/models/shipit/release_status.rb +3 -2
  110. data/app/models/shipit/repository.rb +43 -0
  111. data/app/models/shipit/rollback.rb +1 -0
  112. data/app/models/shipit/stack.rb +109 -50
  113. data/app/models/shipit/status.rb +3 -2
  114. data/app/models/shipit/status/common.rb +7 -6
  115. data/app/models/shipit/status/group.rb +1 -0
  116. data/app/models/shipit/status/missing.rb +2 -1
  117. data/app/models/shipit/status/unknown.rb +2 -1
  118. data/app/models/shipit/task.rb +64 -9
  119. data/app/models/shipit/task_definition.rb +1 -0
  120. data/app/models/shipit/team.rb +2 -1
  121. data/app/models/shipit/undeployed_commit.rb +1 -0
  122. data/app/models/shipit/unlimited_api_client.rb +1 -0
  123. data/app/models/shipit/user.rb +29 -5
  124. data/app/models/shipit/variable_definition.rb +1 -0
  125. data/app/models/shipit/webhooks.rb +33 -0
  126. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +20 -0
  127. data/app/models/shipit/webhooks/handlers/handler.rb +41 -0
  128. data/app/models/shipit/webhooks/handlers/membership_handler.rb +46 -0
  129. data/app/models/shipit/webhooks/handlers/push_handler.rb +21 -0
  130. data/app/models/shipit/webhooks/handlers/status_handler.rb +27 -0
  131. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  132. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  133. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  134. data/app/serializers/shipit/commit_serializer.rb +1 -0
  135. data/app/serializers/shipit/deploy_serializer.rb +2 -1
  136. data/app/serializers/shipit/hook_serializer.rb +1 -0
  137. data/app/serializers/shipit/pull_request_serializer.rb +1 -0
  138. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  139. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  140. data/app/serializers/shipit/stack_serializer.rb +7 -1
  141. data/app/serializers/shipit/tail_task_serializer.rb +1 -0
  142. data/app/serializers/shipit/task_serializer.rb +2 -17
  143. data/app/serializers/shipit/user_serializer.rb +6 -1
  144. data/app/validators/ascii_only_validator.rb +4 -3
  145. data/app/validators/subset_validator.rb +1 -0
  146. data/app/views/layouts/_head.html.erb +0 -0
  147. data/app/views/layouts/shipit.html.erb +6 -4
  148. data/app/views/shipit/_variables.html.erb +1 -1
  149. data/app/views/shipit/api_clients/index.html.erb +36 -0
  150. data/app/views/shipit/api_clients/new.html.erb +33 -0
  151. data/app/views/shipit/api_clients/show.html.erb +35 -0
  152. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  153. data/app/views/shipit/deploys/new.html.erb +17 -12
  154. data/app/views/shipit/deploys/show.html.erb +2 -2
  155. data/app/views/shipit/merge_status/logged_out.erb +1 -1
  156. data/app/views/shipit/stacks/_header.html.erb +27 -12
  157. data/app/views/shipit/stacks/_links.html.erb +1 -0
  158. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  159. data/app/views/shipit/stacks/index.html.erb +7 -2
  160. data/app/views/shipit/stacks/settings.html.erb +19 -0
  161. data/app/views/shipit/stacks/statistics.html.erb +82 -0
  162. data/app/views/shipit/tasks/show.html.erb +1 -1
  163. data/config/initializers/inflections.rb +2 -1
  164. data/config/locales/en.yml +18 -5
  165. data/config/routes.rb +14 -2
  166. data/db/migrate/20191209231045_create_shipit_repositories.rb +12 -0
  167. data/db/migrate/20191209231307_add_repository_reference_to_stacks.rb +15 -0
  168. data/db/migrate/20191216162728_backfill_repository_data.rb +22 -0
  169. data/db/migrate/20191216163010_remove_repository_information_from_stacks.rb +20 -0
  170. data/db/migrate/20191219205202_add_archived_since_to_stacks.rb +6 -0
  171. data/db/migrate/20200102175621_optional_task_commits.rb +6 -0
  172. data/db/migrate/20200109132519_add_sha_to_commit_deployments.rb +5 -0
  173. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  174. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  175. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  176. data/lib/shipit.rb +18 -20
  177. data/lib/shipit/cast_value.rb +1 -0
  178. data/lib/shipit/command.rb +14 -18
  179. data/lib/shipit/commands.rb +5 -4
  180. data/lib/shipit/csv_serializer.rb +1 -0
  181. data/lib/shipit/deploy_commands.rb +1 -0
  182. data/lib/shipit/engine.rb +11 -2
  183. data/lib/shipit/environment_variables.rb +11 -1
  184. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  185. data/lib/shipit/flock.rb +1 -0
  186. data/lib/shipit/github_app.rb +60 -6
  187. data/lib/shipit/github_http_cache_middleware.rb +57 -0
  188. data/lib/shipit/null_serializer.rb +1 -0
  189. data/lib/shipit/octokit_check_runs.rb +3 -2
  190. data/lib/shipit/octokit_iterator.rb +3 -2
  191. data/lib/shipit/paginator.rb +3 -2
  192. data/lib/shipit/rollback_commands.rb +1 -0
  193. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  194. data/lib/shipit/simple_message_verifier.rb +1 -0
  195. data/lib/shipit/stack_commands.rb +6 -3
  196. data/lib/shipit/stat.rb +1 -0
  197. data/lib/shipit/task_commands.rb +22 -14
  198. data/lib/shipit/version.rb +2 -1
  199. data/lib/snippets/release-gem +5 -1
  200. data/lib/tasks/cron.rake +2 -0
  201. data/lib/tasks/dev.rake +3 -2
  202. data/lib/tasks/shipit.rake +16 -17
  203. data/lib/tasks/teams.rake +1 -0
  204. data/test/controllers/api/base_controller_test.rb +3 -2
  205. data/test/controllers/api/ccmenu_controller_test.rb +9 -8
  206. data/test/controllers/api/commits_controller_test.rb +3 -2
  207. data/test/controllers/api/deploys_controller_test.rb +15 -14
  208. data/test/controllers/api/hooks_controller_test.rb +8 -7
  209. data/test/controllers/api/locks_controller_test.rb +7 -6
  210. data/test/controllers/api/outputs_controller_test.rb +3 -2
  211. data/test/controllers/api/pull_requests_controller_test.rb +8 -7
  212. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  213. data/test/controllers/api/rollback_controller_test.rb +113 -0
  214. data/test/controllers/api/stacks_controller_test.rb +44 -15
  215. data/test/controllers/api/tasks_controller_test.rb +13 -12
  216. data/test/controllers/api_clients_controller_test.rb +104 -0
  217. data/test/controllers/ccmenu_controller_test.rb +4 -3
  218. data/test/controllers/commit_checks_controller_test.rb +4 -3
  219. data/test/controllers/commits_controller_test.rb +3 -2
  220. data/test/controllers/deploys_controller_test.rb +33 -22
  221. data/test/controllers/github_authentication_controller_test.rb +1 -0
  222. data/test/controllers/merge_status_controller_test.rb +27 -9
  223. data/test/controllers/pull_requests_controller_test.rb +4 -3
  224. data/test/controllers/release_statuses_controller_test.rb +3 -2
  225. data/test/controllers/rollbacks_controller_test.rb +9 -8
  226. data/test/controllers/stacks_controller_test.rb +64 -15
  227. data/test/controllers/status_controller_test.rb +1 -0
  228. data/test/controllers/tasks_controller_test.rb +20 -19
  229. data/test/controllers/webhooks_controller_test.rb +36 -9
  230. data/test/dummy/config/application.rb +1 -1
  231. data/test/dummy/config/environments/development.rb +24 -4
  232. data/test/dummy/config/environments/test.rb +2 -0
  233. data/test/dummy/db/schema.rb +25 -11
  234. data/test/dummy/db/seeds.rb +34 -17
  235. data/test/fixtures/shipit/commit_deployment_statuses.yml +4 -4
  236. data/test/fixtures/shipit/commit_deployments.yml +8 -8
  237. data/test/fixtures/shipit/commits.yml +38 -0
  238. data/test/fixtures/shipit/repositories.yml +27 -0
  239. data/test/fixtures/shipit/stacks.yml +190 -30
  240. data/test/fixtures/shipit/tasks.yml +66 -3
  241. data/test/fixtures/timeout +2 -1
  242. data/test/helpers/api_helper.rb +1 -0
  243. data/test/helpers/fixture_aliases_helper.rb +1 -0
  244. data/test/helpers/hooks_helper.rb +2 -1
  245. data/test/helpers/json_helper.rb +15 -11
  246. data/test/helpers/links_helper.rb +4 -3
  247. data/test/helpers/payloads_helper.rb +1 -0
  248. data/test/helpers/queries_helper.rb +3 -2
  249. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  250. data/test/jobs/chunk_rollup_job_test.rb +1 -0
  251. data/test/jobs/deliver_hook_job_test.rb +2 -1
  252. data/test/jobs/destroy_stack_job_test.rb +10 -0
  253. data/test/jobs/emit_event_job_test.rb +2 -1
  254. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  255. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  256. data/test/jobs/github_sync_job_test.rb +1 -0
  257. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  258. data/test/jobs/merge_pull_requests_job_test.rb +5 -4
  259. data/test/jobs/perform_task_job_test.rb +4 -3
  260. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  261. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  262. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  263. data/test/jobs/refresh_status_job_test.rb +1 -0
  264. data/test/jobs/unique_job_test.rb +1 -0
  265. data/test/jobs/update_github_last_deployed_ref_job_test.rb +13 -11
  266. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  267. data/test/models/api_client_test.rb +1 -0
  268. data/test/models/commit_checks_test.rb +1 -0
  269. data/test/models/commit_deployment_status_test.rb +34 -4
  270. data/test/models/commit_deployment_test.rb +9 -11
  271. data/test/models/commits_test.rb +99 -7
  272. data/test/models/delivery_test.rb +3 -2
  273. data/test/models/deploy_spec_test.rb +47 -42
  274. data/test/models/deploy_stats_test.rb +113 -0
  275. data/test/models/deploys_test.rb +60 -13
  276. data/test/models/duration_test.rb +1 -0
  277. data/test/models/github_hook_test.rb +1 -0
  278. data/test/models/hook_test.rb +20 -16
  279. data/test/models/membership_test.rb +1 -0
  280. data/test/models/output_chunk_test.rb +1 -0
  281. data/test/models/pull_request_test.rb +18 -11
  282. data/test/models/release_statuses_test.rb +1 -0
  283. data/test/models/rollbacks_test.rb +1 -0
  284. data/test/models/shipit/check_run_test.rb +1 -0
  285. data/test/models/shipit/repository_test.rb +77 -0
  286. data/test/models/shipit/wehbooks/handlers_test.rb +27 -0
  287. data/test/models/stacks_test.rb +110 -56
  288. data/test/models/status/group_test.rb +1 -0
  289. data/test/models/status/missing_test.rb +1 -0
  290. data/test/models/status_test.rb +1 -0
  291. data/test/models/task_definitions_test.rb +9 -8
  292. data/test/models/tasks_test.rb +18 -1
  293. data/test/models/team_test.rb +4 -2
  294. data/test/models/undeployed_commits_test.rb +14 -0
  295. data/test/models/users_test.rb +109 -1
  296. data/test/test_command_integration.rb +3 -2
  297. data/test/test_helper.rb +38 -34
  298. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  299. data/test/unit/command_test.rb +12 -7
  300. data/test/unit/commands_test.rb +1 -0
  301. data/test/unit/commit_serializer_test.rb +16 -0
  302. data/test/unit/csv_serializer_test.rb +3 -2
  303. data/test/unit/deploy_commands_test.rb +14 -4
  304. data/test/unit/deploy_serializer_test.rb +17 -0
  305. data/test/unit/environment_variables_test.rb +5 -4
  306. data/test/unit/github_app_test.rb +165 -0
  307. data/test/unit/github_url_helper_test.rb +1 -0
  308. data/test/unit/rollback_commands_test.rb +2 -1
  309. data/test/unit/shipit_helper_test.rb +17 -0
  310. data/test/unit/shipit_test.rb +1 -0
  311. data/test/unit/user_serializer_test.rb +14 -0
  312. data/test/unit/variable_definition_test.rb +1 -0
  313. metadata +215 -157
  314. data/lib/shipit/strip_cache_control.rb +0 -40
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -10,7 +11,7 @@ module Shipit
10
11
 
11
12
  test ":create allow users to append release statuses and mark the deploy as success" do
12
13
  assert_difference -> { ReleaseStatus.count }, +1 do
13
- post :create, params: {stack_id: @stack, deploy_id: @deploy.id, status: 'success'}
14
+ post :create, params: { stack_id: @stack, deploy_id: @deploy.id, status: 'success' }
14
15
  assert_response :created
15
16
  end
16
17
 
@@ -23,7 +24,7 @@ module Shipit
23
24
 
24
25
  test ":create allow users to append release statuses and mark the deploy as faulty" do
25
26
  assert_difference -> { ReleaseStatus.count }, +1 do
26
- post :create, params: {stack_id: @stack, deploy_id: @deploy.id, status: 'failure'}
27
+ post :create, params: { stack_id: @stack, deploy_id: @deploy.id, status: 'failure' }
27
28
  assert_response :created
28
29
  end
29
30
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -11,37 +12,37 @@ module Shipit
11
12
 
12
13
  test ":create persists a new rollback" do
13
14
  assert_difference '@stack.rollbacks.count', 1 do
14
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
15
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
15
16
  end
16
17
  end
17
18
 
18
19
  test ":create can receive an :env hash" do
19
- env = {'SAFETY_DISABLED' => '1'}
20
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id, env: env}}
20
+ env = { 'SAFETY_DISABLED' => '1' }
21
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env: env } }
21
22
  new_rollback = Rollback.last
22
23
  assert_equal env, new_rollback.env
23
24
  end
24
25
 
25
26
  test ":create ignore :env keys not declared in the deploy spec" do
26
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id, env: {'H4X0R' => '1'}}}
27
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env: { 'H4X0R' => '1' } } }
27
28
  new_rollback = Rollback.last
28
29
  assert_equal({}, new_rollback.env)
29
30
  end
30
31
 
31
32
  test ":create redirects to the new deploy" do
32
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
33
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
33
34
  assert_redirected_to stack_deploy_path(@stack, Rollback.last)
34
35
  end
35
36
 
36
37
  test ":create locks deploys" do
37
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
38
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
38
39
  assert @stack.reload.locked?
39
40
  end
40
41
 
41
42
  test ":create redirects back to the :new page if there is an active deploy" do
42
43
  shipit_deploys(:shipit_running).update!(allow_concurrency: false, status: 'running')
43
44
  assert_no_difference '@stack.deploys.count' do
44
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}}
45
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id } }
45
46
  end
46
47
  assert_redirected_to rollback_stack_deploy_path(@stack, @deploy)
47
48
  end
@@ -49,7 +50,7 @@ module Shipit
49
50
  test ":create with `force` option ignore the active deploys" do
50
51
  shipit_deploys(:shipit_running).update_column(:status, 'running')
51
52
  assert_difference '@stack.deploys.count', 1 do
52
- post :create, params: {stack_id: @stack.to_param, rollback: {parent_id: @deploy.id}, force: 'true'}
53
+ post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id }, force: 'true' }
53
54
  end
54
55
  assert_redirected_to stack_deploy_path(@stack, Rollback.last)
55
56
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -46,13 +47,26 @@ module Shipit
46
47
  )
47
48
  end
48
49
 
50
+ test "#index list all stacks" do
51
+ get :index
52
+ assert_response :ok
53
+ assert_select ".stack", count: Stack.count
54
+ end
55
+
56
+ test "#index list a repo stacks if the :repo params is passed" do
57
+ repo = shipit_repositories(:shipit)
58
+ get :index, params: { repo: repo.full_name }
59
+ assert_response :ok
60
+ assert_select ".stack", count: repo.stacks.count
61
+ end
62
+
49
63
  test "#show is success" do
50
- get :show, params: {id: @stack.to_param}
64
+ get :show, params: { id: @stack.to_param }
51
65
  assert_response :ok
52
66
  end
53
67
 
54
68
  test "#show with faulty and validating deploys is success" do
55
- get :show, params: {id: shipit_stacks(:shipit_canaries).to_param}
69
+ get :show, params: { id: shipit_stacks(:shipit_canaries).to_param }
56
70
  assert_response :ok
57
71
  end
58
72
 
@@ -60,18 +74,18 @@ module Shipit
60
74
  @stack = shipit_stacks(:check_runs)
61
75
  assert_not_equal 0, CheckRun.where(stack_id: @stack.id).count
62
76
 
63
- get :show, params: {id: @stack.to_param}
77
+ get :show, params: { id: @stack.to_param }
64
78
  assert_response :ok
65
79
  end
66
80
 
67
81
  test "#show handles locked stacks without a lock_author" do
68
82
  @stack.update!(lock_reason: "I am a lock with no author")
69
- get :show, params: {id: @stack.to_param}
83
+ get :show, params: { id: @stack.to_param }
70
84
  end
71
85
 
72
86
  test "#show auto-links URLs in lock reason" do
73
87
  @stack.update!(lock_reason: 'http://google.com')
74
- get :show, params: {id: @stack.to_param}
88
+ get :show, params: { id: @stack.to_param }
75
89
  assert_response :ok
76
90
  assert_select 'a[href="http://google.com"]'
77
91
  end
@@ -93,27 +107,38 @@ module Shipit
93
107
 
94
108
  test "#create when not valid renders new" do
95
109
  assert_no_difference "Stack.count" do
96
- post :create, params: {stack: {repo_owner: 'some', repo_name: 'owner/path'}}
110
+ post :create, params: { stack: { repo_owner: 'some', repo_name: 'owner/path' } }
97
111
  end
98
112
  assert_response :success
99
113
  end
100
114
 
101
115
  test "#destroy enqueues a DestroyStackJob" do
102
116
  assert_enqueued_with(job: DestroyStackJob, args: [@stack]) do
103
- delete :destroy, params: {id: @stack.to_param}
117
+ delete :destroy, params: { id: @stack.to_param }
104
118
  end
105
119
  assert_redirected_to stacks_path
106
120
  end
107
121
 
108
122
  test "#settings is success" do
109
- get :settings, params: {id: @stack.to_param}
123
+ get :settings, params: { id: @stack.to_param }
110
124
  assert_response :success
111
125
  end
112
126
 
127
+ test "#statistics is success" do
128
+ get :statistics, params: { id: @stack.to_param }
129
+ assert_response :success
130
+ end
131
+
132
+ test "#statistics redirects to #show if no deploys are present" do
133
+ @stack.deploys.destroy_all
134
+ get :statistics, params: { id: @stack.to_param }
135
+ assert_redirected_to stack_path(@stack)
136
+ end
137
+
113
138
  test "#update allows to lock the stack" do
114
139
  refute @stack.locked?
115
140
 
116
- patch :update, params: {id: @stack.to_param, stack: {lock_reason: 'Went out to eat some chips!'}}
141
+ patch :update, params: { id: @stack.to_param, stack: { lock_reason: 'Went out to eat some chips!' } }
117
142
  @stack.reload
118
143
  assert @stack.locked?
119
144
  assert_equal shipit_users(:walrus), @stack.lock_author
@@ -123,8 +148,32 @@ module Shipit
123
148
  @stack.update!(lock_reason: 'Went out to eat some chips!')
124
149
  assert @stack.locked?
125
150
 
126
- patch :update, params: {id: @stack.to_param, stack: {lock_reason: ''}}
151
+ patch :update, params: { id: @stack.to_param, stack: { lock_reason: '' } }
152
+ @stack.reload
153
+ refute @stack.locked?
154
+ assert_instance_of AnonymousUser, @stack.lock_author
155
+ end
156
+
157
+ test "#update allows to archive the stack" do
158
+ refute @stack.archived?
159
+ refute @stack.locked?
160
+
161
+ patch :update, params: { id: @stack.to_param, stack: { archived: "true" } }
162
+ @stack.reload
163
+ assert @stack.archived?
164
+ assert @stack.locked?
165
+ assert_equal shipit_users(:walrus), @stack.lock_author
166
+ assert_equal "Archived", @stack.lock_reason
167
+ end
168
+
169
+ test "#update allows to dearchive the stack" do
170
+ @stack.archive!(shipit_users(:walrus))
171
+ assert @stack.locked?
172
+ assert @stack.archived?
173
+
174
+ patch :update, params: { id: @stack.to_param, stack: { archived: "false" } }
127
175
  @stack.reload
176
+ refute @stack.archived?
128
177
  refute @stack.locked?
129
178
  assert_instance_of AnonymousUser, @stack.lock_author
130
179
  end
@@ -135,7 +184,7 @@ module Shipit
135
184
  assert_enqueued_with(job: RefreshStatusesJob, args: [stack_id: @stack.id]) do
136
185
  assert_enqueued_with(job: RefreshCheckRunsJob, args: [stack_id: @stack.id]) do
137
186
  assert_enqueued_with(job: GithubSyncJob, args: [stack_id: @stack.id]) do
138
- post :refresh, params: {id: @stack.to_param}
187
+ post :refresh, params: { id: @stack.to_param }
139
188
  end
140
189
  end
141
190
  end
@@ -145,23 +194,23 @@ module Shipit
145
194
 
146
195
  test "#clear_git_cache queues a ClearGitCacheJob" do
147
196
  assert_enqueued_with(job: ClearGitCacheJob, args: [@stack]) do
148
- post :clear_git_cache, params: {id: @stack.to_param}
197
+ post :clear_git_cache, params: { id: @stack.to_param }
149
198
  end
150
199
  assert_redirected_to stack_settings_path(@stack)
151
200
  end
152
201
 
153
202
  test "#clear_git_cache displays a flash message" do
154
- post :clear_git_cache, params: {id: @stack.to_param}
203
+ post :clear_git_cache, params: { id: @stack.to_param }
155
204
  assert_equal 'Git Cache clearing scheduled', flash[:success]
156
205
  end
157
206
 
158
207
  test "#update redirects to return_to parameter" do
159
- patch :update, params: {id: @stack.to_param, stack: {ignore_ci: false}, return_to: stack_path(@stack)}
208
+ patch :update, params: { id: @stack.to_param, stack: { ignore_ci: false }, return_to: stack_path(@stack) }
160
209
  assert_redirected_to stack_path(@stack)
161
210
  end
162
211
 
163
212
  test "#lookup redirects to the canonical URL" do
164
- get :lookup, params: {id: @stack.id}
213
+ get :lookup, params: { id: @stack.id }
165
214
  assert_redirected_to stack_path(@stack)
166
215
  end
167
216
 
@@ -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,7 +12,7 @@ module Shipit
11
12
  end
12
13
 
13
14
  test "tasks defined in the shipit.yml can be displayed" do
14
- get :new, params: {stack_id: @stack, definition_id: @definition.id}
15
+ get :new, params: { stack_id: @stack, definition_id: @definition.id }
15
16
  assert_response :ok
16
17
  end
17
18
 
@@ -20,7 +21,7 @@ module Shipit
20
21
 
21
22
  assert_predicate @stack, :active_task?
22
23
  assert_no_difference -> { @stack.tasks.count } do
23
- post :create, params: {stack_id: @stack, definition_id: @definition.id}
24
+ post :create, params: { stack_id: @stack, definition_id: @definition.id }
24
25
  end
25
26
  assert_redirected_to new_stack_tasks_path(@stack, @definition)
26
27
  end
@@ -30,7 +31,7 @@ module Shipit
30
31
 
31
32
  assert_predicate @stack, :active_task?
32
33
  assert_difference -> { @stack.tasks.count } do
33
- post :create, params: {stack_id: @stack, definition_id: @definition.id, force: 'true'}
34
+ post :create, params: { stack_id: @stack, definition_id: @definition.id, force: 'true' }
34
35
  end
35
36
  assert_redirected_to stack_task_path(@stack, Task.last)
36
37
  end
@@ -38,34 +39,34 @@ module Shipit
38
39
  test "tasks defined in the shipit.yml can be triggered while the stack is being deployed if specified as such" do
39
40
  @definition = @stack.find_task_definition('flush_cache')
40
41
  assert_difference -> { @stack.tasks.count } do
41
- post :create, params: {stack_id: @stack, definition_id: @definition.id}
42
+ post :create, params: { stack_id: @stack, definition_id: @definition.id }
42
43
  end
43
44
  assert_redirected_to stack_task_path(@stack, Task.last)
44
45
  end
45
46
 
46
47
  test "tasks with variables defined in the shipit.yml can be triggered with their variables set" do
47
- env = {"FOO" => "0"}
48
+ env = { "FOO" => "0" }
48
49
 
49
- post :create, params: {stack_id: @stack, definition_id: @definition.id, task: {env: env}, force: 'true'}
50
+ post :create, params: { stack_id: @stack, definition_id: @definition.id, task: { env: env }, force: 'true' }
50
51
 
51
52
  assert_redirected_to stack_tasks_path(@stack, Task.last)
52
53
  end
53
54
 
54
55
  test "triggered tasks can be observed" do
55
- get :show, params: {stack_id: @stack, id: @task.id}
56
+ get :show, params: { stack_id: @stack, id: @task.id }
56
57
  assert_response :ok
57
58
  end
58
59
 
59
60
  test "triggered tasks can be observed as raw text" do
60
- get :show, params: {stack_id: @stack, id: @task.id}, format: 'txt'
61
+ get :show, params: { stack_id: @stack, id: @task.id }, format: 'txt'
61
62
  assert_response :success
62
- assert_equal("text/plain", @response.content_type)
63
+ assert_equal("text/plain", @response.media_type)
63
64
  end
64
65
 
65
66
  test ":abort call abort! on the deploy" do
66
67
  @task = shipit_deploys(:shipit_running)
67
68
  @task.ping
68
- post :abort, params: {stack_id: @stack.to_param, id: @task.id}
69
+ post :abort, params: { stack_id: @stack.to_param, id: @task.id }
69
70
 
70
71
  @task.reload
71
72
  assert_response :success
@@ -77,7 +78,7 @@ module Shipit
77
78
  test ":abort schedule the rollback if `rollback` is present" do
78
79
  @task = shipit_deploys(:shipit_running)
79
80
  @task.ping
80
- post :abort, params: {stack_id: @stack.to_param, id: @task.id, rollback: 'true'}
81
+ post :abort, params: { stack_id: @stack.to_param, id: @task.id, rollback: 'true' }
81
82
 
82
83
  @task.reload
83
84
  assert_response :success
@@ -87,13 +88,13 @@ module Shipit
87
88
  end
88
89
 
89
90
  test ":index list the stack deploys" do
90
- get :index, params: {stack_id: @stack.to_param}
91
+ get :index, params: { stack_id: @stack.to_param }
91
92
  assert_response :success
92
93
  assert_select '.task-list .task', @stack.tasks.count
93
94
  end
94
95
 
95
96
  test ":index paginates with the `since` parameter" do
96
- get :index, params: {stack_id: @stack.to_param, since: @stack.tasks.last.id}
97
+ get :index, params: { stack_id: @stack.to_param, since: @stack.tasks.last.id }
97
98
  assert_response :success
98
99
  assert_select '.task-list .task', @stack.tasks.count - 1
99
100
  end
@@ -102,7 +103,7 @@ module Shipit
102
103
  @task = shipit_deploys(:shipit_running)
103
104
  last_chunk = @task.chunks.last
104
105
 
105
- get :tail, params: {stack_id: @stack.to_param, id: @task.id, last_id: last_chunk.id}, format: :json
106
+ get :tail, params: { stack_id: @stack.to_param, id: @task.id, last_id: last_chunk.id }, format: :json
106
107
  assert_response :success
107
108
  assert_json_keys %w(url status output)
108
109
  assert_json 'status', @task.status
@@ -111,7 +112,7 @@ module Shipit
111
112
  test ":tail doesn't returns the next url if the task is finished" do
112
113
  @task = shipit_deploys(:shipit)
113
114
 
114
- get :tail, params: {stack_id: @stack.to_param, id: @task.id}, format: :json
115
+ get :tail, params: { stack_id: @stack.to_param, id: @task.id }, format: :json
115
116
  assert_response :success
116
117
  assert_no_json 'url'
117
118
  end
@@ -119,7 +120,7 @@ module Shipit
119
120
  test ":tail returns the rollback url if the task have been aborted" do
120
121
  @task = shipit_deploys(:shipit_aborted)
121
122
 
122
- get :tail, params: {stack_id: @stack.to_param, id: @task.id}, format: :json
123
+ get :tail, params: { stack_id: @stack.to_param, id: @task.id }, format: :json
123
124
  assert_response :success
124
125
  assert_json_keys %w(status output rollback_url)
125
126
  end
@@ -127,7 +128,7 @@ module Shipit
127
128
  test ":lookup returns stack task url if the task is an instance of Task" do
128
129
  @task = shipit_tasks(:shipit_restart)
129
130
 
130
- get :lookup, params: {id: @task.id}
131
+ get :lookup, params: { id: @task.id }
131
132
 
132
133
  assert_redirected_to stack_task_path(@task.stack, @task)
133
134
  end
@@ -135,7 +136,7 @@ module Shipit
135
136
  test ":lookup returns stack deploy url if the task is an instance of Deploy" do
136
137
  @task = shipit_tasks(:shipit)
137
138
 
138
- get :lookup, params: {id: @task.id}
139
+ get :lookup, params: { id: @task.id }
139
140
 
140
141
  assert_redirected_to stack_deploy_path(@task.stack, @task)
141
142
  end
@@ -143,7 +144,7 @@ module Shipit
143
144
  test ":lookup returns stack deploy url if the task is an instance of Rollback" do
144
145
  @task = shipit_tasks(:shipit_rollback)
145
146
 
146
- get :lookup, params: {id: @task.id}
147
+ get :lookup, params: { id: @task.id }
147
148
 
148
149
  assert_redirected_to stack_deploy_path(@task.stack, @task)
149
150
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -7,6 +8,17 @@ module Shipit
7
8
  GithubHook.any_instance.stubs(:verify_signature).returns(true)
8
9
  end
9
10
 
11
+ test "create github repository which is not yet present in the datastore" do
12
+ request.headers['X-Github-Event'] = 'push'
13
+ unknown_repo_payload = JSON.parse(payload(:push_master))
14
+ unknown_repo_payload["repository"]["full_name"] = "owner/unknown-repository"
15
+ unknown_repo_payload = unknown_repo_payload.to_json
16
+
17
+ assert_nothing_raised do
18
+ post :create, body: unknown_repo_payload, as: :json
19
+ end
20
+ end
21
+
10
22
  test ":push with the target branch queues a GithubSyncJob" do
11
23
  request.headers['X-Github-Event'] = 'push'
12
24
 
@@ -43,14 +55,14 @@ module Shipit
43
55
 
44
56
  test ":state with a unexisting commit respond with 200 OK" do
45
57
  request.headers['X-Github-Event'] = 'status'
46
- params = {'sha' => 'notarealcommit', 'state' => 'pending', 'branches' => [{'name' => 'master'}]}.to_json
58
+ params = { 'sha' => 'notarealcommit', 'state' => 'pending', 'branches' => [{ 'name' => 'master' }] }.to_json
47
59
  post :create, body: params, as: :json
48
60
  assert_response :ok
49
61
  end
50
62
 
51
63
  test ":state in an untracked branche bails out" do
52
64
  request.headers['X-Github-Event'] = 'status'
53
- params = {'sha' => 'notarealcommit', 'state' => 'pending', 'branches' => []}.to_json
65
+ params = { 'sha' => 'notarealcommit', 'state' => 'pending', 'branches' => [] }.to_json
54
66
  post :create, body: params, as: :json
55
67
  assert_response :ok
56
68
  end
@@ -68,7 +80,7 @@ module Shipit
68
80
  @request.headers['X-Github-Event'] = 'ping'
69
81
 
70
82
  assert_no_enqueued_jobs do
71
- post :create, body: {zen: 'Git is beautiful'}.to_json, as: :json
83
+ post :create, body: { zen: 'Git is beautiful' }.to_json, as: :json
72
84
  assert_response :ok
73
85
  end
74
86
  end
@@ -76,7 +88,7 @@ module Shipit
76
88
  test "verifies webhook signature" do
77
89
  commit = shipit_commits(:first)
78
90
 
79
- payload = {"sha" => commit.sha, "state" => "pending", "target_url" => "https://ci.example.com/1000/output"}.to_json
91
+ payload = { "sha" => commit.sha, "state" => "pending", "target_url" => "https://ci.example.com/1000/output" }.to_json
80
92
  signature = 'sha1=4848deb1c9642cd938e8caa578d201ca359a8249'
81
93
 
82
94
  @request.headers['X-Github-Event'] = 'push'
@@ -105,7 +117,7 @@ module Shipit
105
117
  @request.headers['X-Github-Event'] = 'membership'
106
118
  Shipit.github.api.expects(:user).with('george').returns(george)
107
119
  assert_difference -> { User.count }, 1 do
108
- post :create, body: membership_params.merge(member: {login: 'george'}).to_json, as: :json
120
+ post :create, body: membership_params.merge(member: { login: 'george' }).to_json, as: :json
109
121
  assert_response :ok
110
122
  end
111
123
  end
@@ -121,7 +133,7 @@ module Shipit
121
133
  test ":membership can append an user membership" do
122
134
  @request.headers['X-Github-Event'] = 'membership'
123
135
  assert_difference -> { Membership.count }, 1 do
124
- post :create, body: membership_params.merge(member: {login: 'bob'}).to_json, as: :json
136
+ post :create, body: membership_params.merge(member: { login: 'bob' }).to_json, as: :json
125
137
  assert_response :ok
126
138
  end
127
139
  end
@@ -137,19 +149,34 @@ module Shipit
137
149
  test ":membership can delete an user twice" do
138
150
  @request.headers['X-Github-Event'] = 'membership'
139
151
  assert_no_difference -> { Membership.count } do
140
- post :create, body: membership_params.merge(action: 'removed', member: {login: 'bob'}).to_json, as: :json
152
+ post :create, body: membership_params.merge(action: 'removed', member: { login: 'bob' }).to_json, as: :json
141
153
  assert_response :ok
142
154
  end
143
155
  end
144
156
 
157
+ test "other events trigger custom handlers" do
158
+ event = 'pull_request'
159
+ mock_handler = mock
160
+ mock_handler.expects(:call).with(pull_request_params.stringify_keys).once
161
+ Shipit::Webhooks.register_handler(event, mock_handler)
162
+
163
+ @request.headers['X-Github-Event'] = event
164
+ post :create, body: pull_request_params.to_json, as: :json
165
+ assert_response :ok
166
+ end
167
+
145
168
  private
146
169
 
170
+ def pull_request_params
171
+ { action: 'opened', number: 2, pull_request: 'foobar' }
172
+ end
173
+
147
174
  def membership_params
148
- {action: 'added', team: team_params, organization: {login: 'shopify'}, member: {login: 'walrus'}}
175
+ { action: 'added', team: team_params, organization: { login: 'shopify' }, member: { login: 'walrus' } }
149
176
  end
150
177
 
151
178
  def team_params
152
- {id: shipit_teams(:shopify_developers).id, slug: 'developers', name: 'Developers', url: 'http://example.com'}
179
+ { id: shipit_teams(:shopify_developers).id, slug: 'developers', name: 'Developers', url: 'http://example.com' }
153
180
  end
154
181
 
155
182
  def george