pact_broker 1.3.2.rc1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +76 -17
  4. data/db/migrations/16_add_pact_content_foreign_key_to_pacts.rb +6 -0
  5. data/db/migrations/migration_helper.rb +11 -1
  6. data/example/Gemfile +1 -1
  7. data/example/pact_broker_database.sqlite3 +0 -0
  8. data/lib/db.rb +1 -0
  9. data/lib/pact_broker/api.rb +11 -2
  10. data/lib/pact_broker/api/decorators.rb +1 -1
  11. data/lib/pact_broker/api/decorators/base_decorator.rb +3 -3
  12. data/lib/pact_broker/api/decorators/basic_pacticipant_decorator.rb +0 -1
  13. data/lib/pact_broker/api/decorators/embedded_tag_decorator.rb +26 -0
  14. data/lib/pact_broker/api/decorators/embedded_version_decorator.rb +20 -0
  15. data/lib/pact_broker/api/decorators/pact_collection_decorator.rb +9 -3
  16. data/lib/pact_broker/api/decorators/pact_decorator.rb +70 -6
  17. data/lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb +2 -2
  18. data/lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb +4 -28
  19. data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +2 -2
  20. data/lib/pact_broker/api/decorators/representable_pact.rb +4 -1
  21. data/lib/pact_broker/api/decorators/tag_decorator.rb +24 -1
  22. data/lib/pact_broker/api/decorators/timestamps.rb +2 -2
  23. data/lib/pact_broker/api/decorators/version_decorator.rb +27 -3
  24. data/lib/pact_broker/api/decorators/webhooks_decorator.rb +1 -1
  25. data/lib/pact_broker/api/pact_broker_urls.rb +10 -3
  26. data/lib/pact_broker/api/resources/index.rb +5 -5
  27. data/lib/pact_broker/api/resources/pact_content_diff.rb +40 -0
  28. data/lib/pact_broker/api/resources/previous_distinct_pact_version.rb +39 -0
  29. data/lib/pact_broker/api/resources/version.rb +36 -0
  30. data/lib/pact_broker/app.rb +2 -2
  31. data/lib/pact_broker/date_helper.rb +93 -0
  32. data/lib/pact_broker/doc/controllers/app.rb +1 -1
  33. data/lib/pact_broker/doc/views/consumer.markdown +7 -0
  34. data/lib/pact_broker/doc/views/diff-previous-distinct.markdown +5 -0
  35. data/lib/pact_broker/doc/views/latest-pact-version.markdown +7 -0
  36. data/lib/pact_broker/doc/views/latest-pact-versions.markdown +5 -0
  37. data/lib/pact_broker/doc/views/pact-versions.markdown +3 -0
  38. data/lib/pact_broker/doc/views/pact-webhooks.markdown +50 -0
  39. data/lib/pact_broker/doc/views/pacticipants.markdown +2 -0
  40. data/lib/pact_broker/doc/views/provider.markdown +7 -0
  41. data/lib/pact_broker/doc/views/tag-prod-version.markdown +7 -0
  42. data/lib/pact_broker/doc/views/tag-version.markdown +4 -0
  43. data/lib/pact_broker/doc/views/webhooks.markdown +2 -0
  44. data/lib/pact_broker/domain/pact.rb +6 -1
  45. data/lib/pact_broker/domain/tag.rb +0 -1
  46. data/lib/pact_broker/locale/en.yml +37 -1
  47. data/lib/pact_broker/pacts/all_pacts.rb +8 -0
  48. data/lib/pact_broker/pacts/create_formatted_diff.rb +20 -0
  49. data/lib/pact_broker/pacts/diff.rb +105 -0
  50. data/lib/pact_broker/pacts/repository.rb +43 -7
  51. data/lib/pact_broker/repositories/version_repository.rb +1 -0
  52. data/lib/pact_broker/services.rb +6 -1
  53. data/lib/pact_broker/services/pact_service.rb +6 -0
  54. data/lib/pact_broker/services/version_service.rb +2 -2
  55. data/lib/pact_broker/ui.rb +8 -3
  56. data/lib/pact_broker/ui/app.rb +2 -1
  57. data/lib/pact_broker/ui/controllers/base_controller.rb +1 -1
  58. data/lib/pact_broker/ui/controllers/clusters.rb +1 -1
  59. data/lib/pact_broker/ui/views/relationships/show.haml +11 -4
  60. data/lib/pact_broker/version.rb +1 -1
  61. data/pact_broker.gemspec +6 -4
  62. data/public/images/doc-text.svg +1 -0
  63. data/public/stylesheets/relationships.css +43 -1
  64. data/script/publish-2.sh +3 -0
  65. data/script/publish.sh +3 -0
  66. data/spec/features/delete_pact_spec.rb +1 -1
  67. data/spec/features/get_diff.rb +52 -0
  68. data/spec/features/get_previous_distinct_version.rb +51 -0
  69. data/spec/features/get_version.rb +45 -0
  70. data/spec/features/publish_pact_spec.rb +1 -1
  71. data/spec/fixtures/a_consumer-a_provider-2.json +22 -0
  72. data/spec/fixtures/a_consumer-a_provider.json +22 -0
  73. data/spec/fixtures/consumer-provider.json +4 -3
  74. data/spec/integration/app_spec.rb +6 -1
  75. data/spec/lib/pact_broker/api/decorators/embedded_tag_decorator_spec.rb +40 -0
  76. data/spec/lib/pact_broker/api/decorators/embedded_version_decorator_spec.rb +39 -0
  77. data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +52 -10
  78. data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +9 -1
  79. data/spec/lib/pact_broker/api/decorators/pacticipant_collection_decorator_spec.rb +36 -0
  80. data/spec/lib/pact_broker/api/decorators/tag_decorator_spec.rb +57 -0
  81. data/spec/lib/pact_broker/api/decorators/version_decorator_spec.rb +49 -0
  82. data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +2 -2
  83. data/spec/lib/pact_broker/pacts/create_formatted_diff_spec.rb +33 -0
  84. data/spec/lib/pact_broker/pacts/diff_spec.rb +72 -0
  85. data/spec/lib/pact_broker/pacts/pact_params_spec.rb +2 -2
  86. data/spec/lib/pact_broker/pacts/repository_spec.rb +90 -0
  87. data/spec/lib/pact_broker/repositories/version_repository_spec.rb +10 -2
  88. data/spec/lib/pact_broker/ui/controllers/relationships_spec.rb +1 -1
  89. data/vendor/hal-browser/README.md +6 -0
  90. data/vendor/hal-browser/browser.html +5 -3
  91. data/vendor/hal-browser/js/hal.js +3 -0
  92. data/vendor/hal-browser/js/hal/resource.js +1 -0
  93. data/vendor/hal-browser/js/hal/views/embedded_resource.js +1 -0
  94. data/vendor/hal-browser/js/hal/views/query_uri_dialog.js +12 -2
  95. data/vendor/hal-browser/js/hal/views/resource.js +6 -1
  96. data/vendor/hal-browser/styles.css +10 -0
  97. data/vendor/hal-browser/vendor/js/{jquery-1.9.1.js → jquery-1.10.2.js} +4394 -4202
  98. data/vendor/hal-browser/vendor/js/jquery-1.10.2.min.js +6 -0
  99. data/vendor/hal-browser/vendor/js/jquery-1.10.2.min.map +1 -0
  100. metadata +90 -18
  101. data/db/migrations/15_add_value_to_tag.rb.wip +0 -5
  102. data/lib/pact_broker/doc/views/latest-pacts.markdown +0 -3
