From 445e328208cbe2bcd020d6fe612d00d1f37776d8 Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Tue, 9 Dec 2025 18:05:11 +0200 Subject: [PATCH 1/4] Add test case --- test/plausible_web/live/change_domain_test.exs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/plausible_web/live/change_domain_test.exs b/test/plausible_web/live/change_domain_test.exs index 9b7ac6b1b094..c295096ba21c 100644 --- a/test/plausible_web/live/change_domain_test.exs +++ b/test/plausible_web/live/change_domain_test.exs @@ -39,6 +39,14 @@ defmodule PlausibleWeb.Live.ChangeDomainTest do assert html =~ "Change your website domain" end + test "mounts and renders form for guest editor", %{conn: conn} do + site = new_site() + add_guest(site, role: :editor) + {:ok, _lv, html} = live(conn, "/#{site.domain}/change-domain") + + assert html =~ "Change your website domain" + end + test "form submission when no change is made", %{conn: conn, site: site} do {:ok, lv, _html} = live(conn, "/#{site.domain}/change-domain") From f70ef32ee21118a0759915503d6f13752db78ddf Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Wed, 10 Dec 2025 10:50:34 +0200 Subject: [PATCH 2/4] Fix change domain permissions --- lib/plausible_web/live/change_domain.ex | 1 + test/plausible_web/live/change_domain_test.exs | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/plausible_web/live/change_domain.ex b/lib/plausible_web/live/change_domain.ex index a840f623dcd3..c3d71009e01b 100644 --- a/lib/plausible_web/live/change_domain.ex +++ b/lib/plausible_web/live/change_domain.ex @@ -28,6 +28,7 @@ defmodule PlausibleWeb.Live.ChangeDomain do site = Plausible.Sites.get_for_user!(socket.assigns.current_user, domain, roles: [ + :editor, :owner, :admin, :super_admin diff --git a/test/plausible_web/live/change_domain_test.exs b/test/plausible_web/live/change_domain_test.exs index c295096ba21c..67d2284dbd08 100644 --- a/test/plausible_web/live/change_domain_test.exs +++ b/test/plausible_web/live/change_domain_test.exs @@ -39,14 +39,27 @@ defmodule PlausibleWeb.Live.ChangeDomainTest do assert html =~ "Change your website domain" end - test "mounts and renders form for guest editor", %{conn: conn} do + test "mounts and renders form for guest editor", %{conn: conn, user: user} do site = new_site() - add_guest(site, role: :editor) + add_guest(site, user: user, role: :editor) {:ok, _lv, html} = live(conn, "/#{site.domain}/change-domain") assert html =~ "Change your website domain" end + for role <- [:editor, :admin, :owner] do + test "mounts and renders form for user in team role #{inspect(role)}", %{ + conn: conn, + user: user + } do + site = new_site() + add_member(site.team, user: user, role: unquote(role)) + {:ok, _lv, html} = live(conn, "/#{site.domain}/change-domain") + + assert html =~ "Change your website domain" + end + end + test "form submission when no change is made", %{conn: conn, site: site} do {:ok, lv, _html} = live(conn, "/#{site.domain}/change-domain") From b974c226abefa468526309eaa8d9459574f278cf Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Wed, 10 Dec 2025 10:55:59 +0200 Subject: [PATCH 3/4] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index de5252c4bb0f..80627ae6efe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. ### Fixed - To make internal stats API requests for password-protected shared links, shared link auth cookie must be set in the requests +- Fix issue with site guests in Editor role and team members in Editor role not being able to change the domain of site ## v3.1.0 - 2025-11-13 From 55239f5180924e907674cda049a597bb2ccfe048 Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Wed, 10 Dec 2025 11:24:35 +0200 Subject: [PATCH 4/4] Add more comprehensive tests for other roles --- .../plausible_web/live/change_domain_test.exs | 63 +++++++++---------- test/support/teams/test.ex | 7 +++ 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/test/plausible_web/live/change_domain_test.exs b/test/plausible_web/live/change_domain_test.exs index 67d2284dbd08..18ef42a876f2 100644 --- a/test/plausible_web/live/change_domain_test.exs +++ b/test/plausible_web/live/change_domain_test.exs @@ -39,27 +39,6 @@ defmodule PlausibleWeb.Live.ChangeDomainTest do assert html =~ "Change your website domain" end - test "mounts and renders form for guest editor", %{conn: conn, user: user} do - site = new_site() - add_guest(site, user: user, role: :editor) - {:ok, _lv, html} = live(conn, "/#{site.domain}/change-domain") - - assert html =~ "Change your website domain" - end - - for role <- [:editor, :admin, :owner] do - test "mounts and renders form for user in team role #{inspect(role)}", %{ - conn: conn, - user: user - } do - site = new_site() - add_member(site.team, user: user, role: unquote(role)) - {:ok, _lv, html} = live(conn, "/#{site.domain}/change-domain") - - assert html =~ "Change your website domain" - end - end - test "form submission when no change is made", %{conn: conn, site: site} do {:ok, lv, _html} = live(conn, "/#{site.domain}/change-domain") @@ -103,22 +82,38 @@ defmodule PlausibleWeb.Live.ChangeDomainTest do assert is_nil(site.domain_changed_from) end - test "successful form submission updates database", %{conn: conn, site: site} do - original_domain = site.domain - new_domain = "new.#{site.domain}" - {:ok, lv, _html} = live(conn, "/#{site.domain}/change-domain") + for {role, membership_type} <- [ + {:editor, :site_guest}, + {:editor, :team_member}, + {:admin, :team_member}, + {:owner, :team_member} + ] do + test "#{Phoenix.Naming.humanize(membership_type)} with role #{role} can submit the form and it changes the record in the database", + %{conn: conn, user: user} do + site = new_site() - lv - |> element("form") - |> render_submit(%{site: %{domain: new_domain}}) + add_site_guest_or_team_member(site, + user: user, + role: unquote(role), + membership_type: unquote(membership_type) + ) - on_ee do - render_async(lv, 500) - end + original_domain = site.domain + new_domain = "new.#{site.domain}" + {:ok, lv, _html} = live(conn, "/#{site.domain}/change-domain") - site = Repo.reload!(site) - assert site.domain == new_domain - assert site.domain_changed_from == original_domain + lv + |> element("form") + |> render_submit(%{site: %{domain: new_domain}}) + + on_ee do + render_async(lv, 500) + end + + site = Repo.reload!(site) + assert site.domain == new_domain + assert site.domain_changed_from == original_domain + end end test "successful form submission navigates to success page", %{conn: conn, site: site} do diff --git a/test/support/teams/test.ex b/test/support/teams/test.ex index 93738a628521..d4c699889d30 100644 --- a/test/support/teams/test.ex +++ b/test/support/teams/test.ex @@ -112,6 +112,13 @@ defmodule Plausible.Teams.Test do end end + def add_site_guest_or_team_member(site, args \\ []) do + case Keyword.pop!(args, :membership_type) do + {:site_guest, args} -> add_guest(site, args) + {:team_member, args} -> add_member(site.team, args) + end + end + def add_guest(site, args \\ []) do user = Keyword.get(args, :user, new_user()) role = Keyword.fetch!(args, :role)