require 'spec_helper' require 'pact_broker/api/decorators/webhook_execution_result_decorator' module PactBroker module Api module Decorators describe WebhookExecutionResultDecorator do describe "to_json" do let(:webhook_execution_result) { PactBroker::Domain::WebhookExecutionResult.new(request, response, logs, error)} let(:logs) { "logs" } let(:headers) { { "Something" => ["blah", "thing"]} } let(:request) do req = Net::HTTP::Get.new("http://example.org?foo=bar") req['Foo'] = ['bar', 'wiffle'] req.body = { foo: 'bar' }.to_json req end let(:response) { double('http_response', code: '200', body: response_body, to_hash: headers) } let(:response_body) { 'body' } let(:error) { nil } let(:webhook) { instance_double(PactBroker::Domain::Webhook, uuid: 'some-uuid') } let(:show_response) { true } let(:json) { WebhookExecutionResultDecorator.new(webhook_execution_result) .to_json(user_options: { base_url: 'http://example.org', webhook: webhook, show_response: show_response }) } let(:subject) { JSON.parse(json, symbolize_names: true)} it "includes a link to execute the webhook again" do expect(subject[:_links][:'try-again'][:href]).to eq 'http://example.org/webhooks/some-uuid/execute' end it "includes a link to the webhook" do expect(subject[:_links][:webhook][:href]).to eq 'http://example.org/webhooks/some-uuid' end context "when there is an error" do let(:error) { double('error', message: 'message', backtrace: ['blah','blah']) } it "includes the message" do expect(subject[:error][:message]).to eq 'message' end it "includes the backtrace" do expect(subject[:error][:backtrace]).to eq ['blah','blah'] end end context "when there is a request" do it "includes the request URL" do expect(subject[:request][:url]).to eq "http://example.org?foo=bar" end it "includes the request headers" do expect(subject[:request][:headers][:'foo']).to eq "bar, wiffle" end context "when the request body is JSON" do it "includes the request body as JSON" do expect(subject[:request][:body]).to include( foo: 'bar' ) end end context "when the request body is not json" do before do request.body = "" end it "includes the request body as a String" do expect(subject[:request][:body]).to eq "" end end end context "when there is a response" do it "includes the response code" do expect(subject[:response][:status]).to eq 200 end it "includes the response headers" do expect(subject[:response][:headers]).to eq :'Something' => "blah, thing" end it "includes the response body" do expect(subject[:response][:body]).to eq response_body end context "when the response body is JSON" do let(:response_body_hash) { {some: 'json'} } let(:response_body) { response_body_hash.to_json } it "returns the response as JSON" do expect(subject[:response][:body]).to eq response_body_hash end end end context "when show_response is false" do let(:show_response) { false } it "does not include the response" do expect(subject).to_not have_key(:response) end it "includes a message about why the response is hidden" do expect(subject[:message]).to match /security purposes/ end end end end end end end