pact_broker 1.2.0 → 1.3.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 (67) hide show
  1. checksums.yaml +13 -5
  2. data/.gitignore +2 -0
  3. data/CHANGELOG.md +5 -0
  4. data/README.md +2 -1
  5. data/Rakefile +1 -3
  6. data/db/migrations/07_increase_json_content_length.rb +6 -1
  7. data/db/migrations/08_create_latest_pact_view.rb +7 -5
  8. data/db/migrations/14_add_timestamps_to_pact_views.rb +28 -0
  9. data/lib/pact_broker/api.rb +0 -4
  10. data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +4 -1
  11. data/lib/pact_broker/api/decorators/pact_decorator.rb +2 -2
  12. data/lib/pact_broker/api/decorators/pact_version_decorator.rb +3 -4
  13. data/lib/pact_broker/api/decorators/pact_versions_decorator.rb +4 -4
  14. data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +3 -2
  15. data/lib/pact_broker/api/decorators/tag_decorator.rb +2 -2
  16. data/lib/pact_broker/api/decorators/timestamps.rb +24 -0
  17. data/lib/pact_broker/api/decorators/webhook_decorator.rb +2 -2
  18. data/lib/pact_broker/api/decorators/webhooks_decorator.rb +4 -4
  19. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +16 -4
  20. data/lib/pact_broker/api/resources/base_resource.rb +0 -1
  21. data/lib/pact_broker/api/resources/group.rb +11 -6
  22. data/lib/pact_broker/api/resources/index.rb +5 -6
  23. data/lib/pact_broker/api/resources/latest_pact.rb +8 -5
  24. data/lib/pact_broker/api/resources/latest_pacts.rb +3 -3
  25. data/lib/pact_broker/api/resources/pact.rb +9 -5
  26. data/lib/pact_broker/api/resources/pact_webhooks.rb +9 -5
  27. data/lib/pact_broker/api/resources/pacticipant.rb +10 -5
  28. data/lib/pact_broker/api/resources/relationships.rb +3 -3
  29. data/lib/pact_broker/api/resources/tag.rb +8 -7
  30. data/lib/pact_broker/api/resources/webhook.rb +1 -1
  31. data/lib/pact_broker/api/resources/webhook_execution.rb +1 -1
  32. data/lib/pact_broker/app.rb +8 -57
  33. data/lib/pact_broker/logging.rb +1 -0
  34. data/lib/pact_broker/models/pact.rb +6 -8
  35. data/lib/pact_broker/repositories/pact.rb +29 -0
  36. data/lib/pact_broker/repositories/pact_content.rb +0 -0
  37. data/lib/pact_broker/repositories/pact_repository.rb +66 -21
  38. data/lib/pact_broker/repositories/tag_repository.rb +1 -1
  39. data/lib/pact_broker/repositories/version_repository.rb +2 -1
  40. data/lib/pact_broker/services/pact_service.rb +14 -16
  41. data/lib/pact_broker/ui.rb +2 -0
  42. data/lib/pact_broker/ui/app.rb +81 -0
  43. data/lib/pact_broker/ui/controllers/groups.rb +1 -1
  44. data/lib/pact_broker/version.rb +1 -1
  45. data/lib/rack/pact_broker/convert_file_extension_to_accept_header.rb +44 -0
  46. data/pact_broker.gemspec +1 -0
  47. data/public/javascripts/highlight.pack.js +1 -0
  48. data/public/stylesheets/github-json.css +127 -0
  49. data/public/stylesheets/pact.css +4 -0
  50. data/spec/fixtures/consumer-provider.json +21 -0
  51. data/spec/integration/app_spec.rb +165 -0
  52. data/spec/integration/endpoints/pact_put_spec.rb +43 -0
  53. data/spec/lib/pact_broker/api/decorators/latest_pact_decorator_spec.rb +42 -0
  54. data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +5 -0
  55. data/spec/lib/pact_broker/api/decorators/pacticipant_decorator_spec.rb +2 -1
  56. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +9 -2
  57. data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +14 -3
  58. data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +88 -4
  59. data/spec/lib/pact_broker/repositories/tag_repository_spec.rb +2 -0
  60. data/spec/lib/pact_broker/repositories/version_repository_spec.rb +20 -2
  61. data/spec/lib/pact_broker/services/pacticipant_service_spec.rb +1 -1
  62. data/spec/service_consumers/pact_helper.rb +2 -17
  63. data/spec/spec_helper.rb +4 -22
  64. data/spec/support/database_cleaner.rb +18 -0
  65. data/spec/support/fixture_helpers.rb +10 -0
  66. data/spec/support/provider_state_builder.rb +4 -15
  67. metadata +82 -47
