shipit-engine 0.31.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 (290) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -2
  3. data/Rakefile +4 -2
  4. data/app/assets/stylesheets/_pages/_stacks.scss +0 -3
  5. data/app/assets/stylesheets/merge_status.scss +0 -3
  6. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
  7. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  8. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  9. data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
  10. data/app/controllers/concerns/shipit/authentication.rb +3 -2
  11. data/app/controllers/concerns/shipit/pagination.rb +2 -1
  12. data/app/controllers/shipit/api/base_controller.rb +11 -6
  13. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  14. data/app/controllers/shipit/api/commits_controller.rb +2 -1
  15. data/app/controllers/shipit/api/deploys_controller.rb +4 -3
  16. data/app/controllers/shipit/api/hooks_controller.rb +6 -5
  17. data/app/controllers/shipit/api/locks_controller.rb +5 -4
  18. data/app/controllers/shipit/api/outputs_controller.rb +2 -1
  19. data/app/controllers/shipit/api/pull_requests_controller.rb +7 -6
  20. data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
  21. data/app/controllers/shipit/api/rollbacks_controller.rb +33 -0
  22. data/app/controllers/shipit/api/stacks_controller.rb +18 -5
  23. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  24. data/app/controllers/shipit/api_clients_controller.rb +4 -3
  25. data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
  26. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  27. data/app/controllers/shipit/commits_controller.rb +2 -1
  28. data/app/controllers/shipit/deploys_controller.rb +3 -2
  29. data/app/controllers/shipit/github_authentication_controller.rb +4 -3
  30. data/app/controllers/shipit/merge_status_controller.rb +17 -16
  31. data/app/controllers/shipit/pull_requests_controller.rb +3 -2
  32. data/app/controllers/shipit/release_statuses_controller.rb +3 -2
  33. data/app/controllers/shipit/rollbacks_controller.rb +3 -2
  34. data/app/controllers/shipit/shipit_controller.rb +2 -1
  35. data/app/controllers/shipit/stacks_controller.rb +22 -7
  36. data/app/controllers/shipit/status_controller.rb +2 -1
  37. data/app/controllers/shipit/tasks_controller.rb +6 -5
  38. data/app/controllers/shipit/webhooks_controller.rb +3 -2
  39. data/app/helpers/shipit/chunks_helper.rb +1 -0
  40. data/app/helpers/shipit/deploys_helper.rb +4 -3
  41. data/app/helpers/shipit/github_url_helper.rb +1 -0
  42. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  43. data/app/helpers/shipit/shipit_helper.rb +1 -0
  44. data/app/helpers/shipit/stacks_helper.rb +1 -0
  45. data/app/helpers/shipit/tasks_helper.rb +1 -0
  46. data/app/jobs/shipit/background_job.rb +4 -0
  47. data/app/jobs/shipit/background_job/unique.rb +1 -0
  48. data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
  49. data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
  50. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  51. data/app/jobs/shipit/continuous_delivery_job.rb +2 -1
  52. data/app/jobs/shipit/create_on_github_job.rb +6 -1
  53. data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
  54. data/app/jobs/shipit/deferred_touch_job.rb +4 -0
  55. data/app/jobs/shipit/deliver_hook_job.rb +1 -0
  56. data/app/jobs/shipit/destroy_job.rb +1 -0
  57. data/app/jobs/shipit/destroy_stack_job.rb +1 -0
  58. data/app/jobs/shipit/emit_event_job.rb +2 -1
  59. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  60. data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
  61. data/app/jobs/shipit/github_sync_job.rb +2 -1
  62. data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
  63. data/app/jobs/shipit/merge_pull_requests_job.rb +1 -0
  64. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  65. data/app/jobs/shipit/perform_task_job.rb +12 -5
  66. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  67. data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
  68. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  69. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  70. data/app/jobs/shipit/refresh_pull_request_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  72. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  73. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  74. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +4 -3
  75. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  76. data/app/models/shipit/anonymous_user.rb +5 -0
  77. data/app/models/shipit/api_client.rb +3 -2
  78. data/app/models/shipit/application_record.rb +2 -1
  79. data/app/models/shipit/check_run.rb +4 -3
  80. data/app/models/shipit/command_line_user.rb +1 -0
  81. data/app/models/shipit/commit.rb +11 -4
  82. data/app/models/shipit/commit_checks.rb +1 -0
  83. data/app/models/shipit/commit_deployment.rb +3 -2
  84. data/app/models/shipit/commit_deployment_status.rb +2 -1
  85. data/app/models/shipit/commit_message.rb +1 -0
  86. data/app/models/shipit/delivery.rb +4 -3
  87. data/app/models/shipit/deploy.rb +6 -17
  88. data/app/models/shipit/deploy_spec.rb +22 -3
  89. data/app/models/shipit/deploy_spec/bundler_discovery.rb +1 -0
  90. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  91. data/app/models/shipit/deploy_spec/file_system.rb +10 -3
  92. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
  93. data/app/models/shipit/deploy_spec/lerna_discovery.rb +1 -0
  94. data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
  95. data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
  96. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  97. data/app/models/shipit/deploy_stats.rb +2 -1
  98. data/app/models/shipit/duration.rb +3 -2
  99. data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
  100. data/app/models/shipit/github_hook.rb +2 -1
  101. data/app/models/shipit/github_status.rb +2 -1
  102. data/app/models/shipit/hook.rb +6 -5
  103. data/app/models/shipit/membership.rb +3 -2
  104. data/app/models/shipit/output_chunk.rb +7 -2
  105. data/app/models/shipit/pull_request.rb +6 -5
  106. data/app/models/shipit/record.rb +18 -0
  107. data/app/models/shipit/release_status.rb +3 -2
  108. data/app/models/shipit/repository.rb +10 -5
  109. data/app/models/shipit/rollback.rb +1 -0
  110. data/app/models/shipit/stack.rb +50 -16
  111. data/app/models/shipit/status.rb +3 -2
  112. data/app/models/shipit/status/common.rb +7 -6
  113. data/app/models/shipit/status/group.rb +1 -0
  114. data/app/models/shipit/status/missing.rb +2 -1
  115. data/app/models/shipit/status/unknown.rb +2 -1
  116. data/app/models/shipit/task.rb +38 -5
  117. data/app/models/shipit/task_definition.rb +1 -0
  118. data/app/models/shipit/team.rb +2 -1
  119. data/app/models/shipit/undeployed_commit.rb +1 -0
  120. data/app/models/shipit/unlimited_api_client.rb +1 -0
  121. data/app/models/shipit/user.rb +10 -8
  122. data/app/models/shipit/variable_definition.rb +1 -0
  123. data/app/models/shipit/webhooks.rb +1 -0
  124. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
  125. data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
  126. data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
  127. data/app/models/shipit/webhooks/handlers/push_handler.rb +1 -0
  128. data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
  129. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  130. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  131. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  132. data/app/serializers/shipit/commit_serializer.rb +1 -0
  133. data/app/serializers/shipit/deploy_serializer.rb +2 -1
  134. data/app/serializers/shipit/hook_serializer.rb +1 -0
  135. data/app/serializers/shipit/pull_request_serializer.rb +1 -0
  136. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  137. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  138. data/app/serializers/shipit/stack_serializer.rb +1 -0
  139. data/app/serializers/shipit/tail_task_serializer.rb +1 -0
  140. data/app/serializers/shipit/task_serializer.rb +2 -17
  141. data/app/serializers/shipit/user_serializer.rb +6 -1
  142. data/app/validators/ascii_only_validator.rb +1 -0
  143. data/app/validators/subset_validator.rb +1 -0
  144. data/app/views/layouts/shipit.html.erb +1 -1
  145. data/app/views/shipit/_variables.html.erb +1 -1
  146. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  147. data/app/views/shipit/deploys/show.html.erb +2 -2
  148. data/app/views/shipit/stacks/_header.html.erb +3 -0
  149. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  150. data/app/views/shipit/stacks/index.html.erb +1 -1
  151. data/app/views/shipit/tasks/show.html.erb +1 -1
  152. data/config/initializers/inflections.rb +2 -1
  153. data/config/locales/en.yml +3 -3
  154. data/config/routes.rb +10 -2
  155. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  156. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  157. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  158. data/lib/shipit.rb +12 -2
  159. data/lib/shipit/cast_value.rb +1 -0
  160. data/lib/shipit/command.rb +13 -12
  161. data/lib/shipit/commands.rb +5 -4
  162. data/lib/shipit/csv_serializer.rb +1 -0
  163. data/lib/shipit/deploy_commands.rb +1 -0
  164. data/lib/shipit/engine.rb +7 -2
  165. data/lib/shipit/environment_variables.rb +2 -1
  166. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  167. data/lib/shipit/flock.rb +1 -0
  168. data/lib/shipit/github_app.rb +7 -6
  169. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  170. data/lib/shipit/null_serializer.rb +1 -0
  171. data/lib/shipit/octokit_check_runs.rb +3 -2
  172. data/lib/shipit/octokit_iterator.rb +3 -2
  173. data/lib/shipit/paginator.rb +3 -2
  174. data/lib/shipit/rollback_commands.rb +1 -0
  175. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  176. data/lib/shipit/simple_message_verifier.rb +1 -0
  177. data/lib/shipit/stack_commands.rb +3 -2
  178. data/lib/shipit/stat.rb +1 -0
  179. data/lib/shipit/task_commands.rb +2 -0
  180. data/lib/shipit/version.rb +2 -1
  181. data/lib/snippets/release-gem +5 -1
  182. data/lib/tasks/cron.rake +2 -0
  183. data/lib/tasks/dev.rake +3 -2
  184. data/lib/tasks/shipit.rake +15 -14
  185. data/lib/tasks/teams.rake +1 -0
  186. data/test/controllers/api/base_controller_test.rb +3 -2
  187. data/test/controllers/api/ccmenu_controller_test.rb +8 -7
  188. data/test/controllers/api/commits_controller_test.rb +3 -2
  189. data/test/controllers/api/deploys_controller_test.rb +15 -14
  190. data/test/controllers/api/hooks_controller_test.rb +8 -7
  191. data/test/controllers/api/locks_controller_test.rb +7 -6
  192. data/test/controllers/api/outputs_controller_test.rb +2 -1
  193. data/test/controllers/api/pull_requests_controller_test.rb +8 -7
  194. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  195. data/test/controllers/api/rollback_controller_test.rb +113 -0
  196. data/test/controllers/api/stacks_controller_test.rb +30 -9
  197. data/test/controllers/api/tasks_controller_test.rb +13 -12
  198. data/test/controllers/api_clients_controller_test.rb +5 -4
  199. data/test/controllers/ccmenu_controller_test.rb +4 -3
  200. data/test/controllers/commit_checks_controller_test.rb +4 -3
  201. data/test/controllers/commits_controller_test.rb +3 -2
  202. data/test/controllers/deploys_controller_test.rb +32 -21
  203. data/test/controllers/github_authentication_controller_test.rb +1 -0
  204. data/test/controllers/merge_status_controller_test.rb +7 -6
  205. data/test/controllers/pull_requests_controller_test.rb +4 -3
  206. data/test/controllers/release_statuses_controller_test.rb +3 -2
  207. data/test/controllers/rollbacks_controller_test.rb +9 -8
  208. data/test/controllers/stacks_controller_test.rb +33 -19
  209. data/test/controllers/status_controller_test.rb +1 -0
  210. data/test/controllers/tasks_controller_test.rb +19 -18
  211. data/test/controllers/webhooks_controller_test.rb +11 -10
  212. data/test/dummy/config/environments/development.rb +2 -0
  213. data/test/dummy/config/environments/test.rb +2 -0
  214. data/test/dummy/db/schema.rb +4 -1
  215. data/test/fixtures/shipit/commits.yml +15 -0
  216. data/test/fixtures/shipit/repositories.yml +4 -0
  217. data/test/fixtures/shipit/stacks.yml +90 -14
  218. data/test/fixtures/timeout +2 -1
  219. data/test/helpers/api_helper.rb +1 -0
  220. data/test/helpers/fixture_aliases_helper.rb +1 -0
  221. data/test/helpers/hooks_helper.rb +2 -1
  222. data/test/helpers/json_helper.rb +15 -11
  223. data/test/helpers/links_helper.rb +4 -3
  224. data/test/helpers/payloads_helper.rb +1 -0
  225. data/test/helpers/queries_helper.rb +3 -2
  226. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  227. data/test/jobs/chunk_rollup_job_test.rb +1 -0
  228. data/test/jobs/deliver_hook_job_test.rb +1 -0
  229. data/test/jobs/destroy_stack_job_test.rb +1 -0
  230. data/test/jobs/emit_event_job_test.rb +2 -1
  231. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  232. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  233. data/test/jobs/github_sync_job_test.rb +1 -0
  234. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  235. data/test/jobs/merge_pull_requests_job_test.rb +1 -0
  236. data/test/jobs/perform_task_job_test.rb +4 -3
  237. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  238. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  239. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  240. data/test/jobs/refresh_status_job_test.rb +1 -0
  241. data/test/jobs/unique_job_test.rb +1 -0
  242. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  243. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  244. data/test/models/api_client_test.rb +1 -0
  245. data/test/models/commit_checks_test.rb +1 -0
  246. data/test/models/commit_deployment_status_test.rb +1 -0
  247. data/test/models/commit_deployment_test.rb +2 -1
  248. data/test/models/commits_test.rb +72 -6
  249. data/test/models/delivery_test.rb +2 -1
  250. data/test/models/deploy_spec_test.rb +47 -42
  251. data/test/models/deploy_stats_test.rb +1 -0
  252. data/test/models/deploys_test.rb +31 -22
  253. data/test/models/duration_test.rb +1 -0
  254. data/test/models/github_hook_test.rb +1 -0
  255. data/test/models/hook_test.rb +18 -10
  256. data/test/models/membership_test.rb +1 -0
  257. data/test/models/output_chunk_test.rb +1 -0
  258. data/test/models/pull_request_test.rb +4 -3
  259. data/test/models/release_statuses_test.rb +1 -0
  260. data/test/models/rollbacks_test.rb +1 -0
  261. data/test/models/shipit/check_run_test.rb +1 -0
  262. data/test/models/shipit/repository_test.rb +1 -0
  263. data/test/models/shipit/wehbooks/handlers_test.rb +1 -0
  264. data/test/models/stacks_test.rb +30 -8
  265. data/test/models/status/group_test.rb +1 -0
  266. data/test/models/status/missing_test.rb +1 -0
  267. data/test/models/status_test.rb +1 -0
  268. data/test/models/task_definitions_test.rb +9 -8
  269. data/test/models/tasks_test.rb +18 -1
  270. data/test/models/team_test.rb +4 -2
  271. data/test/models/undeployed_commits_test.rb +1 -0
  272. data/test/models/users_test.rb +13 -5
  273. data/test/test_command_integration.rb +3 -2
  274. data/test/test_helper.rb +34 -31
  275. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  276. data/test/unit/command_test.rb +8 -7
  277. data/test/unit/commands_test.rb +1 -0
  278. data/test/unit/commit_serializer_test.rb +16 -0
  279. data/test/unit/csv_serializer_test.rb +3 -2
  280. data/test/unit/deploy_commands_test.rb +5 -4
  281. data/test/unit/deploy_serializer_test.rb +17 -0
  282. data/test/unit/environment_variables_test.rb +5 -4
  283. data/test/unit/github_app_test.rb +1 -0
  284. data/test/unit/github_url_helper_test.rb +1 -0
  285. data/test/unit/rollback_commands_test.rb +2 -1
  286. data/test/unit/shipit_helper_test.rb +17 -0
  287. data/test/unit/shipit_test.rb +1 -0
  288. data/test/unit/user_serializer_test.rb +14 -0
  289. data/test/unit/variable_definition_test.rb +1 -0
  290. metadata +155 -130
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -9,7 +10,7 @@ module Shipit
9
10
  end
