File size: 5,552 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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | defmodule PlausibleWeb.AuthPlugTest do
use PlausibleWeb.ConnCase, async: true
alias PlausibleWeb.AuthPlug
setup [:create_user, :log_in]
test "does nothing if user is not logged in" do
conn =
build_conn(:get, "/")
|> init_test_session(%{})
|> AuthPlug.call(%{})
assert is_nil(conn.assigns[:current_user])
end
test "looks up current user if they are logged in", %{conn: conn, user: user} do
subscribe_to_plan(user, "123", inserted_at: NaiveDateTime.utc_now())
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{})
|> AuthPlug.call(%{})
assert conn.assigns[:current_user].id == user.id
assert conn.assigns[:my_team].subscription.paddle_plan_id == "123"
assert conn.assigns[:current_team_role] == :owner
end
test "looks up the latest subscription", %{conn: conn, user: user} do
# old subscription
subscribe_to_plan(
user,
"123",
inserted_at: NaiveDateTime.shift(NaiveDateTime.utc_now(), day: -1)
)
subscribe_to_plan(
user,
"456",
inserted_at: NaiveDateTime.utc_now()
)
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{})
|> AuthPlug.call(%{})
assert conn.assigns[:current_user].id == user.id
assert conn.assigns[:my_team].subscription.paddle_plan_id == "456"
end
test "switches current team when `team` parameter provided", %{conn: conn, user: user} do
subscribe_to_plan(user, "123", inserted_at: NaiveDateTime.utc_now())
team = team_of(user)
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{__team: team.identifier})
|> AuthPlug.call(%{})
assert conn.assigns[:current_team].id == team.id
assert conn.assigns[:current_team_role] == :owner
assert get_session(conn, "current_team_id") == team.identifier
end
test "does not switch to team provided via `team` the user doesn't belong to", %{conn: conn} do
other_user = new_user()
subscribe_to_plan(other_user, "123", inserted_at: NaiveDateTime.utc_now())
team = team_of(other_user)
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{team: team.identifier})
|> AuthPlug.call(%{})
refute conn.assigns[:current_team]
refute get_session(conn, "current_team_id")
end
test "does not switch to a team from session when the user doesn't belong to it", %{conn: conn} do
other_user = new_user()
subscribe_to_plan(other_user, "123", inserted_at: NaiveDateTime.utc_now())
team = team_of(other_user)
conn =
conn
|> put_session("current_team_id", team.identifier)
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{})
|> AuthPlug.call(%{})
refute conn.assigns[:current_team]
refute get_session(conn, "current_team_id")
end
test "falls back to my_team when there's no current team picked", %{conn: conn, user: user} do
subscribe_to_plan(user, "123", inserted_at: NaiveDateTime.utc_now())
team = team_of(user)
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{})
|> AuthPlug.call(%{})
assert conn.assigns[:current_team].id == team.id
refute get_session(conn, "current_team_id")
end
test "tracks current team role", %{conn: conn, user: user} do
other_user = new_user()
subscribe_to_plan(other_user, "123", inserted_at: NaiveDateTime.utc_now())
team = team_of(other_user)
add_member(team, user: user, role: :editor)
conn = set_current_team(conn, team)
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{})
|> AuthPlug.call(%{})
assert conn.assigns[:current_team].id == team.id
assert conn.assigns[:current_team_role] == :editor
end
test "stores team identifier when team changes", %{conn: conn, user: user} do
subscribe_to_plan(user, "123", inserted_at: NaiveDateTime.utc_now())
team = team_of(user)
assert is_nil(user.last_team_identifier)
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{__team: team.identifier})
|> AuthPlug.call(%{})
updated_user = Plausible.Repo.reload!(user)
assert updated_user.last_team_identifier == team.identifier
assert get_session(conn, "current_team_id") == team.identifier
end
test "clears team identifier when recently stored team identifier doesn't exist", %{
conn: conn,
user: user
} do
subscribe_to_plan(user, "123", inserted_at: NaiveDateTime.utc_now())
stale_team_id = Ecto.UUID.generate()
:ok = Plausible.Users.remember_last_team(user, stale_team_id)
assert Plausible.Repo.reload!(user).last_team_identifier
conn =
conn
|> put_session("current_team_id", stale_team_id)
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{})
|> AuthPlug.call(%{})
updated_user = Plausible.Repo.reload!(user)
assert is_nil(updated_user.last_team_identifier)
refute get_session(conn, "current_team_id")
end
test "assigns expired session for further subsequent processing", %{conn: conn} do
now = NaiveDateTime.utc_now(:second)
in_the_past = NaiveDateTime.add(now, -1, :hour)
{:ok, user_session} = PlausibleWeb.UserAuth.get_user_session(conn)
user_session |> Ecto.Changeset.change(timeout_at: in_the_past) |> Plausible.Repo.update!()
conn =
conn
|> Plug.Adapters.Test.Conn.conn(:get, "/", %{})
|> AuthPlug.call(%{})
refute conn.assigns[:current_user]
refute conn.assigns[:current_team]
assert conn.assigns[:expired_session].id == user_session.id
end
end
|