File size: 4,663 Bytes
6778ee0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | defmodule PlausibleWeb.Live.SharedLinkSettingsTest do
use PlausibleWeb.ConnCase, async: true
import Phoenix.LiveViewTest
describe "SharedLinkSettings LiveView" do
setup [:create_user, :log_in, :create_site]
setup %{user: user, site: site} do
subscribe_to_growth_plan(user)
{:ok, session: %{"site_id" => site.id, "domain" => site.domain}}
end
test "guest editors should be able to access shared link settings", %{
site: site,
conn: conn,
session: session
} do
insert(:shared_link, site: site, name: "Link 1")
guest_user = new_user()
add_guest(site, user: guest_user, role: :editor)
{:ok, conn: conn} = log_in(%{user: guest_user, conn: conn})
lv = get_liveview(conn, session)
lock_notice = render(lv) |> text_of_element("#lock-notice")
refute lock_notice =~ "upgrade your subscription"
end
test "allows shared link deletion", %{conn: conn, site: site, session: session} do
link1 = insert(:shared_link, site: site, name: "Link 1")
link2 = insert(:shared_link, site: site, name: "Link 2")
lv = get_liveview(conn, session)
html = render(lv)
assert html =~ "Link 1"
assert html =~ "Link 2"
html =
lv
|> element(~s/button[phx-click="delete-shared-link"][phx-value-slug="#{link1.slug}"]/)
|> render_click()
refute html =~ "Link 1"
assert html =~ "Link 2"
assert html =~ "Shared link deleted"
# Verify it's actually deleted from database
refute Plausible.Repo.get_by(Plausible.Site.SharedLink, slug: link1.slug)
assert Plausible.Repo.get_by(Plausible.Site.SharedLink, slug: link2.slug)
end
test "shows success message when link is deleted", %{conn: conn, site: site, session: session} do
link = insert(:shared_link, site: site, name: "Test Link")
lv = get_liveview(conn, session)
html =
lv
|> element(~s/button[phx-click="delete-shared-link"][phx-value-slug="#{link.slug}"]/)
|> render_click()
assert html =~ "Shared link deleted"
refute html =~ "Test Link"
end
test "shows error message when trying to delete non-existent link (race condition)", %{
conn: conn,
site: site,
session: session
} do
# Simulate race condition: link exists when page loads, but is deleted
# by another user/process before we click delete
link = insert(:shared_link, site: site, name: "Test Link")
lv = get_liveview(conn, session)
html = render(lv)
assert html =~ "Test Link"
Plausible.Repo.delete!(link)
html =
lv
|> element(~s/button[phx-click="delete-shared-link"][phx-value-slug="#{link.slug}"]/)
|> render_click()
assert html =~ "Could not find Shared Link"
end
test "displays shared links with password indicators", %{
conn: conn,
site: site,
session: session
} do
link_with_password =
insert(:shared_link, site: site, name: "Protected", password: "secret")
link_without_password = insert(:shared_link, site: site, name: "Public")
lv = get_liveview(conn, session)
html = render(lv)
assert html =~ "Protected"
assert html =~ "value=\"#{Plausible.Sites.shared_link_url(site, link_with_password)}\""
assert html =~ "Public"
assert html =~ "value=\"#{Plausible.Sites.shared_link_url(site, link_without_password)}\""
# Check for lock icons
assert element_exists?(html, ~s|svg|)
end
test "displays empty state when no shared links", %{conn: conn, session: session} do
lv = get_liveview(conn, session)
html = render(lv)
assert html =~ "Create your first shared link"
end
test "cannot edit shared link from another site by passing its slug as a param", %{
conn: conn,
site: site,
session: session
} do
_own_link = insert(:shared_link, site: site, name: "Own Link")
victim_site = insert(:site)
victim_link = insert(:shared_link, site: victim_site, name: "Victim Link")
lv = get_liveview(conn, session)
html = render_click(lv, "edit-shared-link", %{"slug" => victim_link.slug})
refute html =~ "Edit shared link"
assert html =~ "Could not find Shared Link"
# Verify the victim's shared link is unchanged in the database
reloaded = Plausible.Repo.reload!(victim_link)
assert reloaded.name == "Victim Link"
end
end
defp get_liveview(conn, session) do
{:ok, lv, _html} = live_isolated(conn, PlausibleWeb.Live.SharedLinkSettings, session: session)
lv
end
end
|