pact_broker 2.88.0 → 2.89.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release_gem.yml +1 -1
  3. data/.github/workflows/trigger_pact_docs_update.yml +1 -0
  4. data/CHANGELOG.md +14 -0
  5. data/docs/CONFIGURATION.md +1 -1
  6. data/lib/pact_broker/api/contracts/pacts_for_verification_json_query_schema.rb +14 -4
  7. data/lib/pact_broker/api/decorators/deployed_version_decorator.rb +2 -1
  8. data/lib/pact_broker/api/decorators/pacts_for_verification_query_decorator.rb +18 -0
  9. data/lib/pact_broker/api/resources/currently_deployed_versions_for_environment.rb +3 -1
  10. data/lib/pact_broker/api/resources/deployed_versions_for_version_and_environment.rb +4 -3
  11. data/lib/pact_broker/api/resources/pact.rb +1 -1
  12. data/lib/pact_broker/api/resources/publish_contracts.rb +27 -4
  13. data/lib/pact_broker/config/runtime_configuration_database_methods.rb +1 -1
  14. data/lib/pact_broker/contracts/contracts_publication_results.rb +2 -7
  15. data/lib/pact_broker/contracts/notice.rb +8 -0
  16. data/lib/pact_broker/contracts/service.rb +25 -0
  17. data/lib/pact_broker/doc/views/index/publish-contracts.markdown +32 -2
  18. data/lib/pact_broker/doc/views/provider-pacts-for-verification.markdown +2 -0
  19. data/lib/pact_broker/locale/en.yml +1 -1
  20. data/lib/pact_broker/pacts/content.rb +18 -0
  21. data/lib/pact_broker/pacts/create_formatted_diff.rb +9 -2
  22. data/lib/pact_broker/pacts/selector.rb +35 -21
  23. data/lib/pact_broker/pacts/sort_content.rb +1 -0
  24. data/lib/pact_broker/verifications/required_verification.rb +5 -2
  25. data/lib/pact_broker/verifications/service.rb +14 -7
  26. data/lib/pact_broker/version.rb +1 -1
  27. data/lib/pact_broker/versions/selector.rb +32 -0
  28. data/lib/pact_broker/versions/selectors.rb +20 -0
  29. data/lib/pact_broker/webhooks/pact_and_verification_parameters.rb +2 -2
  30. data/lib/pact_broker/webhooks/trigger_service.rb +9 -1
  31. data/script/docs/generate-configuration-docs.rb +9 -9
  32. data/script/github-issues/add-branch-support/issue-text.txt +7 -0
  33. data/script/github-issues/add-branch-support/issues.txt +0 -0
  34. data/script/github-issues/add-branch-support/raise-issue-in-client-repos.sh +10 -0
  35. data/script/github-issues/add-branch-support-for-provider-versions/issue-text.txt +9 -0
  36. data/script/github-issues/add-branch-support-for-provider-versions/issues.txt +6 -0
  37. data/script/github-issues/add-branch-support-for-provider-versions/raise-issue-in-client-repos.sh +10 -0
  38. data/script/github-issues/branch-consumer-version-selector/issue-text.txt +52 -0
  39. data/script/github-issues/branch-consumer-version-selector/issues.txt +9 -0
  40. data/script/github-issues/branch-consumer-version-selector/raise-issue-in-client-repos.sh +10 -0
  41. data/script/{issues → github-issues}/consumer-version-selectors-docs/issue-text.txt +0 -0
  42. data/script/{issues → github-issues}/consumer-version-selectors-docs/issues.txt +0 -0
  43. data/script/{issues → github-issues}/consumer-version-selectors-docs/raise-issue-in-client-repos.sh +0 -0
  44. data/script/github-issues/deployed-and-released-selectors-docs/issue-text.txt +26 -0
  45. data/script/github-issues/deployed-and-released-selectors-docs/issues.txt +9 -0
  46. data/script/github-issues/deployed-and-released-selectors-docs/raise-issue-in-client-repos.sh +10 -0
  47. data/script/github-issues/include-pending-by-default/issue-text.txt +5 -0
  48. data/script/github-issues/include-pending-by-default/issues.txt +10 -0
  49. data/script/github-issues/include-pending-by-default/raise-issue-in-client-repos.sh +10 -0
  50. data/spec/features/get_currently_deployed_versions_for_environment_spec.rb +23 -6
  51. data/spec/features/publish_pact_all_in_one_spec.rb +19 -0
  52. data/spec/features/record_deployment_spec.rb +17 -4
  53. data/spec/lib/pact_broker/api/contracts/pacts_for_verification_json_query_schema_combinations_spec.rb +5 -3
  54. data/spec/lib/pact_broker/api/contracts/pacts_for_verification_json_query_schema_spec.rb +10 -0
  55. data/spec/lib/pact_broker/api/decorators/pacts_for_verification_query_decorator_spec.rb +10 -0
  56. data/spec/lib/pact_broker/contracts/service_spec.rb +64 -0
  57. data/spec/lib/pact_broker/verifications/service_spec.rb +18 -12
  58. data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +67 -3
  59. metadata +22 -5
