Prevent invited users without sites from subscribing (#3600)

* prevent invited users without sites from subscribing

* always setup a site in choose_plan_test context

* change trial_expiry_date=nil condition to no sites owned
This commit is contained in:
RobertJoonas 2023-12-12 15:48:33 +00:00 committed by GitHub
parent 8ba851d27f
commit e85ee417ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 30 deletions

View File

@ -447,6 +447,24 @@ defmodule PlausibleWeb.Components.Billing do
def subscription_paused_notice(assigns), do: ~H""
def upgrade_ineligible_notice(assigns) do
~H"""
<aside id="upgrade-eligible-notice" class="pb-6">
<PlausibleWeb.Components.Generic.notice
title="No sites owned"
theme={:yellow}
class="shadow-md dark:shadow-none"
>
You cannot start a subscription as your account doesn't own any sites. The account that owns the sites is responsible for the billing. Please either
<.styled_link href="https://plausible.io/docs/transfer-ownership">
transfer the sites
</.styled_link>
to your account or start a subscription from the account that owns your sites.
</PlausibleWeb.Components.Generic.notice>
</aside>
"""
end
def present_enterprise_plan(assigns) do
~H"""
<ul class="w-full py-4">

View File

@ -37,8 +37,8 @@ defmodule PlausibleWeb.Live.ChoosePlan do
|> assign_new(:owned_tier, fn %{owned_plan: owned_plan} ->
if owned_plan, do: Map.get(owned_plan, :kind), else: nil
end)
|> assign_new(:recommended_tier, fn %{owned_plan: owned_plan, user: user} ->
if owned_plan, do: nil, else: Plans.suggest_tier(user)
|> assign_new(:recommended_tier, fn %{owned_plan: owned_plan, user: user, usage: usage} ->
if owned_plan || usage.sites == 0, do: nil, else: Plans.suggest_tier(user)
end)
|> assign_new(:current_interval, fn %{user: user} ->
current_user_subscription_interval(user.subscription)
@ -97,8 +97,9 @@ defmodule PlausibleWeb.Live.ChoosePlan do
~H"""
<div class="bg-gray-100 dark:bg-gray-900 pt-1 pb-12 sm:pb-16 text-gray-900 dark:text-gray-100">
<div class="mx-auto max-w-7xl px-6 lg:px-20">
<.subscription_past_due_notice class="pb-2" subscription={@user.subscription} />
<.subscription_paused_notice class="pb-2" subscription={@user.subscription} />
<.subscription_past_due_notice class="pb-6" subscription={@user.subscription} />
<.subscription_paused_notice class="pb-6" subscription={@user.subscription} />
<.upgrade_ineligible_notice :if={@usage.sites == 0} />
<div class="mx-auto max-w-4xl text-center">
<p class="text-4xl font-bold tracking-tight lg:text-5xl">
<%= if @owned_plan,
@ -361,6 +362,9 @@ defmodule PlausibleWeb.Live.ChoosePlan do
{checkout_disabled, disabled_message} =
cond do
assigns.usage.sites == 0 ->
{true, nil}
change_plan_link_text == "Currently on this plan" && not subscription_deleted ->
{true, nil}

View File

@ -33,7 +33,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
@slider_volumes ["10k", "100k", "200k", "500k", "1M", "2M", "5M", "10M", "10M+"]
describe "for a user with no subscription" do
setup [:create_user, :log_in]
setup [:create_user, :create_site, :log_in]
test "displays basic page content", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
@ -206,8 +206,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
@v4_business_5m_monthly_plan_id
end
test "warns about losing access to a feature", %{conn: conn, user: user} do
site = insert(:site, members: [user])
test "warns about losing access to a feature", %{conn: conn, site: site} do
Plausible.Props.allow(site, ["author"])
{:ok, _lv, doc} = get_liveview(conn)
@ -224,11 +223,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
@tag :full_build_only
test "recommends Business tier when Revenue Goals were used during trial", %{
conn: conn,
user: user
} do
site = insert(:site, members: [user])
test "recommends Business when Revenue Goals used during trial", %{conn: conn, site: site} do
insert(:goal, site: site, currency: :USD, event_name: "Purchase")
{:ok, _lv, doc} = get_liveview(conn)
@ -239,7 +234,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a user with a v4 growth subscription plan" do
setup [:create_user, :log_in, :subscribe_v4_growth]
setup [:create_user, :create_site, :log_in, :subscribe_v4_growth]
test "displays basic page content", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
@ -288,9 +283,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
"https://plausible.io/white-label-web-analytics"
end
test "displays usage", %{conn: conn, user: user} do
site = insert(:site, members: [user])
test "displays usage", %{conn: conn, site: site} do
populate_stats(site, [
build(:pageview),
build(:pageview)
@ -376,7 +369,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a user with a v4 business subscription plan" do
setup [:create_user, :log_in, :subscribe_v4_business]
setup [:create_user, :create_site, :log_in, :subscribe_v4_business]
test "gets default pageview limit from current subscription plan", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
@ -451,9 +444,9 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
test "checkout is not disabled when pageview usage exceeded but next upgrade allowed by override",
%{
conn: conn,
user: user
user: user,
site: site
} do
site = insert(:site, members: [user])
now = NaiveDateTime.utc_now()
generate_usage_for(site, 11_000, Timex.shift(now, days: -5))
@ -468,9 +461,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
@tag :full_build_only
test "warns about losing access to a feature", %{conn: conn, user: user} do
site = insert(:site, members: [user])
test "warns about losing access to a feature", %{conn: conn, user: user, site: site} do
Plausible.Props.allow(site, ["author"])
insert(:goal, currency: :USD, site: site, event_name: "Purchase")
insert(:api_key, user: user)
@ -483,7 +474,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a user with a v3 business (unlimited team members) subscription plan" do
setup [:create_user, :log_in]
setup [:create_user, :create_site, :log_in]
setup %{user: user} = context do
create_subscription_for(user, paddle_plan_id: @v3_business_10k_monthly_plan_id)
@ -529,7 +520,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a user with a past_due subscription" do
setup [:create_user, :log_in, :create_past_due_subscription]
setup [:create_user, :create_site, :log_in, :create_past_due_subscription]
test "renders failed payment notice and link to update billing details", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
@ -559,7 +550,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a user with a paused subscription" do
setup [:create_user, :log_in, :create_paused_subscription]
setup [:create_user, :create_site, :log_in, :create_paused_subscription]
test "renders subscription paused notice and link to update billing details", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
@ -589,7 +580,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a user with a cancelled subscription" do
setup [:create_user, :log_in, :create_cancelled_subscription]
setup [:create_user, :create_site, :log_in, :create_cancelled_subscription]
test "checkout buttons are paddle buttons", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
@ -622,7 +613,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a grandfathered user" do
setup [:create_user, :log_in]
setup [:create_user, :create_site, :log_in]
setup %{user: user} = context do
create_subscription_for(user, paddle_plan_id: @v1_10k_yearly_plan_id)
@ -695,7 +686,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
describe "for a free_10k subscription" do
setup [:create_user, :log_in, :subscribe_free_10k]
setup [:create_user, :create_site, :log_in, :subscribe_free_10k]
test "recommends growth tier when no premium features used", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
@ -704,8 +695,7 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
@tag :full_build_only
test "recommends Business tier when premium features used", %{conn: conn, user: user} do
site = insert(:site, members: [user])
test "recommends Business tier when premium features used", %{conn: conn, site: site} do
insert(:goal, currency: :USD, site: site, event_name: "Purchase")
{:ok, _lv, doc} = get_liveview(conn)
@ -731,6 +721,18 @@ defmodule PlausibleWeb.Live.ChoosePlanTest do
end
end
describe "for a user with no sites" do
setup [:create_user, :log_in]
test "does not allow to subscribe and renders notice", %{conn: conn} do
{:ok, _lv, doc} = get_liveview(conn)
assert text_of_element(doc, "#upgrade-eligible-notice") =~ "You cannot start a subscription"
assert class_of_element(doc, @growth_checkout_button) =~ "pointer-events-none"
assert class_of_element(doc, @business_checkout_button) =~ "pointer-events-none"
end
end
defp subscribe_v4_growth(%{user: user}) do
create_subscription_for(user, paddle_plan_id: @v4_growth_200k_yearly_plan_id)
end