@@ -3,6 +3,7 @@ require 'pact_broker/services/pacticipant_service'
3
3
  require 'pact_broker/services/tag_service'
4
4
  require 'pact_broker/services/group_service'
5
5
  require 'pact_broker/services/webhook_service'
6
+ require 'pact_broker/services/version_service'
6
7
 
7
8
  module PactBroker
8
9
  module Services
@@ -25,5 +26,9 @@ module PactBroker
25
26
  def webhook_service
26
27
  WebhookService
27
28
  end
29
+
30
+ def version_service
31
+ VersionService
32
+ end
28
33
  end
29
- end
34
+ end
@@ -43,6 +43,12 @@ module PactBroker
43
43
  pact_repository.find_all_pacts_between consumer, options
44
44
  end
45
45
 
46
+ def find_previous_distinct_pact_version params
47
+ pact = find_pact params
48
+ return nil if pact.nil?
49
+ pact_repository.find_previous_distinct_pact pact
50
+ end
51
+
46
52
  def find_distinct_pacts_between consumer, options
47
53
  # Assumes pacts are sorted from newest to oldest
48
54
  all = pact_repository.find_all_pacts_between consumer, options
@@ -7,8 +7,8 @@ module PactBroker
7
7
 
8
8
  extend PactBroker::Repositories
