describe Onfido::Webhook do
  subject(:webhook) { described_class.new }
  let(:params) do
    {
      "url" => "https://webhookendpoint.url",
      "enabled" => true,
      "events" => [
        "report completion",
        "report withdrawal",
        "check completion",
        "check in progress"
      ]
    }
  end

  describe "#create" do
    it "cretes the webhook" do
      response = webhook.create(params)
      expect(response['id']).to_not be_nil
    end

    it "responds with the right url" do
      response = webhook.create(params)
      expect(response["url"]).to eq params["url"]
    end
  end

  describe '#find' do
    let(:webhook_id) { 'fcb73186-0733-4f6f-9c57-d9d5ef979443' }

    it 'returns the webhook' do
      response = webhook.find(webhook_id)
      expect(response['id']).to eq(webhook_id)
    end
  end

  describe "#all" do
    it "returns all the registered webhooks" do
      response = webhook.all
      expect(response["webhooks"].count).to eq 2
    end

    it "returns with id" do
      response = webhook.all
      expect(response["webhooks"][0]["id"]).to_not be_nil
      expect(response["webhooks"][1]["id"]).to_not be_nil
    end
  end

  describe ".valid?" do
    subject(:valid?) do
      described_class.valid?(request_body, request_signature, token)
    end

    let(:request_body) { '{"foo":"bar"}' }
    let(:request_signature) { 'fdab9db604d33297741b43b9fc9536028d09dca3' }
    let(:token) { 'very_secret_token' }

    it { is_expected.to be(true) }

    context "with an invalid signature" do
      let(:request_signature) { '2f3d7727ff9a32a7c87072ce514df1f6d3228bec' }
      it { is_expected.to be(false) }
    end

    context "with a nil request signature" do
      let(:request_signature) { nil }
      specify { expect { valid? }.to raise_error(ArgumentError) }
    end

    context "with a token other than the one used to sign the request" do
      let(:token) { "quite_secret_token" }
      it { is_expected.to be(false) }
    end

    context "with a nil token" do
      let(:token) { nil }
      specify { expect { valid? }.to raise_error(ArgumentError) }
    end

    context "with a modified request body" do
      let(:request_body) { '{"bar":"baz"}' }
      it { is_expected.to be(false) }
    end

    context "with a nil request body" do
      let(:request_body) { nil }
      specify { expect { valid? }.to raise_error(ArgumentError) }
    end
  end
end