analytics/test/workers/lock_sites_test.exs
RobertJoonas 3d2f356ba7
Refactor enterprise plan upgrade and change-plan actions (#3397)
* rename enterprise?/1 function

* change link text to Upgrade when subscription deleted

* extract paddle_button and paddle_script components

* create a new upgrade-to-enterprise-plan page

* extract upgrade_link component

* rename function

* link to enterprise plan upgrade page from settings

...if the user has an enterprise plan configured

* fetch enterprise plan price on the new page

* add change_enterprise_plan functionality on the new page

* render existing change_enterprise_plan_contact_us.html

...when subscribed to latest configured enterprise plan

* rename vars and extract resumable? fn

* remove dead billing route

* small test refactor: extract convenience fn

* add tests for...

...restricting paused and past_due subscription access to the new
enterprise plan page.

1. redirect to /settings from the controller action
2. hiding the change-plan link from the user settings

* implement redirect to /settings

* hide the enterprise upgrade/change-plan link

* add tests for a deleted enterprise subscription

* plug in the new controller action and delete dead code

* optimize for dark mode

* fix compile warning

* credo fix

* display N/A instead of crash when price nil

* change subscription.status type to Ecto.Enum

Also, create a new `Subscription.Status` module that exposes macros to
return the used atom values (prevent typos at compiletime).

* fix bug (@conn not available anymore)

* use Routes.billing_path where applicable

* add a status() type

* silence credo

* refactor suggestion from review

Co-authored-by: Adrian Gruntkowski <adrian.gruntkowski@gmail.com>

* Remove the __using__ macro from Subscription.Status

... instead be explicit about requires and aliases and also order
the use, import, require, and alias clauses according to
https://github.com/christopheradams/elixir_style_guide#module-attribute-ordering

* drop the virtual Enteprise 'price_per_interval' field

* apply review suggestion to make the code more DRY

* use dot syntax to fetch current user in new controller actions

* fix formatting

---------

Co-authored-by: Adrian Gruntkowski <adrian.gruntkowski@gmail.com>
2023-10-10 20:35:17 +03: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(100)
|> 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