pact_broker 2.9.0 → 2.10.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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -1
  3. data/config.ru +2 -2
  4. data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +6 -6
  5. data/lib/pact_broker/domain/group.rb +3 -3
  6. data/lib/pact_broker/domain/{relationship.rb → index_item.rb} +27 -7
  7. data/lib/pact_broker/groups/service.rb +2 -3
  8. data/lib/pact_broker/index/service.rb +56 -0
  9. data/lib/pact_broker/pacticipants/service.rb +0 -12
  10. data/lib/pact_broker/pacts/pact_publication.rb +4 -0
  11. data/lib/pact_broker/pacts/repository.rb +1 -1
  12. data/lib/pact_broker/relationships/groupify.rb +8 -8
  13. data/lib/pact_broker/services.rb +5 -0
  14. data/lib/pact_broker/tags/repository.rb +11 -1
  15. data/lib/pact_broker/tags/service.rb +3 -1
  16. data/lib/pact_broker/ui/app.rb +3 -3
  17. data/lib/pact_broker/ui/controllers/clusters.rb +1 -1
  18. data/lib/pact_broker/ui/controllers/groups.rb +1 -1
  19. data/lib/pact_broker/ui/controllers/index.rb +22 -0
  20. data/lib/pact_broker/ui/view_models/{relationship.rb → index_item.rb} +32 -5
  21. data/lib/pact_broker/ui/view_models/index_items.rb +30 -0
  22. data/lib/pact_broker/ui/views/index/show-with-tags.haml +83 -0
  23. data/lib/pact_broker/ui/views/{relationships → index}/show.haml +18 -18
  24. data/lib/pact_broker/ui/views/matrix/show.haml +1 -1
  25. data/lib/pact_broker/verifications/repository.rb +3 -0
  26. data/lib/pact_broker/version.rb +1 -1
  27. data/public/stylesheets/{relationships.css → index.css} +0 -0
  28. data/script/seed.rb +55 -39
  29. data/spec/integration/app_spec.rb +1 -1
  30. data/spec/integration/endpoints/{group.rb → group_spec.rb} +0 -3
  31. data/spec/integration/ui/index_spec.rb +36 -0
  32. data/spec/lib/pact_broker/domain/group_spec.rb +3 -3
  33. data/spec/lib/pact_broker/domain/{relationship_spec.rb → index_items_spec.rb} +3 -3
  34. data/spec/lib/pact_broker/groups/service_spec.rb +5 -4
  35. data/spec/lib/pact_broker/index/service_spec.rb +131 -0
  36. data/spec/lib/pact_broker/pacticipants/service_spec.rb +2 -35
  37. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +35 -0
  38. data/spec/lib/pact_broker/pacts/repository_spec.rb +16 -14
  39. data/spec/lib/pact_broker/relationships/groupify_spec.rb +7 -7
  40. data/spec/lib/pact_broker/tags/repository_spec.rb +23 -1
  41. data/spec/lib/pact_broker/tags/service_spec.rb +0 -1
  42. data/spec/lib/pact_broker/ui/controllers/index_spec.rb +71 -0
  43. data/spec/lib/pact_broker/ui/view_models/{relationship_spec.rb → index_item_spec.rb} +38 -18
  44. data/spec/lib/pact_broker/ui/view_models/{relationships_spec.rb → index_items_spec.rb} +10 -10
  45. metadata +26 -18
  46. data/lib/pact_broker/ui/controllers/relationships.rb +0 -21
  47. data/lib/pact_broker/ui/view_models/relationships.rb +0 -30
  48. data/spec/lib/pact_broker/ui/controllers/relationships_spec.rb +0 -39