@@ -125,6 +125,16 @@ module PactBroker
125
125
  expect(subject.consumer_version_selectors.last).to eq PactBroker::Pacts::Selector.for_currently_supported
126
126
  end
127
127
  end
128
+
129
+ context "when matchingBranch is true" do
130
+ let(:consumer_version_selectors) do
131
+ [{ "matchingBranch" => true }]
132
+ end
133
+
134
+ it "sets the branch and latest and matching branch properties" do
135
+ expect(subject.consumer_version_selectors).to contain_exactly(have_attributes(branch: "main", matching_branch: true, latest: true))
136
+ end
137
+ end
128
138
  end
129
139
 
130
140
  context "when parsing query string params" do
@@ -124,6 +124,70 @@ module PactBroker
124
124
  end
125
125
  end
126
126
  end
127
+
128
+ describe "#conflict_errors" do
129
+ let(:contracts_to_publish) do
130
+ ContractsToPublish.from_hash(
131
+ pacticipant_name: "Foo",
132
+ pacticipant_version_number: "1",
133
+ tags: ["a", "b"],
134
+ branch: branch,
135
+ contracts: contracts
136
+ )
137
+ end
138
+
139
+ let(:on_conflict) { "overwrite" }
140
+ let(:branch) { "main" }
141
+ let(:contracts) { [contract_1] }
142
+ let(:contract_1) do
143
+ ContractToPublish.from_hash(
144
+ consumer_name: "Foo",
145
+ provider_name: "Bar",
146
+ decoded_content: decoded_contract,
147
+ specification: "pact",
148
+ on_conflict: on_conflict
149
+ )
150
+ end
151
+
152
+ let(:contract_hash) { { consumer: { name: "Foo" }, provider: { name: "Bar" }, interactions: [{a: "b"}] } }
153
+ let(:decoded_contract) { contract_hash.to_json }
154
+
155
+ subject { Service.conflict_notices(contracts_to_publish) }
156
+
157
+ context "when a pact already exists" do
158
+ before do
159
+ allow(PactBroker.configuration).to receive(:allow_dangerous_contract_modification).and_return(allow_dangerous_contract_modification)
160
+ td.create_pact_with_hierarchy("Foo", "1", "Bar", existing_json_content)
161
+ end
162
+
163
+ let(:existing_json_content) { td.random_json_content("Foo", "Bar") }
164
+
165
+ context "when allow_dangerous_contract_modification=false and the pact content is different" do
166
+ let(:allow_dangerous_contract_modification) { false }
167
+
168
+ it "returns errors" do
169
+ expect(subject).to_not be_empty
170
+ end
171
+ end
172
+
173
+ context "when allow_dangerous_contract_modification=false and the pact content is the same" do
174
+ let(:allow_dangerous_contract_modification) { false }
175
+ let(:existing_json_content) { decoded_contract }
176
+
177
+ it { is_expected.to be_empty }
178
+ end
179
+
180
+ context "when allow_dangerous_contract_modification=true and the pact content is different" do
181
+ let(:allow_dangerous_contract_modification) { true }
182
+
183
+ it { is_expected.to be_empty }
184
+ end
185
+ end
186
+
187
+ context "when no pacts exist" do
188
+ it { is_expected.to be_empty }
189
+ end
190
+ end
127
191
  end
128
192
  end
129
193
  end
@@ -112,12 +112,15 @@ module PactBroker
112
112
  end
113
113
 
114
114
  it "returns the required verification for the main branch" do
