analytics/test/workers/import_google_analytics_test.exs
2023-06-19 10:32:34 +01:00

198 lines
6.0 KiB
Elixir

defmodule Plausible.Workers.ImportGoogleAnalyticsTest do
use Plausible.DataCase
use Bamboo.Test
import Double
alias Plausible.Workers.ImportGoogleAnalytics
@moduletag capture_log: true
@imported_data %Plausible.Site.ImportedData{
start_date: Timex.today() |> Timex.shift(days: -7),
end_date: Timex.today(),
source: "Google Analytics",
status: "importing"
}
test "updates the imported_data field for the site after successful import" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: 1))
site = insert(:site, members: [user], imported_data: @imported_data)
api_stub =
stub(Plausible.Google.Api, :import_analytics, fn _site,
_date_range,
_view_id,
_access_token ->
:ok
end)
ImportGoogleAnalytics.perform(
%Oban.Job{
args: %{
"site_id" => site.id,
"view_id" => "view_id",
"start_date" => "2020-01-01",
"end_date" => "2022-01-01",
"access_token" => "token"
}
},
api_stub
)
assert Repo.reload!(site).imported_data.status == "ok"
end
test "updates the stats_start_date field for the site after successful import" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: 1))
site = insert(:site, members: [user], imported_data: @imported_data)
api_stub =
stub(Plausible.Google.Api, :import_analytics, fn _site,
_date_range,
_view_id,
_access_token ->
:ok
end)
ImportGoogleAnalytics.perform(
%Oban.Job{
args: %{
"site_id" => site.id,
"view_id" => "view_id",
"start_date" => "2020-01-01",
"end_date" => "2022-01-01",
"access_token" => "token"
}
},
api_stub
)
assert Repo.reload!(site).stats_start_date == @imported_data.start_date
end
test "sends email to owner after successful import" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: 1))
site = insert(:site, members: [user], imported_data: @imported_data)
api_stub =
stub(Plausible.Google.Api, :import_analytics, fn _site,
_date_range,
_view_id,
_access_token ->
:ok
end)
ImportGoogleAnalytics.perform(
%Oban.Job{
args: %{
"site_id" => site.id,
"view_id" => "view_id",
"start_date" => "2020-01-01",
"end_date" => "2022-01-01",
"access_token" => "token"
}
},
api_stub
)
assert_email_delivered_with(
to: [user],
subject: "Google Analytics data imported for #{site.domain}"
)
end
test "updates site record after failed import" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: 1))
site = insert(:site, members: [user], imported_data: @imported_data)
api_stub =
stub(Plausible.Google.Api, :import_analytics, fn _site,
_date_range,
_view_id,
_access_token ->
{:error, "Something went wrong"}
end)
ImportGoogleAnalytics.perform(
%Oban.Job{
args: %{
"site_id" => site.id,
"view_id" => "view_id",
"start_date" => "2020-01-01",
"end_date" => "2022-01-01",
"access_token" => "token"
}
},
api_stub
)
assert Repo.reload!(site).imported_data.status == "error"
end
test "clears any orphaned data during import" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: 1))
site = insert(:site, members: [user], imported_data: @imported_data)
populate_stats(site, [
build(:imported_visitors, pageviews: 10)
])
api_stub =
stub(Plausible.Google.Api, :import_analytics, fn _site,
_date_range,
_view_id,
_access_token ->
{:error, "Something went wrong"}
end)
ImportGoogleAnalytics.perform(
%Oban.Job{
args: %{
"site_id" => site.id,
"view_id" => "view_id",
"start_date" => "2020-01-01",
"end_date" => "2022-01-01",
"access_token" => "token"
}
},
api_stub
)
assert eventually(fn ->
count = Plausible.Stats.Clickhouse.imported_pageview_count(site)
{count == 0, count}
end)
end
test "sends email to owner after failed import" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: 1))
site = insert(:site, members: [user], imported_data: @imported_data)
api_stub =
stub(Plausible.Google.Api, :import_analytics, fn _site,
_date_range,
_view_id,
_access_token ->
{:error, "Something went wrong"}
end)
ImportGoogleAnalytics.perform(
%Oban.Job{
args: %{
"site_id" => site.id,
"view_id" => "view_id",
"start_date" => "2020-01-01",
"end_date" => "2022-01-01",
"access_token" => "token"
}
},
api_stub
)
assert_email_delivered_with(
to: [user],
subject: "Google Analytics import failed for #{site.domain}"
)
end
end