10
11
 
11
12
  test "#perform checkout the repository to the last recorded commit and cache the deploy spec" do
12
- @stack.update!(cached_deploy_spec: DeploySpec.new('review' => {'checklist' => %w(foo bar)}))
13
+ @stack.update!(cached_deploy_spec: DeploySpec.new('review' => { 'checklist' => %w(foo bar) }))
13
14
 
14
15
  dir = Pathname(Dir.tmpdir)
15
16
  StackCommands.any_instance.expects(:with_temporary_working_directory).with(commit: @last_commit).yields(dir)
@@ -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
@@ -9,7 +10,7 @@ module Shipit
9
10
 
10
11
  test "#perform schedule deliveries" do
11
12
  assert_enqueued_jobs(2, only: DeliverHookJob) do
12
- @job.perform(event: :deploy, stack_id: @stack.id, payload: {foo: 42}.to_json)
13
+ @job.perform(event: :deploy, stack_id: @stack.id, payload: { foo: 42 }.to_json)
13
14
  end
14
15
  end
15
16
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -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
@@ -20,7 +21,7 @@ module Shipit
20
21
  test "#perform fetch commits from the API" do
21
22
  @job.stubs(:capture!)
22
23
  @job.stubs(:capture)
23
- @commands = stub(:commands)
24
+ @commands = stub
24
25
  Commands.expects(:for).with(@deploy).returns(@commands)
