require 'spec_helper' require 'pact_broker/api/resources/webhook' module PactBroker::Api module Resources describe Webhook do before do allow(PactBroker::Webhooks::Service).to receive(:find_by_uuid).and_return(webhook) end describe "GET" do subject { get '/webhooks/some-uuid'; last_response } context "when the webhook does not exist" do let(:webhook) { nil } it "returns a 404" do expect(subject).to be_a_404_response end end context "when the webhook exists" do before do allow(Decorators::WebhookDecorator).to receive(:new).and_return(decorator) end let(:webhook) { double("webhook") } let(:decorator) { double(Decorators::WebhookDecorator, to_json: json)} let(:json) { {some: 'json'}.to_json } it "finds the webhook by UUID" do expect(PactBroker::Webhooks::Service).to receive(:find_by_uuid).with('some-uuid') subject end it "returns a 200 JSON response" do subject expect(last_response).to be_a_hal_json_success_response end it "generates a JSON representation of the webhook" do expect(Decorators::WebhookDecorator).to receive(:new).with(webhook) expect(decorator).to receive(:to_json).with(user_options: hash_including(base_url: 'http://example.org')) subject end it "includes the JSON representation in the response body" do subject expect(last_response.body).to eq json end end end describe "PUT" do before do allow(Decorators::WebhookDecorator).to receive(:new).and_return(decorator) allow(PactBroker::Webhooks::Service).to receive(:create).and_return(created_webhook) allow_any_instance_of(Webhook).to receive(:consumer).and_return(consumer) allow_any_instance_of(Webhook).to receive(:provider).and_return(provider) allow_any_instance_of(Webhook).to receive(:webhook_validation_errors?).and_return(false) end let(:consumer) { double('consumer') } let(:provider) { double('provider') } let(:webhook) { double("webhook") } let(:decorator) { double(Decorators::WebhookDecorator, from_json: parsed_webhook, to_json: json)} let(:json) { {some: 'json'}.to_json } let(:parsed_webhook) { double('parsed_webhook') } let(:created_webhook) { double('created_webhook') } let(:webhook) { nil } let(:webhook_json) { load_fixture('webhook_valid.json') } let(:uuid) { 'some-uuid' } subject { put("/webhooks/#{uuid}", webhook_json, 'CONTENT_TYPE' => 'application/json') } it "validates the UUID" do expect_any_instance_of(Webhook).to receive(:webhook_validation_errors?).with(parsed_webhook, uuid) subject end context "when the webhook does not exist" do it "creates the webhook" do expect(PactBroker::Webhooks::Service).to receive(:create).with(uuid, parsed_webhook, consumer, provider) subject end its(:status) { is_expected.to eq 201 } it "returns the JSON respresentation of the webhook" do expect(subject.body).to eq json end end context "when the webhook does exist" do before do allow(PactBroker::Webhooks::Service).to receive(:update_by_uuid).and_return(created_webhook) end let(:webhook) { double('existing webhook') } its(:status) { is_expected.to eq 200 } it "updates the webhook" do expect(PactBroker::Webhooks::Service).to receive(:update_by_uuid).with(uuid, JSON.parse(webhook_json)) subject end it "returns the JSON respresentation of the webhook" do expect(subject.body).to eq json end end end end end end