Skip to content

Commit 45a8147

Browse files
committed
fix: remove route overlap and add tests for new routes
1 parent cb86795 commit 45a8147

11 files changed

+283
-4
lines changed

lib/pact_broker/api.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ def self.build_api(application_context = PactBroker::ApplicationContext.default_
3333
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "versions"], Api::Resources::PactVersions, {resource_name: "pact_publications"}
3434
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "versions", :consumer_version_number], Api::Resources::Pact, {resource_name: "pact_publication", deprecated: true} # Not the standard URL, but keep for backwards compatibility
3535
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "tag", :tag], Api::Resources::TaggedPactVersions, {resource_name: "tagged_pact_publications"}
36-
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "branch", :branch_name], Api::Resources::PactVersionsForBranch, {resource_name: "pact_publications_for_branch"}
3736
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "branch", "versions"], Api::Resources::PactVersionsForBranch, {resource_name: "pact_publications_for_main_branch"}
37+
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "branch", :branch_name], Api::Resources::PactVersionsForBranch, {resource_name: "pact_publications_for_branch"}
3838
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "branch", "latest", "versions"], Api::Resources::PactVersionsForBranch, {resource_name: "latest_pact_publications_for_main_branch"}
3939
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "branch", :branch_name, "latest", "versions"], Api::Resources::PactVersionsForBranch, {resource_name: "latest_pact_publications_for_branch"}
4040

lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,18 @@ def latest_for_main_branches
4646

4747
def for_main_branches
4848
consumers_join = { Sequel[:pact_publications][:consumer_id] => Sequel[:consumers][:id] }
49-
query = self
50-
query
49+
branch_versions_join = {
50+
Sequel[:branch_versions][:version_id] => Sequel[:pact_publications][:consumer_version_id],
51+
Sequel[:branch_versions][:branch_name] => Sequel[:consumers][:main_branch]
52+
}
53+
base_query = self
54+
55+
if no_columns_selected?
56+
base_query = base_query.select_all_qualified.select_append(Sequel[:branch_versions][:branch_name].as(:branch_name))
57+
end
58+
base_query
5159
.join(:pacticipants, consumers_join, { table_alias: :consumers })
60+
.join(:branch_versions, branch_versions_join)
5261
.remove_overridden_revisions_from_complete_query
5362
end
5463

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
3+
describe "retrieving all pact publications for a provider, for any consumers main branch" do
4+
let(:path) { "/pacts/provider/Provider/branch/foo" }
5+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
6+
7+
subject { get(path) }
8+
9+
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
12+
td.create_consumer("Consumer", main_branch: "main")
13+
.create_provider("Provider")
14+
.create_consumer_version("1", branch: "main")
15+
.create_pact(json_content: seed_example_data.pact_1)
16+
.create_consumer_version("2", branch: "main")
17+
.create_pact(json_content: seed_example_data.pact_1)
18+
.create_consumer_version("3", branch: "foo")
19+
.create_pact(json_content: seed_example_data.pact_1)
20+
.create_consumer_version("4", branch: "main")
21+
.create_pact(json_content: seed_example_data.pact_1)
22+
end
23+
24+
it "returns a list of latest pact publications for a provider, for any consumers main branch" do
25+
expect(json_response_body[:_links][:"pb:pacts"].length).to eq(1)
26+
end
27+
end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
3+
describe "retrieving latest pact publications for a provider, for any consumers main branch" do
4+
let(:path) { "/pacts/provider/Provider/branch/main/latest" }
5+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
6+
7+
subject { get(path) }
8+
9+
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
12+
td.create_consumer("Consumer", main_branch: "main")
13+
.create_provider("Provider")
14+
.create_consumer_version("1", branch: "main")
15+
.create_pact(json_content: seed_example_data.pact_1)
16+
.create_consumer_version("2", branch: "main")
17+
.create_pact(json_content: seed_example_data.pact_1)
18+
.create_consumer_version("3", branch: "foo")
19+
.create_pact(json_content: seed_example_data.pact_1)
20+
.create_consumer_version("4", branch: "main")
21+
.create_pact(json_content: seed_example_data.pact_1)
22+
end
23+
24+
it "returns a list of latest pact publications for a provider, for any consumers main branch" do
25+
expect(json_response_body[:_links][:"pb:pacts"].length).to eq(1)
26+
expect(json_response_body[:_links][:"pb:pacts"][0][:href]).to end_with("4")
27+
end
28+
end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
3+
describe "retrieving latest pact publications for a provider, for any consumers main branch" do
4+
let(:path) { "/pacts/provider/Provider/branch/latest" }
5+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
6+
7+
subject { get(path) }
8+
9+
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
12+
td.create_consumer("Consumer", main_branch: "main")
13+
.create_provider("Provider")
14+
.create_consumer_version("1", branch: "main")
15+
.create_pact(json_content: seed_example_data.pact_1)
16+
.create_consumer_version("2", branch: "main")
17+
.create_pact(json_content: seed_example_data.pact_1)
18+
.create_consumer_version("3", branch: "foo")
19+
.create_pact(json_content: seed_example_data.pact_1)
20+
.create_consumer_version("4", branch: "main")
21+
.create_pact(json_content: seed_example_data.pact_1)
22+
end
23+
24+
it "returns a list of latest pact publications for a provider, for any consumers main branch" do
25+
expect(json_response_body[:_links][:"pb:pacts"].length).to eq(1)
26+
expect(json_response_body[:_links][:"pb:pacts"][0][:href]).to end_with("4")
27+
end
28+
end
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
13
describe "retrieving the latest pact for a branch" do
24
let(:path) { "/pacts/provider/Provider/consumer/Consumer/branch/main/latest" }
35
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
46