@@ -0,0 +1,43 @@
1
+ describe "pacts/provider/:provider/consumer/:consumer/version/:version" do
2
+ describe "PUT" do
3
+
4
+ let(:pact_content) { load_fixture('consumer-provider.json') }
5
+ let(:path) { "/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.2.3" }
6
+ let(:response_body_json) { JSON.parse(subject.body) }
7
+
8
+ subject { put path, pact_content, {'CONTENT_TYPE' => 'application/json' }; last_response }
9
+
10
+ context "when the pact does not exist" do
11
+ it "returns a 201 Created" do
12
+ expect(subject.status).to be 201
13
+ end
14
+
15
+ it "returns a json body" do
16
+ expect(subject.headers['Content-Type']).to eq "application/json"
17
+ end
18
+
19
+ it "returns the pact in the body" do
20
+ expect(response_body_json).to include JSON.parse(pact_content)
21
+ end
22
+ end
23
+
24
+ context "when the pact does exist" do
25
+
26
+ before do
27
+ ProviderStateBuilder.new.create_pact_with_hierarchy "A Consumer", "1.2.3", "A Provider"
28
+ end
29
+
30
+ it "returns a 200 Success" do
31
+ expect(subject.status).to be 200
32
+ end
33
+
34
+ it "returns a json body" do
35
+ expect(subject.headers['Content-Type']).to eq "application/json"
36
+ end
37
+
38
+ it "returns the pact in the body" do
39
+ expect(response_body_json).to include JSON.parse(pact_content)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/api/decorators/latest_pact_decorator'
3
+
4
+ module PactBroker
5
+
6
+ module Api
7
+
8
+ module Decorators
9
+
10
+ describe LatestPactDecorator do
11
+
12
+ let(:pact) { RepresentablePact.new(ProviderStateBuilder.new.create_pact_with_hierarchy 'Consumer', '1.2.3', 'Provider') }
13
+ let(:base_url) { 'http://example.org' }
14
+
15
+ subject { JSON.parse LatestPactDecorator.new(pact).to_json(base_url: base_url), symbolize_names: true}
16
+
17
+ it "includes the createdAt date" do
18
+ expect(subject[:createdAt]).to_not be_nil
19
+ end
20
+
21
+ context "when the updatedAt is the same as the createdAt" do
22
+ it "does not include the updatedAt date" do
23
+ expect(subject[:updatedAt]).to be_nil
24
+ end
25
+ end
26
+
27
+ context "when the updatedAt is not the same as the createdAt" do
28
+ let(:pact) do
29
+ pact = ProviderStateBuilder.new.create_pact_with_hierarchy 'Consumer', '1.2.3', 'Provider'
30
+ pact.updated_at = pact.created_at + 1
31
+ RepresentablePact.new(pact)
32
+ end
33
+
34
+ it "includes the updatedAt date" do
35
+ expect(subject[:updatedAt]).to_not be_nil
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -43,6 +43,11 @@ module PactBroker
43
43
  expect(subject[:_embedded][:consumerVersion][:_links][:self][:href]).to eq "http://example.org/pacticipants/Consumer/versions/1234"
