shipit-engine 0.29.0 → 0.30.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.
- checksums.yaml +4 -4
- data/README.md +37 -2
- data/app/assets/images/archive-solid.svg +1 -0
- data/app/assets/stylesheets/_pages/_stacks.scss +76 -0
- data/app/controllers/shipit/api/stacks_controller.rb +20 -1
- data/app/controllers/shipit/api_clients_controller.rb +49 -0
- data/app/controllers/shipit/merge_status_controller.rb +8 -4
- data/app/controllers/shipit/stacks_controller.rb +58 -9
- data/app/controllers/shipit/webhooks_controller.rb +2 -130
- data/app/helpers/shipit/stacks_helper.rb +4 -0
- data/app/jobs/shipit/background_job/unique.rb +3 -1
- data/app/jobs/shipit/continuous_delivery_job.rb +1 -0
- data/app/jobs/shipit/destroy_stack_job.rb +2 -2
- data/app/models/shipit/commit.rb +21 -9
- data/app/models/shipit/commit_deployment.rb +15 -11
- data/app/models/shipit/commit_deployment_status.rb +6 -2
- data/app/models/shipit/deploy.rb +48 -7
- data/app/models/shipit/deploy_stats.rb +57 -0
- data/app/models/shipit/repository.rb +38 -0
- data/app/models/shipit/stack.rb +41 -34
- data/app/models/shipit/task.rb +26 -4
- data/app/models/shipit/webhooks.rb +32 -0
- data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +19 -0
- data/app/models/shipit/webhooks/handlers/handler.rb +40 -0
- data/app/models/shipit/webhooks/handlers/membership_handler.rb +45 -0
- data/app/models/shipit/webhooks/handlers/push_handler.rb +20 -0
- data/app/models/shipit/webhooks/handlers/status_handler.rb +26 -0
- data/app/serializers/shipit/stack_serializer.rb +6 -1
- data/app/validators/ascii_only_validator.rb +3 -3
- data/app/views/layouts/_head.html.erb +0 -0
- data/app/views/layouts/shipit.html.erb +4 -2
- data/app/views/shipit/api_clients/index.html.erb +36 -0
- data/app/views/shipit/api_clients/new.html.erb +33 -0
- data/app/views/shipit/api_clients/show.html.erb +35 -0
- data/app/views/shipit/merge_status/logged_out.erb +1 -1
- data/app/views/shipit/stacks/_header.html.erb +12 -7
- data/app/views/shipit/stacks/_links.html.erb +1 -0
- data/app/views/shipit/stacks/index.html.erb +7 -2
- data/app/views/shipit/stacks/settings.html.erb +19 -0
- data/app/views/shipit/stacks/statistics.html.erb +82 -0
- data/config/locales/en.yml +14 -2
- data/config/routes.rb +4 -0
- data/db/migrate/20191209231045_create_shipit_repositories.rb +12 -0
- data/db/migrate/20191209231307_add_repository_reference_to_stacks.rb +15 -0
- data/db/migrate/20191216162728_backfill_repository_data.rb +22 -0
- data/db/migrate/20191216163010_remove_repository_information_from_stacks.rb +20 -0
- data/db/migrate/20191219205202_add_archived_since_to_stacks.rb +6 -0
- data/db/migrate/20200102175621_optional_task_commits.rb +6 -0
- data/db/migrate/20200109132519_add_sha_to_commit_deployments.rb +5 -0
- data/lib/shipit/github_app.rb +32 -3
- data/lib/shipit/task_commands.rb +10 -2
- data/lib/shipit/version.rb +1 -1
- data/test/controllers/api/ccmenu_controller_test.rb +1 -1
- data/test/controllers/api/stacks_controller_test.rb +14 -6
- data/test/controllers/api_clients_controller_test.rb +103 -0
- data/test/controllers/merge_status_controller_test.rb +21 -4
- data/test/controllers/stacks_controller_test.rb +35 -0
- data/test/controllers/webhooks_controller_test.rb +26 -0
- data/test/dummy/config/environments/development.rb +22 -4
- data/test/dummy/db/schema.rb +17 -6
- data/test/dummy/db/seeds.rb +20 -6
- data/test/fixtures/shipit/commit_deployment_statuses.yml +4 -4
- data/test/fixtures/shipit/commit_deployments.yml +8 -8
- data/test/fixtures/shipit/commits.yml +23 -0
- data/test/fixtures/shipit/repositories.yml +23 -0
- data/test/fixtures/shipit/stacks.yml +100 -16
- data/test/fixtures/shipit/tasks.yml +66 -3
- data/test/jobs/destroy_stack_job_test.rb +9 -0
- data/test/models/commit_deployment_status_test.rb +33 -4
- data/test/models/commit_deployment_test.rb +8 -11
- data/test/models/commits_test.rb +22 -2
- data/test/models/deploy_stats_test.rb +112 -0
- data/test/models/deploys_test.rb +55 -17
- data/test/models/pull_request_test.rb +1 -1
- data/test/models/shipit/repository_test.rb +76 -0
- data/test/models/shipit/wehbooks/handlers_test.rb +26 -0
- data/test/models/stacks_test.rb +44 -51
- data/test/models/undeployed_commits_test.rb +13 -0
- data/test/test_helper.rb +3 -1
- data/test/unit/deploy_commands_test.rb +9 -0
- data/test/unit/github_app_test.rb +136 -0
- metadata +161 -128
data/test/models/commits_test.rb
CHANGED
@@ -96,6 +96,14 @@ module Shipit
|
|
96
96
|
assert_equal shipit_users(:walrus), commit.author
|
97
97
|
end
|
98
98
|
|
99
|
+
test "#message= truncates the message" do
|
100
|
+
skip unless Shipit::Commit.columns_hash['message'].limit
|
101
|
+
limit = Shipit::Commit.columns_hash['message'].limit
|
102
|
+
|
103
|
+
@commit.update!(message: 'a' * limit * 2)
|
104
|
+
assert_equal limit, @commit.message.size
|
105
|
+
end
|
106
|
+
|
99
107
|
test "#pull_request? detect pull request based on message format" do
|
100
108
|
assert @pr.pull_request?
|
101
109
|
refute @commit.pull_request?
|
@@ -190,12 +198,14 @@ module Shipit
|
|
190
198
|
committed_at: Time.now,
|
191
199
|
)
|
192
200
|
|
193
|
-
@stack.deploys.
|
201
|
+
deploy = @stack.deploys.build(
|
194
202
|
user_id: walrus.id,
|
195
203
|
since_commit: @stack.commits.first,
|
196
204
|
until_commit: new_commit,
|
197
205
|
status: 'success',
|
198
206
|
)
|
207
|
+
deploy.stubs(:pull_request_head_for_commit).returns(nil)
|
208
|
+
deploy.save!
|
199
209
|
|
200
210
|
assert_no_difference "Deploy.count" do
|
201
211
|
@commit.statuses.create!(stack_id: @stack.id, state: 'success')
|
@@ -248,7 +258,7 @@ module Shipit
|
|
248
258
|
target_url: 'http://example.com',
|
249
259
|
created_at: 1.day.ago,
|
250
260
|
)
|
251
|
-
Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha).returns([status])
|
261
|
+
Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha, per_page: 100).returns([status])
|
252
262
|
assert_difference '@commit.statuses.count', 1 do
|
253
263
|
@commit.refresh_statuses!
|
254
264
|
end
|
@@ -773,6 +783,16 @@ module Shipit
|
|
773
783
|
assert_equal commit.deploy_requested_at, commit.created_at
|
774
784
|
end
|
775
785
|
|
786
|
+
test "#recently_pushed?" do
|
787
|
+
freeze_time do
|
788
|
+
commit = Commit.new(message: "abcd", created_at: Time.now.utc)
|
789
|
+
assert_predicate commit, :recently_pushed?
|
790
|
+
|
791
|
+
commit = Commit.new(message: "abcd", created_at: 10.minutes.ago)
|
792
|
+
refute_predicate commit, :recently_pushed?
|
793
|
+
end
|
794
|
+
end
|
795
|
+
|
776
796
|
private
|
777
797
|
|
778
798
|
def expect_event(stack)
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Shipit
|
4
|
+
class DeployStatsTest < ActiveSupport::TestCase
|
5
|
+
def setup
|
6
|
+
@stack = shipit_stacks(:shipit_stats)
|
7
|
+
@stats = Shipit::DeployStats.new(@stack.deploys.not_active)
|
8
|
+
@old_deploys = @stack.deploys.not_active.where(created_at: 62.minutes.ago..32.minutes.ago)
|
9
|
+
@new_deploys = @stack.deploys.not_active.where("created_at > ?", 32.minutes.ago)
|
10
|
+
end
|
11
|
+
|
12
|
+
test "#average_duration is accurate" do
|
13
|
+
assert_equal 225.0, @stats.average_duration
|
14
|
+
end
|
15
|
+
|
16
|
+
test "#median_duration is accurate" do
|
17
|
+
assert_equal 210.0, @stats.median_duration
|
18
|
+
end
|
19
|
+
|
20
|
+
test "#max_duration is accurate" do
|
21
|
+
assert_equal 360.0, @stats.max_duration
|
22
|
+
end
|
23
|
+
|
24
|
+
test "#min_duration is accurate" do
|
25
|
+
assert_equal 120.0, @stats.min_duration
|
26
|
+
end
|
27
|
+
|
28
|
+
test "#success_rate is accurate" do
|
29
|
+
assert_equal 75.0, @stats.success_rate
|
30
|
+
end
|
31
|
+
|
32
|
+
test "#average_duration handles empty deploy data" do
|
33
|
+
stats = Shipit::DeployStats.new([])
|
34
|
+
assert_nil stats.average_duration
|
35
|
+
end
|
36
|
+
|
37
|
+
test "#median_duration handles empty deploy data" do
|
38
|
+
stats = Shipit::DeployStats.new([])
|
39
|
+
assert_nil stats.median_duration
|
40
|
+
end
|
41
|
+
|
42
|
+
test "#max_duration handles empty deploy data" do
|
43
|
+
stats = Shipit::DeployStats.new([])
|
44
|
+
assert_nil stats.max_duration
|
45
|
+
end
|
46
|
+
|
47
|
+
test "#min_duration handles empty deploy data" do
|
48
|
+
stats = Shipit::DeployStats.new([])
|
49
|
+
assert_nil stats.min_duration
|
50
|
+
end
|
51
|
+
|
52
|
+
test "#success_rate handles empty deploy data" do
|
53
|
+
stats = Shipit::DeployStats.new([])
|
54
|
+
assert_nil stats.success_rate
|
55
|
+
end
|
56
|
+
|
57
|
+
test "#compare count handles empty compare count" do
|
58
|
+
comparison = Shipit::DeployStats.new([])
|
59
|
+
results = @stats.compare(comparison)
|
60
|
+
assert_equal 400, results[:count]
|
61
|
+
end
|
62
|
+
|
63
|
+
test "#compare average and median handles empty array" do
|
64
|
+
comparison = Shipit::DeployStats.new([])
|
65
|
+
results = @stats.compare(comparison)
|
66
|
+
assert_nil results[:average_duration]
|
67
|
+
assert_nil results[:median_duration]
|
68
|
+
end
|
69
|
+
|
70
|
+
test "#compare average is accurate when negative" do
|
71
|
+
new_data = Shipit::DeployStats.new(@new_deploys)
|
72
|
+
old_data = Shipit::DeployStats.new(@old_deploys)
|
73
|
+
results = new_data.compare(old_data)
|
74
|
+
assert_equal(-53.84615384615385, results[:average_duration])
|
75
|
+
end
|
76
|
+
|
77
|
+
test "#compare median is accurate when negative" do
|
78
|
+
new_data = Shipit::DeployStats.new(@new_deploys)
|
79
|
+
old_data = Shipit::DeployStats.new(@old_deploys)
|
80
|
+
results = new_data.compare(old_data)
|
81
|
+
assert_equal(-50, results[:median_duration])
|
82
|
+
end
|
83
|
+
|
84
|
+
test "#compare count is accurate when negative" do
|
85
|
+
new_data = Shipit::DeployStats.new(@new_deploys)
|
86
|
+
old_data = Shipit::DeployStats.new(@old_deploys)
|
87
|
+
results = new_data.compare(old_data)
|
88
|
+
assert_equal(-66.66666666666666, results[:count])
|
89
|
+
end
|
90
|
+
|
91
|
+
test "#compare average is accurate" do
|
92
|
+
old_data = Shipit::DeployStats.new(@new_deploys)
|
93
|
+
new_data = Shipit::DeployStats.new(@old_deploys)
|
94
|
+
results = new_data.compare(old_data)
|
95
|
+
assert_equal(116.66666666666667, results[:average_duration])
|
96
|
+
end
|
97
|
+
|
98
|
+
test "#compare median is accurate" do
|
99
|
+
old_data = Shipit::DeployStats.new(@new_deploys)
|
100
|
+
new_data = Shipit::DeployStats.new(@old_deploys)
|
101
|
+
results = new_data.compare(old_data)
|
102
|
+
assert_equal(100, results[:median_duration])
|
103
|
+
end
|
104
|
+
|
105
|
+
test "#compare count is accurate" do
|
106
|
+
old_data = Shipit::DeployStats.new(@new_deploys)
|
107
|
+
new_data = Shipit::DeployStats.new(@old_deploys)
|
108
|
+
results = new_data.compare(old_data)
|
109
|
+
assert_equal(200, results[:count])
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/test/models/deploys_test.rb
CHANGED
@@ -199,6 +199,7 @@ module Shipit
|
|
199
199
|
since_commit: shipit.commits.first,
|
200
200
|
until_commit: shipit.commits.last,
|
201
201
|
)
|
202
|
+
deploy.stubs(:pull_request_head_for_commit).returns(nil)
|
202
203
|
|
203
204
|
expect_event(deploy)
|
204
205
|
deploy.save!
|
@@ -300,18 +301,6 @@ module Shipit
|
|
300
301
|
end
|
301
302
|
end
|
302
303
|
|
303
|
-
test "creating a deploy creates one CommitDeployment per commit" do
|
304
|
-
shipit = shipit_stacks(:shipit)
|
305
|
-
deploy = shipit.deploys.build(
|
306
|
-
since_commit: shipit.commits.first,
|
307
|
-
until_commit: shipit.commits.last,
|
308
|
-
)
|
309
|
-
|
310
|
-
assert_difference -> { CommitDeployment.count }, deploy.commits.size do
|
311
|
-
deploy.save!
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
304
|
test "#build_rollback returns an unsaved record" do
|
316
305
|
assert @deploy.build_rollback.new_record?
|
317
306
|
end
|
@@ -338,10 +327,9 @@ module Shipit
|
|
338
327
|
assert_equal shipit_commits(:second), @stack.last_deployed_commit
|
339
328
|
end
|
340
329
|
|
341
|
-
def create_test_stack
|
330
|
+
def create_test_stack(repository: Shipit::Repository.find_or_create_by!(owner: "shopify-test", name: "shipit-engine-test"))
|
342
331
|
Shipit::Stack.create(
|
343
|
-
|
344
|
-
repo_name: "shipit-engine-test",
|
332
|
+
repository: repository,
|
345
333
|
environment: 'production',
|
346
334
|
branch: "master",
|
347
335
|
merge_queue_enabled: true,
|
@@ -552,8 +540,7 @@ module Shipit
|
|
552
540
|
user_id = @user.id
|
553
541
|
test_stack = create_test_stack
|
554
542
|
test_stack.save
|
555
|
-
other_stack = create_test_stack
|
556
|
-
other_stack.repo_name += "_other"
|
543
|
+
other_stack = create_test_stack(repository: Shipit::Repository.create!(owner: "_", name: "_some-other-repository"))
|
557
544
|
other_stack.save
|
558
545
|
other_stack.reload
|
559
546
|
stack_id = test_stack.id
|
@@ -860,6 +847,57 @@ module Shipit
|
|
860
847
|
end
|
861
848
|
end
|
862
849
|
|
850
|
+
test "succeeding a deploy creates CommitDeploymentStatuses" do
|
851
|
+
@deploy = shipit_deploys(:shipit_running)
|
852
|
+
refute_empty @deploy.commit_deployments
|
853
|
+
|
854
|
+
assert_difference -> { CommitDeploymentStatus.count }, @deploy.commit_deployments.size do
|
855
|
+
@deploy.report_complete!
|
856
|
+
end
|
857
|
+
|
858
|
+
assert_equal 'success', CommitDeploymentStatus.last.status
|
859
|
+
end
|
860
|
+
|
861
|
+
test "creates one CommitDeployment and status per commit, and one more for the batch head" do
|
862
|
+
template_task = shipit_tasks(:shipit_pending)
|
863
|
+
deploy = template_task.stack.deploys.build(
|
864
|
+
since_commit: template_task.since_commit,
|
865
|
+
until_commit: template_task.until_commit,
|
866
|
+
)
|
867
|
+
|
868
|
+
pull_request_response = stub(head: stub(sha: '6dcb09b5b57875f334f61aebed695e2e4193db5e'))
|
869
|
+
Shipit.github.api.expects(:pull_request).with('shopify/shipit-engine', 7).returns(pull_request_response)
|
870
|
+
|
871
|
+
expected_delta = deploy.commits.select(&:pull_request?).size + 1
|
872
|
+
assert_difference -> { CommitDeployment.count }, expected_delta do
|
873
|
+
assert_difference -> { CommitDeploymentStatus.count }, expected_delta do
|
874
|
+
deploy.save!
|
875
|
+
end
|
876
|
+
end
|
877
|
+
|
878
|
+
refute_nil CommitDeployment.find_by(sha: '6dcb09b5b57875f334f61aebed695e2e4193db5e')
|
879
|
+
refute_nil CommitDeployment.find_by(sha: deploy.until_commit.sha)
|
880
|
+
end
|
881
|
+
|
882
|
+
test "#create_commit_deployments handles API errors when loading pull request details" do
|
883
|
+
template_task = shipit_tasks(:shipit_pending)
|
884
|
+
deploy = template_task.stack.deploys.build(
|
885
|
+
since_commit: template_task.since_commit,
|
886
|
+
until_commit: template_task.until_commit,
|
887
|
+
)
|
888
|
+
|
889
|
+
Shipit.github.api.expects(:pull_request).with('shopify/shipit-engine', 7).raises(Octokit::NotFound)
|
890
|
+
|
891
|
+
expected_delta = 1 # Only the batch head
|
892
|
+
assert_difference -> { CommitDeployment.count }, expected_delta do
|
893
|
+
assert_difference -> { CommitDeploymentStatus.count }, expected_delta do
|
894
|
+
deploy.save!
|
895
|
+
end
|
896
|
+
end
|
897
|
+
|
898
|
+
refute_nil CommitDeployment.find_by(sha: deploy.until_commit.sha)
|
899
|
+
end
|
900
|
+
|
863
901
|
private
|
864
902
|
|
865
903
|
def expect_event(deploy)
|
@@ -116,7 +116,7 @@ module Shipit
|
|
116
116
|
)
|
117
117
|
end
|
118
118
|
|
119
|
-
Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, head_sha).returns([stub(
|
119
|
+
Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, head_sha, per_page: 100).returns([stub(
|
120
120
|
state: 'success',
|
121
121
|
description: nil,
|
122
122
|
context: 'default',
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Shipit
|
4
|
+
class RepositoryTest < ActiveSupport::TestCase
|
5
|
+
setup do
|
6
|
+
@repository = shipit_repositories(:shipit)
|
7
|
+
end
|
8
|
+
|
9
|
+
test "owner, and name uniqueness is enforced" do
|
10
|
+
clone = Repository.new(@repository.attributes.except('id'))
|
11
|
+
refute clone.save
|
12
|
+
assert_equal ["cannot be used more than once"], clone.errors[:name]
|
13
|
+
end
|
14
|
+
|
15
|
+
test "owner, name, and environment can only be ASCII" do
|
16
|
+
@repository.update(owner: 'héllò', name: 'wørld')
|
17
|
+
refute_predicate @repository, :valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
test "owner and name are case insensitive" do
|
21
|
+
assert_no_difference -> { Repository.count } do
|
22
|
+
error = assert_raises ActiveRecord::RecordInvalid do
|
23
|
+
Repository.create!(
|
24
|
+
owner: @repository.owner.upcase,
|
25
|
+
name: @repository.name.upcase,
|
26
|
+
)
|
27
|
+
end
|
28
|
+
assert_equal 'Validation failed: Name cannot be used more than once', error.message
|
29
|
+
end
|
30
|
+
|
31
|
+
new_repository = Repository.create!(owner: 'FOO', name: 'BAR')
|
32
|
+
assert_equal new_repository, Repository.find_by(owner: 'foo', name: 'bar')
|
33
|
+
end
|
34
|
+
|
35
|
+
test "owner is automatically downcased" do
|
36
|
+
@repository.owner = 'George'
|
37
|
+
assert_equal 'george', @repository.owner
|
38
|
+
end
|
39
|
+
|
40
|
+
test "name is automatically downcased" do
|
41
|
+
@repository.name = 'Cyclim.se'
|
42
|
+
assert_equal 'cyclim.se', @repository.name
|
43
|
+
end
|
44
|
+
|
45
|
+
test "owner cannot contain a `/`" do
|
46
|
+
assert @repository.valid?
|
47
|
+
@repository.owner = 'foo/bar'
|
48
|
+
refute @repository.valid?
|
49
|
+
end
|
50
|
+
|
51
|
+
test "name cannot contain a `/`" do
|
52
|
+
assert @repository.valid?
|
53
|
+
@repository.name = 'foo/bar'
|
54
|
+
refute @repository.valid?
|
55
|
+
end
|
56
|
+
|
57
|
+
test "http_url" do
|
58
|
+
assert_equal "https://github.com/#{@repository.owner}/#{@repository.name}", @repository.http_url
|
59
|
+
end
|
60
|
+
|
61
|
+
test "git_url" do
|
62
|
+
assert_equal "https://github.com/#{@repository.owner}/#{@repository.name}.git", @repository.git_url
|
63
|
+
end
|
64
|
+
|
65
|
+
test "from_github_repo_name" do
|
66
|
+
owner = "repository-owner"
|
67
|
+
name = "repository-name"
|
68
|
+
github_repo_name = [owner, name].join("/")
|
69
|
+
expected_repository = Repository.create(owner: owner, name: name)
|
70
|
+
|
71
|
+
found_repository = Repository.from_github_repo_name(github_repo_name)
|
72
|
+
|
73
|
+
assert_equal(expected_repository, found_repository)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Shipit
|
4
|
+
module Webhooks
|
5
|
+
class HandlersTest < ActiveSupport::TestCase
|
6
|
+
test 'custom handlers do not replace default shipit handlers' do
|
7
|
+
event = 'push'
|
8
|
+
mock_handler = mock
|
9
|
+
Shipit::Webhooks.register_handler(event, mock_handler)
|
10
|
+
|
11
|
+
assert_includes Shipit::Webhooks.for_event(event), mock_handler
|
12
|
+
assert_includes Shipit::Webhooks.for_event(event), Shipit::Webhooks::Handlers::PushHandler
|
13
|
+
|
14
|
+
Shipit::Webhooks.reset_handlers!
|
15
|
+
end
|
16
|
+
|
17
|
+
test "unknown events have no handlers" do
|
18
|
+
event = '_'
|
19
|
+
|
20
|
+
handlers = Shipit::Webhooks.for_event(event)
|
21
|
+
|
22
|
+
assert_equal [], handlers
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/test/models/stacks_test.rb
CHANGED
@@ -9,43 +9,6 @@ module Shipit
|
|
9
9
|
GithubHook.any_instance.stubs(:teardown!)
|
10
10
|
end
|
11
11
|
|
12
|
-
test "repo_owner, repo_name and environment uniqueness is enforced" do
|
13
|
-
clone = Stack.new(@stack.attributes.except('id'))
|
14
|
-
refute clone.save
|
15
|
-
assert_equal ["cannot be used more than once with this environment"], clone.errors[:repo_name]
|
16
|
-
end
|
17
|
-
|
18
|
-
test "repo_owner, repo_name, and environment can only be ASCII" do
|
19
|
-
@stack.update(repo_owner: 'héllò', repo_name: 'wørld', environment: 'pródüctïòn')
|
20
|
-
refute_predicate @stack, :valid?
|
21
|
-
end
|
22
|
-
|
23
|
-
test "repo_owner and repo_name are case insensitive" do
|
24
|
-
assert_no_difference -> { Stack.count } do
|
25
|
-
error = assert_raises ActiveRecord::RecordInvalid do
|
26
|
-
Stack.create!(
|
27
|
-
repo_owner: @stack.repo_owner.upcase,
|
28
|
-
repo_name: @stack.repo_name.upcase,
|
29
|
-
environment: @stack.environment,
|
30
|
-
)
|
31
|
-
end
|
32
|
-
assert_equal 'Validation failed: Repo name cannot be used more than once with this environment', error.message
|
33
|
-
end
|
34
|
-
|
35
|
-
new_stack = Stack.create!(repo_owner: 'FOO', repo_name: 'BAR')
|
36
|
-
assert_equal new_stack, Stack.find_by(repo_owner: 'foo', repo_name: 'bar')
|
37
|
-
end
|
38
|
-
|
39
|
-
test "repo_owner is automatically downcased" do
|
40
|
-
@stack.repo_owner = 'George'
|
41
|
-
assert_equal 'george', @stack.repo_owner
|
42
|
-
end
|
43
|
-
|
44
|
-
test "repo_name is automatically downcased" do
|
45
|
-
@stack.repo_name = 'Cyclim.se'
|
46
|
-
assert_equal 'cyclim.se', @stack.repo_name
|
47
|
-
end
|
48
|
-
|
49
12
|
test "branch defaults to master" do
|
50
13
|
@stack.branch = ""
|
51
14
|
assert @stack.save
|
@@ -64,18 +27,6 @@ module Shipit
|
|
64
27
|
assert_equal 'foo:bar', @stack.environment
|
65
28
|
end
|
66
29
|
|
67
|
-
test "repo_owner cannot contain a `/`" do
|
68
|
-
assert @stack.valid?
|
69
|
-
@stack.repo_owner = 'foo/bar'
|
70
|
-
refute @stack.valid?
|
71
|
-
end
|
72
|
-
|
73
|
-
test "repo_name cannot contain a `/`" do
|
74
|
-
assert @stack.valid?
|
75
|
-
@stack.repo_name = 'foo/bar'
|
76
|
-
refute @stack.valid?
|
77
|
-
end
|
78
|
-
|
79
30
|
test "repo_http_url" do
|
80
31
|
assert_equal "https://github.com/#{@stack.repo_owner}/#{@stack.repo_name}", @stack.repo_http_url
|
81
32
|
end
|
@@ -104,6 +55,30 @@ module Shipit
|
|
104
55
|
assert_equal shipit_deploys(:shipit_complete).until_commit_id, deploy.since_commit_id
|
105
56
|
end
|
106
57
|
|
58
|
+
test "#trigger_deploy emits a hook" do
|
59
|
+
original_receivers = Shipit.internal_hook_receivers
|
60
|
+
|
61
|
+
FakeReceiver = Module.new do
|
62
|
+
mattr_accessor :hooks
|
63
|
+
self.hooks = []
|
64
|
+
|
65
|
+
def self.deliver(event, stack, payload)
|
66
|
+
hooks << [event, stack, payload]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
Shipit.internal_hook_receivers = [FakeReceiver]
|
70
|
+
|
71
|
+
last_commit = shipit_commits(:third)
|
72
|
+
deploy = @stack.trigger_deploy(last_commit, AnonymousUser.new)
|
73
|
+
assert_includes FakeReceiver.hooks, [
|
74
|
+
:deploy,
|
75
|
+
@stack,
|
76
|
+
{deploy: deploy, status: "pending", stack: @stack},
|
77
|
+
]
|
78
|
+
ensure
|
79
|
+
Shipit.internal_hook_receivers = original_receivers
|
80
|
+
end
|
81
|
+
|
107
82
|
test "#trigger_deploy deploy until the commit passed in argument" do
|
108
83
|
last_commit = shipit_commits(:third)
|
109
84
|
deploy = @stack.trigger_deploy(last_commit, AnonymousUser.new)
|
@@ -225,7 +200,7 @@ module Shipit
|
|
225
200
|
|
226
201
|
test "#create queues a GithubSyncJob" do
|
227
202
|
assert_enqueued_with(job: GithubSyncJob) do
|
228
|
-
Stack.create!(
|
203
|
+
Stack.create!(repository: shipit_repositories(:rails))
|
229
204
|
end
|
230
205
|
end
|
231
206
|
|
@@ -273,7 +248,10 @@ module Shipit
|
|
273
248
|
end
|
274
249
|
|
275
250
|
test ".run_deploy_in_foreground triggers a deploy" do
|
276
|
-
stack = Stack.create!(
|
251
|
+
stack = Stack.create!(
|
252
|
+
repository: Repository.new(owner: "foo", name: "bar"),
|
253
|
+
environment: 'production',
|
254
|
+
)
|
277
255
|
commit = shipit_commits(:first)
|
278
256
|
stack.commits << commit
|
279
257
|
|
@@ -870,6 +848,21 @@ module Shipit
|
|
870
848
|
)
|
871
849
|
end
|
872
850
|
|
851
|
+
test "#trigger_continuous_delivery sets delay if commit was pushed recently" do
|
852
|
+
freeze_time do
|
853
|
+
@stack.tasks.delete_all
|
854
|
+
|
855
|
+
commit = @stack.next_commit_to_deploy
|
856
|
+
commit.touch(:created_at)
|
857
|
+
|
858
|
+
assert_no_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
859
|
+
assert_no_difference -> { Deploy.count } do
|
860
|
+
@stack.trigger_continuous_delivery
|
861
|
+
end
|
862
|
+
end
|
863
|
+
end
|
864
|
+
end
|
865
|
+
|
873
866
|
private
|
874
867
|
|
875
868
|
def generate_revert_commit(stack:, reverted_commit:, author: reverted_commit.author)
|