mirror of
https://github.com/discourse/discourse.git
synced 2026-08-06 04:02:30 +08:00
Previously, browser pageviews were persisted through the MessageBus piggyback path, which could miss navigation and unload events. This change records piggyback and sendBeacon pageviews in browser_pageview_events with a source, and uses the beacon transport for dashboard_improvements because keepalive requests can complete after page navigation starts. --------- Co-authored-by: Natalie Tay <natalie.tay@gmail.com>
65 lines
1.8 KiB
Ruby
Vendored
65 lines
1.8 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
RSpec.describe Jobs::FlushBrowserPageviewEvents do
|
|
before do
|
|
BrowserPageviewEvent.clear_queued!
|
|
Discourse.clear_readonly!
|
|
end
|
|
|
|
after do
|
|
BrowserPageviewEvent.clear_queued!
|
|
Discourse.clear_readonly!
|
|
end
|
|
|
|
let(:payload) do
|
|
{
|
|
url: "https://discourse.example/t/topic/1",
|
|
ip_address: "1.2.3.4",
|
|
user_agent: "Mozilla/5.0",
|
|
session_id: "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx",
|
|
source: BrowserPageviewEvent::SOURCE_BEACON,
|
|
occurred_at: Time.zone.parse("2026-05-27 10:30:00").iso8601(6),
|
|
}
|
|
end
|
|
|
|
def queue_payload(payload)
|
|
BrowserPageviewEvent.enqueue_for_later(payload)
|
|
end
|
|
|
|
def queue_payloads(payloads)
|
|
payloads.each { |queued_payload| queue_payload(queued_payload) }
|
|
end
|
|
|
|
it "does nothing when browser pageview persistence is disabled" do
|
|
SiteSetting.persist_browser_pageview_events = false
|
|
queue_payload(payload)
|
|
|
|
expect { described_class.new.execute({}) }.not_to change { BrowserPageviewEvent.count }
|
|
|
|
expect(BrowserPageviewEvent.queued_count).to eq(1)
|
|
end
|
|
|
|
it "flushes queued browser pageviews" do
|
|
SiteSetting.persist_browser_pageview_events = true
|
|
queue_payload(payload)
|
|
|
|
expect { described_class.new.execute({}) }.to change { BrowserPageviewEvent.count }.by(1)
|
|
|
|
expect(BrowserPageviewEvent.queued_count).to eq(0)
|
|
end
|
|
|
|
it "flushes multiple batches in one run" do
|
|
SiteSetting.persist_browser_pageview_events = true
|
|
|
|
stub_const(BrowserPageviewEvent, "REDIS_FLUSH_BATCH_SIZE", 3) do
|
|
payloads = 5.times.map { |index| payload.merge(session_id: format("%032d", index)) }
|
|
queue_payloads(payloads)
|
|
|
|
expect { described_class.new.execute({}) }.to change { BrowserPageviewEvent.count }.by(
|
|
payloads.length,
|
|
)
|
|
|
|
expect(BrowserPageviewEvent.queued_count).to eq(0)
|
|
end
|
|
end
|
|
end
|