9
9
 
10
- def self.find_latest_version name
11
-
10
+ def self.find_by_pacticipant_name_and_number params
11
+ version_repository.find_by_pacticipant_name_and_number params.fetch(:pacticipant_name), params.fetch(:pacticipant_version_number)
12
12
  end
13
13
  end
14
14
  end
@@ -2,8 +2,13 @@
2
2
  # Stop Padrino creating a log file, as it will try to create it in the gems directory
3
3
  # http://www.padrinorb.com/api/Padrino/Logger.html
4
4
  unless defined? PADRINO_LOGGER
5
- PADRINO_LOGGER = { production: { log_level: :warn, stream: :null } }
5
+ PADRINO_LOGGER = {
6
+ production: { log_level: :error, stream: :stderr },
7
+ staging: { log_level: :error, stream: :stderr },
8
+ test: { log_level: :warn, stream: :stdout },
9
+ development: { log_level: :warn, stream: :stdout }
10
+ }
6
11
  end
7
12
 
8
- require 'pact_broker/ui/controllers/relationships'
9
- require 'pact_broker/ui/controllers/groups'
13
+ require 'pact_broker/ui/app'
14
+
@@ -1,4 +1,5 @@
1
- require 'pact_broker/ui'
1
+ require 'pact_broker/ui/controllers/relationships'
2
+ require 'pact_broker/ui/controllers/groups'
2
3
  require 'pact_broker/doc/controllers/app'
3
4
 
4
5
  module PactBroker
@@ -1,4 +1,4 @@
1
- require 'padrino'
1
+ require 'padrino-core'
2
2
  require 'haml'
3
3
  require 'pact_broker/services'
4
4
 
@@ -1,4 +1,4 @@
1
- require 'padrino'
1
+ require 'padrino-core'
2
2
  require 'haml'
3
3
  require 'pact_broker/services'
4
4
 
@@ -1,6 +1,6 @@
1
1
  %head
2
2
  %title
3
- Relationships
3
+ Pacts
4
4
  %link{rel: 'stylesheet', href: '/css/bootstrap.min.css'}
5
5
  %link{rel: 'stylesheet', href: '/stylesheets/relationships.css'}
6
6
  %script{type: 'text/javascript', src:'/javascripts/jquery-2.1.1.min.js'}
@@ -14,9 +14,10 @@
14
14
  HAL Browser
15
15
  .container
16
16
  %h1.page-header
17
- Relationships
17
+ Pacts
18
18
  %table.table.table-bordered.table-striped{id: 'relationships'}
19
19
  %thead
20
+ %th
20
21
  %th.consumer
21
22
  Consumer
22
23
  %span.glyphicon.glyphicon-sort.relationships-sort
@@ -25,19 +26,22 @@
25
26
  %th.provider
26
27
  Provider
27
28
  %span.glyphicon.glyphicon-sort.relationships-sort
29
+ %th
28
30
  %tbody
29
31
 
30
32
  - relationships.each do | relationship |
31
33
  %tr
34
+ %td
32
35
  %td.consumer
33
36
  %a{:href => relationship.consumer_group_url}
34
37
  = relationship.consumer_name
35
38
  %td.pact
36
- %a.btn.btn-primary{:href => relationship.latest_pact_url}
37
- %span.glyphicon.glyphicon-arrow-right
39
+ %a{:href => relationship.latest_pact_url, :title => "View pact"}
40
+ %span.pact
38
41
  %td.provider
