defmodule Plausible.AuthTest do use Plausible.DataCase, async: true alias Plausible.Auth test "enterprise_configured?/1 returns whether the user has an enterprise plan" do user_without_plan = new_user() user_with_plan = new_user() |> subscribe_to_enterprise_plan() user_with_plan_no_subscription = new_user() |> subscribe_to_enterprise_plan(subscription?: false) assert Plausible.Teams.Billing.enterprise_configured?(team_of(user_with_plan)) assert Plausible.Teams.Billing.enterprise_configured?(team_of(user_with_plan_no_subscription)) refute Plausible.Teams.Billing.enterprise_configured?(team_of(user_without_plan)) refute Plausible.Teams.Billing.enterprise_configured?(nil) end describe "create_stats_api_key/3" do test "creates a new api key" do user = new_user(trial_expiry_date: Date.utc_today()) team = team_of(user) key = Ecto.UUID.generate() assert {:ok, %Auth.ApiKey{} = api_key} = Auth.create_stats_api_key(user, team, "my new key", key) assert api_key.team_id == team.id assert api_key.user_id == user.id end test "errors when key already exists" do u1 = new_user(trial_expiry_date: Date.utc_today()) t1 = team_of(u1) u2 = new_user(trial_expiry_date: Date.utc_today()) t2 = team_of(u2) key = Ecto.UUID.generate() assert {:ok, %Auth.ApiKey{}} = Auth.create_stats_api_key(u1, t1, "my new key", key) assert {:error, changeset} = Auth.create_stats_api_key(u2, t2, "my other key", key) assert changeset.errors[:key] == {"has already been taken", [constraint: :unique, constraint_name: "api_keys_key_hash_index"]} end @tag :ee_only test "returns error when team is on a growth plan" do user = new_user() |> subscribe_to_growth_plan() team = team_of(user) assert {:error, :upgrade_required} = Auth.create_stats_api_key(user, team, "my new key", Ecto.UUID.generate()) end test "creates a key for user in a team with a bunsiness plan" do user = new_user() |> subscribe_to_business_plan() team = team_of(user) another_site = new_site() add_member(another_site.team, user: user, role: :owner) assert {:ok, %Auth.ApiKey{}} = Auth.create_stats_api_key(user, team, "my new key", Ecto.UUID.generate()) end end describe "create_sites_api_key/3" do test "creates a new api key for user on enterprise plan with SitesAPI enabled" do user = new_user() |> subscribe_to_enterprise_plan( features: [Plausible.Billing.Feature.StatsAPI, Plausible.Billing.Feature.SitesAPI] ) team = team_of(user) key = Ecto.UUID.generate() assert {:ok, %Auth.ApiKey{} = api_key} = Auth.create_sites_api_key(user, team, "my new key", key) assert api_key.team_id == team.id assert api_key.user_id == user.id end test "errors when key already exists" do u1 = new_user() |> subscribe_to_enterprise_plan( features: [Plausible.Billing.Feature.StatsAPI, Plausible.Billing.Feature.SitesAPI] ) t1 = team_of(u1) u2 = new_user() |> subscribe_to_enterprise_plan( features: [Plausible.Billing.Feature.StatsAPI, Plausible.Billing.Feature.SitesAPI] ) t2 = team_of(u2) key = Ecto.UUID.generate() assert {:ok, %Auth.ApiKey{}} = Auth.create_sites_api_key(u1, t1, "my new key", key) assert {:error, changeset} = Auth.create_sites_api_key(u2, t2, "my other key", key) assert changeset.errors[:key] == {"has already been taken", [constraint: :unique, constraint_name: "api_keys_key_hash_index"]} end @tag :ee_only test "returns error when team is on a business plan" do user = new_user() |> subscribe_to_business_plan() team = team_of(user) assert {:error, :upgrade_required} = Auth.create_sites_api_key(user, team, "my new key", Ecto.UUID.generate()) end end describe "delete_api_key/2" do test "deletes the record" do user = new_user(trial_expiry_date: Date.utc_today()) team = team_of(user) assert {:ok, api_key} = Auth.create_stats_api_key(user, team, "my new key", Ecto.UUID.generate()) assert :ok = Auth.delete_api_key(user, api_key.id) refute Plausible.Repo.reload(api_key) end test "returns error when api key does not exist or does not belong to user" do me = new_user(trial_expiry_date: Date.utc_today()) other_user = new_user(trial_expiry_date: Date.utc_today()) other_team = team_of(other_user) {:ok, other_api_key} = Auth.create_stats_api_key(other_user, other_team, "my new key", Ecto.UUID.generate()) assert {:error, :not_found} = Auth.delete_api_key(me, other_api_key.id) assert {:error, :not_found} = Auth.delete_api_key(me, -1) end end end