1
0
مراية لـ https://github.com/postalserver/postal.git تم المزامنة 2025-12-01 05:43:04 +00:00
الملفات
postal/spec/app/services/webhook_delivery_service_spec.rb
Adam Cooke b4016f6b49 test: add tests for message unqueueing
This adds a comprehensive set of tests for the message unqueueing service.

Additionally, it improves how message databases are used for testing environments.
2024-02-23 22:51:34 +00:00

116 أسطر
3.9 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
RSpec.describe WebhookDeliveryService do
let(:server) { create(:server) }
let(:webhook) { create(:webhook, server: server) }
let(:webhook_request) { create(:webhook_request, :locked, webhook: webhook) }
subject(:service) { described_class.new(webhook_request: webhook_request) }
let(:response_status) { 200 }
let(:response_body) { "OK" }
before do
stub_request(:post, webhook.url).to_return(status: response_status, body: response_body)
end
describe "#call" do
it "sends a request to the webhook's url" do
service.call
expect(WebMock).to have_requested(:post, webhook.url).with({
body: {
event: webhook_request.event,
timestamp: webhook_request.created_at.to_f,
payload: webhook_request.payload,
uuid: webhook_request.uuid
}.to_json,
headers: {
"Content-Type" => "application/json",
"X-Postal-Signature" => /\A[a-z0-9\/+]+=*\z/i
}
})
end
context "when the endpoint returns a 200 OK" do
it "creates a webhook request for the server" do
service.call
expect(server.message_db.webhooks.list(1)[:total]).to eq(1)
webhook_request = server.message_db.webhooks.list(1)[:records].first
expect(webhook_request).to have_attributes(
event: webhook_request.event,
url: webhook_request.url,
status_code: 200,
body: "OK",
uuid: webhook_request.uuid,
will_retry?: false,
payload: webhook_request.payload,
attempt: 1,
timestamp: webhook_request.timestamp
)
end
it "deletes the webhook request" do
service.call
expect { webhook_request.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
it "updates the last used at time on the webhook" do
service.call
expect(webhook.reload.last_used_at).to be_within(1.second).of(Time.current)
end
end
context "when the request returns a 500 Internal Server Error for the first time" do
let(:response_status) { 500 }
let(:response_body) { "internal server error!" }
it "unlocks the webhook request if locked" do
expect { service.call }.to change { webhook_request.reload.locked? }.from(true).to(false)
end
it "updates the retry time and attempt counter" do
service.call
expect(webhook_request.reload.attempts).to eq(1)
expect(webhook_request.retry_after).to be_within(1.second).of(2.minutes.from_now)
end
end
context "when the request returns a 500 Internal Server Error for the second time" do
let(:webhook_request) { create(:webhook_request, :locked, webhook: webhook, attempts: 1) }
let(:response_status) { 500 }
let(:response_body) { "internal server error!" }
it "updates the retry time and attempt counter" do
service.call
expect(webhook_request.reload.attempts).to eq(2)
expect(webhook_request.retry_after).to be_within(1.second).of(3.minutes.from_now)
end
end
context "when the request returns a 500 Internal Server Error for the sixth time" do
let(:webhook_request) { create(:webhook_request, :locked, webhook: webhook, attempts: 5) }
let(:response_status) { 500 }
let(:response_body) { "internal server error!" }
it "creates a webhook request for the server" do
service.call
expect(server.message_db.webhooks.list(1)[:total]).to eq(1)
webhook_request = server.message_db.webhooks.list(1)[:records].first
expect(webhook_request).to have_attributes(
status_code: 500,
body: "internal server error!",
will_retry?: false,
attempt: 6
)
end
it "deletes the webhook request" do
service.call
expect { webhook_request.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
end