39
42
  %a{:href => relationship.provider_group_url}
40
43
  = relationship.provider_name
44
+ %td
41
45
  %div.relationships-size
42
46
  = relationships.size_label
43
47
 
@@ -46,3 +50,6 @@ $(function(){
46
50
  $("#relationships").tablesorter();
47
51
  });
48
52
 
53
+ $(document).load(function(){
54
+ $("span.pact").load("/images/doc-text.svg");
55
+ });
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '1.3.2.rc1'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -22,16 +22,18 @@ Gem::Specification.new do |gem|
22
22
  #gem.add_runtime_dependency 'pact'
23
23
  gem.add_runtime_dependency 'httparty'
24
24
  gem.add_runtime_dependency 'json'
25
- gem.add_runtime_dependency 'roar', '~> 0.12.9'
25
+ gem.add_runtime_dependency 'roar', '~> 1.0.0.beta2'
26
26
  gem.add_runtime_dependency 'reform', '~> 1.0'
27
27
  gem.add_runtime_dependency 'sequel', '~> 4.12'
28
- gem.add_runtime_dependency 'webmachine', '~> 1.2'
28
+ gem.add_runtime_dependency 'webmachine', '1.2'
29
29
  gem.add_runtime_dependency 'versionomy', '~> 0.4'
30
30
  gem.add_runtime_dependency 'rack'
31
31
  gem.add_runtime_dependency 'redcarpet', '~>3.1'
32
- gem.add_runtime_dependency 'pact', '~>1.3', '>=1.3.2'
33
- gem.add_runtime_dependency 'padrino', '~>0.12'
32
+ gem.add_runtime_dependency 'pact', '~>1.4'
33
+ gem.add_runtime_dependency 'pact-support', '~>0.1', '>=0.1.4'
34
+ gem.add_runtime_dependency 'padrino-core', '~>0.12.4'
34
35
  gem.add_runtime_dependency 'haml'
36
+ gem.add_runtime_dependency 'trailblazer', '~>0.1.0'
35
37
 
36
38
  gem.add_development_dependency 'sqlite3'
37
39
  gem.add_development_dependency 'pry'
@@ -0,0 +1 @@
1
+ <svg height="1000" width="714.286" viewBox="0 0 1000 714.286" xmlns="http://www.w3.org/2000/svg"><path d="M571.392 660.736v35.712q0 7.812 -5.022 12.834t-12.834 5.022h-392.832q-7.812 0 -12.834 -5.022t-5.022 -12.834v-35.712q0 -7.812 5.022 -12.834t12.834 -5.022h392.832q7.812 0 12.834 5.022t5.022 12.834zm0 -142.848v35.712q0 7.812 -5.022 12.834t-12.834 5.022h-392.832q-7.812 0 -12.834 -5.022t-5.022 -12.834v-35.712q0 -7.812 5.022 -12.834t12.834 -5.022h392.832q7.812 0 12.834 5.022t5.022 12.834zm-499.968 339.264h571.392v-428.544h-232.128q-22.32 0 -37.944 -15.624t-15.624 -37.944v-232.128h-285.696v714.24zm357.12 -499.968h209.808q-5.58 -16.182 -12.276 -22.878l-174.654 -174.654q-6.696 -6.696 -22.878 -12.276v209.808zm285.696 17.856v499.968q0 22.32 -15.624 37.944t-37.944 15.624h-607.104q-22.32 0 -37.944 -15.624t-15.624 -37.944v-749.952q0 -22.32 15.624 -37.944t37.944 -15.624h357.12q22.32 0 49.104 11.16t42.408 26.784l174.096 174.096q15.624 15.624 26.784 42.408t11.16 49.104z"/></svg>
@@ -11,6 +11,25 @@
11
11
  border-left: none;
12
12
  }
13
13
 
14
+ table#relationships {
15
+ table-layout: fixed;
16
+ }
17
+
18
+ table#relationships td,
19
+ table#relationships th {
20
+ text-align: left;
21
+ }
22
+
23
+ table#relationships th,
24
+ table#relationships td {
25
+ border-right: none;
26
+ border-left: none;
27
+ }
28
+
29
+ table#relationships td.pact {
30
+ text-align: center;
31
+ }
32
+
14
33
  .relationships-size {
15
34
  text-align: right;
16
35
  color: gray;
@@ -24,4 +43,27 @@
24
43
  padding-right: 20px;
25
44
  }