44
44
  end
45
45
 
46
+ it "includes timestamps" do
47
+ expect(subject[:createdAt]).to_not be_nil
48
+ expect(subject[:updatedAt]).to_not be_nil
49
+ end
50
+
46
51
  end
47
52
  end
48
53
  end
@@ -16,8 +16,9 @@ module PactBroker
16
16
 
17
17
  subject { JSON.parse PacticipantRepresenter.new(pacticipant).to_json, symbolize_names: true }
18
18
 
19
- it "includes the createdAt timestamp" do
19
+ it "includes timestamps" do
20
20
  expect(subject[:createdAt]).to eq created_at.xmlschema
21
+ expect(subject[:updatedAt]).to eq updated_at.xmlschema
21
22
  end
22
23
  end
23
24
  end
@@ -22,6 +22,8 @@ module PactBroker
22
22
 
23
23
  let(:consumer) { Models::Pacticipant.new(name: 'Consumer') }
24
24
  let(:provider) { Models::Pacticipant.new(name: 'Provider') }
25
+ let(:created_at) { DateTime.now }
26
+ let(:updated_at) { created_at + 1 }
25
27
 
26
28
  let(:webhook) do
27
29
  Models::Webhook.new(
@@ -29,8 +31,8 @@ module PactBroker
29
31
  uuid: 'some-uuid',
30
32
  consumer: consumer,
31
33
  provider: provider,
32
- created_at: DateTime.now,
33
- updated_at: DateTime.now)
34
+ created_at: created_at,
35
+ updated_at: updated_at)
34
36
  end
35
37
 
36
38
  subject { WebhookDecorator.new(webhook) }
@@ -83,6 +85,11 @@ module PactBroker
83
85
  expect(parsed_json[:_links][:execute][:href]).to eq 'http://example.org/webhooks/some-uuid/execute'
84
86
  end
85
87
 
88
+ it "includes timestamps" do
89
+ expect(parsed_json[:createdAt]).to eq created_at.xmlschema
90
+ expect(parsed_json[:updatedAt]).to eq updated_at.xmlschema
91
+ end
92
+
86
93
  context "when the headers are empty" do
87
94
  let(:headers) { nil }
88
95
  it "does not include the headers" do
@@ -6,8 +6,17 @@ module PactBroker
6
6
  module Renderers
7
7
  describe HtmlPactRenderer do
8
8
 
9
+ before do
10
+ ENV['BACKUP_TZ'] = ENV['TZ']
11
+ ENV['TZ'] = "Australia/Melbourne"
12
+ end
13
+
14
+ after do
15
+ ENV['TZ'] = ENV['BACKUP_TZ']
16
+ end
17
+
9
18
  let(:consumer) { double('consumer', name: 'Consumer')}
10
- let(:created_at) { DateTime.now }
19
+ let(:created_at) { DateTime.new(2014, 02, 27) }
11
20
  let(:json_content) { load_fixture('renderer_pact.json') }
12
21
  let(:pact) { double('pact', json_content: json_content, updated_at: created_at, consumer_version_number: '1.2.3', consumer: consumer)}
13
22
  let(:pact_url) { '/pact/url' }
@@ -22,12 +31,14 @@ module PactBroker
22
31
  it "renders the pact as HTML" do
23
32
  expect(subject).to include("<html>")
24
33
  expect(subject).to include("</html>")
25
- expect(subject).to include('<link rel="stylesheet"')
26
- expect(subject).to include('href="/stylesheets/github.css"')
34
+ expect(subject).to include("<link rel='stylesheet'")
35
+ expect(subject).to include("href='/stylesheets/github.css'")
27
36
  expect(subject).to include('<pre><code')
28
37
  expect(subject).to include('&quot;method&quot;:')
29
38
  expect(subject).to match /<h\d>.*Some Consumer/