@@ -0,0 +1,36 @@
1
+ require 'pact_broker/ui/app'
2
+
3
+ describe "UI index" do
4
+
5
+ let(:app) { PactBroker::UI::App.new }
6
+ let(:td) { TestDataBuilder.new }
7
+ let(:params) { {} }
8
+
9
+ before do
10
+ td.create_pact_with_hierarchy("Foo", "1", "Bar")
11
+ .create_consumer_version_tag("prod")
12
+ .create_consumer_version("2")
13
+ .create_pact
14
+ get "/"
15
+ end
16
+
17
+ subject { get("/", params, {}); last_response }
18
+
19
+ describe "GET" do
20
+ it "returns a success response" do
21
+ expect(subject.status).to eq 200
22
+ end
23
+
24
+ it "returns a table of pacts" do
25
+ expect(subject.body.scan('<tr').to_a.count).to eq 1
26
+ end
27
+
28
+ context "with an array of tags" do
29
+ let(:params) { { tags: ['prod'] } }
30
+
31
+ it "returns a table of pacts with the specfied tags" do
32
+ expect(subject.body.scan('<tr').to_a.count).to eq 2
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'pact_broker/domain/group'
3
- require 'pact_broker/domain/relationship'
3
+ require 'pact_broker/domain/index_item'
4
4
 
5
5
  module PactBroker
6
6
  module Domain
@@ -15,8 +15,8 @@ module PactBroker
15
15
  let(:provider_x) { double('provider x') }
16
16
  let(:provider_y) { double('provider y') }
17
17
 
18
- let(:relationship_1) { Domain::Relationship.new(consumer_a, provider_x)}
19
- let(:relationship_2) { Domain::Relationship.new(consumer_b, provider_y)}
18
+ let(:relationship_1) { Domain::IndexItem.new(consumer_a, provider_x)}
19
+ let(:relationship_2) { Domain::IndexItem.new(consumer_b, provider_y)}
20
20
 
21
21
  subject { Group.new(relatio)}
22
22
  end
@@ -1,8 +1,8 @@
1
- require 'pact_broker/domain/relationship'
1
+ require 'pact_broker/domain/index_item'
2
2
 
3
3
  module PactBroker
4
4
  module Domain
5
- describe Relationship do
5
+ describe IndexItem do
6
6
  describe "#last_webhook_execution_date" do
7
7
  let(:webhook_execution_1) { double('webhook_execution', created_at: DateTime.new(2013)) }
8
8
  let(:webhook_execution_2) { double('webhook_execution', created_at: DateTime.new(2015)) }
@@ -13,7 +13,7 @@ module PactBroker
13
13
  allow(webhook_executions).to receive(:sort).and_return(webhook_executions)
14
14
  end
15
15
 
16
- subject { Relationship.create(nil, nil, nil, nil, [], webhook_executions) }
16
+ subject { IndexItem.create(nil, nil, nil, true, nil, [], webhook_executions) }
17
17
 
18
18
  it "returns the created_at date of the last execution" do
19
19
  expect(subject.last_webhook_execution_date).to eq DateTime.new(2015)
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'pact_broker/groups/service'
3
+ require 'pact_broker/index/service'
3
4
 
4
5
  module PactBroker
5
6
 
@@ -15,8 +16,8 @@ module PactBroker
15
16
  let(:provider_x) { double('provider x', name: 'provider x', id: 3)}
16
17
  let(:provider_y) { double('provider y', name: 'provider y', id: 4)}
17
18
 
18
- let(:relationship_1) { Domain::Relationship.new(consumer_a, provider_x) }
19
- let(:relationship_2) { Domain::Relationship.new(consumer_b, provider_y) }
19
+ let(:relationship_1) { Domain::IndexItem.new(consumer_a, provider_x) }
20
+ let(:relationship_2) { Domain::IndexItem.new(consumer_b, provider_y) }
20
21
 
21
22
  let(:group_1) { Domain::Group.new(relationship_1) }
22
23
  let(:group_2) { Domain::Group.new(relationship_2) }
@@ -27,12 +28,12 @@ module PactBroker
27
28
  subject { Service.find_group_containing(consumer_b) }
