defmodule PlausibleWeb.Plugins.API.Controllers.CapabilitiesTest do use PlausibleWeb.PluginsAPICase, async: true alias PlausibleWeb.Plugins.API.Schemas describe "examples" do test "Capabilities" do assert_schema( Schemas.Capabilities.schema().example, "Capabilities", spec() ) end end describe "unauthorized" do test "no token", %{conn: conn} do resp = conn |> get(Routes.plugins_api_capabilities_url(PlausibleWeb.Endpoint, :index)) |> json_response(200) assert resp == %{ "authorized" => false, "data_domain" => nil, "features" => %{ "Funnels" => false, "Goals" => false, "Props" => false, "RevenueGoals" => false, "StatsAPI" => false, "SitesAPI" => false, "SiteSegments" => false, "SiteAnnotations" => false, "SharedLinks" => false, "SSO" => false, "ConsolidatedView" => false } } assert_schema(resp, "Capabilities", spec()) end test "bad token", %{conn: conn} do resp = conn |> put_req_header("content-type", "application/json") |> authenticate("foo", "bad token") |> get(Routes.plugins_api_capabilities_url(PlausibleWeb.Endpoint, :index)) |> json_response(200) assert resp == %{ "authorized" => false, "data_domain" => nil, "features" => %{ "Funnels" => false, "Goals" => false, "Props" => false, "RevenueGoals" => false, "StatsAPI" => false, "SitesAPI" => false, "SiteSegments" => false, "SiteAnnotations" => false, "SharedLinks" => false, "SSO" => false, "ConsolidatedView" => false } } assert_schema(resp, "Capabilities", spec()) end end describe "authorized" do test "trial", %{conn: conn, site: site, token: token} do resp = conn |> put_req_header("content-type", "application/json") |> authenticate(site.domain, token) |> get(Routes.plugins_api_capabilities_url(PlausibleWeb.Endpoint, :index)) |> json_response(200) assert resp == %{ "authorized" => true, "data_domain" => site.domain, "features" => %{ "Funnels" => true, "Goals" => true, "Props" => true, "RevenueGoals" => true, "StatsAPI" => true, "SitesAPI" => false, "SiteSegments" => true, "SiteAnnotations" => true, "SharedLinks" => true, "SSO" => false, "ConsolidatedView" => true } } assert_schema(resp, "Capabilities", spec()) end @tag :ee_only test "growth", %{conn: conn, site: site, token: token} do [owner | _] = Plausible.Repo.preload(site, :owners).owners subscribe_to_growth_plan(owner) resp = conn |> put_req_header("content-type", "application/json") |> authenticate(site.domain, token) |> get(Routes.plugins_api_capabilities_url(PlausibleWeb.Endpoint, :index)) |> json_response(200) assert resp == %{ "authorized" => true, "data_domain" => site.domain, "features" => %{ "Funnels" => false, "Goals" => true, "Props" => false, "RevenueGoals" => false, "StatsAPI" => false, "SitesAPI" => false, "SiteSegments" => false, "SiteAnnotations" => false, "SharedLinks" => true, "SSO" => false, "ConsolidatedView" => false } } assert_schema(resp, "Capabilities", spec()) end @tag :ee_only test "enterprise with SitesAPI", %{conn: conn, site: site, token: token} do [owner | _] = Plausible.Repo.preload(site, :owners).owners subscribe_to_enterprise_plan(owner, features: [Plausible.Billing.Feature.StatsAPI, Plausible.Billing.Feature.SitesAPI] ) resp = conn |> put_req_header("content-type", "application/json") |> authenticate(site.domain, token) |> get(Routes.plugins_api_capabilities_url(PlausibleWeb.Endpoint, :index)) |> json_response(200) assert resp == %{ "authorized" => true, "data_domain" => site.domain, "features" => %{ "Funnels" => false, "Goals" => true, "Props" => false, "RevenueGoals" => false, "StatsAPI" => true, "SitesAPI" => true, "SiteSegments" => false, "SiteAnnotations" => false, "SharedLinks" => false, "SSO" => false, "ConsolidatedView" => false } } assert_schema(resp, "Capabilities", spec()) end end end