26
45
 
27
- body { padding-top: 10px; }
46
+ body { padding-top: 10px; }
47
+
48
+ .consumer, .provider {
49
+ text-align: center;
50
+ white-space: nowrap;
51
+ }
52
+
53
+ span.pact {
54
+ display: inline-block;
55
+ }
56
+
57
+ span.pact svg {
58
+ width: 20px !important;
59
+ height: 20px !important;
60
+ overflow: visible;
61
+ }
62
+
63
+ span.pact svg path {
64
+ fill: #111111;
65
+ }
66
+
67
+ span.pact:hover svg path {
68
+ fill: #2a6496;
69
+ }
@@ -0,0 +1,3 @@
1
+ curl -v -XPUT \-H "Content-Type: application/json" \
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
@@ -0,0 +1,3 @@
1
+ curl -v -XPUT \-H "Content-Type: application/json" \
2
+ -d@spec/fixtures/a_consumer-a_provider.json \
3
+ http://localhost:9292/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.0.0
@@ -1,6 +1,6 @@
1
1
  describe "Deleting a pact" do
2
2
 
3
- let(:pact_content) { load_fixture('consumer-provider.json') }
3
+ let(:pact_content) { load_fixture('a_consumer-a_provider.json') }
4
4
  let(:path) { "/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.2.3" }
5
5
  let(:response_body_json) { JSON.parse(subject.body) }
6
6
 