57
subject { get(path) }
68

79
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
812
td.create_consumer("Consumer")
913
.create_provider("Provider")
1014
.create_consumer_version("1", branch: "main")
1115
.create_pact
1216
.create_consumer_version("2", branch: "main")
13-
.create_pact
17+
.create_pact(json_content: seed_example_data.pact_1)
1418
.create_consumer_version("3", branch: "foo")
1519
.create_pact
1620
.create_consumer_version("4", branch: "main")
1721
end
1822

1923
it "returns the latest pact for the branch" do
2024
expect(json_response_body[:_links][:self][:href]).to end_with("2")
25+
expect(json_response_body[:interactions].length).to eq(1)
26+
expect(json_response_body[:interactions][0][:description]).to eq("a request for an alligator")
2127
end
2228
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
3+
describe "retrieving latest pact publications for main branch" do
4+
let(:path) { "/pacts/provider/Provider/consumer/Consumer/branch/foo/latest/versions" }
5+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
6+
7+
subject { get(path) }
8+
9+
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
12+
td.create_consumer("Consumer", main_branch: "main")
13+
.create_provider("Provider")
14+
.create_consumer_version("1", branch: "main")
15+
.create_pact(json_content: seed_example_data.pact_1)
16+
.create_consumer_version("2", branch: "main")
17+
.create_pact(json_content: seed_example_data.pact_1)
18+
.create_consumer_version("3", branch: "foo")
19+
.create_pact
20+
.create_consumer_version("4", branch: "main")
21+
.create_pact(json_content: seed_example_data.pact_1)
22+
end
23+
24+
it "returns the latest pact for the branch" do
25+
expect(json_response_body[:_embedded][:pacts].length).to eq(1)
26+
expect(json_response_body[:_embedded][:pacts][0][:_embedded][:consumerVersion][:number]).to eq("3")
27+
expect(json_response_body[:_links][:"pact-versions"].length).to eq(1)
28+
expect(json_response_body[:_links][:"pact-versions"][0][:name]).to include("Version 3")
29+
end
30+
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
3+
describe "retrieving latest pact publications for main branch" do
4+
let(:path) { "/pacts/provider/Provider/consumer/Consumer/branch/latest/versions" }
5+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
6+
7+
subject { get(path) }
8+
9+
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
12+
td.create_consumer("Consumer", main_branch: "main")
13+
.create_provider("Provider")
14+
.create_consumer_version("1", branch: "main")
15+
.create_pact(json_content: seed_example_data.pact_1)
16+
.create_consumer_version("2", branch: "main")
17+
.create_pact(json_content: seed_example_data.pact_1)
18+
.create_consumer_version("3", branch: "foo")
19+
.create_pact
20+
.create_consumer_version("4", branch: "main")
21+
.create_pact(json_content: seed_example_data.pact_1)
22+
end
23+
24+
it "returns the latest pact for the branch" do
25+
expect(json_response_body[:_embedded][:pacts].length).to eq(1)
26+
expect(json_response_body[:_embedded][:pacts][0][:_embedded][:consumerVersion][:number]).to eq("4")
27+
expect(json_response_body[:_links][:"pact-versions"].length).to eq(1)
28+
expect(json_response_body[:_links][:"pact-versions"][0][:name]).to include("Version 4")
29+
end
30+
end
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
3+
describe "retrieving all pact publications for a provider, for any consumers main branch" do
4+
let(:path) { "/pacts/provider/Provider/branch" }
5+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
6+
7+
subject { get(path) }
8+
9+
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
12+
td.create_consumer("Consumer", main_branch: "main")
13+
.create_provider("Provider")
14+
.create_consumer_version("1", branch: "main")
15+
.create_pact(json_content: seed_example_data.pact_1)
16+
.create_consumer_version("2", branch: "main")
17+
.create_pact(json_content: seed_example_data.pact_1)
18+
.create_consumer_version("3", branch: "foo")
19+
.create_pact(json_content: seed_example_data.pact_1)
20+
.create_consumer_version("4", branch: "main")
21+
.create_pact(json_content: seed_example_data.pact_1)
22+
end
23+
24+
it "returns a list of latest pact publications for a provider, for any consumers main branch" do
25+
expect(json_response_body[:_links][:"pb:pacts"].length).to eq(3)
26+
end
27+
end
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
require "lib/pact_broker/db/seed_example_data"
2+
3+
describe "retrieving pact publications for specified branch" do
4+
let(:path) { "/pacts/provider/Provider/consumer/Consumer/branch/foo" }
5+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
6+
7+
subject { get(path) }
8+
9+
before do
10+
seed_example_data = PactBroker::DB::SeedExampleData.new
11+
12+
td.create_consumer("Consumer", main_branch: "main")
13+
.create_provider("Provider")
14+
.create_consumer_version("1", branch: "main")
15+
.create_pact
16+
.create_consumer_version("2", branch: "main")
17+
.create_pact(json_content: seed_example_data.pact_1)
18+
.create_consumer_version("3", branch: "foo")
19+
.create_pact
20+
.create_consumer_version("4", branch: "main")
21+
.create_consumer_version("5", branch: "foo")
22+
.create_pact
23+
end
24+
25+
it "returns the pact publications for associated consumers named branch" do
26+
expect(json_response_body[:_embedded][:pacts].length).to eq(2)
27+
expect(json_response_body[:_embedded][:pacts][0][:_embedded][:consumerVersion][:number]).to eq("3")
28+
expect(json_response_body[:_embedded][:pacts][1][:_embedded][:consumerVersion][:number]).to eq("5")
29+
expect(json_response_body[:_links][:"pact-versions"].length).to eq(2)
30+
expect(json_response_body[:_links][:"pact-versions"][0][:name]).to include("Version 3")
31+
expect(json_response_body[:_links][:"pact-versions"][1][:name]).to include("Version 5")
32+
end
33+
end
34+
35+
describe "retrieving pact publications for specified branch" do
36+
let(:path) { "/pacts/provider/Provider/consumer/Consumer/branch/main" }
37+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
38+
39+
subject { get(path) }
40+
41+
before do
42+
seed_example_data = PactBroker::DB::SeedExampleData.new
43+
44+
td.create_consumer("Consumer")
45+
.create_provider("Provider")
46+
.create_consumer_version("1", branch: "main")
47+
.create_pact
48+
.create_consumer_version("2", branch: "main")
49+
.create_pact(json_content: seed_example_data.pact_1)
50+
.create_consumer_version("3", branch: "foo")
51+
.create_pact
52+
.create_consumer_version("4", branch: "main")
53+
end
54+
55+
it "returns the latest pact for the branch" do
56+
expect(json_response_body[:_embedded][:pacts].length).to eq(2)
57+
expect(json_response_body[:_embedded][:pacts][0][:_embedded][:consumerVersion][:number]).to eq("1")
58+
expect(json_response_body[:_embedded][:pacts][1][:_embedded][:consumerVersion][:number]).to eq("2")
59+
expect(json_response_body[:_links][:"pact-versions"].length).to eq(2)
60+
expect(json_response_body[:_links][:"pact-versions"][0][:name]).to include("Version 1")
61+
expect(json_response_body[:_links][:"pact-versions"][1][:name]).to include("Version 2")
62+
end
63+
end

0 commit comments

Comments
 (0)