25
26
 
26
27
  @commands.expects(:fetched?).once.returns(FakeSuccessfulCommand.new)
@@ -132,7 +133,7 @@ module Shipit
132
133
 
133
134
  @job.perform(@deploy)
134
135
 
135
- assert_equal 'timedout', @deploy.reload.status
136
+ assert_equal('timedout', @deploy.reload.status)
136
137
  ensure
137
138
  Shipit.timeout_exit_codes = previous_exit_codes
138
139
  end
@@ -140,7 +141,7 @@ module Shipit
140
141
 
141
142
  test "records stack support for rollbacks and fetching deployed revision" do
142
143
  @job.stubs(:capture!)
143
- @commands = stub(:commands)
144
+ @commands = stub
144
145
  @commands.stubs(:fetched?).returns([])
145
146
  @commands.stubs(:fetch).returns([])
146
147
  @commands.stubs(:clone).returns([])
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class ReapDeadTasksJobTest < ActiveSupport::TestCase
6
+ setup do
7
+ Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
8
+
9
+ not_recently = Shipit::Task.recently_created_at - 1.minute
10
+ @deploy = shipit_deploys(:shipit)
11
+ @deploy.status = 'success'
12
+ @deploy.created_at = not_recently
13
+ @deploy.save!
14
+
15
+ @rollback = @deploy.build_rollback
16
+ @rollback.status = 'running'
17
+ @rollback.created_at = not_recently
18
+ @rollback.save!
19
+
20
+ @zombie_deploy = shipit_deploys(:shipit2)
21
+ @zombie_deploy.status = 'running'
22
+ @zombie_deploy.created_at = not_recently
23
+ @zombie_deploy.save!
24
+ end
25
+
26
+ test 'reaps only zombie tasks' do
27
+ refute_predicate @zombie_deploy, :error?
28
+
29
+ Shipit::Deploy.any_instance.expects(:alive?).returns(false)
30
+ Shipit::Rollback.any_instance.expects(:alive?).returns(true)
31
+ ReapDeadTasksJob.perform_now
32
+
33
+ @zombie_deploy.reload
34
+ assert_predicate @zombie_deploy, :error?
35
+
36
+ @deploy.reload
37
+ assert_predicate @deploy, :finished?
38
+
39
+ @rollback.reload
40
+ assert_predicate @rollback, :running?
41
+ end
42
+
43
+ test "does reap recently created tasks" do
44
+ Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
45
+ recently = Time.current
46
+ @deploy = shipit_deploys(:shipit)
47
+ @deploy.created_at = recently
48
+ @deploy.status = 'running'
49
+ @deploy.save!
50
+ Shipit::Deploy.any_instance.expects(:alive?).never
51
+
52
+ ReapDeadTasksJob.perform_now
53
+
54
+ @deploy.reload
55
+ assert_predicate @deploy, :running?
56
+ end
57
+
58
+ test 'reaps zombie aborting tasks' do
59
+ deploy = shipit_deploys(:shipit2)
60
+ deploy.status = 'aborting'
61
+ deploy.save!
62
+
63
+ ReapDeadTasksJob.perform_now
64
+
65
+ assert_predicate deploy.reload, :error?
66
+ end
67
+ end
68
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class SameSiteCookieMiddlewareTest < ActiveSupport::TestCase
6
+ def app
7
+ Rack::Lint.new(lambda { |_env|
8
+ response = Rack::Response.new("", 200, "Content-Type" => "text/yaml")
9
+
10
+ response.set_cookie("session_test", value: "session_test", domain: ".test.com", path: "/")
11
+ response.set_cookie("another_cookie", value: "123abc", domain: ".test.com", path: "/")
12
+ response.finish
13
+ })
14
+ end
15
+
16
+ def env_for_url(url)
17
+ env = Rack::MockRequest.env_for(url)
18
+ env
19
+ end
20
+
21
+ def middleware
22
+ Shipit::SameSiteCookieMiddleware.new(app)
23
+ end
24
+
25
+ test 'SameSite cookie attributes should be added on SSL' do
26
+ env = env_for_url("https://test.com/")
27
+
28
+ _status, headers, _body = middleware.call(env)
29
+
30
+ assert_includes headers['Set-Cookie'], 'SameSite'
31
+ end
32
+
33
+ test 'SameSite cookie attributes should be added when multiple cookies are present' do
34
+ env = env_for_url("https://test.com/")
35
+
36
+ _status, headers, _body = middleware.call(env)
37
+
38
+ session_cookie, other_cookie = headers['Set-Cookie'].split("\n")
39
+
40
+ assert_includes session_cookie, 'SameSite'
41
+ assert_includes other_cookie, 'SameSite'
42
+ end
43
+
44
+ test 'SameSite cookie attributes should not be added on non SSL requests' do
45
+ env = env_for_url("http://test.com/")
46
+
47
+ _status, headers, _body = middleware.call(env)
48
+
49
+ assert_not_includes headers['Set-Cookie'], 'SameSite'
50
+ end
51
+ end
52
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
  require 'tmpdir'