@@ -0,0 +1,52 @@
1
+ require 'spec/support/provider_state_builder'
2
+
3
+ describe "Get diff between versions" do
4
+
5
+ let(:path) { "/pacts/provider/Provider/consumer/Consumer/version/3/diff/previous-distinct" }
6
+
7
+ let(:last_response_body) { JSON.parse(subject.body, symbolize_names: true) }
8
+
9
+ subject { get path; last_response }
10
+
11
+ let(:pact_content_version_1) do
12
+ hash = load_json_fixture('consumer-provider.json')
13
+ hash['interactions'].first['request']['method'] = 'post'
14
+ hash.to_json
15
+ end
16
+ let(:pact_content_version_2) { load_fixture('consumer-provider.json') }
17
+ let(:pact_content_version_3) { pact_content_version_2 }
18
+
19
+ before do
20
+ ProviderStateBuilder.new
21
+ .create_consumer("Consumer")
22
+ .create_provider("Provider")
23
+ .create_consumer_version("1")
24
+ .create_pact(pact_content_version_1)
25
+ .create_consumer_version("2")
26
+ .create_pact(pact_content_version_2)
27
+ .create_consumer_version("3")
28
+ .create_pact(pact_content_version_3)
29
+ end
30
+
31
+ context "when the versions exist" do
32
+
33
+ it "returns a 200 HAL JSON response" do
34
+ expect(subject).to be_a_hal_json_success_response
35
+ end
36
+
37
+ it "returns the JSON representation of the diff" do
38
+ expect(last_response_body).to include({})
39
+ end
40
+
41
+ end
42
+
43
+ context "when either version does not exist" do
44
+
45
+ let(:path) { "/pacts/provider/Provider/consumer/Consumer/versions/1/diff/previous-distinct" }
46
+
47
+ xit "returns a 404 response" do
48
+ expect(subject).to be_a_404_response
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec/support/provider_state_builder'
2
+
3
+ describe "Get previous distinct version of pact" do
4
+
5
+ let(:path) { "/pacts/provider/Provider/consumer/Consumer/version/3/previous-distinct" }
6
+ let(:last_response_body) { JSON.parse(subject.body, symbolize_names: true) }
7
+
8
+ subject { get path; last_response }
9
+
10
+ let(:pact_content_version_1) { load_fixture('consumer-provider.json') }
11
+ let(:pact_content_version_2) do
12
+ hash = load_json_fixture('consumer-provider.json')
13
+ hash['interactions'].first['request']['method'] = 'post'
14
+ hash.to_json
15
+ end
16
+ let(:pact_content_version_3) { pact_content_version_2 }
17
+
18
+ before do
19
+ ProviderStateBuilder.new
20
+ .create_consumer("Consumer")
21
+ .create_provider("Provider")
22
+ .create_consumer_version("1")
23
+ .create_pact(pact_content_version_1)
24
+ .create_consumer_version("2")
25
+ .create_pact(pact_content_version_2)
26
+ .create_consumer_version("3")
27
+ .create_pact(pact_content_version_3)
28
+ end
29
+
30
+ context "when the pact version exists" do
31
+
32
+ it "returns a 200 HAL JSON response" do
33
+ expect(subject).to be_a_hal_json_success_response
34
+ end
35
+
36
+ it "returns the JSON representation of the version" do
37
+ expect(last_response_body[:_links][:self][:href]).to end_with '/1'
38
+ end
39
+
40
+ end
41
+
42
+ context "when the version does not exist" do
43
+
44
+ let(:path) { "/pacts/provider/Provider/consumer/Consumer/version/1/previous-distinct" }
45
+
46
+ it "returns a 404 response" do
47
+ expect(subject).to be_a_404_response
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec/support/provider_state_builder'
2
+
3
+ describe "Get version" do
4
+
5
+ let(:path) { "/pacticipants/Consumer/versions/1.2.3" }
6
+ let(:last_response_body) { JSON.parse(subject.body, symbolize_names: true) }
7
+
8
+ subject { get path; last_response }
9
+
10
+ context "when the version exists" do
11
+
12
+ before do
13
+ ProviderStateBuilder.new
14
+ .create_consumer("Another Consumer")
15
+ .create_consumer("Consumer")
16
+ .create_consumer_version("1.2.3")
17
+ .create_consumer_version_tag("prod")
18
+ .create_consumer_version("1.2.4")
19
+ end
20
+
21
+
22
+ it "returns a 200 HAL JSON response" do
23
+ expect(subject).to be_a_hal_json_success_response
24
+ end
25
+
26
+ it "returns the JSON representation of the version" do
27
+ expect(last_response_body).to include number: '1.2.3'
28
+ end
29
+
30
+ end
31
+
32
+ context "when the version does not exist" do
33
+
34
+ before do
35
+ ProviderStateBuilder.new
36
+ .create_consumer("Consumer")
37
+ .create_version("1.2.4")
38
+ end
39
+
40
+ it "returns a 404 response" do
41
+ expect(subject).to be_a_404_response
42
+ end
43
+
44
+ end
45
+ end
@@ -1,6 +1,6 @@
1
1
  describe "Publishing a pact" do
2
2
 
3
- let(:pact_content) { load_fixture('consumer-provider.json') }
3
+ let(:pact_content) { load_fixture('a_consumer-a_provider.json') }
4
4
  let(:path) { "/pacts/provider/A%20Provider/consumer/A%20Consumer/version/1.2.3" }
5
5
  let(:response_body_json) { JSON.parse(subject.body) }
6
6
 
@@ -0,0 +1,22 @@
1
+ {
2
+ "consumer": {
3
+ "name": "A Consumer"
4
+ },
5
+ "provider": {
6
+ "name": "A Provider"
7
+ },
8
+ "interactions": [
9
+ {
10
+ "description" : "a request for something",
11
+ "provider_state": null,
12
+ "request": {
13
+ "method": "post",
14
+ "path" : "/something"
15
+ },
16
+ "response": {
17
+ "status": 200,
18
+ "body" : "something"
19
+ }
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "consumer": {
3
+ "name": "A Consumer"
4
+ },
5
+ "provider": {
6
+ "name": "A Provider"
7
+ },
8
+ "interactions": [
9
+ {
10
+ "description" : "a request for something",
11
+ "provider_state": null,
12
+ "request": {
13
+ "method": "get",
14
+ "path" : "/something"
15
+ },
16
+ "response": {
17
+ "status": 200,
18
+ "body" : "something"
19
+ }
20
+ }
21
+ ]
22
+ }