28
29
 
29
30
  before do
30
- allow(Pacticipants::Service).to receive(:find_relationships).and_return(relationship_list)
31
+ allow(PactBroker::Index::Service).to receive(:find_index_items).and_return(relationship_list)
31
32
  allow(Relationships::Groupify).to receive(:call).and_return(groups)
32
33
  end
33
34
 
34
35
  it "retrieves a list of the relationships" do
35
- allow(Pacticipants::Service).to receive(:find_relationships)
36
+ allow(Index::Service).to receive(:find_index_items)
36
37
  subject
37
38
  end
38
39
 
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/index/service'
3
+ require 'pact_broker/domain/tag'
4
+ require 'pact_broker/domain/pact'
5
+
6
+ module PactBroker
7
+
8
+ module Index
9
+ describe Service do
10
+ let(:td) { TestDataBuilder.new }
11
+ let(:tags) { ['prod', 'production'] }
12
+ let(:options) { { tags: tags } }
13
+
14
+ subject{ Service }
15
+
16
+ describe ".find_index_items" do
17
+ let(:consumer) { instance_double("PactBroker::Domain::Pacticipant")}
18
+ let(:provider) { instance_double("PactBroker::Domain::Pacticipant")}
19
+ let(:pact) { instance_double("PactBroker::Domain::Pact", id: 1, consumer: consumer, provider: provider, consumer_name: 'foo', provider_name: 'bar', consumer_version_tag_names: [])}
20
+ let(:verification) { instance_double("PactBroker::Domain::Verification")}
21
+ let(:pacts) { [pact]}
22
+ let(:webhooks) { [instance_double("PactBroker::Domain::Webhook")]}
23
+ let(:triggered_webhooks) { [instance_double("PactBroker::Webhooks::TriggeredWebhook")] }
24
+
25
+ before do
26
+ allow_any_instance_of(PactBroker::Pacts::Repository).to receive(:find_latest_pacts).and_return(pacts)
27
+ allow_any_instance_of(PactBroker::Pacts::Repository).to receive(:find_latest_pact).and_return(pact)
28
+ allow(PactBroker::Verifications::Service).to receive(:find_latest_verification_for).and_return(verification)
29
+ allow(PactBroker::Webhooks::Service).to receive(:find_by_consumer_and_provider).and_return(webhooks)
30
+ allow(PactBroker::Webhooks::Service).to receive(:find_latest_triggered_webhooks).and_return(triggered_webhooks)
31
+ end
32
+
33
+ it "retrieves the webhooks for the pact" do
34
+ expect(PactBroker::Webhooks::Service).to receive(:find_by_consumer_and_provider).with(consumer, provider)
35
+ subject.find_index_items(options)
36
+ end
37
+
38
+ it "retrieves the latest verification for the pact" do
39
+ expect(PactBroker::Verifications::Service).to receive(:find_latest_verification_for).with(consumer, provider)
40
+ subject.find_index_items(options)
41
+ end
42
+
43
+ it "returns a list of relationships" do
44
+ expect(subject.find_index_items(options)).to eq([PactBroker::Domain::IndexItem.create(consumer, provider, pact, true, verification, webhooks)])
45
+ end
46
+ end
47
+
48
+ describe "find_relationships integration test" do
49
+ context "when a prod pact exists and is not the latest version" do
50
+ before do
51
+ td.create_pact_with_hierarchy("Foo", "1.2.3", "Bar")
52
+ .create_consumer_version_tag("prod")
53
+ .create_consumer_version_tag("ignored")
54
+ .create_verification(provider_version: "2.0.0")
55
+ .create_consumer_version("1.2.4")
56
+ .create_consumer_version_tag("also-ignored")
57
+ .create_pact
58
+ .create_verification(provider_version: "2.1.0")
59
+ end
60
+
61
+ let(:rows) { subject.find_index_items(options) }
62
+
63
+ it "returns both rows" do
64
+ expect(rows.count).to eq 2
65
+ end
66
+
67
+ context "when the tags are not specified" do
68
+ let(:options) { {} }
69
+
70
+ it "only returns the latest row" do
71
+ expect(rows.count).to eq 1
72
+ end
73
+ end
74
+
75
+ it "returns the latest row first" do
76
+ expect(rows.first.consumer_version_number).to eq "1.2.4"
77
+ expect(rows.last.consumer_version_number).to eq "1.2.3"
78
+ end
79
+
80
+ it "designates the first row as the latest row, and the second as not latest" do
81
+ expect(rows.first.latest?).to be true
82
+ expect(rows.last.latest?).to be false
83
+ end
84
+
85
+ it "doesn't return any tag names for the latest row" do
86
+ expect(rows.first.tag_names).to eq []
87
+ end
88
+
89
+ it "includes the prod tag name for the prod row" do
90
+ expect(rows.last.tag_names).to eq ['prod']
91
+ end
92
+
93
+ it "includes the latest overall verification for the latest pact" do
94
+ expect(rows.first.latest_verification.provider_version_number).to eq '2.1.0'
95
+ end
96
+
97
+ it "includes the latest prod verification for the prod pact" do
98
+ expect(rows.last.latest_verification.provider_version_number).to eq '2.0.0'
99
+ end
100
+ end
101
+
102
+ context "when the prod version is the latest version" do
103
+ before do
104
+ td.create_pact_with_hierarchy("Foo", "1.2.3", "Bar")
105
+ .create_consumer_version_tag("prod")
106
+ .create_consumer_version_tag("ignored")
107
+ .create_verification(provider_version: "2.0.0")
108
+ end
109
+
110
+ let(:rows) { subject.find_index_items(options) }
111
+
112
+ it "returns one row" do
113
+ expect(rows.count).to eq 1
114
+ end
115
+
116
+ it "designates the row as the latest row" do
117
+ expect(rows.first.latest?).to be true
118
+ end
119
+
120
+ it "includes the prod tag name for the row" do
121
+ expect(rows.first.tag_names).to eq ['prod']
122
+ end
123
+
124
+ it "includes the latest overall verification for the latest pact" do
125
+ expect(rows.first.latest_verification.provider_version_number).to eq '2.0.0'
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -8,10 +8,10 @@ module PactBroker
8
8
  module Pacticipants