3
4
 
@@ -1,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
@@ -24,7 +25,7 @@ module Shipit
24
25
  from_sha: 'f890fd8b5f2be05d1fedb763a3605ee461c39074',
25
26
  to_sha: '467578b362bf2b4df5903e1c7960929361c3435a',
26
27
  },
27
- },
28
+ }.to_json,
28
29
  ).returns(deployment_response)
29
30
 
30
31
  @deployment.create_on_github!
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -12,7 +13,7 @@ module Shipit
12
13
  stub_request(:get, "https://api.github.com/user/emails").to_return(
13
14
  status: %w(200 OK),
14
15
  body: {}.to_json,
15
- headers: {"Content-Type" => "application/json"},
16
+ headers: { "Content-Type" => "application/json" },
16
17
  )
17
18
  end
18
19
 
@@ -68,6 +69,39 @@ module Shipit
68
69
  refute_predicate commit, :revert?
69
70
  end
70
71
 
72
+ test '.create_from_github truncates long messages' do
73
+ message = 'ABCDEFGHIJ' * 7000
74
+
75
+ assert_difference -> { Commit.count }, +1 do
76
+ @stack.commits.create_from_github!(
77
+ resource(
78
+ sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
79
+ author: {},
80
+ committer: {},
81
+ commit: {
82
+ author: {
83
+ name: 'Lando Walrussian',
84
+ email: 'walrus@shopify.com',
85
+ date: Time.now,
86
+ },
87
+ committer: {
88
+ name: 'Lando Walrussian',
89
+ email: 'walrus@shopify.com',
90
+ date: Time.now,
91
+ },
92
+ message: message,
93
+ },
94
+ ),
95
+ )
96
+ end
97
+
98
+ max_message_size = Shipit::Commit.columns_hash["message"].limit
99
+ commit = Commit.last
100
+
101
+ refute_predicate commit.message, :blank?
102
+ assert(commit.message.length <= Shipit::Commit.columns_hash["message"].limit) if max_message_size
103
+ end
104
+
71
105
  test '.create_from_github handle PRs merged by another Shipit stacks' do