30
39
  expect(subject).to match /<h\d>.*Some Provider/
40
+ expect(subject).to include("Date published:")
41
+ expect(subject).to include("27/02/2014 11:00AM +11:00")
31
42
  end
32
43
  end
33
44
 
@@ -5,6 +5,90 @@ module PactBroker
5
5
  module Repositories
6
6
  describe PactRepository do
7
7
 
8
+ describe "create" do
9
+ let(:consumer) { PacticipantRepository.new.create name: 'Consumer' }
10
+ let(:provider) { PacticipantRepository.new.create name: 'Provider' }
11
+ let(:version) { VersionRepository.new.create number: '1.2.3', pacticipant_id: consumer.id }
12
+ let(:json_content) { {some: 'json'}.to_json }
13
+
14
+ subject { PactRepository.new.create version_id: version.id, provider_id: provider.id, json_content: json_content}
15
+
16
+ it "saves the pact" do
17
+ expect{subject}.to change{ Pact.count }.by(1)
18
+ end
19
+
20
+ it "returns a Pact::Model" do
21
+ expect(subject).to be_instance_of(PactBroker::Models::Pact)
22
+ end
23
+
24
+ it "sets all the Pact::Model attributes" do
25
+ expect(subject.consumer).to eq consumer
26
+ expect(subject.provider).to eq provider
27
+ expect(subject.consumer_version_number).to eq '1.2.3'
28
+ expect(subject.consumer_version).to eq version
29
+ expect(subject.json_content).to eq json_content
30
+ expect(subject.created_at).to be_instance_of(DateTime)
31
+ expect(subject.updated_at).to be_instance_of(DateTime)
32
+ end
33
+ end
34
+
35
+ describe "update" do
36
+
37
+ let(:existing_pact) do
38
+ ProviderStateBuilder.new.create_pact_with_hierarchy "A Consumer", "1.2.3", "A Provider"
39
+ end
40
+
41
+ before do
42
+ ::DB::PACT_BROKER_DB[:pacts]
43
+ .where(id: existing_pact.id)
44
+ .update(
45
+ created_at: created_at,
46
+ updated_at: updated_at)
47
+ end
48
+
49
+ let(:created_at) { DateTime.new(2014, 3, 2) }
50
+ let(:updated_at) { DateTime.new(2014, 3, 4) }
51
+
52
+ let(:json_content) { {some: 'json'}.to_json }
53
+
54
+ subject { PactRepository.new.update existing_pact.id, json_content: json_content }
55
+
56
+ context "when the attributes have changed" do
57
+
58
+ it "updates the existing content" do
59
+ expect(subject.json_content).to eq json_content
60
+ end
61
+
62
+ it "updates the updated_at timestamp" do
63
+ expect(subject.updated_at).to_not eq updated_at
64
+ end
65
+
66
+ it "does not update the created_at timestamp" do
67
+ expect(subject.created_at).to eq created_at
68
+ end
69
+
70
+ end
71
+
72
+ context "when the attributes have not changed" do
73
+ before do
74
+ ::DB::PACT_BROKER_DB[:pacts]
75
+ .where(id: existing_pact.id)
76
+ .update(
77
+ json_content: json_content)
78
+ end
79
+
80
+ it "does not update the updated_at timestamp" do
81
+ expect(subject.updated_at).to eq updated_at
82
+ end
83
+
84
+ it "does not update the created_at timestamp" do
85
+ expect(subject.created_at).to eq created_at
86
+ end
87
+
88
+ end
89
+
90
+ end
91
+
8
92
  describe "#find_all_pacts_between" do
9
93
  let(:consumer_name) { 'Consumer' }
10
94
  let(:provider_name) { 'Provider' }
@@ -81,8 +165,9 @@ module PactBroker
81
165
  expect(latest_prod_pact.consumer_version.number).to eq("1.2.3")
82
166
  end
83
167
 
