# frozen_string_literal: true

RSpec.describe Jobs::RedeliverWebHookEvents do
  subject(:job) { described_class.new }

  fab!(:web_hook)
  fab!(:web_hook_event1) do
    Fabricate(
      :web_hook_event,
      web_hook: web_hook,
      payload: "abc",
      headers: JSON.dump(aa: "1", bb: "2"),
    )
  end

  fab!(:web_hook_event2) do
    Fabricate(
      :web_hook_event,
      web_hook: web_hook,
      payload: "abc",
      headers: JSON.dump(aa: "1", bb: "2"),
    )
  end

  fab!(:redelivering_webhook_event) do
    Fabricate(:redelivering_webhook_event, web_hook_event_id: web_hook_event1.id)
  end

  it "redelivers webhook events" do
    stub_request(:post, web_hook.payload_url).with(
      body: "abc",
      headers: {
        "aa" => 1,
        "bb" => 2,
      },
    ).to_return(status: 400, body: "", headers: {})

    messages =
      MessageBus.track_publish { job.execute(web_hook: web_hook, web_hook_event: web_hook_event1) }

    expect(RedeliveringWebhookEvent.count).to eq(0)
    expect(messages.count).to eq(1)
    expect(messages.first.data).to include(type: "redelivered")
  end

  context "when there is a redelivering_webhook_event in process" do
    fab!(:redelivering_webhook_event_in_process) do
      Fabricate(
        :redelivering_webhook_event,
        web_hook_event_id: web_hook_event2.id,
        processing: true,
      )
    end

    it "does not delete the webhook event in process" do
      stub_request(:post, web_hook.payload_url).with(
        body: "abc",
        headers: {
          "aa" => 1,
          "bb" => 2,
        },
      ).to_return(status: 400, body: "", headers: {})

      job.execute({})

      expect(RedeliveringWebhookEvent.count).to eq(1)
      expect(
        RedeliveringWebhookEvent.find_by(id: redelivering_webhook_event_in_process.id),
      ).to be_present
    end
  end
end
