shipit-engine 0.32.0 → 0.35.1
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.
- checksums.yaml +4 -4
- data/README.md +13 -2
- data/app/assets/images/magic-solid.svg +1 -0
- data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
- data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
- data/app/assets/stylesheets/_pages/_deploy.scss +2 -3
- data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
- data/app/assets/stylesheets/_pages/_stacks.scss +19 -0
- data/app/assets/stylesheets/shipit.scss +1 -0
- data/app/controllers/shipit/api/ccmenu_controller.rb +1 -1
- data/app/controllers/shipit/api/deploys_controller.rb +2 -0
- data/app/controllers/shipit/api/{pull_requests_controller.rb → merge_requests_controller.rb} +8 -8
- data/app/controllers/shipit/api/rollbacks_controller.rb +2 -1
- data/app/controllers/shipit/api/stacks_controller.rb +15 -1
- data/app/controllers/shipit/deploys_controller.rb +1 -1
- data/app/controllers/shipit/merge_requests_controller.rb +31 -0
- data/app/controllers/shipit/merge_status_controller.rb +15 -15
- data/app/controllers/shipit/repositories_controller.rb +74 -0
- data/app/controllers/shipit/stacks_controller.rb +2 -2
- data/app/controllers/shipit/tasks_controller.rb +2 -2
- data/app/controllers/shipit/webhooks_controller.rb +23 -4
- data/app/helpers/shipit/chunks_helper.rb +2 -2
- data/app/helpers/shipit/github_url_helper.rb +8 -0
- data/app/helpers/shipit/shipit_helper.rb +0 -1
- data/app/helpers/shipit/stacks_helper.rb +4 -0
- data/app/jobs/shipit/create_on_github_job.rb +1 -0
- data/app/jobs/shipit/deliver_hook_job.rb +1 -1
- data/app/jobs/shipit/destroy_repository_job.rb +24 -0
- data/app/jobs/shipit/destroy_stack_job.rb +2 -2
- data/app/jobs/shipit/github_sync_job.rb +13 -9
- data/app/jobs/shipit/perform_task_job.rb +4 -98
- data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
- data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
- data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +1 -1
- data/app/models/shipit/anonymous_user.rb +10 -2
- data/app/models/shipit/check_run.rb +38 -2
- data/app/models/shipit/command_line_user.rb +4 -0
- data/app/models/shipit/commit.rb +31 -20
- data/app/models/shipit/commit_checks.rb +14 -13
- data/app/models/shipit/commit_deployment.rb +3 -3
- data/app/models/shipit/commit_deployment_status.rb +3 -3
- data/app/models/shipit/deploy.rb +17 -11
- data/app/models/shipit/deploy_spec/file_system.rb +11 -5
- data/app/models/shipit/deploy_spec/lerna_discovery.rb +12 -4
- data/app/models/shipit/deploy_spec.rb +16 -4
- data/app/models/shipit/duration.rb +2 -0
- data/app/models/shipit/hook.rb +28 -2
- data/app/models/shipit/merge_request.rb +304 -0
- data/app/models/shipit/provisioning_handler/base.rb +30 -0
- data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
- data/app/models/shipit/provisioning_handler.rb +32 -0
- data/app/models/shipit/pull_request.rb +26 -265
- data/app/models/shipit/pull_request_assignment.rb +10 -0
- data/app/models/shipit/release_status.rb +1 -1
- data/app/models/shipit/repository.rb +63 -3
- data/app/models/shipit/review_stack.rb +130 -0
- data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
- data/app/models/shipit/rollback.rb +5 -0
- data/app/models/shipit/stack.rb +78 -30
- data/app/models/shipit/status/group.rb +1 -1
- data/app/models/shipit/task.rb +62 -9
- data/app/models/shipit/task_execution_strategy/base.rb +20 -0
- data/app/models/shipit/task_execution_strategy/default.rb +109 -0
- data/app/models/shipit/team.rb +4 -2
- data/app/models/shipit/user.rb +10 -1
- data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
- data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
- data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
- data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
- data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
- data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
- data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
- data/app/models/shipit/webhooks/handlers/push_handler.rb +4 -1
- data/app/models/shipit/webhooks.rb +10 -0
- data/app/serializers/shipit/deploy_serializer.rb +6 -0
- data/app/serializers/shipit/merge_request_serializer.rb +21 -0
- data/app/serializers/shipit/pull_request_serializer.rb +5 -8
- data/app/serializers/shipit/review_stack_serializer.rb +7 -0
- data/app/serializers/shipit/stack_serializer.rb +7 -6
- data/app/serializers/shipit/tail_task_serializer.rb +10 -2
- data/app/serializers/shipit/task_serializer.rb +1 -1
- data/app/validators/subset_validator.rb +1 -1
- data/app/views/layouts/merge_status.html.erb +1 -1
- data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
- data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
- data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
- data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
- data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
- data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
- data/app/views/shipit/merge_status/failure.html.erb +1 -1
- data/app/views/shipit/merge_status/locked.html.erb +1 -1
- data/app/views/shipit/merge_status/success.html.erb +2 -2
- data/app/views/shipit/repositories/_header.html.erb +19 -0
- data/app/views/shipit/repositories/index.html.erb +31 -0
- data/app/views/shipit/repositories/new.html.erb +23 -0
- data/app/views/shipit/repositories/settings.html.erb +53 -0
- data/app/views/shipit/repositories/show.html.erb +30 -0
- data/app/views/shipit/stacks/_banners.html.erb +15 -1
- data/app/views/shipit/stacks/_header.html.erb +5 -2
- data/app/views/shipit/stacks/_stack.html.erb +8 -0
- data/app/views/shipit/stacks/index.html.erb +2 -1
- data/app/views/shipit/stacks/new.html.erb +1 -1
- data/app/views/shipit/stacks/settings.html.erb +5 -5
- data/app/views/shipit/stacks/show.html.erb +1 -1
- data/app/views/shipit/tasks/_task_output.html.erb +1 -1
- data/config/routes.rb +15 -5
- data/config/secrets.development.example.yml +24 -0
- data/config/secrets.development.shopify.yml +20 -9
- data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
- data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
- data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
- data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
- data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
- data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
- data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
- data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
- data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
- data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
- data/db/migrate/20210823075617_change_check_runs_github_updated_at_default.rb +5 -0
- data/lib/shipit/command.rb +7 -6
- data/lib/shipit/commands.rb +18 -5
- data/lib/shipit/engine.rb +2 -0
- data/lib/shipit/flock.rb +8 -1
- data/lib/shipit/github_app.rb +8 -6
- data/lib/shipit/octokit_iterator.rb +3 -3
- data/lib/shipit/review_stack_commands.rb +8 -0
- data/lib/shipit/simple_message_verifier.rb +2 -2
- data/lib/shipit/stack_commands.rb +36 -7
- data/lib/shipit/task_commands.rb +8 -1
- data/lib/shipit/version.rb +1 -1
- data/lib/shipit.rb +50 -16
- data/lib/snippets/publish-lerna-independent-packages +35 -34
- data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
- data/lib/tasks/cron.rake +11 -2
- data/test/controllers/api/ccmenu_controller_test.rb +1 -1
- data/test/controllers/api/deploys_controller_test.rb +17 -0
- data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +12 -12
- data/test/controllers/api/outputs_controller_test.rb +1 -0
- data/test/controllers/api/rollback_controller_test.rb +1 -1
- data/test/controllers/api/stacks_controller_test.rb +42 -8
- data/test/controllers/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +6 -6
- data/test/controllers/repositories_controller_test.rb +71 -0
- data/test/controllers/stacks_controller_test.rb +9 -1
- data/test/controllers/tasks_controller_test.rb +14 -2
- data/test/controllers/webhooks_controller_test.rb +27 -12
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/config/application.rb +7 -2
- data/test/dummy/config/database.yml +9 -0
- data/test/dummy/config/environments/development.rb +1 -4
- data/test/dummy/config/environments/test.rb +0 -5
- data/test/dummy/config/secrets_double_github_app.yml +79 -0
- data/test/dummy/db/schema.rb +56 -17
- data/test/dummy/db/seeds.rb +2 -1
- data/test/fixtures/payloads/check_suite_master.json +4 -32
- data/test/fixtures/payloads/invalid_pull_request.json +117 -0
- data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
- data/test/fixtures/payloads/pull_request_assigned.json +480 -0
- data/test/fixtures/payloads/pull_request_closed.json +454 -0
- data/test/fixtures/payloads/pull_request_labeled.json +461 -0
- data/test/fixtures/payloads/pull_request_opened.json +454 -0
- data/test/fixtures/payloads/pull_request_reopened.json +454 -0
- data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
- data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
- data/test/fixtures/payloads/push_master.json +1 -1
- data/test/fixtures/payloads/push_not_master.json +1 -1
- data/test/fixtures/shipit/commits.yml +17 -4
- data/test/fixtures/shipit/hooks.yml +1 -0
- data/test/fixtures/shipit/merge_requests.yml +141 -0
- data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
- data/test/fixtures/shipit/pull_requests.yml +10 -131
- data/test/fixtures/shipit/repositories.yml +1 -0
- data/test/fixtures/shipit/stacks.yml +145 -0
- data/test/fixtures/shipit/statuses.yml +9 -0
- data/test/fixtures/shipit/tasks.yml +4 -1
- data/test/fixtures/shipit/users.yml +7 -0
- data/test/helpers/json_helper.rb +5 -1
- data/test/helpers/payloads_helper.rb +4 -0
- data/test/jobs/chunk_rollup_job_test.rb +15 -1
- data/test/jobs/destroy_repository_job_test.rb +27 -0
- data/test/jobs/github_sync_job_test.rb +2 -1
- data/test/jobs/perform_task_job_test.rb +8 -8
- data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +18 -18
- data/test/lib/shipit/deploy_commands_test.rb +16 -0
- data/test/lib/shipit/task_commands_test.rb +17 -0
- data/test/models/commit_deployment_status_test.rb +3 -3
- data/test/models/commits_test.rb +24 -13
- data/test/models/deploy_spec_test.rb +64 -24
- data/test/models/deploys_test.rb +188 -14
- data/test/models/hook_test.rb +30 -1
- data/test/models/{pull_request_test.rb → merge_request_test.rb} +49 -34
- data/test/models/pull_request_assignment_test.rb +16 -0
- data/test/models/shipit/check_run_test.rb +124 -5
- data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
- data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
- data/test/models/shipit/provisioning_handler_test.rb +64 -0
- data/test/models/shipit/pull_request_test.rb +52 -0
- data/test/models/shipit/repository_test.rb +5 -1
- data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
- data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
- data/test/models/shipit/review_stack_test.rb +91 -0
- data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +52 -8
- data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
- data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
- data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
- data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
- data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
- data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
- data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
- data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +107 -0
- data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
- data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +0 -0
- data/test/models/tasks_test.rb +66 -3
- data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/anonymous_user_serializer_test.rb +1 -1
- data/test/unit/command_test.rb +8 -3
- data/test/unit/commit_serializer_test.rb +1 -1
- data/test/unit/deploy_commands_test.rb +73 -17
- data/test/unit/deploy_serializer_test.rb +1 -1
- data/test/unit/github_app_test.rb +2 -3
- data/test/unit/github_apps_test.rb +416 -0
- data/test/unit/github_url_helper_test.rb +5 -0
- data/test/unit/shipit_deployment_checks_test.rb +77 -0
- data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
- data/test/unit/shipit_test.rb +14 -0
- data/test/unit/user_serializer_test.rb +1 -1
- metadata +306 -188
- data/app/controllers/shipit/pull_requests_controller.rb +0 -31
- data/app/jobs/shipit/merge_pull_requests_job.rb +0 -32
- data/app/jobs/shipit/refresh_pull_request_job.rb +0 -11
- data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
- data/test/fixtures/shipit/output_chunks.yml +0 -47
- data/test/models/output_chunk_test.rb +0 -21
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
module Webhooks
|
|
7
|
+
module Handlers
|
|
8
|
+
module PullRequest
|
|
9
|
+
class ReopenedHandlerTest < ActiveSupport::TestCase
|
|
10
|
+
test "validates payload" do
|
|
11
|
+
assert_raise(StandardError) { Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload_parsed(:invalid_pull_request)) }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test "ignores irrelevant PR actions" do
|
|
15
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
16
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload_parsed(:pull_request_opened).merge(action: "assigned")).process
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "does not error for repos that are not tracked" do
|
|
21
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
22
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload_parsed(:pull_request_with_no_repo)).process
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test "de-archives stacks that were previously archived" do
|
|
27
|
+
create_archived_stack
|
|
28
|
+
|
|
29
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
30
|
+
assert_difference -> { Shipit::Stack.not_archived.count } do
|
|
31
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload_parsed(:pull_request_reopened)).process
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
test "ignored duplicate deliveries" do
|
|
37
|
+
stack = create_archived_stack
|
|
38
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload_parsed(:pull_request_reopened)).process
|
|
39
|
+
complete_active_tasks(stack)
|
|
40
|
+
|
|
41
|
+
assert_no_difference -> { Shipit::Stack.not_archived.count } do
|
|
42
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload_parsed(:pull_request_reopened)).process
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
test "unarchives stacks for repos that allow_all" do
|
|
47
|
+
stack = create_archived_stack
|
|
48
|
+
repository = shipit_repositories(:shipit)
|
|
49
|
+
configure_provisioning_behavior(
|
|
50
|
+
repository: repository,
|
|
51
|
+
behavior: :allow_all
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload_parsed(:pull_request_reopened)).process
|
|
55
|
+
|
|
56
|
+
assert_not stack.reload.archived?, "Expected stack to NOT be archived"
|
|
57
|
+
assert_pending_provision(stack)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
test "provisions missing stacks for repos that allow_all" do
|
|
61
|
+
repository = shipit_repositories(:shipit)
|
|
62
|
+
configure_provisioning_behavior(
|
|
63
|
+
repository: repository,
|
|
64
|
+
behavior: :allow_all
|
|
65
|
+
)
|
|
66
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
67
|
+
|
|
68
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
69
|
+
|
|
70
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
71
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
72
|
+
assert_equal stack.continuous_deployment, false
|
|
73
|
+
assert_equal stack.ignore_ci, false
|
|
74
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
75
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
76
|
+
assert_pending_provision(stack)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
test "auto-created stack should have pull request assigned" do
|
|
80
|
+
repository = shipit_repositories(:shipit)
|
|
81
|
+
configure_provisioning_behavior(
|
|
82
|
+
repository: repository,
|
|
83
|
+
behavior: :allow_all
|
|
84
|
+
)
|
|
85
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
86
|
+
|
|
87
|
+
assert_difference -> { Shipit::PullRequest.count } do
|
|
88
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
test "unarchives stacks for repos that allow_with_label when label is present" do
|
|
93
|
+
stack = create_archived_stack
|
|
94
|
+
repository = shipit_repositories(:shipit)
|
|
95
|
+
configure_provisioning_behavior(
|
|
96
|
+
repository: repository,
|
|
97
|
+
behavior: :allow_with_label,
|
|
98
|
+
label: "pull-requests-label"
|
|
99
|
+
)
|
|
100
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
101
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
102
|
+
|
|
103
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
104
|
+
|
|
105
|
+
assert_not stack.reload.archived?, "Expected stack to be NOT be archived"
|
|
106
|
+
assert_pending_provision(stack)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
test "provisions missing stacks for repos that allow_with_label when label is present" do
|
|
110
|
+
repository = shipit_repositories(:shipit)
|
|
111
|
+
configure_provisioning_behavior(
|
|
112
|
+
repository: repository,
|
|
113
|
+
behavior: :allow_with_label,
|
|
114
|
+
label: "pull-requests-label"
|
|
115
|
+
)
|
|
116
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
117
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
118
|
+
|
|
119
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
120
|
+
|
|
121
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
122
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
123
|
+
assert_equal stack.continuous_deployment, false
|
|
124
|
+
assert_equal stack.ignore_ci, false
|
|
125
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
126
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
127
|
+
assert_pending_provision(stack)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
test "does not unarchive stacks for repos that allow_with_label when label is absent" do
|
|
131
|
+
stack = create_archived_stack
|
|
132
|
+
repository = shipit_repositories(:shipit)
|
|
133
|
+
configure_provisioning_behavior(
|
|
134
|
+
repository: repository,
|
|
135
|
+
behavior: :allow_with_label,
|
|
136
|
+
label: "pull-requests-label"
|
|
137
|
+
)
|
|
138
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
139
|
+
payload["pull_request"]["labels"] = []
|
|
140
|
+
|
|
141
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
142
|
+
|
|
143
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
test "unarchives stacks for repos that prevent_with_label when label is absent" do
|
|
147
|
+
stack = create_archived_stack
|
|
148
|
+
repository = shipit_repositories(:shipit)
|
|
149
|
+
configure_provisioning_behavior(
|
|
150
|
+
repository: repository,
|
|
151
|
+
behavior: :prevent_with_label,
|
|
152
|
+
label: "pull-requests-label"
|
|
153
|
+
)
|
|
154
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
155
|
+
payload["pull_request"]["labels"] = []
|
|
156
|
+
|
|
157
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
158
|
+
|
|
159
|
+
assert_not stack.reload.archived?, "Expected stack to be NOT be archived"
|
|
160
|
+
assert_pending_provision(stack)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
test "provisions missing stacks for repos that prevent_with_label when label is absent" do
|
|
164
|
+
repository = shipit_repositories(:shipit)
|
|
165
|
+
configure_provisioning_behavior(
|
|
166
|
+
repository: repository,
|
|
167
|
+
behavior: :prevent_with_label,
|
|
168
|
+
label: "pull-requests-label"
|
|
169
|
+
)
|
|
170
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
171
|
+
payload["pull_request"]["labels"] = []
|
|
172
|
+
|
|
173
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
174
|
+
|
|
175
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
176
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
177
|
+
assert_equal stack.continuous_deployment, false
|
|
178
|
+
assert_equal stack.ignore_ci, false
|
|
179
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
180
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
181
|
+
assert_pending_provision(stack)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
test "does not unarchive stacks for repos that prevent_with_label when label is present" do
|
|
185
|
+
stack = create_archived_stack
|
|
186
|
+
repository = shipit_repositories(:shipit)
|
|
187
|
+
configure_provisioning_behavior(
|
|
188
|
+
repository: repository,
|
|
189
|
+
behavior: :prevent_with_label,
|
|
190
|
+
label: "pull-requests-label"
|
|
191
|
+
)
|
|
192
|
+
payload = payload_parsed(:pull_request_reopened)
|
|
193
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
194
|
+
|
|
195
|
+
Shipit::Webhooks::Handlers::PullRequest::ReopenedHandler.new(payload).process
|
|
196
|
+
|
|
197
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def configure_provisioning_behavior(repository:, provisioning_enabled: true, behavior: :allow_all, label: nil)
|
|
201
|
+
repository.review_stacks_enabled = provisioning_enabled
|
|
202
|
+
repository.provisioning_behavior = behavior
|
|
203
|
+
repository.provisioning_label_name = label
|
|
204
|
+
repository.save!
|
|
205
|
+
|
|
206
|
+
repository
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def create_archived_stack
|
|
210
|
+
stack = create_stack
|
|
211
|
+
stack.archive!(shipit_users(:codertocat))
|
|
212
|
+
|
|
213
|
+
stack
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def create_stack
|
|
217
|
+
repository = shipit_repositories(:shipit)
|
|
218
|
+
repository.provisioning_behavior = :allow_all
|
|
219
|
+
repository.save!
|
|
220
|
+
|
|
221
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
222
|
+
payload["action"] = "opened"
|
|
223
|
+
|
|
224
|
+
OpenedHandler.new(payload).process
|
|
225
|
+
|
|
226
|
+
stack = repository.stacks.last
|
|
227
|
+
complete_active_tasks(stack)
|
|
228
|
+
|
|
229
|
+
stack
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def complete_active_tasks(stack)
|
|
233
|
+
active_tasks = stack
|
|
234
|
+
.tasks
|
|
235
|
+
.active
|
|
236
|
+
|
|
237
|
+
active_tasks.map(&:run)
|
|
238
|
+
active_tasks.reload
|
|
239
|
+
active_tasks.map(&:complete)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def assert_pending_provision(stack)
|
|
243
|
+
stack.reload
|
|
244
|
+
|
|
245
|
+
assert(stack.awaiting_provision?, "Stack #{stack.environment} should be in the provisioning queue")
|
|
246
|
+
assert(stack.deprovisioned?, "Stack #{stack.environment} should be pending provision")
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
setup do
|
|
250
|
+
Shipit.github.api.stubs(:commit)
|
|
251
|
+
.with("shopify/shipit-engine", "ec26c3e57ca3a959ca5aad62de7213c562f8c821")
|
|
252
|
+
.returns(
|
|
253
|
+
resource(
|
|
254
|
+
{
|
|
255
|
+
sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
|
|
256
|
+
commit: {
|
|
257
|
+
author: {
|
|
258
|
+
name: "Codertocat",
|
|
259
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
260
|
+
date: "2019-05-15 15:20:30",
|
|
261
|
+
},
|
|
262
|
+
committer: {
|
|
263
|
+
name: "Codertocat",
|
|
264
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
265
|
+
date: "2019-05-15 15:20:30",
|
|
266
|
+
},
|
|
267
|
+
message: "Update README.md",
|
|
268
|
+
},
|
|
269
|
+
stats: {
|
|
270
|
+
total: 2,
|
|
271
|
+
additions: 1,
|
|
272
|
+
deletions: 1,
|
|
273
|
+
},
|
|
274
|
+
}
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
module Webhooks
|
|
7
|
+
module Handlers
|
|
8
|
+
module PullRequest
|
|
9
|
+
class ReviewStackAdapterTest < ActiveSupport::TestCase
|
|
10
|
+
test "unarchive! on an unarchived stack is a no-op" do
|
|
11
|
+
stack = create_stack
|
|
12
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
13
|
+
params_for(stack),
|
|
14
|
+
scope: stack.repository.stacks
|
|
15
|
+
)
|
|
16
|
+
Shipit::ReviewStack.any_instance.expects(:unarchive!).never
|
|
17
|
+
Shipit::ReviewStackProvisioningQueue.expects(:add).never
|
|
18
|
+
|
|
19
|
+
review_stack.unarchive!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test "unarchive! syncs with GitHub" do
|
|
23
|
+
stack = create_archived_stack
|
|
24
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
25
|
+
params_for(stack),
|
|
26
|
+
scope: stack.repository.stacks
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
assert_enqueued_with(job: GithubSyncJob, args: [stack_id: stack.id]) do
|
|
30
|
+
review_stack.unarchive!
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
test "unarchive! schedules provisioning" do
|
|
35
|
+
stack = create_archived_stack
|
|
36
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
37
|
+
params_for(stack),
|
|
38
|
+
scope: stack.repository.stacks
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
assert_changes -> { stack.reload.awaiting_provision }, from: false, to: true do
|
|
42
|
+
review_stack.unarchive!
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
test "archive! on an archived stack is a no-op" do
|
|
47
|
+
stack = create_archived_stack
|
|
48
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
49
|
+
params_for(stack),
|
|
50
|
+
scope: stack.repository.stacks
|
|
51
|
+
)
|
|
52
|
+
Shipit::Stack.any_instance.expects(:archive!).never
|
|
53
|
+
|
|
54
|
+
review_stack.archive!
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
test "archive! removes stacks awaiting provisioning from the provisioning queue" do
|
|
58
|
+
stack = create_stack
|
|
59
|
+
stack.enqueue_for_provisioning
|
|
60
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
61
|
+
params_for(stack),
|
|
62
|
+
scope: stack.repository.stacks
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
assert_changes -> { stack.reload.awaiting_provision }, from: true, to: false do
|
|
66
|
+
review_stack.archive!
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def params_for(stack)
|
|
71
|
+
OpenStruct.new(
|
|
72
|
+
number: pr_number,
|
|
73
|
+
repository: {
|
|
74
|
+
"full_name" => stack.github_repo_name,
|
|
75
|
+
},
|
|
76
|
+
sender: { login: shipit_users(:walrus).login }
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def create_stack
|
|
81
|
+
stack = shipit_stacks(:review_stack)
|
|
82
|
+
stack.environment = environment
|
|
83
|
+
|
|
84
|
+
stack.save!
|
|
85
|
+
|
|
86
|
+
stack
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def create_archived_stack
|
|
90
|
+
stack = create_stack
|
|
91
|
+
stack.archive!(shipit_users(:walrus))
|
|
92
|
+
|
|
93
|
+
stack
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def pr_number
|
|
97
|
+
1
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def environment
|
|
101
|
+
"pr#{pr_number}"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
module Webhooks
|
|
7
|
+
module Handlers
|
|
8
|
+
module PullRequest
|
|
9
|
+
class UnlabeledHandlerTest < ActiveSupport::TestCase
|
|
10
|
+
test "validates payload" do
|
|
11
|
+
assert_raise(StandardError) { UnlabeledHandler.new(payload_parsed(:invalid_pull_request)) }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test "ignores Github webhooks when the event is NOT 'unlabeled'" do
|
|
15
|
+
assert_no_difference -> { Shipit::Stack.not_archived.count } do
|
|
16
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_opened).merge(action: "assigned")).process
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "ignores Github PullRequest webhooks by default" do
|
|
21
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_with_no_repo).merge(action: "closed")).process
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test "ignores Github PullRequest webhooks when the Repository has disabled the Review Stacks feature" do
|
|
25
|
+
repository = shipit_repositories(:shipit)
|
|
26
|
+
configure_provisioning_behavior(
|
|
27
|
+
repository: repository,
|
|
28
|
+
provisioning_enabled: false,
|
|
29
|
+
behavior: :allow_with_label,
|
|
30
|
+
label: "pull-requests-label"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
34
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test "ignores Github PullRequest webhooks when the repository allows_all PullRequests to create ReviewStacks" do
|
|
39
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
40
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test "archives existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
|
|
45
|
+
stack = create_stack
|
|
46
|
+
repository = shipit_repositories(:shipit)
|
|
47
|
+
configure_provisioning_behavior(
|
|
48
|
+
repository: repository,
|
|
49
|
+
behavior: :allow_with_label,
|
|
50
|
+
label: "pull-requests-label"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
54
|
+
|
|
55
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
test "deprovisions existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
|
|
59
|
+
stack = create_stack
|
|
60
|
+
repository = shipit_repositories(:shipit)
|
|
61
|
+
configure_provisioning_behavior(
|
|
62
|
+
repository: repository,
|
|
63
|
+
behavior: :allow_with_label,
|
|
64
|
+
label: "pull-requests-label"
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
68
|
+
|
|
69
|
+
assert_equal stack.reload.provision_status, "deprovisioning"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
test "ignores Github PullRequest webhooks when the repository allow_with_label to create ReviewStacks and the label is absent" do
|
|
73
|
+
repository = shipit_repositories(:shipit)
|
|
74
|
+
configure_provisioning_behavior(
|
|
75
|
+
repository: repository,
|
|
76
|
+
behavior: :allow_with_label,
|
|
77
|
+
label: "pull-requests-label"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
81
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
test "unarchives existing review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
|
|
86
|
+
stack = create_archived_stack
|
|
87
|
+
repository = shipit_repositories(:shipit)
|
|
88
|
+
configure_provisioning_behavior(
|
|
89
|
+
repository: repository,
|
|
90
|
+
behavior: :allow_with_label,
|
|
91
|
+
label: "pull-requests-label"
|
|
92
|
+
)
|
|
93
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
94
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
95
|
+
|
|
96
|
+
UnlabeledHandler.new(payload).process
|
|
97
|
+
|
|
98
|
+
assert_not stack.reload.archived?, "Expected stack to NOT be archived"
|
|
99
|
+
assert_pending_provision(stack)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
test "creates and provisions a new review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
|
|
103
|
+
repository = shipit_repositories(:shipit)
|
|
104
|
+
configure_provisioning_behavior(
|
|
105
|
+
repository: repository,
|
|
106
|
+
behavior: :allow_with_label,
|
|
107
|
+
label: "pull-requests-label"
|
|
108
|
+
)
|
|
109
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
110
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
111
|
+
|
|
112
|
+
UnlabeledHandler.new(payload).process
|
|
113
|
+
|
|
114
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
115
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
116
|
+
assert_equal stack.continuous_deployment, false
|
|
117
|
+
assert_equal stack.ignore_ci, false
|
|
118
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
119
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
120
|
+
assert_pending_provision(stack)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
test "archives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
|
|
124
|
+
stack = create_stack
|
|
125
|
+
repository = shipit_repositories(:shipit)
|
|
126
|
+
configure_provisioning_behavior(
|
|
127
|
+
repository: repository,
|
|
128
|
+
behavior: :prevent_with_label,
|
|
129
|
+
label: "pull-requests-label"
|
|
130
|
+
)
|
|
131
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
132
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
133
|
+
|
|
134
|
+
UnlabeledHandler.new(payload).process
|
|
135
|
+
|
|
136
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
test "deprovisions an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
|
|
140
|
+
stack = create_stack
|
|
141
|
+
repository = shipit_repositories(:shipit)
|
|
142
|
+
configure_provisioning_behavior(
|
|
143
|
+
repository: repository,
|
|
144
|
+
behavior: :prevent_with_label,
|
|
145
|
+
label: "pull-requests-label"
|
|
146
|
+
)
|
|
147
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
148
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
149
|
+
|
|
150
|
+
UnlabeledHandler.new(payload).process
|
|
151
|
+
|
|
152
|
+
assert_equal stack.reload.provision_status, "deprovisioning"
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
test "ignores Github PullRequest webhooks when the repository prevent_with_label to create ReviewStacks and the label is present" do
|
|
156
|
+
repository = shipit_repositories(:shipit)
|
|
157
|
+
configure_provisioning_behavior(
|
|
158
|
+
repository: repository,
|
|
159
|
+
behavior: :prevent_with_label,
|
|
160
|
+
label: "pull-requests-label"
|
|
161
|
+
)
|
|
162
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
163
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
164
|
+
|
|
165
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
166
|
+
UnlabeledHandler.new(payload).process
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
test "unarchives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
|
|
171
|
+
stack = create_archived_stack
|
|
172
|
+
repository = shipit_repositories(:shipit)
|
|
173
|
+
configure_provisioning_behavior(
|
|
174
|
+
repository: repository,
|
|
175
|
+
behavior: :prevent_with_label,
|
|
176
|
+
label: "pull-requests-label"
|
|
177
|
+
)
|
|
178
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
179
|
+
payload["pull_request"]["labels"] = []
|
|
180
|
+
|
|
181
|
+
UnlabeledHandler.new(payload).process
|
|
182
|
+
|
|
183
|
+
assert_not stack.reload.archived?, "Expected stack to NOT be archived"
|
|
184
|
+
assert_pending_provision(stack)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
test "creates and provisions a new review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
|
|
188
|
+
repository = shipit_repositories(:shipit)
|
|
189
|
+
configure_provisioning_behavior(
|
|
190
|
+
repository: repository,
|
|
191
|
+
behavior: :prevent_with_label,
|
|
192
|
+
label: "pull-requests-label"
|
|
193
|
+
)
|
|
194
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
195
|
+
payload["pull_request"]["labels"] = []
|
|
196
|
+
|
|
197
|
+
UnlabeledHandler.new(payload).process
|
|
198
|
+
|
|
199
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
200
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
201
|
+
assert_equal stack.continuous_deployment, false
|
|
202
|
+
assert_equal stack.ignore_ci, false
|
|
203
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
204
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
205
|
+
assert_pending_provision(stack)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
test "assigns the PullRequest to newly created stacks" do
|
|
209
|
+
repository = shipit_repositories(:shipit)
|
|
210
|
+
configure_provisioning_behavior(
|
|
211
|
+
repository: repository,
|
|
212
|
+
behavior: :prevent_with_label,
|
|
213
|
+
label: "pull-requests-label"
|
|
214
|
+
)
|
|
215
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
216
|
+
payload["pull_request"]["labels"] = []
|
|
217
|
+
|
|
218
|
+
assert_difference -> { Shipit::PullRequest.count } do
|
|
219
|
+
UnlabeledHandler.new(payload).process
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
test "ignores Github Webhooks for closed PullRequests" do
|
|
224
|
+
create_archived_stack
|
|
225
|
+
repository = shipit_repositories(:shipit)
|
|
226
|
+
configure_provisioning_behavior(
|
|
227
|
+
repository: repository,
|
|
228
|
+
behavior: :allow_with_label,
|
|
229
|
+
label: "pull-requests-label"
|
|
230
|
+
)
|
|
231
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
232
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
233
|
+
payload["pull_request"]["state"] = "closed"
|
|
234
|
+
|
|
235
|
+
Shipit::ReviewStackProvisioningQueue.expects(:add).never
|
|
236
|
+
|
|
237
|
+
UnlabeledHandler.new(payload).process
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def configure_provisioning_behavior(repository:, provisioning_enabled: true, behavior: :allow_all, label: nil)
|
|
241
|
+
repository.review_stacks_enabled = provisioning_enabled
|
|
242
|
+
repository.provisioning_behavior = behavior
|
|
243
|
+
repository.provisioning_label_name = label
|
|
244
|
+
repository.save!
|
|
245
|
+
|
|
246
|
+
repository
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def create_archived_stack
|
|
250
|
+
stack = create_stack
|
|
251
|
+
stack.update(provision_status: :deprovisioned)
|
|
252
|
+
stack.archive!(shipit_users(:codertocat))
|
|
253
|
+
|
|
254
|
+
stack
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def create_stack
|
|
258
|
+
repository = shipit_repositories(:shipit)
|
|
259
|
+
repository.provisioning_behavior = :allow_all
|
|
260
|
+
repository.save!
|
|
261
|
+
|
|
262
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
263
|
+
payload["action"] = "opened"
|
|
264
|
+
|
|
265
|
+
OpenedHandler.new(payload).process
|
|
266
|
+
|
|
267
|
+
stack = repository.stacks.last
|
|
268
|
+
stack.update(provision_status: :provisioned)
|
|
269
|
+
complete_active_tasks(stack)
|
|
270
|
+
|
|
271
|
+
stack
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def complete_active_tasks(stack)
|
|
275
|
+
active_tasks = stack
|
|
276
|
+
.tasks
|
|
277
|
+
.active
|
|
278
|
+
|
|
279
|
+
active_tasks.map(&:run)
|
|
280
|
+
active_tasks.reload
|
|
281
|
+
active_tasks.map(&:complete)
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def assert_pending_provision(stack)
|
|
285
|
+
stack.reload
|
|
286
|
+
|
|
287
|
+
assert(stack.awaiting_provision?, "Stack #{stack.environment} should be in the provisioning queue")
|
|
288
|
+
assert(stack.deprovisioned?, "Stack #{stack.environment} should be pending provision")
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
setup do
|
|
292
|
+
Shipit.github.api.stubs(:commit)
|
|
293
|
+
.with("shopify/shipit-engine", "ec26c3e57ca3a959ca5aad62de7213c562f8c821")
|
|
294
|
+
.returns(
|
|
295
|
+
resource(
|
|
296
|
+
{
|
|
297
|
+
sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
|
|
298
|
+
commit: {
|
|
299
|
+
author: {
|
|
300
|
+
name: "Codertocat",
|
|
301
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
302
|
+
date: "2019-05-15 15:20:30",
|
|
303
|
+
},
|
|
304
|
+
committer: {
|
|
305
|
+
name: "Codertocat",
|
|
306
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
307
|
+
date: "2019-05-15 15:20:30",
|
|
308
|
+
},
|
|
309
|
+
message: "Update README.md",
|
|
310
|
+
},
|
|
311
|
+
stats: {
|
|
312
|
+
total: 2,
|
|
313
|
+
additions: 1,
|
|
314
|
+
deletions: 1,
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
)
|
|
318
|
+
)
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
end
|