require_relative 'pact_helper'
require 'pact_broker/client/webhooks/create'

RSpec.describe "creating a webhook in PactFlow", pact: true do

  include_context "pact broker"
  include PactBrokerPactHelperMethods

  let(:params) do
    {
      description: "a webhook",
      events: %w{contract_content_changed},
      http_method: "POST",
      url: "https://webhook",
      headers: { "Foo" => "bar", "Bar" => "foo"},
      body: body,
      team_uuid: "2abbc12a-427d-432a-a521-c870af1739d9"
    }
  end

  let(:body) { { some: "body" }.to_json }

  let(:request_body) do
    {
      "description" => "a webhook",
      "events" => [
        "name" => "contract_content_changed"
      ],
      "request" => {
        "url" => "https://webhook",
        "method" => "POST",
        "headers" => {
          "Foo" => "bar",
          "Bar" => "foo"
        },
        "body" => {
          "some" => "body"
        },
      },
      "teamUuid" => "2abbc12a-427d-432a-a521-c870af1739d9"
    }
  end

  let(:response_status) { 201 }
  let(:success_response) do
    {
      status: response_status,
      headers: pact_broker_response_headers,
      body: {
        description: Pact.like("a webhook"),
        teamUuid: "2abbc12a-427d-432a-a521-c870af1739d9",
        _links: {
          self: {
            href: Pact.term('http://localhost:1234/some-url', %r{http://.*}),
            title: Pact.like("A title")
          }
        }
      }
    }
  end

  let(:pact_broker_client_options) { {} }

  subject { PactBroker::Client::Webhooks::Create.call(params, pactflow.mock_service_base_url, pact_broker_client_options) }

  context "when a valid webhook with a team specified is submitted" do
    before do
      mock_pact_broker_index(self, pactflow)
      pactflow
        .given("a team with UUID 2abbc12a-427d-432a-a521-c870af1739d9 exists")
        .upon_receiving("a request to create a webhook for a team")
        .with(
            method: :post,
            path: '/HAL-REL-PLACEHOLDER-PB-WEBHOOKS',
            headers: post_request_headers,
            body: request_body)
        .will_respond_with(success_response)
    end

    it "returns a CommandResult with success = true" do
      expect(subject).to be_a PactBroker::Client::CommandResult
      expect(subject.success).to be true
      expect(subject.message).to eq "Webhook \"a webhook\" created"
    end
  end
end