84
- xit "has timestamps" do
85
-
168
+ it "has timestamps" do
169
+ expect(latest_prod_pact.created_at).to be_instance_of(DateTime)
170
+ expect(latest_prod_pact.updated_at).to be_instance_of(DateTime)
86
171
  end
87
172
  end
88
173
 
@@ -116,7 +201,6 @@ module PactBroker
116
201
  expect(pacts[0].provider.name).to eq("Pricing Service")
117
202
  expect(pacts[0].provider.id).to_not be nil
118
203
  expect(pacts[0].consumer_version.number).to eq("1.4.0")
119
- expect(pacts[0].consumer_version_number).to eq("1.4.0")
120
204
 
121
205
  expect(pacts[1].consumer_version.pacticipant.name).to eq("Contract Email Service")
122
206
  expect(pacts[1].consumer.name).to eq("Contract Email Service")
@@ -124,7 +208,7 @@ module PactBroker
124
208
  expect(pacts[1].consumer_version.number).to eq("2.7.0")
125
209
  end
126
210
 
127
- xit "includes the timestamps" do
211
+ it "includes the timestamps - need to update view" do
128
212
  pacts = PactRepository.new.find_latest_pacts
129
213
 
130
214
  expect(pacts[0].updated_at).to be_instance_of DateTime
@@ -37,6 +37,8 @@ module PactBroker
37
37
  expect(find_tag.name).to eq tag_name
38
38
  expect(find_tag.version.number).to eq version_number
39
39
  expect(find_tag.version.pacticipant.name).to eq pacticipant_name
40
+ expect(find_tag.created_at).to be_instance_of(DateTime)
41
+ expect(find_tag.updated_at).to be_instance_of(DateTime)
40
42
  end
41
43
 
42
44
  end
@@ -5,10 +5,27 @@ module PactBroker
5
5
  module Repositories
6
6
  describe VersionRepository do
7
7
 
8
+ let(:pacticipant_name) { "test_pacticipant" }
9
+ let(:version_number) { "1.2.3" }
10
+
11
+ describe "#create" do
12
+ context "when a previous version exists" do
13
+
14
+ let!(:existing_order) do
15
+ ProviderStateBuilder.new.create_version_with_hierarchy pacticipant_name, version_number
16
+ end
17
+
18
+ subject { VersionRepository.new.create pacticipant_id: existing_order.pacticipant_id, number: "1.2.4" }
19
+
20
+ it "sets the order to the previous version's order plus one" do
21
+ expect(subject.order).to eq existing_order.order + 1
22
+ end
23
+
24
+ end
25
+ end
26
+
8
27
  describe "#find_by_pacticipant_name_and_number" do
9
28
 
10
- let(:pacticipant_name) { "test_pacticipant" }
11
- let(:version_number) { "1.2.3" }
12
29
 
13
30
  subject { described_class.new.find_by_pacticipant_name_and_number pacticipant_name, version_number }
14
31
 
@@ -21,6 +38,7 @@ module PactBroker
21
38
  it "returns the version" do
22
39
  expect(subject.number).to eq version_number
23
40
  expect(subject.pacticipant.name).to eq pacticipant_name
41
+ expect(subject.order).to eq 0
24
42
  end
25
43
  end
26
44
 
@@ -155,7 +155,7 @@ module PactBroker
155
155
 
156
156
  it "deletes the child pacts" do
157
157
  expect{ delete_pacticipant }.to change{
158
- PactBroker::Models::Pact.count
158
+ PactBroker::Repositories::Pact.count
159
159
  }.by(-2)
160
160
  end
161
161
  end
@@ -1,27 +1,12 @@
1
1
  require './spec/spec_helper'
2
2
  require 'pact/provider/rspec'
3
- require 'sequel'
4
- require 'db'
5
- require 'pact_broker/api'
6
- require 'uri'
7
- require_relative 'provider_states_for_pact_broker_client'
8
-
9
- require 'pact_broker/api/resources/pact'
10
3
 
