pact_broker 2.7.0.beta.2 → 2.7.0.beta.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/RELEASING.md +2 -12
- data/lib/pact_broker/api/resources/pacticipant.rb +2 -4
- data/lib/pact_broker/api/resources/pacticipants.rb +1 -3
- data/lib/pact_broker/domain/tag.rb +5 -0
- data/lib/pact_broker/matrix/parse_query.rb +8 -1
- data/lib/pact_broker/matrix/repository.rb +25 -0
- data/lib/pact_broker/matrix/service.rb +19 -8
- data/lib/pact_broker/pacticipants/service.rb +8 -4
- data/lib/pact_broker/tags/repository.rb +1 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/repository.rb +20 -0
- data/lib/pact_broker/versions/service.rb +4 -7
- data/pact_broker.gemspec +1 -1
- data/script/release.sh +7 -0
- data/spec/features/create_pacticipant_spec.rb +1 -1
- data/spec/features/update_pacticipant_spec.rb +10 -12
- data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +0 -2
- data/spec/lib/pact_broker/api/resources/pacticipants_spec.rb +1 -1
- data/spec/lib/pact_broker/matrix/parse_query_spec.rb +25 -1
- data/spec/lib/pact_broker/matrix/repository_spec.rb +76 -3
- data/spec/lib/pact_broker/matrix/service_spec.rb +60 -1
- data/spec/lib/pact_broker/pacticipants/service_spec.rb +16 -1
- data/spec/lib/pact_broker/versions/repository_spec.rb +24 -0
- data/spec/lib/pact_broker/versions/service_spec.rb +0 -38
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +14 -0
- data/spec/support/shared_examples_for_responses.rb +10 -0
- data/spec/support/test_data_builder.rb +10 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '09bb5e6f6b13f93ded89b80289de3954432e5fbe'
|
4
|
+
data.tar.gz: 4091e9ee2e13413a98dd9179bd00118b92dfa85c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e12f025d4183d03cad7a7d45ebfd203357ddf63779f8cc39b359e83f30adec8eb3cc018b9d024d4e79ae435b1b847847a87f13dd5c8df5d789b15dac2c08c17
|
7
|
+
data.tar.gz: 64153bb8d9aef540cabd32fb6bdaeb1270f2d24ebdfcb17e6b558bf5b0bcb30236e8655c072396d8ef0b33aedfb87bfaee26398d6ad8365d28d8ad398050fe4f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
<a name="v2.7.0.beta.3"></a>
|
2
|
+
### v2.7.0.beta.3 (2017-11-01)
|
3
|
+
|
4
|
+
#### Features
|
5
|
+
|
6
|
+
* **matrix**
|
7
|
+
* implement querying by latest without a tag ([3d78f79](/../../commit/3d78f79))
|
8
|
+
* update query to handle tag and latest flag ([c5c800f](/../../commit/c5c800f))
|
9
|
+
* update validation of selectors to allow tag and latest flag to be specified ([0fa33f1](/../../commit/0fa33f1))
|
10
|
+
* parse latest=true and tag=TAG in matrix query ([abcab9e](/../../commit/abcab9e))
|
11
|
+
* update validation to allow latest tag to be specified ([6da6e02](/../../commit/6da6e02))
|
12
|
+
* allow version to be specified by latest_tag ([fe498a7](/../../commit/fe498a7))
|
13
|
+
|
14
|
+
* **pacticipant**
|
15
|
+
* expose repositoryUrl in resource ([8f0f16a](/../../commit/8f0f16a))
|
16
|
+
|
17
|
+
#### Bug Fixes
|
18
|
+
|
19
|
+
* correct captialization in require ([db2e676](/../../commit/db2e676))
|
20
|
+
|
1
21
|
<a name="v2.7.0.beta.2"></a>
|
2
22
|
### v2.7.0.beta.2 (2017-10-31)
|
3
23
|
|
data/RELEASING.md
CHANGED
@@ -1,15 +1,5 @@
|
|
1
1
|
# Releasing
|
2
2
|
|
3
|
-
|
4
|
-
2. Update the `CHANGELOG.md` using:
|
3
|
+
Run
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
3. Add files to git
|
9
|
-
|
10
|
-
$ git add CHANGELOG.md lib/pact_broker/version.rb
|
11
|
-
$ git commit -m "chore(release): version $(ruby -r ./lib/pact_broker/version.rb -e "puts PactBroker::VERSION")" && git push
|
12
|
-
|
13
|
-
3. Release:
|
14
|
-
|
15
|
-
$ bundle exec rake release
|
5
|
+
script/release.sh [major|minor|patch] # default is minor
|
@@ -32,9 +32,9 @@ module PactBroker
|
|
32
32
|
|
33
33
|
def from_json
|
34
34
|
if pacticipant
|
35
|
-
@pacticipant = pacticipant_service.update
|
35
|
+
@pacticipant = pacticipant_service.update params_with_string_keys.merge('name' => pacticipant_name)
|
36
36
|
else
|
37
|
-
@pacticipant = pacticipant_service.create
|
37
|
+
@pacticipant = pacticipant_service.create params_with_string_keys.merge('name' => pacticipant_name)
|
38
38
|
response.headers["Location"] = pacticipant_url(base_url, pacticipant)
|
39
39
|
end
|
40
40
|
response.body = to_json
|
@@ -62,9 +62,7 @@ module PactBroker
|
|
62
62
|
def pacticipant_name
|
63
63
|
identifier_from_path[:name]
|
64
64
|
end
|
65
|
-
|
66
65
|
end
|
67
66
|
end
|
68
|
-
|
69
67
|
end
|
70
68
|
end
|
@@ -32,7 +32,7 @@ module PactBroker
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def from_json
|
35
|
-
created_model = pacticipant_service.create
|
35
|
+
created_model = pacticipant_service.create params_with_string_keys
|
36
36
|
response.body = decorator_for(created_model).to_json(user_options: decorator_context)
|
37
37
|
end
|
38
38
|
|
@@ -55,9 +55,7 @@ module PactBroker
|
|
55
55
|
def new_model
|
56
56
|
@new_model ||= decorator_for(PactBroker::Domain::Pacticipant.new).from_json(request.body.to_s)
|
57
57
|
end
|
58
|
-
|
59
58
|
end
|
60
59
|
end
|
61
|
-
|
62
60
|
end
|
63
61
|
end
|
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'pact_broker/db'
|
2
|
+
require 'pact_broker/repositories/helpers'
|
2
3
|
|
3
4
|
module PactBroker
|
4
5
|
|
5
6
|
module Domain
|
6
7
|
class Tag < Sequel::Model
|
7
8
|
|
9
|
+
dataset_module do
|
10
|
+
include PactBroker::Repositories::Helpers
|
11
|
+
end
|
12
|
+
|
8
13
|
unrestrict_primary_key
|
9
14
|
|
10
15
|
associate(:many_to_one, :version, :class => "PactBroker::Domain::Version", :key => :version_id, :primary_key => :id)
|
@@ -5,7 +5,14 @@ module PactBroker
|
|
5
5
|
class ParseQuery
|
6
6
|
def self.call query
|
7
7
|
params = Rack::Utils.parse_nested_query(query)
|
8
|
-
selectors = (params['q'] || []).collect
|
8
|
+
selectors = (params['q'] || []).collect do |i|
|
9
|
+
p = {}
|
10
|
+
p[:pacticipant_name] = i['pacticipant'] if i['pacticipant']
|
11
|
+
p[:pacticipant_version_number] = i['version'] if i['version']
|
12
|
+
p[:latest] = true if i['latest'] == 'true'
|
13
|
+
p[:tag] = i['tag'] if i['tag']
|
14
|
+
p
|
15
|
+
end
|
9
16
|
options = {}
|
10
17
|
if params.key?('success') && params['success'].is_a?(Array)
|
11
18
|
options[:success] = params['success'].collect do | value |
|
@@ -37,6 +37,8 @@ module PactBroker
|
|
37
37
|
# If the version is nil, it means all versions for that pacticipant are to be included
|
38
38
|
#
|
39
39
|
def find_all selectors
|
40
|
+
selectors = look_up_versions_for_tags(selectors)
|
41
|
+
|
40
42
|
query = PactBroker::Pacts::LatestPactPublicationsByConsumerVersion
|
41
43
|
.select_append(:consumer_version_number, :provider_name, :consumer_name, :provider_version_id, :provider_version_number, :success)
|
42
44
|
.select_append(Sequel[:latest_pact_publications_by_consumer_versions][:created_at].as(:pact_created_at))
|
@@ -55,6 +57,29 @@ module PactBroker
|
|
55
57
|
.collect(&:values)
|
56
58
|
end
|
57
59
|
|
60
|
+
def look_up_versions_for_tags(selectors)
|
61
|
+
selectors.collect do | selector |
|
62
|
+
# resource validation currently stops tag being specified without latest=true
|
63
|
+
|
64
|
+
if selector[:tag] && selector[:latest]
|
65
|
+
version = version_repository.find_by_pacticpant_name_and_latest_tag(selector[:pacticipant_name], selector[:tag])
|
66
|
+
# validation in resource should ensure we always have a version
|
67
|
+
{
|
68
|
+
pacticipant_name: selector[:pacticipant_name],
|
69
|
+
pacticipant_version_number: version.number
|
70
|
+
}
|
71
|
+
elsif selector[:latest]
|
72
|
+
version = version_repository.find_latest_by_pacticpant_name(selector[:pacticipant_name])
|
73
|
+
{
|
74
|
+
pacticipant_name: selector[:pacticipant_name],
|
75
|
+
pacticipant_version_number: version.number
|
76
|
+
}
|
77
|
+
else
|
78
|
+
selector
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
58
83
|
def where_consumer_and_provider_within selectors, query
|
59
84
|
query.where{
|
60
85
|
Sequel.&(
|
@@ -23,25 +23,36 @@ module PactBroker
|
|
23
23
|
def validate_selectors selectors
|
24
24
|
error_messages = []
|
25
25
|
|
26
|
-
selectors.each do |
|
27
|
-
if
|
26
|
+
selectors.each do | s |
|
27
|
+
if s[:pacticipant_name].nil? && s[:pacticipant_version_number].nil?
|
28
28
|
error_messages << "Please specify the pacticipant name and version"
|
29
|
-
elsif
|
29
|
+
elsif s[:pacticipant_name].nil?
|
30
30
|
error_messages << "Please specify the pacticipant name"
|
31
|
+
else
|
32
|
+
if s.key?(:pacticipant_version_number) && s.key?(:latest)
|
33
|
+
error_messages << "A version and latest flag cannot both be specified for #{s[:pacticipant_name]}"
|
34
|
+
end
|
35
|
+
|
36
|
+
if s.key?(:tag) && !s.key?(:latest)
|
37
|
+
error_messages << "Querying for all versions with a tag is not currently supported. The latest=true flag must be specified when a tag is given."
|
38
|
+
end
|
31
39
|
end
|
32
40
|
end
|
33
41
|
|
34
42
|
selectors.collect{ |selector| selector[:pacticipant_name] }.compact.each do | pacticipant_name |
|
35
43
|
unless pacticipant_service.find_pacticipant_by_name(pacticipant_name)
|
36
|
-
error_messages << "Pacticipant
|
44
|
+
error_messages << "Pacticipant #{pacticipant_name} not found"
|
37
45
|
end
|
38
46
|
end
|
39
47
|
|
40
48
|
if error_messages.empty?
|
41
|
-
selectors.each do |
|
42
|
-
if
|
43
|
-
version = version_service.find_by_pacticipant_name_and_number(pacticipant_name:
|
44
|
-
error_messages << "No pact or verification found for #{
|
49
|
+
selectors.each do | s |
|
50
|
+
if s[:pacticipant_version_number]
|
51
|
+
version = version_service.find_by_pacticipant_name_and_number(pacticipant_name: s[:pacticipant_name], pacticipant_version_number: s[:pacticipant_version_number])
|
52
|
+
error_messages << "No pact or verification found for #{s[:pacticipant_name]} version #{s[:pacticipant_version_number]}" if version.nil?
|
53
|
+
elsif s[:tag]
|
54
|
+
version = version_service.find_by_pacticpant_name_and_latest_tag(s[:pacticipant_name], s[:tag])
|
55
|
+
error_messages << "No version of #{s[:pacticipant_name]} found with tag #{s[:tag]}" if version.nil?
|
45
56
|
end
|
46
57
|
end
|
47
58
|
end
|
@@ -70,13 +70,17 @@ module PactBroker
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def self.update params
|
73
|
-
pacticipant = pacticipant_repository.find_by_name(params.fetch(
|
74
|
-
pacticipant.
|
75
|
-
|
73
|
+
pacticipant = pacticipant_repository.find_by_name(params.fetch('name'))
|
74
|
+
PactBroker::Api::Decorators::PacticipantDecorator.new(pacticipant).from_hash(params)
|
75
|
+
pacticipant.save
|
76
|
+
pacticipant_repository.find_by_name(params.fetch('name'))
|
76
77
|
end
|
77
78
|
|
78
79
|
def self.create params
|
79
|
-
|
80
|
+
pacticipant = PactBroker::Domain::Pacticipant.new
|
81
|
+
PactBroker::Api::Decorators::PacticipantDecorator.new(pacticipant).from_hash(params)
|
82
|
+
pacticipant.save
|
83
|
+
pacticipant
|
80
84
|
end
|
81
85
|
|
82
86
|
def self.delete name
|
@@ -14,7 +14,7 @@ module PactBroker
|
|
14
14
|
|
15
15
|
def find args
|
16
16
|
PactBroker::Domain::Tag
|
17
|
-
.
|
17
|
+
.select_all_qualified
|
18
18
|
.join(:versions, {id: :version_id})
|
19
19
|
.join(:pacticipants, {Sequel.qualify("pacticipants", "id") => Sequel.qualify("versions", "pacticipant_id")})
|
20
20
|
.where(name_like(Sequel.qualify("tags", "name"), args.fetch(:tag_name)))
|
data/lib/pact_broker/version.rb
CHANGED
@@ -12,6 +12,26 @@ module PactBroker
|
|
12
12
|
PactBroker::Domain::Version.where(number: number, pacticipant_id: pacticipant_id).single_record
|
13
13
|
end
|
14
14
|
|
15
|
+
def find_by_pacticpant_name_and_latest_tag pacticipant_name, tag
|
16
|
+
PactBroker::Domain::Version
|
17
|
+
.select_all_qualified
|
18
|
+
.join(:pacticipants, {id: :pacticipant_id}, {implicit_qualifier: :versions})
|
19
|
+
.join(:tags, {version_id: :id}, {implicit_qualifier: :versions})
|
20
|
+
.where(name_like(Sequel[:tags][:name], tag))
|
21
|
+
.where(name_like(Sequel[:pacticipants][:name], pacticipant_name))
|
22
|
+
.reverse_order(:order)
|
23
|
+
.first
|
24
|
+
end
|
25
|
+
|
26
|
+
def find_latest_by_pacticpant_name pacticipant_name
|
27
|
+
PactBroker::Domain::Version
|
28
|
+
.select_all_qualified
|
29
|
+
.join(:pacticipants, {id: :pacticipant_id}, {implicit_qualifier: :versions})
|
30
|
+
.where(name_like(Sequel[:pacticipants][:name], pacticipant_name))
|
31
|
+
.reverse_order(:order)
|
32
|
+
.first
|
33
|
+
end
|
34
|
+
|
15
35
|
def find_by_pacticipant_name_and_number pacticipant_name, number
|
16
36
|
PactBroker::Domain::Version
|
17
37
|
.select(Sequel[:versions][:id], Sequel[:versions][:number], Sequel[:versions][:pacticipant_id], Sequel[:versions][:order], Sequel[:versions][:created_at], Sequel[:versions][:updated_at])
|
@@ -11,18 +11,15 @@ module PactBroker
|
|
11
11
|
version_repository.find_by_pacticipant_name_and_number params.fetch(:pacticipant_name), params.fetch(:pacticipant_version_number)
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.find_by_pacticpant_name_and_latest_tag(pacticipant_name, tag)
|
15
|
+
version_repository.find_by_pacticpant_name_and_latest_tag(pacticipant_name, tag)
|
16
|
+
end
|
17
|
+
|
14
18
|
def self.delete version
|
15
19
|
tag_repository.delete_by_version_id version.id
|
16
20
|
pact_repository.delete_by_version_id version.id
|
17
21
|
version_repository.delete_by_id version.id
|
18
22
|
end
|
19
|
-
|
20
|
-
def self.find_versions_by_selector selectors
|
21
|
-
selectors.collect do | selector |
|
22
|
-
pacticipant_name, type, number = selector.split("/")
|
23
|
-
version_repository.find_by_pacticipant_name_and_number pacticipant_name, number
|
24
|
-
end
|
25
|
-
end
|
26
23
|
end
|
27
24
|
end
|
28
25
|
end
|
data/pact_broker.gemspec
CHANGED
@@ -51,5 +51,5 @@ Gem::Specification.new do |gem|
|
|
51
51
|
gem.add_development_dependency 'database_cleaner', '~>1.6'
|
52
52
|
gem.add_development_dependency 'pg', '~>0.21'
|
53
53
|
gem.add_development_dependency 'conventional-changelog', '~>1.3'
|
54
|
-
|
54
|
+
gem.add_development_dependency 'bump', '~> 0.5'
|
55
55
|
end
|
data/script/release.sh
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
set -e
|
3
|
+
bundle exec bump ${1:-minor} --no-commit
|
4
|
+
bundle exec rake generate_changelog
|
5
|
+
git add CHANGELOG.md lib/pact_broker/version.rb
|
6
|
+
git commit -m "chore(release): version $(ruby -r ./lib/pact_broker/version.rb -e "puts PactBroker::VERSION")" && git push
|
7
|
+
bundle exec rake release
|
@@ -4,7 +4,7 @@ describe "Creating a pacticipant" do
|
|
4
4
|
let(:path) { "/pacticipants" }
|
5
5
|
let(:headers) { {'CONTENT_TYPE' => 'application/json'} }
|
6
6
|
let(:response_body) { JSON.parse(last_response.body, symbolize_names: true)}
|
7
|
-
let(:pacticipant_hash) { {name: 'Foo Thing'}}
|
7
|
+
let(:pacticipant_hash) { { name: 'Foo Thing' } }
|
8
8
|
|
9
9
|
subject { post path, pacticipant_hash.to_json, headers; last_response }
|
10
10
|
|
@@ -1,25 +1,23 @@
|
|
1
|
-
|
1
|
+
describe "Publishing a pact" do
|
2
2
|
|
3
|
-
let(:request_body) {
|
3
|
+
let(:request_body) { {'repositoryUrl' => 'http://foo'} }
|
4
4
|
let(:path) { "/pacticipants/Some%20Consumer" }
|
5
5
|
let(:response_body_json) { JSON.parse(subject.body) }
|
6
6
|
|
7
|
-
subject { patch path, request_body, {'CONTENT_TYPE' => 'application/json
|
7
|
+
subject { patch path, request_body.to_json, {'CONTENT_TYPE' => 'application/json' }; last_response }
|
8
8
|
|
9
9
|
context "when the pacticipant exists" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
TestDataBuilder.new.create_pacticipant("Some Consumer")
|
13
|
+
end
|
10
14
|
it "returns a 200 OK" do
|
11
|
-
|
15
|
+
puts subject.body unless subject.status == 200
|
16
|
+
expect(subject.status).to be 200
|
12
17
|
end
|
13
18
|
|
14
19
|
it "returns a json body with the updated pacticipant" do
|
15
|
-
expect(subject.headers['Content-Type']).to eq "application/json"
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
context "when the pacticipant does not exist" do
|
21
|
-
it "returns a 404" do
|
22
|
-
expect(subject.status).to be 404
|
20
|
+
expect(subject.headers['Content-Type']).to eq "application/hal+json;charset=utf-8"
|
23
21
|
end
|
24
22
|
end
|
25
23
|
end
|
@@ -47,7 +47,7 @@ module PactBroker
|
|
47
47
|
|
48
48
|
context "with valid JSON" do
|
49
49
|
it "creates the pacticipant" do
|
50
|
-
expect(PactBroker::Pacticipants::Service).to receive(:create).with(
|
50
|
+
expect(PactBroker::Pacticipants::Service).to receive(:create).with('name' => 'New Consumer')
|
51
51
|
subject
|
52
52
|
end
|
53
53
|
|
@@ -32,7 +32,7 @@ module PactBroker
|
|
32
32
|
let(:query) { "q[][wrong]=Foo&q[][blah]=1.2.3" }
|
33
33
|
|
34
34
|
it "returns nil keys or values" do
|
35
|
-
expect(subject.first).to eq [{
|
35
|
+
expect(subject.first).to eq [{}]
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -73,6 +73,30 @@ module PactBroker
|
|
73
73
|
expect(subject.last).to eq(success: [nil])
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
context "when latest is true" do
|
78
|
+
let(:query) { "q[][pacticipant]=Foo&q[][latest]=true" }
|
79
|
+
|
80
|
+
it "returns a selector with latest true" do
|
81
|
+
expect(subject.first).to eq [{ pacticipant_name: 'Foo', latest: true }]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "when latest is not true" do
|
86
|
+
let(:query) { "q[][pacticipant]=Foo&q[][latest]=false" }
|
87
|
+
|
88
|
+
it "returns a selector with no latest key" do
|
89
|
+
expect(subject.first).to eq [{ pacticipant_name: 'Foo' }]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "when there is a tag" do
|
94
|
+
let(:query) { "q[][pacticipant]=Foo&q[][tag]=prod" }
|
95
|
+
|
96
|
+
it "returns a selector with a tag" do
|
97
|
+
expect(subject.first).to eq [{ pacticipant_name: 'Foo', tag: 'prod' }]
|
98
|
+
end
|
99
|
+
end
|
76
100
|
end
|
77
101
|
end
|
78
102
|
end
|
@@ -32,15 +32,15 @@ module PactBroker
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it "returns an row with a blank provider_version_number" do
|
35
|
-
expect(subject
|
35
|
+
expect(subject).to include_hash_matching consumer_name: "A",
|
36
36
|
provider_name: "B",
|
37
37
|
consumer_version_number: "1.2.3",
|
38
38
|
provider_version_number: nil
|
39
39
|
|
40
|
-
expect(subject
|
40
|
+
expect(subject).to include_hash_matching({consumer_name: "A",
|
41
41
|
provider_name: "C",
|
42
42
|
consumer_version_number: "1.2.3",
|
43
|
-
provider_version_number: nil
|
43
|
+
provider_version_number: nil})
|
44
44
|
end
|
45
45
|
|
46
46
|
context "when only 2 version selectors are specified" do
|
@@ -219,6 +219,79 @@ module PactBroker
|
|
219
219
|
end
|
220
220
|
end
|
221
221
|
end
|
222
|
+
|
223
|
+
context "when the latest tag is specified for a provider instead of a version" do
|
224
|
+
before do
|
225
|
+
td.create_pact_with_hierarchy("A", "1.2.3", "B")
|
226
|
+
.create_verification(provider_version: "1.0.0")
|
227
|
+
.use_provider_version("1.0.0")
|
228
|
+
.create_provider_version_tag("prod")
|
229
|
+
.create_verification(provider_version: "2.0.0", number: 2)
|
230
|
+
.use_provider_version("2.0.0")
|
231
|
+
.create_provider_version_tag("prod")
|
232
|
+
.create_verification(provider_version: "3.0.0", number: 3)
|
233
|
+
end
|
234
|
+
|
235
|
+
let(:selectors) do
|
236
|
+
[
|
237
|
+
{ pacticipant_name: "A", pacticipant_version_number: "1.2.3" },
|
238
|
+
{ pacticipant_name: "B", latest: true, tag: "prod" }
|
239
|
+
]
|
240
|
+
end
|
241
|
+
|
242
|
+
subject { Repository.new.find(selectors) }
|
243
|
+
|
244
|
+
it "returns the row for the version " do
|
245
|
+
expect(subject.first).to include provider_version_number: "2.0.0"
|
246
|
+
expect(subject.size).to eq 1
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
context "when the latest version is specified for a provider without a tag" do
|
251
|
+
before do
|
252
|
+
td.create_pact_with_hierarchy("A", "1.2.3", "B")
|
253
|
+
.create_verification(provider_version: "1.0.0")
|
254
|
+
.use_provider_version("1.0.0")
|
255
|
+
.create_verification(provider_version: "2.0.0", number: 2)
|
256
|
+
.use_provider_version("2.0.0")
|
257
|
+
.create_verification(provider_version: "3.0.0", number: 3)
|
258
|
+
end
|
259
|
+
|
260
|
+
let(:selectors) do
|
261
|
+
[
|
262
|
+
{ pacticipant_name: "A", pacticipant_version_number: "1.2.3" },
|
263
|
+
{ pacticipant_name: "B", latest: true }
|
264
|
+
]
|
265
|
+
end
|
266
|
+
|
267
|
+
subject { Repository.new.find(selectors) }
|
268
|
+
|
269
|
+
it "returns the row for the version " do
|
270
|
+
expect(subject.first).to include provider_version_number: "3.0.0"
|
271
|
+
expect(subject.size).to eq 1
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
context "when the latest version is specified for a provider without a tag but the latest known version for a provider does not have a verification" do
|
276
|
+
before do
|
277
|
+
td.create_pact_with_hierarchy("A", "1.2.3", "B")
|
278
|
+
.create_verification(provider_version: "1.0.0")
|
279
|
+
.create_provider_version("5.0.0")
|
280
|
+
end
|
281
|
+
|
282
|
+
let(:selectors) do
|
283
|
+
[
|
284
|
+
{ pacticipant_name: "A", pacticipant_version_number: "1.2.3" },
|
285
|
+
{ pacticipant_name: "B", latest: true }
|
286
|
+
]
|
287
|
+
end
|
288
|
+
|
289
|
+
subject { Repository.new.find(selectors) }
|
290
|
+
|
291
|
+
it "returns no data - this may be confusing. Might need to re-think this logic." do
|
292
|
+
expect(subject.size).to eq 0
|
293
|
+
end
|
294
|
+
end
|
222
295
|
end
|
223
296
|
|
224
297
|
describe "#find_for_consumer_and_provider" do
|
@@ -36,7 +36,7 @@ module PactBroker
|
|
36
36
|
let(:selectors) { [{ pacticipant_name: "Foo", pacticipant_version_number: "1" }] }
|
37
37
|
|
38
38
|
it "returns error messages" do
|
39
|
-
expect(subject.first).to eq "Pacticipant
|
39
|
+
expect(subject.first).to eq "Pacticipant Foo not found"
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -70,6 +70,65 @@ module PactBroker
|
|
70
70
|
expect(subject.first).to eq "Please specify the pacticipant name and version"
|
71
71
|
end
|
72
72
|
end
|
73
|
+
|
74
|
+
context "when the latest_tag is used instead of a version" do
|
75
|
+
before do
|
76
|
+
td.create_pacticipant("Foo")
|
77
|
+
.create_version("1")
|
78
|
+
.create_tag("prod")
|
79
|
+
.create_pacticipant("Bar")
|
80
|
+
.create_version("2")
|
81
|
+
end
|
82
|
+
|
83
|
+
let(:selectors) { [{ pacticipant_name: "Foo", latest_tag: "prod" }, { pacticipant_name: "Bar", pacticipant_version_number: "2" }] }
|
84
|
+
|
85
|
+
context "when there is a version for the tag" do
|
86
|
+
it "returns no error messages" do
|
87
|
+
expect(subject).to eq []
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "when there is not a version for the tag" do
|
92
|
+
|
93
|
+
let(:selectors) { [{ pacticipant_name: "Foo", latest: true, tag: "wiffle" }, { pacticipant_name: "Bar", pacticipant_version_number: "2" }] }
|
94
|
+
|
95
|
+
it "returns an error message" do
|
96
|
+
expect(subject).to eq ["No version of Foo found with tag wiffle"]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "when the latest is used as well as a version" do
|
102
|
+
before do
|
103
|
+
td.create_pacticipant("Foo")
|
104
|
+
.create_version("1")
|
105
|
+
.create_tag("prod")
|
106
|
+
.create_pacticipant("Bar")
|
107
|
+
.create_version("2")
|
108
|
+
end
|
109
|
+
|
110
|
+
let(:selectors) { [{ pacticipant_name: "Foo", pacticipant_version_number: "1", latest: true }, { pacticipant_name: "Bar", pacticipant_version_number: "2" }] }
|
111
|
+
|
112
|
+
it "returns an error message" do
|
113
|
+
expect(subject).to eq ["A version and latest flag cannot both be specified for Foo"]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context "when a tag is specified without latest=true" do
|
118
|
+
before do
|
119
|
+
td.create_pacticipant("Foo")
|
120
|
+
.create_version("1")
|
121
|
+
.create_tag("prod")
|
122
|
+
.create_pacticipant("Bar")
|
123
|
+
.create_version("2")
|
124
|
+
end
|
125
|
+
|
126
|
+
let(:selectors) { [{ pacticipant_name: "Foo", tag: "1"}] }
|
127
|
+
|
128
|
+
it "returns an error message" do
|
129
|
+
expect(subject).to eq ["Querying for all versions with a tag is not currently supported. The latest=true flag must be specified when a tag is given."]
|
130
|
+
end
|
131
|
+
end
|
73
132
|
end
|
74
133
|
end
|
75
134
|
end
|
@@ -10,6 +10,22 @@ module PactBroker
|
|
10
10
|
|
11
11
|
subject{ Service }
|
12
12
|
|
13
|
+
let(:td) { TestDataBuilder.new }
|
14
|
+
|
15
|
+
describe ".update" do
|
16
|
+
before do
|
17
|
+
td.create_pacticipant("Foo")
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:params) { { 'name' => 'Foo', 'repositoryUrl' => 'http://foo' } }
|
21
|
+
|
22
|
+
subject { Service.update(params) }
|
23
|
+
|
24
|
+
it "updates the repositoryUrl" do
|
25
|
+
expect(subject.repository_url).to eq 'http://foo'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
13
29
|
describe ".messages_for_potential_duplicate_pacticipants" do
|
14
30
|
|
15
31
|
let(:base_url) { 'http://example.org' }
|
@@ -126,7 +142,6 @@ module PactBroker
|
|
126
142
|
it "returns a list of relationships" do
|
127
143
|
expect(subject.find_relationships).to eq([PactBroker::Domain::Relationship.create(consumer, provider, pact, verification, webhooks)])
|
128
144
|
end
|
129
|
-
|
130
145
|
end
|
131
146
|
|
132
147
|
describe "delete" do
|
@@ -5,9 +5,33 @@ module PactBroker
|
|
5
5
|
module Versions
|
6
6
|
describe Repository do
|
7
7
|
|
8
|
+
let(:td) { TestDataBuilder.new }
|
8
9
|
let(:pacticipant_name) { "test_pacticipant" }
|
9
10
|
let(:version_number) { "1.2.3" }
|
10
11
|
|
12
|
+
|
13
|
+
describe "#find_by_pacticpant_name_and_latest_tag" do
|
14
|
+
before do
|
15
|
+
td.create_consumer("Bar")
|
16
|
+
.create_consumer_version("2.3.4")
|
17
|
+
.create_consumer_version_tag("prod")
|
18
|
+
.create_consumer("Foo")
|
19
|
+
.create_consumer_version("1.2.3")
|
20
|
+
.create_consumer_version_tag("prod")
|
21
|
+
.create_consumer_version("2.3.4")
|
22
|
+
.create_consumer_version_tag("prod")
|
23
|
+
.create_consumer_version("5.6.7")
|
24
|
+
end
|
25
|
+
|
26
|
+
subject { Repository.new.find_by_pacticpant_name_and_latest_tag("Foo", "prod") }
|
27
|
+
|
28
|
+
it "returns the most recent version that has the specified tag" do
|
29
|
+
|
30
|
+
expect(subject.number).to eq "2.3.4"
|
31
|
+
expect(subject.pacticipant.name).to eq "Foo"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
11
35
|
describe "#create" do
|
12
36
|
context "when a previous version exists" do
|
13
37
|
|
@@ -4,44 +4,6 @@ module PactBroker
|
|
4
4
|
|
5
5
|
module Versions
|
6
6
|
describe Service do
|
7
|
-
|
8
|
-
describe ".find_versions_by_selector" do
|
9
|
-
|
10
|
-
context "without a version selector" do
|
11
|
-
let(:selector) { "Foo" }
|
12
|
-
end
|
13
|
-
|
14
|
-
context "with a version selector" do
|
15
|
-
before do
|
16
|
-
TestDataBuilder.new
|
17
|
-
.create_pacticipant("Foo")
|
18
|
-
.create_version("1.2.3")
|
19
|
-
.create_version("4.5.6")
|
20
|
-
.create_pacticipant("Bar")
|
21
|
-
.create_version("1.2.3")
|
22
|
-
end
|
23
|
-
|
24
|
-
let(:selector) { "Foo/version/1.2.3" }
|
25
|
-
|
26
|
-
subject { Service.find_versions_by_selector [selector] }
|
27
|
-
|
28
|
-
context "when the version exists" do
|
29
|
-
it "returns the specfied version" do
|
30
|
-
expect(subject.first.number).to eq "1.2.3"
|
31
|
-
expect(subject.first.pacticipant.name).to eq "Foo"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "when the version does not exist" do
|
36
|
-
let(:selector) { "Wiffle/version/0.0.0" }
|
37
|
-
|
38
|
-
it "returns nil" do
|
39
|
-
expect(subject.first).to eq nil
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
7
|
describe ".delete" do
|
46
8
|
let!(:version) do
|
47
9
|
TestDataBuilder.new
|
@@ -48,6 +48,20 @@ Pact.provider_states_for "Pact Broker Client" do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
provider_state "the pact for Foo version 1.2.3 has been successfully verified by Bar version 4.5.6 with tag prod, and 1.2.4 unsuccessfully by 9.9.9" do
|
52
|
+
set_up do
|
53
|
+
TestDataBuilder.new
|
54
|
+
.create_pact_with_hierarchy("Foo", "1.2.3", "Bar")
|
55
|
+
.create_verification(provider_version: "4.5.6")
|
56
|
+
.use_provider("Bar")
|
57
|
+
.use_provider_version("4.5.6")
|
58
|
+
.create_provider_version_tag("prod")
|
59
|
+
.create_consumer_version("1.2.4")
|
60
|
+
.create_pact
|
61
|
+
.create_verification(provider_version: "9.9.9", success: false)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
51
65
|
provider_state "the 'Pricing Service' does not exist in the pact-broker" do
|
52
66
|
no_op
|
53
67
|
end
|
@@ -41,3 +41,13 @@ RSpec::Matchers.define :be_a_404_response do
|
|
41
41
|
expect(actual.status).to be 404
|
42
42
|
end
|
43
43
|
end
|
44
|
+
|
45
|
+
RSpec::Matchers.define :include_hash_matching do |expected|
|
46
|
+
match do |array_of_hashes|
|
47
|
+
array_of_hashes.any? { |actual| slice(actual, expected.keys) == expected }
|
48
|
+
end
|
49
|
+
|
50
|
+
def slice actual, keys
|
51
|
+
keys.each_with_object({}) { |k, hash| hash[k] = actual[k] if actual.has_key?(k) }
|
52
|
+
end
|
53
|
+
end
|
@@ -154,6 +154,11 @@ class TestDataBuilder
|
|
154
154
|
self
|
155
155
|
end
|
156
156
|
|
157
|
+
def use_provider_version version_number
|
158
|
+
@provider_version = PactBroker::Domain::Version.where(pacticipant_id: @provider.id, number: version_number).single_record
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
157
162
|
def create_tag tag_name
|
158
163
|
@tag = PactBroker::Domain::Tag.create(name: tag_name, version: @version)
|
159
164
|
self
|
@@ -164,6 +169,11 @@ class TestDataBuilder
|
|
164
169
|
self
|
165
170
|
end
|
166
171
|
|
172
|
+
def create_provider_version_tag tag_name
|
173
|
+
@tag = PactBroker::Domain::Tag.create(name: tag_name, version: @provider_version)
|
174
|
+
self
|
175
|
+
end
|
176
|
+
|
167
177
|
def create_label label_name
|
168
178
|
@label = PactBroker::Domain::Label.create(name: label_name, pacticipant: @pacticipant)
|
169
179
|
self
|
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.7.0.beta.
|
4
|
+
version: 2.7.0.beta.3
|
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: 2017-
|
13
|
+
date: 2017-11-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -430,6 +430,20 @@ dependencies:
|
|
430
430
|
- - "~>"
|
431
431
|
- !ruby/object:Gem::Version
|
432
432
|
version: '1.3'
|
433
|
+
- !ruby/object:Gem::Dependency
|
434
|
+
name: bump
|
435
|
+
requirement: !ruby/object:Gem::Requirement
|
436
|
+
requirements:
|
437
|
+
- - "~>"
|
438
|
+
- !ruby/object:Gem::Version
|
439
|
+
version: '0.5'
|
440
|
+
type: :development
|
441
|
+
prerelease: false
|
442
|
+
version_requirements: !ruby/object:Gem::Requirement
|
443
|
+
requirements:
|
444
|
+
- - "~>"
|
445
|
+
- !ruby/object:Gem::Version
|
446
|
+
version: '0.5'
|
433
447
|
description: A server that stores and returns pact files generated by the pact gem.
|
434
448
|
It enables head/prod cross testing of the consumer and provider projects.
|
435
449
|
email:
|
@@ -796,6 +810,7 @@ files:
|
|
796
810
|
- script/publish-not-a-pact.sh
|
797
811
|
- script/publish.sh
|
798
812
|
- script/recreate-pg-db.sh
|
813
|
+
- script/release.sh
|
799
814
|
- script/seed-matrix.rb
|
800
815
|
- script/seed.rb
|
801
816
|
- script/update-hal-browser
|