9
9
  describe Service do
10
10
 
11
- subject{ Service }
12
-
13
11
  let(:td) { TestDataBuilder.new }
14
12
 
13
+ subject{ Service }
14
+
15
15
  describe ".update" do
16
16
  before do
17
17
  td.create_pacticipant("Foo")
@@ -112,40 +112,7 @@ module PactBroker
112
112
  end
113
113
  end
114
114
 
115
- describe ".find_relationships" do
116
-
117
- let(:consumer) { instance_double("PactBroker::Domain::Pacticipant")}
118
- let(:provider) { instance_double("PactBroker::Domain::Pacticipant")}
119
- let(:pact) { instance_double("PactBroker::Domain::Pact", consumer: consumer, provider: provider)}
120
- let(:verification) { instance_double("PactBroker::Domain::Verification")}
121
- let(:pacts) { [pact]}
122
- let(:webhooks) { [instance_double("PactBroker::Domain::Webhook")]}
123
- let(:triggered_webhooks) { [instance_double("PactBroker::Webhooks::TriggeredWebhook")] }
124
-
125
- before do
126
- allow_any_instance_of(PactBroker::Pacts::Repository).to receive(:find_latest_pacts).and_return(pacts)
127
- allow(PactBroker::Verifications::Service).to receive(:find_latest_verification_for).and_return(verification)
128
- allow(PactBroker::Webhooks::Service).to receive(:find_by_consumer_and_provider).and_return(webhooks)
129
- allow(PactBroker::Webhooks::Service).to receive(:find_latest_triggered_webhooks).and_return(triggered_webhooks)
130
- end
131
-
132
- it "retrieves the webhooks for the pact" do
133
- expect(PactBroker::Webhooks::Service).to receive(:find_by_consumer_and_provider).with(consumer, provider)
134
- subject.find_relationships
135
- end
136
-
137
- it "retrieves the latest verification for the pact" do
138
- expect(PactBroker::Verifications::Service).to receive(:find_latest_verification_for).with(consumer, provider)
139
- subject.find_relationships
140
- end
141
-
142
- it "returns a list of relationships" do
143
- expect(subject.find_relationships).to eq([PactBroker::Domain::Relationship.create(consumer, provider, pact, verification, webhooks)])
144
- end
145
- end
146
-
147
115
  describe "delete" do