72
106
  assert_difference -> { Commit.count }, +1 do
73
107
  @stack.commits.create_from_github!(
@@ -96,12 +130,44 @@ module Shipit
96
130
  assert_equal shipit_users(:walrus), commit.author
97
131
  end
98
132
 
133
+ test '.create_from_github stores pull_request_head_sha' do
134
+ assert_difference -> { Commit.count }, +1 do
135
+ @stack.commits.create_from_github!(
136
+ resource(
137
+ sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
138
+ author: {},
139
+ committer: {},
140
+ commit: {
141
+ author: {
142
+ name: 'Shipit',
143
+ email: '',
144
+ date: Time.now,
145
+ },
146
+ committer: {
147
+ name: 'Shipit',
148
+ email: '',
149
+ date: Time.now,
150
+ },
151
+ message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
152
+ },
153
+ parents: [
154
+ { sha: "1864542e3d2f8a41916a2dec0f2b4d3c1bf4899b", url: '', html_url: '' },
155
+ { sha: "63d7e03e517fd2ae1caeb1b7a9f21767f84d671a", url: '', html_url: '' },
156
+ ],
157
+ ),
158
+ )
159
+ end
160
+
161
+ commit = Commit.last
162
+ assert_equal '63d7e03e517fd2ae1caeb1b7a9f21767f84d671a', commit.pull_request_head_sha
163
+ end
164
+
99
165
  test "#message= truncates the message" do
100
166
  skip unless Shipit::Commit.columns_hash['message'].limit
101
167
  limit = Shipit::Commit.columns_hash['message'].limit
102
168
 
103
169
  @commit.update!(message: 'a' * limit * 2)
104
- assert_equal limit, @commit.message.size
170
+ assert_equal limit, @commit.message.bytesize
105
171
  end
106
172
 
107
173
  test "#pull_request? detect pull request based on message format" do
@@ -395,10 +461,10 @@ module Shipit
395
461
  commit = shipit_commits(:second)
396
462
  assert_predicate commit.status, :group?
397
463
  assert_equal 3, commit.status.size
398
- commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => {'hide' => [
464
+ commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => { 'hide' => [
399
465
  'Travis CI',
400
466
  'metrics/coveralls',
401
- ]}))
467
+ ] }))
402
468
  commit.reload
403
469
  refute_predicate commit.status, :group?
404
470
  end
@@ -528,7 +594,7 @@ module Shipit
528
594
  'error' => %w(success),
529
595
  }
530
596
  expected_webhook_transitions.each do |initial_state, firing_states|
531
- initial_status_attributes = {state: initial_state, description: 'abc', context: 'ci/travis'}
597
+ initial_status_attributes = { state: initial_state, description: 'abc', context: 'ci/travis' }
532
598
  (expected_webhook_transitions.keys - %w(unknown)).each do |new_state|
533
599
  should_fire = firing_states.include?(new_state)
534
600
  action = should_fire ? 'fires' : 'does not fire'
@@ -547,7 +613,7 @@ module Shipit
547
613
  end
548
614
  assert_equal initial_state, commit.state
549
615
 