11
- Pact.configure do | config |
12
- config.logger.level = Logger::DEBUG
13
- #config.diff_format = :plus_and_minus
14
- end
4
+ require_relative 'provider_states_for_pact_broker_client'
15
5
 
16
6
  Pact.service_provider "Pact Broker" do
17
- # app { PactBroker::API }
18
7
 
19
8
  honours_pact_with "Pact Broker Client" do
20
- pact_uri "../pact_broker-client/spec/pacts/pact_broker_client-pact_broker.json"
9
+ pact_uri "https://raw.githubusercontent.com/bethesque/pact_broker-client/master/spec/pacts/pact_broker_client-pact_broker.json"
21
10
  end
22
11
 
23
- # honours_pact_with "Pact Broker Client", :ref => :head do
24
- # pact_uri URI.encode("http://rea-pact-broker.biq.vpc.realestate.com.au/pacts/provider/Pact Broker/consumer/Pact Broker Client/latest")
25
- # end
26
-
27
12
  end
data/spec/spec_helper.rb CHANGED
@@ -4,45 +4,27 @@ RACK_ENV = 'test'
4
4
  $: << File.expand_path("../../", __FILE__)
5
5
  require 'rack/test'
6
6
  require 'db'
7
- require 'support/provider_state_builder'
8
- require 'support/shared_examples_for_responses'
9
7
  require 'pact_broker/api'
10
8
  require 'rspec/its'
11
9
 
10
+ Dir.glob("./spec/support/**/*.rb") { |file| require file }
11
+
12
12
  YAML::ENGINE.yamler = 'psych'
13
13
  I18n.config.enforce_available_locales = false
14
14
 
15
- def load_fixture(file_name)
16
- File.read(File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', file_name)))
17
- end
18
-
19
- def load_json_fixture(file_name)
20
- require 'json'
21
- JSON.parse(load_fixture(file_name))
22
- end
23
-
24
15
  RSpec.configure do | config |
25
16
  config.before :suite do
26
17
  raise "Wrong environment!!! Don't run this script!! ENV['RACK_ENV'] is #{ENV['RACK_ENV']} and RACK_ENV is #{RACK_ENV}" if ENV['RACK_ENV'] != 'test' || RACK_ENV != 'test'
27
18
  PactBroker::DB.connection = DB::PACT_BROKER_DB
28
19
  end
29
20
 
30
-
31
- config.before :each do
32
- # TODO: Change this to transactional!
33
- DB::PACT_BROKER_DB[:webhook_headers].truncate
34
- DB::PACT_BROKER_DB[:webhooks].truncate
35
- DB::PACT_BROKER_DB[:pacts].truncate
36
- DB::PACT_BROKER_DB[:tags].truncate
37
- DB::PACT_BROKER_DB[:versions].truncate
38
- DB::PACT_BROKER_DB[:pacticipants].truncate
39
- end
40
-
41
21
  config.include Rack::Test::Methods
42
22
  config.mock_with :rspec do |mocks|
43
23
  mocks.verify_partial_doubles = true
44
24
  end
45
25
 
26
+ config.include FixtureHelpers
27
+
46
28
  def app
47
29
  PactBroker::API
48
30
  end
@@ -0,0 +1,18 @@
1
+ require 'database_cleaner'
2
+
3
+ RSpec.configure do |config|
4
+ config.before(:suite) do
5
+ if defined?(::DB)
6
+ DatabaseCleaner.strategy = :transaction
7
+ DatabaseCleaner.clean_with :truncation
8
+ end
9
+ end
10
+
11
+ config.before(:each) do
12
+ DatabaseCleaner.start if defined?(::DB)
13
+ end
14
+
15
+ config.after(:each) do
16
+ DatabaseCleaner.clean if defined?(::DB)
17
+ end
18
+ end