148
-
149
116
  before do
150
117
  TestDataBuilder.new
151
118
  .create_consumer("Consumer")
@@ -0,0 +1,35 @@
1
+ require 'pact_broker/pacts/pact_publication'
2
+
3
+ module PactBroker
4
+ module Pacts
5
+ describe PactPublication do
6
+
7
+ describe "#latest_tag_names" do
8
+ before do
9
+ td.create_pact_with_hierarchy("Foo", "1.2.3", "Bar")
10
+ .create_consumer_version_tag("no")
11
+ .create_consumer_version("3.4.5")
12
+ .create_consumer_version_tag("yes")
13
+ .create_pact
14
+ .create_consumer_version("5.6.7")
15
+ .create_consumer_version_tag("no")
16
+ end
17
+
18
+ let(:td) { TestDataBuilder.new }
19
+ let(:pact_publication) { PactPublication.find(id: td.pact.id) }
20
+
21
+ context "when the pact is the latest for a tag" do
22
+ it "returns the relevant tag names" do
23
+ expect(pact_publication.latest_tag_names).to eq ["yes"]
24
+ end
25
+ end
26
+
27
+ context "when the pact is not the latest for a tag" do
28
+ it "returns the relevant tag names" do
29
+ expect(pact_publication.latest_tag_names).to eq ["yes"]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -576,19 +576,20 @@ module PactBroker
576
576
  describe "find_latest_pacts" do
577
577
  before do
578
578
  TestDataBuilder.new
579
- .create_condor
580
- .create_condor_version('1.3.0')
581
- .create_pricing_service
582
- .create_condor_pricing_service_pact
583
- .create_condor_version('1.4.0')
584
- .create_condor_pricing_service_pact
585
- .create_contract_email_service
586
- .create_contract_email_service_version('2.6.0')
587
- .create_contract_proposal_service
588
- .create_ces_cps_pact
589
- .create_contract_email_service_version('2.7.0')
590
- .create_ces_cps_pact
591
- .create_contract_email_service_version('2.8.0') # Create a version without a pact, it shouldn't be used
579
+ .create_consumer("Condor")
580
+ .create_consumer_version('1.3.0')
581
+ .create_provider("Pricing Service")
582
+ .create_pact
583
+ .create_consumer_version('1.4.0')
584
+ .create_consumer_version_tag("prod")
585
+ .create_pact
586
+ .create_consumer("Contract Email Service")
587
+ .create_consumer_version("2.6.0")
588
+ .create_provider("Contract Proposal Service")
589
+ .create_pact
590
+ .create_consumer_version('2.7.0')
591
+ .create_pact
592
+ .create_consumer_version('2.8.0') # Create a version without a pact, it shouldn't be used
592
593
  end
593
594
 
594
595
  it "finds the latest pact for each consumer/provider pair" do
@@ -600,12 +601,13 @@ module PactBroker
600
601
  expect(pacts[0].provider.name).to eq("Pricing Service")
601
602
  expect(pacts[0].provider.id).to_not be nil
602
603
  expect(pacts[0].consumer_version.number).to eq("1.4.0")
