pact_broker 1.5.0 → 1.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17b10186ffac951ca6a1d81ca4c4941b378d8e72
4
- data.tar.gz: 8cfabd6ed5d782788096d445ae46e098679d0fcd
3
+ metadata.gz: e750616e35159ab4915a82899463fb4726c3f1a0
4
+ data.tar.gz: 194233d951cfa4bc3b4039efbaac97f19ecf88f7
5
5
  SHA512:
6
- metadata.gz: 758286a2af8b8d56f12763e6b2a4c5f156186ed95a2f37ed4e30b24a8c2d79903fcdd54444317a3cef9fd67811cd5d8c9fed66e950aa9d5244e87b0949d0025b
7
- data.tar.gz: c6db590d2225a0738a0b0dd9c8c1582ef1f887905990b383951537a9df23fdc5f1158c75de76242978d4c01689b66bce1f723f5c2f28438561cc5c5a24dbc3fb
6
+ metadata.gz: fe4b4e81c2224d8ef238c3ddc8f5539b435dcadf5c87add833e9992d4e5ca79ad8463aff7a337601826be1fccd148cc709a6ca9b43c922a618ddf259b0b35eeb
7
+ data.tar.gz: 3a3b9df99e3e07546c2088297e6baf3b15d6928d0190642de12ed86bcd627b56412c40f486793954600f1c1aa368cd178fbea307f85d9f04e1db65be669b016e
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  Do this to generate your change history
2
2
 
3
- $ git log --pretty=format:' * %h - %s (%an, %ad)'
3
+ $ git log --pretty=format:' * %h - %s (%an, %ad)' vX.Y.Z..HEAD
4
+
5
+ #### 1.6.0 (2015-03-20)
6
+
7
+ * e20e657 - Added support for JSON contracts that are not in the Pact format (e.g. top level is an array) (Beth Skurrie, Fri Mar 20 19:12:46 2015 +1100)
4
8
 
5
9
  #### 1.5.0 (2015-02-20)
6
10
 
data/README.md CHANGED
@@ -94,7 +94,7 @@ Use the HAL browser to view documentation as you browse.
94
94
  * Copy the [example](/example) directory to the location you want to install the application.
95
95
  * Modify the config.ru and Gemfile as desired (eg. choose database driver gem, set your database credentials. Use the "pg" gem if using Postgres.)
96
96
  * Please ensure you use `encoding: 'utf8'` in your Sequel options to avoid encoding issues.
