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