603
- expect(pacts[1].consumer_version.tags).to be nil # Not used, don't bother loading
604
+ expect(pacts[0].consumer_version.tags.collect(&:name)).to eq ["prod"]
604
605
 
605
606
  expect(pacts[1].consumer_version.pacticipant.name).to eq("Contract Email Service")
606
607
  expect(pacts[1].consumer.name).to eq("Contract Email Service")
607
608
  expect(pacts[1].provider.name).to eq("Contract Proposal Service")
608
609
  expect(pacts[1].consumer_version.number).to eq("2.7.0")
610
+ expect(pacts[1].consumer_version.tags.collect(&:name)).to eq []
609
611
  end
610
612
 
611
613
  it "includes the timestamps - need to update view" do
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'pact_broker/relationships/groupify'
3
- require 'pact_broker/domain/relationship'
3
+ require 'pact_broker/domain/index_item'
4
4
 
5
5
  module PactBroker
6
6
 
@@ -24,15 +24,15 @@ module PactBroker
24
24
  let(:provider_z) { double('provider z', id: 9, name: 'provider z') }
25
25
 
26
26
 
27
- let(:relationship_1) { Domain::Relationship.new(consumer_a, provider_x) }
28
- let(:relationship_4) { Domain::Relationship.new(consumer_a, provider_y) }
29
- let(:relationship_2) { Domain::Relationship.new(consumer_b, provider_y) }
27
+ let(:relationship_1) { Domain::IndexItem.new(consumer_a, provider_x) }
28
+ let(:relationship_4) { Domain::IndexItem.new(consumer_a, provider_y) }
29
+ let(:relationship_2) { Domain::IndexItem.new(consumer_b, provider_y) }
30
30
 
31
- let(:relationship_3) { Domain::Relationship.new(consumer_c, provider_z) }
31
+ let(:relationship_3) { Domain::IndexItem.new(consumer_c, provider_z) }
32
32
 
33
33
 
34
- let(:relationship_5) { Domain::Relationship.new(consumer_l, provider_p) }
35
- let(:relationship_6) { Domain::Relationship.new(consumer_m, provider_p) }
34
+ let(:relationship_5) { Domain::IndexItem.new(consumer_l, provider_p) }
35
+ let(:relationship_6) { Domain::IndexItem.new(consumer_m, provider_p) }
36
36
 
37
37
  let(:relationships) { [relationship_1, relationship_2, relationship_3, relationship_4, relationship_5, relationship_6] }
38
38
 
@@ -5,6 +5,8 @@ module PactBroker
5
5
  module Tags
6
6
  describe Repository do
7
7
 
8
+ let(:td) { TestDataBuilder.new }
9
+
8
10
  describe ".find" do
9
11
 
10
12
  let(:pacticipant_name) { "test_pacticipant" }
@@ -80,9 +82,29 @@ module PactBroker
80
82
  it "deletes the tag" do
81
83
  expect{ subject }.to change { PactBroker::Domain::Tag.count }.by(-2)
82
84
  end
83
-
84
85
  end
85
86
 
87
+
88
+ describe "find_all_tag_names_for_pacticipant" do
89
+ before do
90
+ td.create_consumer("Foo")
91
+ .create_consumer_version("1")
92
+ .create_consumer_version_tag("prod")
93
+ .create_consumer_version_tag("master")
94
+ .create_consumer_version("2")
95
+ .create_consumer_version_tag("prod")
96
+ .create_consumer_version_tag("dev")
97
+ .create_consumer("Bar")
98
+ .create_consumer_version("1")
99
+ .create_consumer_version_tag("ignore")
100
+ end
101
+
102
+ subject { Repository.new.find_all_tag_names_for_pacticipant("Foo") }
103
+
104
+ it "returns all the tag names for the pacticipant" do
105
+ expect(subject).to eq ["dev", "master", "prod"]
106
+ end
107
+ end
86
108
  end
87
109
  end
88
110
  end