analytics/test/workers/lock_sites_test.exs
RobertJoonas d3094ffdb7
Prevent upgrades that would leave the customer locked (#3683)
* Remove allowance_required field from grace_period

Since we are now preventing customers from subscribing to a plan that
does not accommodate their pageview usage, there is no need for an extra
check on removing the grace period after a successful upgrade.

This extra check is the reason why the automatic unlocks have recently
failed in several cases.

* refactor outgrown subscription notices

* make a test actually test the described functionality

* Apply greater pageview allowance margin only for trial upgrades

...in order to prevent cancelled or paused subscriptions from subscribing
to plans that would still leave their account locked.

* Mark the entire ChoosePlanTest module full build only

* remove account locking guide

This is irrelevant for self-hosters, and the internal knowledge base is
a better place for this document. Moved it there.

* refactor Keyword get clause

* add a pattern matching assertion in code
2024-01-15 14:59:56 +00:00

132 lines
3.5 KiB
Elixir

defmodule Plausible.Workers.LockSitesTest do
use Plausible.DataCase, async: true
require Plausible.Billing.Subscription.Status
alias Plausible.Workers.LockSites
alias Plausible.Billing.Subscription
test "does not lock enterprise site on grace period" do
user =
:user
|> build()
|> Plausible.Auth.GracePeriod.start_manual_lock_changeset()
|> Plausible.Repo.insert!()
site = insert(:site, members: [user])
LockSites.perform(nil)
refute Repo.reload!(site).locked
end
test "does not lock trial user's site" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: 1))
site = insert(:site, members: [user])
LockSites.perform(nil)
refute Repo.reload!(site).locked
end
test "locks site for user whose trial has expired" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: -1))
site = insert(:site, members: [user])
LockSites.perform(nil)
assert Repo.reload!(site).locked
end
test "does not lock active subsriber's sites" do
user = insert(:user)
insert(:subscription, status: Subscription.Status.active(), user: user)
site = insert(:site, members: [user])
LockSites.perform(nil)
refute Repo.reload!(site).locked
end
test "does not lock user who is past due" do
user = insert(:user)
insert(:subscription, status: Subscription.Status.past_due(), user: user)
site = insert(:site, members: [user])
LockSites.perform(nil)
refute Repo.reload!(site).locked
end
test "does not lock user who cancelled subscription but it hasn't expired yet" do
user = insert(:user)
insert(:subscription, status: Subscription.Status.deleted(), user: user)
site = insert(:site, members: [user])
LockSites.perform(nil)
refute Repo.reload!(site).locked
end
test "locks user who cancelled subscription and the cancelled subscription has expired" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: -1))
insert(:subscription,
status: Subscription.Status.deleted(),
next_bill_date: Timex.today() |> Timex.shift(days: -1),
user: user
)
site = insert(:site, members: [user])
LockSites.perform(nil)
assert Repo.reload!(site).locked
end
test "does not lock if user has an old cancelled subscription and a new active subscription" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: -1))
insert(:subscription,
status: Subscription.Status.deleted(),
next_bill_date: Timex.today() |> Timex.shift(days: -1),
user: user,
inserted_at: Timex.now() |> Timex.shift(days: -1)
)
insert(:subscription, status: Subscription.Status.active(), user: user)
site = insert(:site, members: [user])
LockSites.perform(nil)
refute Repo.reload!(site).locked
end
describe "locking" do
test "only locks sites that the user owns" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: -1))
owner_site =
insert(:site,
memberships: [
build(:site_membership, user: user, role: :owner)
]
)
viewer_site =
insert(:site,
memberships: [
build(:site_membership, user: user, role: :viewer)
]
)
LockSites.perform(nil)
owner_site = Repo.reload!(owner_site)
viewer_site = Repo.reload!(viewer_site)
assert owner_site.locked
refute viewer_site.locked
end
end
end