550
- expected_status_attributes = {state: new_state, description: initial_state, context: 'ci/travis'}
616
+ expected_status_attributes = { state: new_state, description: initial_state, context: 'ci/travis' }
551
617
  add_status = lambda do
552
618
  attrs = expected_status_attributes.merge(created_at: 1.day.ago.to_s(:db))
553
619
  commit.create_status_from_github!(OpenStruct.new(attrs))
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -23,7 +24,7 @@ module Shipit
23
24
  end
24
25
 
25
26
  test "#send! post the payload and update the status to `sent`" do
26
- headers = {'content-type' => 'text/plain', 'content-length' => '2'}
27
+ headers = { 'content-type' => 'text/plain', 'content-length' => '2' }
27
28
  stub_request(:post, @delivery.url).to_return(headers: headers, body: 'OK')
28
29
 
29
30
  assert_equal 'scheduled', @delivery.status
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -22,7 +23,7 @@ module Shipit
22
23
  end
23
24
 
24
25
  test '#supports_rollback? returns true if steps are defined' do
25
- @spec.stubs(:load_config).returns('rollback' => {'override' => ['rm -rf /usr /lib/nvidia-current/xorg/xorg']})
26
+ @spec.stubs(:load_config).returns('rollback' => { 'override' => ['rm -rf /usr /lib/nvidia-current/xorg/xorg'] })
26
27
  assert @spec.supports_rollback?
27
28
  end
28
29
 
@@ -32,7 +33,7 @@ module Shipit
32
33
  end
33
34
 
34
35
  test '#dependencies_steps returns `dependencies.override` if present' do
35
- @spec.stubs(:load_config).returns('dependencies' => {'override' => %w(foo bar baz)})
36
+ @spec.stubs(:load_config).returns('dependencies' => { 'override' => %w(foo bar baz) })
36
37
  assert_equal %w(foo bar baz), @spec.dependencies_steps
37
38
  end
38
39
 
@@ -43,7 +44,7 @@ module Shipit
43
44
  end
44
45
 
45
46
  test "#dependencies_steps prepend and append pre and post steps" do
46
- @spec.stubs(:load_config).returns('dependencies' => {'pre' => ['before'], 'post' => ['after']})
47
+ @spec.stubs(:load_config).returns('dependencies' => { 'pre' => ['before'], 'post' => ['after'] })
47
48
  @spec.expects(:bundler?).returns(true).at_least_once
48
49
  @spec.expects(:bundle_install).returns(['bundle install'])
49
50
  assert_equal ['before', 'bundle install', 'after'], @spec.dependencies_steps
@@ -75,7 +76,7 @@ module Shipit
75
76
 
76
77
  test '#bundle_install use `dependencies.bundler.without` if present to build the --without argument' do
77
78
  @spec.stubs(:gemfile_lock_exists?).returns(true)
78
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'without' => %w(some custom groups)}})
79
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'without' => %w(some custom groups) } })
79
80
  command = %(
80
81
  bundle install
81
82
  --frozen
@@ -88,25 +89,25 @@ module Shipit
88
89
  end
89
90
 
90
91
  test '#bundle_install has --frozen option if Gemfile.lock is present' do
91
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'without' => %w(some custom groups)}})
92
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'without' => %w(some custom groups) } })
92
93
  @spec.stubs(:gemfile_lock_exists?).returns(true)
93
94
  assert @spec.bundle_install.last.include?('--frozen')
94
95
  end
95
96
 
96
97
  test '#bundle_install does not have --frozen option if Gemfile.lock is not present' do
97
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'without' => %w(some custom groups)}})
98
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'without' => %w(some custom groups) } })
98
99
  @spec.stubs(:gemfile_lock_exists?).returns(false)
99
100
  refute @spec.bundle_install.last.include?('--frozen')
100
101
  end
101
102
 
102
103
  test '#bundle_install does not have --frozen if overridden in shipit.yml' do
103
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'frozen' => false}})
104
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'frozen' => false } })
104
105
  @spec.stubs(:gemfile_lock_exists?).returns(true)
105
106
  refute @spec.bundle_install.last.include?('--frozen')
106
107
  end
107
108
 
108
109
  test '#deploy_steps returns `deploy.override` if present' do
109
- @spec.stubs(:load_config).returns('deploy' => {'override' => %w(foo bar baz)})
110
+ @spec.stubs(:load_config).returns('deploy' => { 'override' => %w(foo bar baz) })
110
111
  assert_equal %w(foo bar baz), @spec.deploy_steps
111
112
  end
112
113
 
@@ -161,7 +162,7 @@ module Shipit
161
162
  end
162
163
 
163
164
  test "#deploy_steps prepend and append pre and post steps" do
164
- @spec.stubs(:load_config).returns('deploy' => {'pre' => ['before'], 'post' => ['after']})
165
+ @spec.stubs(:load_config).returns('deploy' => { 'pre' => ['before'], 'post' => ['after'] })
165
166
  @spec.expects(:bundler?).returns(true).at_least_once
166
167
  @spec.expects(:capistrano?).returns(true)
167
168
  assert_equal ['before', 'bundle exec cap $ENVIRONMENT deploy', 'after'], @spec.deploy_steps
@@ -175,7 +176,7 @@ module Shipit
175
176
  end
176
177
 
177
178
  test '#rollback_steps returns `rollback.override` if present' do
178
- @spec.stubs(:load_config).returns('rollback' => {'override' => %w(foo bar baz)})
179
+ @spec.stubs(:load_config).returns('rollback' => { 'override' => %w(foo bar baz) })
179
180
  assert_equal %w(foo bar baz), @spec.rollback_steps
180
181
  end
181
182
 
