From bb56183fdc25c4cbb9f0e424f1427a8c6975c0bd Mon Sep 17 00:00:00 2001 From: Danny Andrews Date: Wed, 18 Mar 2015 13:09:49 -0500 Subject: [PATCH 1/3] Add to_hash method to Swagger response clause --- lib/pacto/formats/swagger/response_clause.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/pacto/formats/swagger/response_clause.rb b/lib/pacto/formats/swagger/response_clause.rb index 866bfe2..71f3dd5 100644 --- a/lib/pacto/formats/swagger/response_clause.rb +++ b/lib/pacto/formats/swagger/response_clause.rb @@ -25,6 +25,12 @@ def schema return nil unless swagger_response.schema swagger_response.schema.parse end + + def to_hash + [:status, :headers, :schema].each_with_object({}) do | key, hash | + hash[key.to_s] = send key + end + end end end end From 5bdec957f0b43891cdbf0cb1444d430361377986 Mon Sep 17 00:00:00 2001 From: Danny Andrews Date: Wed, 18 Mar 2015 13:14:04 -0500 Subject: [PATCH 2/3] Move body formatting behavior to pacto_response class --- lib/pacto/core/pacto_response.rb | 12 +++++++++++- lib/pacto/stubs/webmock_adapter.rb | 15 +-------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/lib/pacto/core/pacto_response.rb b/lib/pacto/core/pacto_response.rb index d77be70..78055ce 100644 --- a/lib/pacto/core/pacto_response.rb +++ b/lib/pacto/core/pacto_response.rb @@ -18,7 +18,7 @@ def to_hash { status: status, headers: headers, - body: body + body: format_body(body) } end @@ -27,5 +27,15 @@ def to_s string << " with body (#{raw_body.bytesize} bytes)" if raw_body string end + + private + + def format_body(body) + if body.is_a?(Hash) || body.is_a?(Array) + body.to_json + else + body + end + end end end diff --git a/lib/pacto/stubs/webmock_adapter.rb b/lib/pacto/stubs/webmock_adapter.rb index d2e2a60..ad15bc8 100644 --- a/lib/pacto/stubs/webmock_adapter.rb +++ b/lib/pacto/stubs/webmock_adapter.rb @@ -62,12 +62,7 @@ def stub_request!(contract) stub.to_return do |request| pacto_request = Pacto::Adapters::WebMock::PactoRequest.new request - response = contract.response_for pacto_request - { - status: response.status, - headers: response.headers, - body: format_body(response.body) - } + contract.response_for(pacto_request).to_hash end end @@ -84,14 +79,6 @@ def process_hooks(webmock_request_signature, webmock_response) private - def format_body(body) - if body.is_a?(Hash) || body.is_a?(Array) - body.to_json - else - body - end - end - def strict_details(request) {}.tap do |details| details[webmock_params_key(request)] = request.params unless request.params.empty? From 2bd52fbe72a37973ebecba3a1d67e9d0f13cd050 Mon Sep 17 00:00:00 2001 From: Danny Andrews Date: Wed, 18 Mar 2015 16:47:50 -0500 Subject: [PATCH 3/3] Parse swagger example into a hash --- lib/pacto/formats/swagger/contract.rb | 2 +- .../pacto/formats/swagger/contract_spec.rb | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/pacto/formats/swagger/contract.rb b/lib/pacto/formats/swagger/contract.rb index 0720ff1..4820f66 100644 --- a/lib/pacto/formats/swagger/contract.rb +++ b/lib/pacto/formats/swagger/contract.rb @@ -71,7 +71,7 @@ def build_examples(response) default: { request: {}, # Swagger doesn't have a clear way to capture request examples response: { - body: response_body + body: response_body.parse } } } diff --git a/spec/unit/pacto/formats/swagger/contract_spec.rb b/spec/unit/pacto/formats/swagger/contract_spec.rb index 105b3bb..34c2509 100644 --- a/spec/unit/pacto/formats/swagger/contract_spec.rb +++ b/spec/unit/pacto/formats/swagger/contract_spec.rb @@ -6,7 +6,7 @@ module Formats module Swagger describe Contract do let(:swagger_yaml) do - ''" + %( swagger: '2.0' info: title: Sample API @@ -23,7 +23,15 @@ module Swagger 200: description: |- Success. - "'' + examples: + application/json: |- + { + "item": { + "id": 45, + "name": "basketball" + } + } + ) end let(:swagger_definition) do ::Swagger.build(swagger_yaml, format: :yaml) @@ -40,6 +48,12 @@ module Swagger described_class.new(api_operation, file: file) end + describe 'contract examples' do + let(:example) { contract.examples } + it { expect(example).to be_truthy } + it { expect(example[:default][:response][:body]).to be_a(Hash) } + end + it_behaves_like 'a contract' end end