97
- * For production usage, use a web application server like [Phusion Passenger](https://www.phusionpassenger.com) or [Nginx][http://nginx.org/] to serve the Pact Broker application.
97
+ * For production usage, use a web application server like [Phusion Passenger](https://www.phusionpassenger.com) or [Nginx](http://nginx.org/) to serve the Pact Broker application.
98
98
  * Deploy to your location of choice.
99
99
 
100
100
  [decouple]: http://techblog.realestate.com.au/enter-the-pact-matrix-or-how-to-decouple-the-release-cycles-of-your-microservices/
@@ -13,7 +13,12 @@ module PactBroker
13
13
  include Timestamps
14
14
 
15
15
  def to_hash(options = {})
16
- ::JSON.parse(represented.json_content, PACT_PARSING_OPTIONS).merge super
16
+ parsed_content = represented.content_hash
17
+ if parsed_content.is_a?(::Hash)
18
+ parsed_content.merge super
19
+ else
20
+ parsed_content
21
+ end
17
22
  end
18
23
 
19
24
  link :self do | options |
@@ -9,6 +9,8 @@ module PactBroker
9
9
  module Renderers
10
10
  class HtmlPactRenderer
11
11
 
12
+ class NotAPactError < StandardError; end
13
+
12
14
  def self.call pact
13
15
  new(pact).call
14
16
  end
@@ -69,6 +71,11 @@ module PactBroker
69
71
 
70
72
  def markdown
71
73
  Pact::Doc::Markdown::ConsumerContractRenderer.call consumer_contract
74
+ rescue NotAPactError
75
+ heading = "### A contract between #{@pact.consumer.name} and #{@pact.provider.name}"
76
+ warning = "_Note: this contract could not be parsed to a Pact, showing raw content instead._"
77
+ pretty_json = JSON.pretty_generate(@pact.content_hash)
78
+ "#{heading}\n#{warning}\n```json\n#{pretty_json}\n```\n"
72
79
  end
73
80
 
74
81
  def html
@@ -77,6 +84,8 @@ module PactBroker
77
84
 
78
85
  def consumer_contract
79
86
  Pact::ConsumerContract.from_json(@json_content)
87
+ rescue
88
+ raise NotAPactError
80
89
  end
81
90
 
82
91
  end
@@ -12,18 +12,21 @@ module PactBroker
12
12
 
13
13
  def self.from_request request, path_info
14
14
  json_content = request.body.to_s
15
- pact_hash = begin
15
+ parsed_content = begin
16
16
  JSON.parse(json_content, PACT_PARSING_OPTIONS)
17
17
  rescue
18
18
  {}
19
19
  end
20
20
 
21
+ consumer_name_in_pact = parsed_content.is_a?(Hash) ? parsed_content.fetch('consumer',{})['name'] : nil
22
+ provider_name_in_pact = parsed_content.is_a?(Hash) ? parsed_content.fetch('provider',{})['name'] : nil
23
+
21
24
  new(
22
25
  consumer_name: path_info.fetch(:consumer_name),
23
26
  provider_name: path_info.fetch(:provider_name),
24
27
  consumer_version_number: path_info.fetch(:consumer_version_number),
25
- consumer_name_in_pact: pact_hash.fetch('consumer',{})['name'],
26
- provider_name_in_pact: pact_hash.fetch('provider',{})['name'],
28
+ consumer_name_in_pact: consumer_name_in_pact,
29
+ provider_name_in_pact: provider_name_in_pact,
27
30
  json_content: json_content
28
31
  )
29
32
  end
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '1.5.0'
2
+ VERSION = '1.6.0'
3
3
  end
data/script/publish-2.sh CHANGED
@@ -1,3 +1,3 @@
1
1
  curl -v -XPUT \-H "Content-Type: application/json" \
2
2
  -d@spec/fixtures/a_consumer-a_provider-2.json \
3
- http://localhost:9292/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.0.1
3
+ http://localhost:9292/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.0.1
@@ -0,0 +1,3 @@
1
+ curl -v -XPUT \-H "Content-Type: application/json" \
2
+ -d '[1]' \
3
+ http://localhost:9292/pacts/provider/A%20Not%20Pact%20Provider/consumer/A%20Not%20Pact%20Consumer/version/1.0.0
data/script/publish.sh CHANGED
@@ -1,3 +1,3 @@
1
1
  curl -v -XPUT \-H "Content-Type: application/json" \
2
2
  -d@spec/fixtures/a_consumer-a_provider.json \
3
- http://localhost:9292/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.0.0
3
+ http://localhost:9292/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.0.0
@@ -0,0 +1,37 @@
1
+ describe "Publishing a contract that is not a pact" do
2
+
3
+ let(:path) { "/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.2.3" }
4
+ let(:parsed_response_body) { JSON.parse(subject.body) }
5
+
6
+ subject { put path, pact_content, {'CONTENT_TYPE' => 'application/json' }; last_response }
7
+
8
+ context "when the pact is another type of CDC that doesn't have the Consumer or Provider names in the expected places" do
9
+ let(:pact_content) { {a: 'not pact'}.to_json }
10
+
11
+ it "accepts the un-pact Pact" do
12
+ expect(subject.status).to be 201
13
+ end
14
+
15
+ it "returns the content" do
16
+ expect(parsed_response_body).to include 'a' => 'not pact'
17
+ end
18
+
19
+ it "returns _links" do
20
+ expect(parsed_response_body).to have_key '_links'
21
+ end
22
+ end
23
+
24
+ context "when the content is an array" do
25
+
26
+ let(:pact_content) { '[1]' }
27
+
28
+ it "accepts the un-pact Pact" do
29
+ expect(subject.status).to be 201
30
+ end
31
+
32
+ it "returns the content" do
33
+ expect(parsed_response_body).to eq [1]
34
+ end
35
+
36
+ end
37
+ end
@@ -46,13 +46,4 @@ describe "Publishing a pact" do
46
46
  expect(subject).to be_a_json_error_response "does not match"
47
47
  end
48
48
  end
49
-
50
- context "when the pact is another type of CDC that doesn't have the Consumer or Provider names in the expected places" do
51
- let(:pact_content) { {}.to_json }
52
-
53
- it "accepts the un-pact Pact" do
54
- expect(subject.status).to be 201
55
- end
56
- end
57
-
58
49
  end
@@ -9,20 +9,20 @@ module PactBroker
9
9
 
10
10
  describe PactDecorator do
11
11
 
12
- let(:json_content) {
12
+ let(:content_hash) {
13
13
  {
14
14
  'consumer' => {'name' => 'Consumer'},
15
15
  'provider' => {'name' => 'Provider'},
16
16
  'interactions' => [],
17
17
  'metadata' => {}
18
- }.to_json
18
+ }
19
19
  }
20
20
 
21
21
  let(:base_url) { 'http://example.org' }
22
22
  let(:created_at) { Time.new(2014, 3, 4) }
23
23
  let(:updated_at) { Time.new(2014, 3, 5) }
24
24
  let(:pact) { double('pact',
25
- json_content: json_content,
25
+ content_hash: content_hash,
26
26
  created_at: created_at,
27
27
  updated_at: updated_at,
28
28
  consumer: consumer,
@@ -93,6 +93,13 @@ module PactBroker
93
93
  it "includes a curie" do
94
94
  expect(subject[:_links][:curies]).to eq [{ name: "pb", href: "http://example.org/doc/{rel}", templated: true }]
95
95
  end
96
+
97
+ context "when the json_content is not a Hash" do
98
+ let(:content_hash) { [1] }
99
+ it "returns the plain JSON without any links" do
100
+ expect(subject).to eq content_hash
101
+ end
102
+ end
96
103
  end
97
104
 
98
105
  end
@@ -16,9 +16,10 @@ module PactBroker
16
16
  end
17
17
 
18
18
  let(:consumer) { double('consumer', name: 'Consumer')}
19
+ let(:provider) { double('provider', name: 'Provider')}
19
20
  let(:created_at) { DateTime.new(2014, 02, 27) }
20
21
  let(:json_content) { load_fixture('renderer_pact.json') }
21
- let(:pact) { double('pact', json_content: json_content, updated_at: created_at, consumer_version_number: '1.2.3', consumer: consumer)}
22
+ let(:pact) { double('pact', json_content: json_content, updated_at: created_at, consumer_version_number: '1.2.3', consumer: consumer, provider: provider)}
22
23
  let(:pact_url) { '/pact/url' }
23
24
 
24
25
  before do
@@ -40,6 +41,26 @@ module PactBroker
40
41
  expect(subject).to include("Date published:")
41
42
  expect(subject).to include("Thu 27 Feb 2014, 11:00am +11:00")
42
43
  end
44
+
45
+ context "when the content is not a valid pact, but is still JSON" do
46
+ before do
47
+ allow(pact).to receive(:content_hash).and_return(content_hash)
48
+ end
49
+ let(:json_content) { '[1]' }
50
+ let(:content_hash) { [1] }
51
+
52
+ it "includes a dismissive title" do
53
+ expect(subject).to include "A contract between Consumer and Provider"
54
+ end
55
+
56
+ it "includes a warning" do
57
+ expect(subject).to include "Note:"
58
+ end
59
+
60
+ it "renders the JSON in HTML" do
61
+ expect(subject).to match /\[\s+1\s+\]/m
62
+ end
63
+ end
43
64
  end
44
65
 
45
66
  end
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: 1.5.0
4
+ version: 1.6.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: 2015-02-20 00:00:00.000000000 Z
13
+ date: 2015-03-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -552,6 +552,7 @@ files:
552
552
  - public/stylesheets/pact.css
553
553
  - public/stylesheets/relationships.css
554
554
  - script/publish-2.sh
555
+ - script/publish-not-a-pact.sh
555
556
  - script/publish.sh
556
557
  - script/update-hal-browser
557
558
  - spec/features/create_webhook_spec.rb
@@ -559,6 +560,7 @@ files:
559
560
  - spec/features/get_diff.rb
560
561
  - spec/features/get_previous_distinct_version.rb
561
562
  - spec/features/get_version.rb
563
+ - spec/features/publish_not_a_pact_spec.rb
562
564
  - spec/features/publish_pact_spec.rb
563
565
  - spec/features/update_pacticipant_spec.rb
564
566
  - spec/fixtures/a_consumer-a_provider-2.json
@@ -709,6 +711,7 @@ test_files:
709
711
  - spec/features/get_diff.rb
710
712
  - spec/features/get_previous_distinct_version.rb
711
713
  - spec/features/get_version.rb
714
+ - spec/features/publish_not_a_pact_spec.rb
712
715
  - spec/features/publish_pact_spec.rb
713
716
  - spec/features/update_pacticipant_spec.rb
714
717
  - spec/fixtures/a_consumer-a_provider-2.json