@@ -186,7 +187,7 @@ module Shipit
186
187
  end
187
188
 
188
189
  test "#rollback_steps prepend and append pre and post steps" do
189
- @spec.stubs(:load_config).returns('rollback' => {'pre' => ['before'], 'post' => ['after']})
190
+ @spec.stubs(:load_config).returns('rollback' => { 'pre' => ['before'], 'post' => ['after'] })
190
191
  @spec.expects(:bundler?).returns(true).at_least_once
191
192
  @spec.expects(:capistrano?).returns(true)
192
193
  assert_equal ['before', 'bundle exec cap $ENVIRONMENT deploy:rollback', 'after'], @spec.rollback_steps
@@ -255,14 +256,14 @@ module Shipit
255
256
  end
256
257
 
257
258
  test '#machine_env returns an environment hash' do
258
- @spec.stubs(:load_config).returns('machine' => {'environment' => {'GLOBAL' => '1'}})
259
- assert_equal({'GLOBAL' => '1'}, @spec.machine_env)
259
+ @spec.stubs(:load_config).returns('machine' => { 'environment' => { 'GLOBAL' => '1' } })
260
+ assert_equal({ 'GLOBAL' => '1' }, @spec.machine_env)
260
261
  end
261
262
 
262
263
  test '#load_config can grab the env-specific shipit.yml file' do
263
264
  config = {}
264
265
  config.expects(:exist?).returns(true)
265
- config.expects(:read).returns({'dependencies' => {'override' => %w(foo bar baz)}}.to_yaml)
266
+ config.expects(:read).returns({ 'dependencies' => { 'override' => %w(foo bar baz) } }.to_yaml)
266
267
  spec = DeploySpec::FileSystem.new('.', 'staging')
267
268
  spec.expects(:file).with('shipit.staging.yml', root: true).returns(config)
268
269
  assert_equal %w(foo bar baz), spec.dependencies_steps
@@ -274,7 +275,7 @@ module Shipit
274
275
 
275
276
  config = {}
276
277
  config.expects(:exist?).returns(true)
277
- config.expects(:read).returns({'dependencies' => {'override' => %w(foo bar baz)}}.to_yaml)
278
+ config.expects(:read).returns({ 'dependencies' => { 'override' => %w(foo bar baz) } }.to_yaml)
278
279
 
279
280
  spec = DeploySpec::FileSystem.new('.', 'staging')
280
281
  spec.expects(:file).with('shipit.staging.yml', root: true).returns(not_config)
@@ -352,16 +353,16 @@ module Shipit
352
353
  'blocking' => [],
353
354
  },
354
355
  'machine' => {
355
- 'environment' => {'BUNDLE_PATH' => @spec.bundle_path.to_s},
356
+ 'environment' => { 'BUNDLE_PATH' => @spec.bundle_path.to_s },
356
357
  'directory' => nil,
357
358
  'cleanup' => true,
358
359
  },
359
- 'review' => {'checklist' => [], 'monitoring' => [], 'checks' => []},
360
+ 'review' => { 'checklist' => [], 'monitoring' => [], 'checks' => [] },
360
361
  'status' => {
361
362
  'context' => nil,
362
363
  'delay' => 0,
363
364
  },
364
- 'dependencies' => {'override' => []},
365
+ 'dependencies' => { 'override' => [] },
365
366
  'plugins' => {},
366
367
  'deploy' => {
367
368
  'override' => nil,
@@ -369,7 +370,7 @@ module Shipit
369
370
  'max_commits' => 8,
370
371
  'interval' => 0,
371
372
  },
372
- 'rollback' => {'override' => nil},
373
+ 'rollback' => { 'override' => nil },
373
374
  'fetch' => nil,
374
375
  'tasks' => {},
375
376
  }
@@ -381,11 +382,11 @@ module Shipit
381
382
  end
382
383
 
383
384
  test "#deploy_variables returns an array of VariableDefinition instances" do
384
- @spec.stubs(:load_config).returns('deploy' => {'variables' => [{
385
+ @spec.stubs(:load_config).returns('deploy' => { 'variables' => [{
385
386
  'name' => 'SAFETY_DISABLED',
386
387
  'title' => 'Set to 1 to do dangerous things',
387
388
  'default' => 0,
388
- }]})
389
+ }] })
389
390
 
390
391
  assert_equal 1, @spec.deploy_variables.size
391
392
  variable_definition = @spec.deploy_variables.first
@@ -393,13 +394,13 @@ module Shipit
393
394
  end
394
395
 
395
396
  test "task definitions don't prepend bundle exec by default" do
396
- @spec.expects(:load_config).returns('tasks' => {'restart' => {'steps' => %w(foo)}})
397
+ @spec.expects(:load_config).returns('tasks' => { 'restart' => { 'steps' => %w(foo) } })
397
398
  definition = @spec.find_task_definition('restart')
398
399
  assert_equal ['foo'], definition.steps
399
400
  end
400
401
 
401
402
  test "task definitions don't bundle exec before serialization" do
402
- @spec.expects(:discover_task_definitions).returns('restart' => {'steps' => %w(foo)})
403
+ @spec.expects(:discover_task_definitions).returns('restart' => { 'steps' => %w(foo) })
403
404
  @spec.expects(:bundler?).returns(true).at_least_once
404
405
 
405
406
  cached_spec = DeploySpec.load(DeploySpec.dump(@spec))
@@ -418,18 +419,18 @@ module Shipit
418
419
  module TestTaskDiscovery
419
420
  def discover_task_definitions
