166 lines
4.8 KiB
Elixir
166 lines
4.8 KiB
Elixir
defmodule Plausible.Ingestion.EventTest do
|
|
use Plausible.DataCase, async: true
|
|
|
|
import Phoenix.ConnTest
|
|
|
|
alias Plausible.Ingestion.Request
|
|
alias Plausible.Ingestion.Event
|
|
|
|
test "event pipeline processes a request into an event" do
|
|
site = insert(:site)
|
|
|
|
payload = %{
|
|
name: "pageview",
|
|
url: "http://#{site.domain}"
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [_], dropped: []}} = Event.build_and_buffer(request)
|
|
end
|
|
|
|
test "event pipeline drops a request when site does not exists" do
|
|
payload = %{
|
|
name: "pageview",
|
|
url: "http://dummy.site"
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [], dropped: [dropped]}} = Event.build_and_buffer(request)
|
|
assert dropped.drop_reason == :not_found
|
|
end
|
|
|
|
test "event pipeline drops a request when referrer is spam" do
|
|
site = insert(:site)
|
|
|
|
payload = %{
|
|
name: "pageview",
|
|
url: "http://dummy.site",
|
|
referrer: "https://www.1-best-seo.com",
|
|
domain: site.domain
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [], dropped: [dropped]}} = Event.build_and_buffer(request)
|
|
assert dropped.drop_reason == :spam_referrer
|
|
end
|
|
|
|
test "event pipeline drops a request when referrer is spam for multiple domains" do
|
|
site = insert(:site)
|
|
|
|
payload = %{
|
|
name: "pageview",
|
|
url: "http://dummy.site",
|
|
referrer: "https://www.1-best-seo.com",
|
|
d: "#{site.domain},#{site.domain}"
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{dropped: [dropped, dropped]}} = Event.build_and_buffer(request)
|
|
assert dropped.drop_reason == :spam_referrer
|
|
end
|
|
|
|
test "event pipeline selectively drops an event for multiple domains" do
|
|
site = insert(:site)
|
|
|
|
payload = %{
|
|
name: "pageview",
|
|
url: "http://dummy.site",
|
|
d: "#{site.domain},thisdoesnotexist.com"
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [_], dropped: [dropped]}} = Event.build_and_buffer(request)
|
|
assert dropped.drop_reason == :not_found
|
|
end
|
|
|
|
test "event pipeline selectively drops an event when rate-limited" do
|
|
site = insert(:site, ingest_rate_limit_threshold: 1)
|
|
|
|
payload = %{
|
|
name: "pageview",
|
|
url: "http://dummy.site",
|
|
d: "#{site.domain}"
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [_], dropped: []}} = Event.build_and_buffer(request)
|
|
assert {:ok, %{buffered: [], dropped: [dropped]}} = Event.build_and_buffer(request)
|
|
assert dropped.drop_reason == :throttle
|
|
end
|
|
|
|
test "saves revenue amount" do
|
|
site = insert(:site)
|
|
_goal = insert(:goal, event_name: "checkout", currency: "USD", site: site)
|
|
|
|
payload = %{
|
|
name: "checkout",
|
|
url: "http://#{site.domain}",
|
|
revenue: %{amount: 10.2, currency: "USD"}
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [event], dropped: []}} = Event.build_and_buffer(request)
|
|
assert Decimal.eq?(event.clickhouse_event.revenue_source_amount, Decimal.new("10.2"))
|
|
end
|
|
|
|
test "does not save revenue amount when there is no revenue goal" do
|
|
site = insert(:site)
|
|
|
|
payload = %{
|
|
name: "checkout",
|
|
url: "http://#{site.domain}",
|
|
revenue: %{amount: 10.2, currency: "USD"}
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [event], dropped: []}} = Event.build_and_buffer(request)
|
|
assert event.clickhouse_event.revenue_source_amount == nil
|
|
end
|
|
|
|
test "IPv4 hostname is stored without public suffix processing" do
|
|
_site = insert(:site, domain: "192.168.0.1")
|
|
|
|
payload = %{
|
|
name: "checkout",
|
|
url: "http://192.168.0.1"
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [event]}} = Event.build_and_buffer(request)
|
|
assert event.clickhouse_event_attrs.hostname == "192.168.0.1"
|
|
end
|
|
|
|
test "Hostname is stored with public suffix processing" do
|
|
_site = insert(:site, domain: "foo.netlify.app")
|
|
|
|
payload = %{
|
|
name: "checkout",
|
|
url: "http://foo.netlify.app"
|
|
}
|
|
|
|
conn = build_conn(:post, "/api/events", payload)
|
|
assert {:ok, request} = Request.build(conn)
|
|
|
|
assert {:ok, %{buffered: [event]}} = Event.build_and_buffer(request)
|
|
assert event.clickhouse_event_attrs.hostname == "foo.netlify.app"
|
|
end
|
|
end
|