0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-12 05:37:26 +08:00
discourse/plugins/discourse-calendar/spec/integration/outgoing_web_hooks_spec.rb
Bannon Tanner fb19e92f37
FEAT: add webhooks for calendar events (#38315)
Adds webhook support for calendar events being created, updated, or
destroyed. Creates a custom payload showing information about the event,
topic, and post.
2026-03-09 12:30:19 -05:00

137 lines
4.5 KiB
Ruby
Vendored

# frozen_string_literal: true
RSpec.describe "Outgoing calendar event webhooks" do
fab!(:user) { Fabricate(:user, admin: true, refresh_auto_groups: true) }
fab!(:web_hook, :outgoing_calendar_event_web_hook)
before do
SiteSetting.calendar_enabled = true
SiteSetting.discourse_post_event_enabled = true
end
let(:job_args) do
Jobs::EmitWebHookEvent
.jobs
.map { |job| job["args"].first }
.find { |args| args["event_type"] == "calendar_event" }
end
let(:event_name) { job_args["event_name"] }
let(:payload) { JSON.parse(job_args["payload"]) }
describe "calendar_event_created" do
it "fires when a post with event markup is created" do
post = create_post_with_event(user)
event = post.reload.event
expect(job_args).to be_present
expect(event_name).to eq("calendar_event_created")
expect(job_args["category_id"]).to eq(post.topic.category_id)
expect(payload["event"]["id"]).to eq(event.id)
expect(payload["event"]["starts_at"]).to be_present
expect(payload["post"]["id"]).to eq(post.id)
expect(payload["post"]["url"]).to eq(post.url)
expect(payload["topic"]["id"]).to eq(post.topic_id)
expect(payload["topic"]["title"]).to eq(post.topic.title)
expect(payload["topic"]["category_id"]).to eq(post.topic.category_id)
end
end
describe "calendar_event_updated" do
let(:event_post) { create_post_with_event(user) }
it "fires when an existing event is edited" do
event_post
revisor = PostRevisor.new(event_post, event_post.topic)
revisor.revise!(user, raw: "[event start=\"#{1.day.from_now.utc.iso8601}\"]\n[/event]")
job = find_webhook_job(:calendar_event_updated)
expect(job).to be_present
expect(job["event_name"]).to eq("calendar_event_updated")
end
it "fires calendar_event_created when event markup is added to an existing post" do
post = Fabricate(:post, user: user)
revisor = PostRevisor.new(post, post.topic)
revisor.revise!(user, raw: "[event start=\"#{1.day.from_now.utc.iso8601}\"]\n[/event]")
job = find_webhook_job(:calendar_event_created)
expect(job).to be_present
expect(job["event_name"]).to eq("calendar_event_created")
end
end
describe "calendar_event_destroyed" do
let(:event_post) { create_post_with_event(user) }
it "fires when event markup is removed from a post" do
event_post
revisor = PostRevisor.new(event_post, event_post.topic)
revisor.revise!(user, raw: "No event here.")
job = find_webhook_job(:calendar_event_destroyed)
expect(job).to be_present
expect(job["event_name"]).to eq("calendar_event_destroyed")
end
it "fires when a post with an event is destroyed" do
event_post
event = event_post.reload.event
PostDestroyer.new(user, event_post).destroy
job = find_webhook_job(:calendar_event_destroyed)
expect(job).to be_present
expect(job["event_name"]).to eq("calendar_event_destroyed")
expect(payload["event"]["id"]).to eq(event.id)
end
it "fires when DELETE /discourse-post-event/events/:id is called" do
event_post
sign_in(user)
event = event_post.reload.event
delete "/discourse-post-event/events/#{event.id}.json"
job = find_webhook_job(:calendar_event_destroyed)
expect(job).to be_present
expect(job["event_name"]).to eq("calendar_event_destroyed")
expect(payload["event"]["id"]).to eq(event.id)
end
end
describe "calendar_event_created on post recovery" do
let(:event_post) { create_post_with_event(user) }
it "fires when a destroyed post with an event is recovered" do
event_post
PostDestroyer.new(user, event_post).destroy
expect { PostDestroyer.new(user, event_post).recover }.to change {
Jobs::EmitWebHookEvent.jobs.count do |j|
j["args"].first["event_name"] == "calendar_event_created"
end
}.by(1)
end
end
describe "WebHookEventType.active" do
it "excludes all 3 calendar event types when discourse_post_event_enabled is false" do
SiteSetting.discourse_post_event_enabled = false
active_calendar_event_types =
WebHookEventType.active.where(group: WebHookEventType.groups[:calendar])
expect(active_calendar_event_types.count).to eq(0)
end
end
def find_webhook_job(event_name)
Jobs::EmitWebHookEvent
.jobs
.map { |job| job["args"].first }
.find do |args|
args["event_type"] == "calendar_event" && args["event_name"] == event_name.to_s
end
end
end