420
421
  {
421
- 'config_task' => {'steps' => %w(bar)},
422
+ 'config_task' => { 'steps' => %w(bar) },
422
423
  }.merge!(super)
423
424
  end
424
425
  end
425
426
 
426
427
  # Include the module in our new test class
427
- DuplicateCustomizedDeploySpec.include TestTaskDiscovery
428
+ DuplicateCustomizedDeploySpec.include(TestTaskDiscovery)
428
429
 
429
430
  # Setup the spec as we would normally, but use the customized version
430
431
  @spec = DuplicateCustomizedDeploySpec.new(@app_dir, 'env')
431
432
  @spec.stubs(:load_config).returns(
432
- 'tasks' => {'config_task' => {'steps' => %w(foo)}},
433
+ 'tasks' => { 'config_task' => { 'steps' => %w(foo) } },
433
434
  )
434
435
  tasks = @spec.task_definitions
435
436
 
@@ -448,18 +449,18 @@ module Shipit
448
449
  module TestTaskDiscovery
449
450
  def discover_task_definitions
450
451
  {
451
- 'module_task' => {'steps' => %w(bar)},
452
+ 'module_task' => { 'steps' => %w(bar) },
452
453
  }.merge(super)
453
454
  end
454
455
  end
455
456
 
456
457
  # Include the module in our new test class
457
- CustomizedDeploySpec.include TestTaskDiscovery
458
+ CustomizedDeploySpec.include(TestTaskDiscovery)
458
459
 
459
460
  # Setup the spec as we would normally, but use the customized version
460
461
  @spec = CustomizedDeploySpec.new(@app_dir, 'env')
461
462
  @spec.stubs(:load_config).returns(
462
- 'tasks' => {'config_task' => {'steps' => %w(foo)}},
463
+ 'tasks' => { 'config_task' => { 'steps' => %w(foo) } },
463
464
  'kubernetes' => {
464
465
  'namespace' => 'foo',
465
466
  'context' => 'bar',
@@ -484,7 +485,7 @@ module Shipit
484
485
 
485
486
  test "task definitions returns an array of VariableDefinition instances" do
486
487
  @spec.expects(:load_config).returns('tasks' =>
487
- {'restart' =>
488
+ { 'restart' =>
488
489
  {
489
490
  'variables' => [
490
491
  {
@@ -499,8 +500,7 @@ module Shipit
499
500
  },
500
501
  ],
501
502
  'steps' => %w(foo),
502
- },
503
- })
503
+ } })
504
504
 
505
505
  assert_equal 2, @spec.task_definitions.first.variables.size
506
506
  variable_definition = @spec.task_definitions.first.variables.first
@@ -512,7 +512,7 @@ module Shipit
512
512
  end
513
513
 
514
514
  test "#review_checklist returns an array" do
515
- @spec.expects(:load_config).returns('review' => {'checklist' => %w(foo bar)})
515
+ @spec.expects(:load_config).returns('review' => { 'checklist' => %w(foo bar) })
516
516
  assert_equal %w(foo bar), @spec.review_checklist
517
517
  end
518
518
 
@@ -521,13 +521,13 @@ module Shipit
521
521
  end
522
522
 
523
523
  test "#review_monitoring returns an array of hashes" do
524
- @spec.expects(:load_config).returns('review' => {'monitoring' => [
525
- {'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400},
526
- {'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400},
527
- ]})
524
+ @spec.expects(:load_config).returns('review' => { 'monitoring' => [
525
+ { 'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400 },
526
+ { 'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400 },
527
+ ] })
528
528
  assert_equal [
529
- {'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400},
530
- {'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400},
529
+ { 'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400 },
530
+ { 'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400 },
531
531
  ], @spec.review_monitoring
532
532
  end
533
533
 
@@ -540,12 +540,12 @@ module Shipit
540
540
  end
541
541
 
542
542
  test "#hidden_statuses is an array even if the value is a string" do
543
- @spec.expects(:load_config).returns('ci' => {'hide' => 'ci/circleci'})
543
+ @spec.expects(:load_config).returns('ci' => { 'hide' => 'ci/circleci' })
544
544
  assert_equal %w(ci/circleci), @spec.hidden_statuses
545
545
  end
546
546
 
547
547
  test "#hidden_statuses is an array even if the value is present" do
548
- @spec.expects(:load_config).returns('ci' => {'hide' => %w(ci/circleci ci/jenkins)})
548
+ @spec.expects(:load_config).returns('ci' => { 'hide' => %w(ci/circleci ci/jenkins) })
549
549
  assert_equal %w(ci/circleci ci/jenkins), @spec.hidden_statuses
550
550
  end
551
551
 
@@ -677,7 +677,7 @@ module Shipit
677
677
 
678
678
  test "#file is impacted by `machine.directory`" do
679
679
  subdir = '/foo/bar'
680
- @spec.stubs(:load_config).returns('machine' => {'directory' => subdir})
680
+ @spec.stubs(:load_config).returns('machine' => { 'directory' => subdir })
681
681
  assert_instance_of Pathname, @spec.file('baz')
682
682
  assert_equal File.join(@app_dir, subdir, 'baz'), @spec.file('baz').to_s
683
683
  end
@@ -1084,5 +1084,10 @@ module Shipit
1084
1084
  )
1085
1085
  assert_nil @spec.max_divergence_age
1086
1086
  end
1087
+
1088
+ test "serialised deploy specs are normalised" do
1089
+ stack = shipit_stacks(:shipit)
1090
+ assert_equal stack.cached_deploy_spec_before_type_cast, DeploySpec.dump(stack.cached_deploy_spec)
1091
+ end
1087
1092
  end
1088
1093
  end