115
- expect(subject).to eq [
116
- RequiredVerification.new(
115
+ expect(subject).to contain_exactly(
116
+ have_attributes(
117
117
  provider_version: td.find_version("Bar", "1"),
118
+ provider_version_selectors: contain_exactly(
119
+ have_attributes(resolved_branch_name: "main", main_branch: true)
120
+ ),
118
121
  provider_version_descriptions: ["latest from main branch"]
119
122
  )
120
- ]
123
+ )
121
124
  end
122
125
  end
123
126
 
@@ -153,6 +156,7 @@ module PactBroker
153
156
  expect(subject).to eq [
154
157
  RequiredVerification.new(
155
158
  provider_version: td.find_version("Bar", "1"),
159
+ provider_version_selectors: PactBroker::Versions::Selectors.new(PactBroker::Versions::Selector.for_currently_deployed),
156
160
  provider_version_descriptions: ["deployed in test"]
157
161
  )
158
162
  ]
@@ -193,6 +197,7 @@ module PactBroker
193
197
  expect(subject).to eq [
194
198
  RequiredVerification.new(
195
199
  provider_version: td.find_version("Bar", "1"),
200
+ provider_version_selectors: PactBroker::Versions::Selectors.new(PactBroker::Versions::Selector.for_currently_supported),
196
201
  provider_version_descriptions: ["released in test"]
197
202
  )
198
203
  ]
@@ -231,15 +236,16 @@ module PactBroker
231
236
  end
232
237
 
233
238
  it "deduplicates the required versions" do
234
- expect(subject).to eq [
235
- RequiredVerification.new(
236
- provider_version: td.find_version("Bar", "1"),
237
- provider_version_descriptions: [
238
- "latest from main branch",
239
- "deployed in test",
240
- "released in test"
241
- ])
242
- ]
239
+ expect(subject.size).to eq 1
240
+ expect(subject.first.provider_version).to eq td.find_version("Bar", "1")
241
+ expect(subject.first.provider_version_selectors[0]).to have_attributes(main_branch: true, resolved_branch_name: "main")
242
+ expect(subject.first.provider_version_selectors[1]).to eq PactBroker::Versions::Selector.for_currently_deployed
243
+ expect(subject.first.provider_version_selectors[2]).to eq PactBroker::Versions::Selector.for_currently_supported
244
+ expect(subject.first.provider_version_descriptions).to eq [
245
+ "latest from main branch",
246
+ "deployed in test",
247
+ "released in test"
248
+ ]
243
249
  end
244
250
  end
245
251
  end
@@ -1,4 +1,6 @@
1
1
  require "pact_broker/webhooks/trigger_service"
2
+ require "pact_broker/versions/selectors"
3
+ require "pact_broker/versions/selector"
2
4
 
3
5
  module PactBroker
4
6
  module Webhooks
@@ -59,7 +61,8 @@ module PactBroker
59
61
  let(:pact) { instance_double(PactBroker::Domain::Pact, consumer: consumer, provider: provider, consumer_version: consumer_version)}
60
62
  let(:consumer_version) { PactBroker::Domain::Version.new(number: "1.2.3") }
61
63
  let(:consumer) { PactBroker::Domain::Pacticipant.new(name: "Consumer") }
62
- let(:provider) { PactBroker::Domain::Pacticipant.new(name: "Provider") }
64
+ let(:provider) { PactBroker::Domain::Pacticipant.new(name: "Provider", main_branch: provider_main_branch) }
65
+ let(:provider_main_branch) { "main" }
63
66
  let(:webhooks) { [webhook]}
64
67
  let(:webhook) do
65
68
  instance_double(PactBroker::Domain::Webhook,
@@ -127,10 +130,14 @@ module PactBroker
127
130
  let(:required_verifications) { [required_verification] }
128
131
  let(:required_verification) do
129
132
  instance_double("PactBroker::Verifications::RequiredVerification",
130
- provider_version: double("version", number: "1"),
133
+ provider_version: double("version", number: "1", branch_versions: branch_versions),
134
+ provider_version_selectors: provider_version_selectors,
131
135
  provider_version_descriptions: ["foo"]
132
136
  )
133
137
  end
138
+ let(:provider_version_selectors) { [instance_double("PactBroker::Versions::ResolvedSelector", latest_for_main_branch?: latest_for_main_branch, resolved_branch_name: "the-main-branch")] }
139
+ let(:latest_for_main_branch) { true }
140
+ let(:branch_versions) { [instance_double("PactBroker::Versions::BranchVersion", branch_name: "main")] }
134
141
 
135
142
  it "creates a triggered webhook for each required verification" do
136
143
  expect(webhook_repository).to receive(:create_triggered_webhook).with(
@@ -140,7 +147,7 @@ module PactBroker
140
147
  verification,
141
148
  TriggerService::RESOURCE_CREATION,
142
149
  PactBroker::Webhooks::WebhookEvent::CONTRACT_REQUIRING_VERIFICATION_PUBLISHED,
143
- expected_event_context.merge(provider_version_number: "1", provider_version_descriptions: ["foo"])
150
+ expected_event_context.merge(provider_version_number: "1", provider_version_branch: "the-main-branch", provider_version_descriptions: ["foo"])
144
151
  )
145
152
  subject
146
153
  end
@@ -149,6 +156,63 @@ module PactBroker
149
156
  expect(subject.size).to eq 1
150
157
  end
151
158
 
159
+ context "when a version is required because it was the main branch" do
160
+ it "uses the main branch" do
161
+ expect(webhook_repository).to receive(:create_triggered_webhook).with(
162
+ anything,
163
+ anything,
164
+ anything,
165
+ anything,
166
+ anything,
167
+ anything,
168
+ hash_including(provider_version_branch: "the-main-branch")
169
+ )
170
+ subject
171
+ end
172
+ end
173
+
174
+ context "when a version was required but not because it was for the main branch" do
175
+ let(:latest_for_main_branch) { false }
176
+
177
+ context "when there are multiple branches" do
178
+ let(:branch_versions) do
179
+ [
180
+ instance_double("PactBroker::Versions::BranchVersion", branch_name: "foo"),
181
+ instance_double("PactBroker::Versions::BranchVersion", branch_name: "bar")
182
+ ]
183
+ end
184
+ it "uses the last branch" do
185
+ expect(webhook_repository).to receive(:create_triggered_webhook).with(
186
+ anything,
187
+ anything,
188
+ anything,
189
+ anything,
190
+ anything,
191
+ anything,
192
+ hash_including(provider_version_branch: "bar")
193
+ )
194
+ subject
195
+ end
196
+ end
197
+
198
+ context "when there are no branches" do
199
+ let(:branch_versions) { [] }
200
+
201
+ it "uses nil" do
202
+ expect(webhook_repository).to receive(:create_triggered_webhook).with(
203
+ anything,
204
+ anything,
205
+ anything,
206
+ anything,
207
+ anything,
208
+ anything,
209
+ hash_including(provider_version_branch: nil)
210
+ )
211
+ subject
212
+ end
213
+ end
214
+ end
215
+
152
216
  context "when there are no required verifications" do
153
217
  let(:required_verifications) { [] }
154
218
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.88.0
4
+ version: 2.89.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bethany Skurrie
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-10-11 00:00:00.000000000 Z
13
+ date: 2021-10-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -1113,6 +1113,8 @@ files:
1113
1113
  - lib/pact_broker/versions/latest_version.rb
1114
1114
  - lib/pact_broker/versions/parse_semantic_version.rb
1115
1115
  - lib/pact_broker/versions/repository.rb
1116
+ - lib/pact_broker/versions/selector.rb
1117
+ - lib/pact_broker/versions/selectors.rb
1116
1118
  - lib/pact_broker/versions/sequence.rb
1117
1119
  - lib/pact_broker/versions/service.rb
1118
1120
  - lib/pact_broker/webhooks/check_host_whitelist.rb
@@ -1277,11 +1279,26 @@ files:
1277
1279
  - script/foo-bar.json
1278
1280
  - script/generate-certificates-for-webooks-certificate-spec.rb
1279
1281
  - script/generate-erd
1282
+ - script/github-issues/add-branch-support-for-provider-versions/issue-text.txt
1283
+ - script/github-issues/add-branch-support-for-provider-versions/issues.txt
1284
+ - script/github-issues/add-branch-support-for-provider-versions/raise-issue-in-client-repos.sh
1285
+ - script/github-issues/add-branch-support/issue-text.txt
1286
+ - script/github-issues/add-branch-support/issues.txt
1287
+ - script/github-issues/add-branch-support/raise-issue-in-client-repos.sh
1288
+ - script/github-issues/branch-consumer-version-selector/issue-text.txt
1289
+ - script/github-issues/branch-consumer-version-selector/issues.txt
1290
+ - script/github-issues/branch-consumer-version-selector/raise-issue-in-client-repos.sh
1291
+ - script/github-issues/consumer-version-selectors-docs/issue-text.txt
1292
+ - script/github-issues/consumer-version-selectors-docs/issues.txt
1293
+ - script/github-issues/consumer-version-selectors-docs/raise-issue-in-client-repos.sh
1294
+ - script/github-issues/deployed-and-released-selectors-docs/issue-text.txt
1295
+ - script/github-issues/deployed-and-released-selectors-docs/issues.txt
1296
+ - script/github-issues/deployed-and-released-selectors-docs/raise-issue-in-client-repos.sh
1297
+ - script/github-issues/include-pending-by-default/issue-text.txt
1298
+ - script/github-issues/include-pending-by-default/issues.txt
1299
+ - script/github-issues/include-pending-by-default/raise-issue-in-client-repos.sh
1280
1300
  - script/import-pg-database.sh
1281
1301
  - script/insert-self-signed-certificate-from-url.rb
1282
- - script/issues/consumer-version-selectors-docs/issue-text.txt
1283
- - script/issues/consumer-version-selectors-docs/issues.txt
1284
- - script/issues/consumer-version-selectors-docs/raise-issue-in-client-repos.sh
1285
1302
  - script/prod/clean-up.sql
1286
1303
  - script/prod/migrate-latest-pacts.sh
1287
1304
  - script/prod/redact-data.sql