Leon4gr45 commited on
Commit
d7fe0f6
·
verified ·
1 Parent(s): 2bb25e0

Delete test/plausible/auth/user_sessions_test.exs with huggingface_hub

Browse files
test/plausible/auth/user_sessions_test.exs DELETED
@@ -1,550 +0,0 @@
1
- defmodule Plausible.Auth.UserSessionsTest do
2
- use Plausible.DataCase, async: true
3
-
4
- import Phoenix.ChannelTest
5
-
6
- alias Plausible.Auth
7
- alias Plausible.Auth.UserSessions
8
- alias Plausible.Repo
9
-
10
- describe "list_for_user/2" do
11
- test "lists user sessions" do
12
- user = insert(:user)
13
-
14
- now = NaiveDateTime.utc_now(:second)
15
- thirty_minutes_ago = NaiveDateTime.shift(now, minute: -30)
16
- ten_hours_ago = NaiveDateTime.shift(now, hour: -10)
17
- ten_days_ago = NaiveDateTime.shift(now, day: -10)
18
- twenty_days_ago = NaiveDateTime.shift(now, day: -20)
19
-
20
- recent_session = insert_session(user, "Recent Device", thirty_minutes_ago)
21
- old_session = insert_session(user, "Old Device", ten_hours_ago)
22
- older_session = insert_session(user, "Older Device", ten_days_ago)
23
- _expired_session = insert_session(user, "Expired Device", twenty_days_ago)
24
- _rogue_session = insert_session(insert(:user), "Unrelated device", now)
25
-
26
- assert [session1, session2, session3] = UserSessions.list_for_user(user, now)
27
-
28
- assert session1.id == recent_session.id
29
- assert session2.id == old_session.id
30
- assert session3.id == older_session.id
31
- end
32
- end
33
-
34
- describe "count_for_users/2" do
35
- test "counts user sessions" do
36
- now = NaiveDateTime.utc_now(:second)
37
- thirty_minutes_ago = NaiveDateTime.shift(now, minute: -30)
38
-
39
- u1 = insert(:user)
40
- u2 = insert(:user)
41
- u3 = insert(:user)
42
-
43
- insert_session(u1, "Recent Device", thirty_minutes_ago)
44
- insert_session(u1, "Recent Device 2", thirty_minutes_ago)
45
- insert_session(u2, "Recent Device", thirty_minutes_ago)
46
-
47
- assert UserSessions.count_for_users([u1, u2, u3], now) == [{u1.id, 2}, {u2.id, 1}]
48
- end
49
- end
50
-
51
- on_ee do
52
- describe "list_for_sso_team/1,2" do
53
- test "lists only SSO member sessions for a given team" do
54
- %{team: sso_team, site: site, sso_integration: sso_integration} =
55
- setup_do(&create_user/1)
56
- |> setup_do(&create_team/1)
57
- |> setup_do(&create_site/1)
58
- |> setup_do(&setup_sso/1)
59
-
60
- %{team: _other_sso_team, sso_integration: other_sso_integration} =
61
- %{domain: "example2.com"}
62
- |> setup_do(&create_user/1)
63
- |> setup_do(&create_team/1)
64
- |> setup_do(&setup_sso/1)
65
-
66
- %{team: _other_team, user: other_member} =
67
- setup_do(&create_user/1)
68
- |> setup_do(&create_team/1)
69
-
70
- add_guest(site, user: other_member, role: :editor)
71
- _other_member_session = Auth.UserSessions.create!(other_member, "Unknown")
72
-
73
- %{user: sso_member} =
74
- %{
75
- user: %{name: "Jerry Wane", email: "wane@example.com"},
76
- sso_integration: sso_integration
77
- }
78
- |> setup_do(&provision_sso_user/1)
79
-
80
- now = NaiveDateTime.utc_now(:second)
81
-
82
- sso_member_session =
83
- insert_session(sso_member, "Unknown", NaiveDateTime.add(now, -1, :hour))
84
-
85
- %{user: sso_member2} =
86
- %{
87
- user: %{name: "Joan McGuire", email: "joan@example.com"},
88
- sso_integration: sso_integration
89
- }
90
- |> setup_do(&provision_sso_user/1)
91
-
92
- sso_member2_session1 =
93
- insert_session(sso_member2, "Unknown", NaiveDateTime.add(now, -2, :hour))
94
-
95
- sso_member2_session2 = insert_session(sso_member2, "Unknown", now)
96
-
97
- in_the_past = NaiveDateTime.add(NaiveDateTime.utc_now(:second), -1, :hour)
98
-
99
- _sso_member2_session_past =
100
- Auth.UserSessions.create!(sso_member2, "Unknown", timeout_at: in_the_past)
101
-
102
- team = new_site().team
103
- standard_member = add_member(team, role: :editor)
104
- _standard_member_session = insert_session(standard_member, "Unknown", now)
105
-
106
- %{user: other_sso_member} =
107
- %{
108
- user: %{name: "Veronica Dogwright", email: "veronica@example2.com"},
109
- sso_integration: other_sso_integration
110
- }
111
- |> setup_do(&provision_sso_user/1)
112
-
113
- _other_sso_member_session = insert_session(other_sso_member, "Unknown", now)
114
-
115
- %{user: guest_sso_member} =
116
- %{
117
- user: %{name: "Jimmy Felon", email: "jimmy@example2.com"},
118
- sso_integration: other_sso_integration
119
- }
120
- |> setup_do(&provision_sso_user/1)
121
-
122
- add_guest(site, user: Repo.reload!(guest_sso_member), role: :viewer)
123
-
124
- _guest_sso_member_session = insert_session(guest_sso_member, "Unknown", now)
125
-
126
- assert [s1, s2, s3] = Auth.UserSessions.list_sso_for_team(sso_team)
127
-
128
- assert s1.token == sso_member2_session2.token
129
- assert s2.token == sso_member_session.token
130
- assert s3.token == sso_member2_session1.token
131
- end
132
- end
133
-
134
- describe "revoke_sso_by_id/2" do
135
- test "deletes and disconnects user session" do
136
- %{team: sso_team, sso_integration: sso_integration} =
137
- setup_do(&create_user/1)
138
- |> setup_do(&create_team/1)
139
- |> setup_do(&setup_sso/1)
140
-
141
- %{user: user} =
142
- %{
143
- user: %{name: "Jerry Wane", email: "wane@example.com"},
144
- sso_integration: sso_integration
145
- }
146
- |> setup_do(&provision_sso_user/1)
147
-
148
- now = NaiveDateTime.utc_now(:second)
149
- active_session = insert_session(user, "Unknown", now)
150
- another_session = insert_session(user, "Unknown", now)
151
-
152
- live_socket_id = "user_sessions:" <> Base.url_encode64(active_session.token)
153
- Phoenix.PubSub.subscribe(Plausible.PubSub, live_socket_id)
154
-
155
- assert :ok = UserSessions.revoke_sso_by_id(sso_team, active_session.id)
156
-
157
- assert [remaining_session] = Repo.preload(user, :sessions).sessions
158
- assert_broadcast "disconnect", %{}
159
- assert remaining_session.id == another_session.id
160
- refute Repo.reload(active_session)
161
- assert Repo.reload(another_session)
162
- end
163
-
164
- test "does not delete session of user on another team" do
165
- %{team: sso_team, sso_integration: sso_integration} =
166
- setup_do(&create_user/1)
167
- |> setup_do(&create_team/1)
168
- |> setup_do(&setup_sso/1)
169
-
170
- %{team: _other_sso_team, sso_integration: other_sso_integration} =
171
- %{domain: "example2.com"}
172
- |> setup_do(&create_user/1)
173
- |> setup_do(&create_team/1)
174
- |> setup_do(&setup_sso/1)
175
-
176
- %{user: user} =
177
- %{
178
- user: %{name: "Jerry Wane", email: "wane@example.com"},
179
- sso_integration: sso_integration
180
- }
181
- |> setup_do(&provision_sso_user/1)
182
-
183
- now = NaiveDateTime.utc_now(:second)
184
-
185
- active_session = insert_session(user, "Unknown", now)
186
-
187
- %{user: other_user} =
188
- %{
189
- user: %{name: "Judy Wasteland", email: "judy@example2.com"},
190
- sso_integration: other_sso_integration
191
- }
192
- |> setup_do(&provision_sso_user/1)
193
-
194
- other_session = insert_session(other_user, "Unknown", now)
195
-
196
- assert :ok = UserSessions.revoke_sso_by_id(sso_team, other_session.id)
197
-
198
- assert Repo.reload(active_session)
199
- assert Repo.reload(other_session)
200
- end
201
-
202
- test "does not revoke session of standard user" do
203
- %{team: sso_team} =
204
- setup_do(&create_user/1)
205
- |> setup_do(&create_team/1)
206
- |> setup_do(&setup_sso/1)
207
-
208
- user = add_member(sso_team, role: :editor)
209
-
210
- now = NaiveDateTime.utc_now(:second)
211
- active_session = insert_session(user, "Unknown", now)
212
-
213
- assert :ok = UserSessions.revoke_sso_by_id(sso_team, active_session.id)
214
-
215
- assert Repo.reload(active_session)
216
- end
217
-
218
- test "does not revoke session of a guest who happens to be SSO user" do
219
- %{team: sso_team, site: site} =
220
- setup_do(&create_user/1)
221
- |> setup_do(&create_site/1)
222
- |> setup_do(&create_team/1)
223
- |> setup_do(&setup_sso/1)
224
-
225
- %{team: _other_sso_team, sso_integration: other_sso_integration} =
226
- %{domain: "example2.com"}
227
- |> setup_do(&create_user/1)
228
- |> setup_do(&create_team/1)
229
- |> setup_do(&setup_sso/1)
230
-
231
- %{user: user} =
232
- %{
233
- user: %{name: "Judy Wasteland", email: "judy@example2.com"},
234
- sso_integration: other_sso_integration
235
- }
236
- |> setup_do(&provision_sso_user/1)
237
-
238
- user = add_guest(site, user: Repo.reload!(user), role: :editor)
239
-
240
- now = NaiveDateTime.utc_now(:second)
241
- active_session = insert_session(user, "Unknown", now)
242
-
243
- assert :ok = UserSessions.revoke_sso_by_id(sso_team, active_session.id)
244
-
245
- assert Repo.reload(active_session)
246
- end
247
-
248
- test "executes gracefully when session does not exist" do
249
- %{team: sso_team, sso_integration: sso_integration} =
250
- setup_do(&create_user/1)
251
- |> setup_do(&create_team/1)
252
- |> setup_do(&setup_sso/1)
253
-
254
- %{user: user} =
255
- %{
256
- user: %{name: "Jerry Wane", email: "wane@example.com"},
257
- sso_integration: sso_integration
258
- }
259
- |> setup_do(&provision_sso_user/1)
260
-
261
- now = NaiveDateTime.utc_now(:second)
262
- active_session = insert_session(user, "Unknown", now)
263
-
264
- Repo.delete!(active_session)
265
-
266
- assert :ok = UserSessions.revoke_sso_by_id(sso_team, active_session.id)
267
- end
268
- end
269
- end
270
-
271
- describe "last_used_humanize/2" do
272
- test "returns humanized relative time" do
273
- user = insert(:user)
274
- now = NaiveDateTime.utc_now(:second)
275
- thirty_minutes_ago = NaiveDateTime.shift(now, minute: -30)
276
- ninety_minutes_ago = NaiveDateTime.shift(now, minute: -90)
277
- ten_hours_ago = NaiveDateTime.shift(now, hour: -10)
278
- twenty_seven_hours_ago = NaiveDateTime.shift(now, hour: -27)
279
- fifty_hours_ago = NaiveDateTime.shift(now, hour: -50)
280
- ten_days_ago = NaiveDateTime.shift(now, day: -10)
281
-
282
- assert last_used_humanize(user, now) == "Just recently"
283
- assert last_used_humanize(user, thirty_minutes_ago) == "Just recently"
284
- assert last_used_humanize(user, ninety_minutes_ago) == "1 hour ago"
285
- assert last_used_humanize(user, ten_hours_ago) == "10 hours ago"
286
- assert last_used_humanize(user, twenty_seven_hours_ago) == "Yesterday"
287
- assert last_used_humanize(user, fifty_hours_ago) == "2 days ago"
288
- assert last_used_humanize(user, ten_days_ago) == "10 days ago"
289
- end
290
- end
291
-
292
- describe "get_by_token/1" do
293
- setup do
294
- user = new_user()
295
-
296
- session =
297
- user
298
- |> Auth.UserSession.new_session("A Device")
299
- |> Repo.insert!()
300
-
301
- {:ok, user: user, session: session}
302
- end
303
-
304
- test "fetches token by session", %{session: session, user: user} do
305
- user |> subscribe_to_growth_plan()
306
- team = team_of(user)
307
- assert {:ok, fetched} = UserSessions.get_by_token(session.token)
308
-
309
- assert fetched.id == session.id
310
- assert fetched.user.id == user.id
311
- assert [ownership] = fetched.user.team_memberships
312
- assert ownership.role == :owner
313
- assert ownership.team.id == team.id
314
- assert ownership.team.subscription.id
315
- assert [owner] = ownership.team.owners
316
- assert owner.id == user.id
317
- end
318
-
319
- test "returns not found when no matching session found" do
320
- assert {:error, :not_found} = UserSessions.get_by_token(Ecto.UUID.generate())
321
- end
322
-
323
- test "returns expired when the matching session is expired", %{session: session} do
324
- now = NaiveDateTime.utc_now(:second)
325
- in_the_past = NaiveDateTime.add(now, -1, :hour)
326
- session = session |> Ecto.Changeset.change(timeout_at: in_the_past) |> Repo.update!()
327
-
328
- assert {:error, :expired, expired_session} = UserSessions.get_by_token(session.token)
329
- assert expired_session.id == session.id
330
- end
331
- end
332
-
333
- describe "touch/1,2" do
334
- setup do
335
- user = new_user()
336
-
337
- session =
338
- user
339
- |> Auth.UserSession.new_session("A Device")
340
- |> Repo.insert!()
341
-
342
- {:ok, user: user, session: session}
343
- end
344
-
345
- test "refreshes user session timestamps", %{user: user, session: session} do
346
- two_days_later =
347
- NaiveDateTime.utc_now(:second)
348
- |> NaiveDateTime.shift(day: 2)
349
-
350
- assert refreshed_session =
351
- %Auth.UserSession{} = UserSessions.touch(session, two_days_later)
352
-
353
- assert refreshed_session.id == session.id
354
- assert NaiveDateTime.compare(refreshed_session.last_used_at, two_days_later) == :eq
355
- assert NaiveDateTime.compare(Repo.reload(user).last_seen, two_days_later) == :eq
356
- assert NaiveDateTime.compare(refreshed_session.timeout_at, session.timeout_at) == :gt
357
- end
358
-
359
- test "does not refresh if timestamps were updated less than hour before", %{
360
- user: user,
361
- session: session
362
- } do
363
- last_seen = Repo.reload(user).last_seen
364
-
365
- fifty_minutes_later =
366
- NaiveDateTime.utc_now(:second)
367
- |> NaiveDateTime.shift(minute: 50)
368
-
369
- assert refreshed_session1 =
370
- %Auth.UserSession{} =
371
- UserSessions.touch(session, fifty_minutes_later)
372
-
373
- assert NaiveDateTime.compare(
374
- refreshed_session1.last_used_at,
375
- session.last_used_at
376
- ) == :eq
377
-
378
- assert NaiveDateTime.compare(Repo.reload(user).last_seen, last_seen) == :eq
379
-
380
- sixty_five_minutes_later =
381
- NaiveDateTime.utc_now(:second)
382
- |> NaiveDateTime.shift(minute: 65)
383
-
384
- assert refreshed_session2 =
385
- %Auth.UserSession{} =
386
- UserSessions.touch(session, sixty_five_minutes_later)
387
-
388
- assert NaiveDateTime.compare(
389
- refreshed_session2.last_used_at,
390
- sixty_five_minutes_later
391
- ) == :eq
392
-
393
- assert NaiveDateTime.compare(Repo.reload(user).last_seen, sixty_five_minutes_later) == :eq
394
- end
395
-
396
- test "handles concurrent refresh gracefully", %{session: session} do
397
- # concurrent update
398
- now = NaiveDateTime.utc_now(:second)
399
- two_days_later = NaiveDateTime.shift(now, day: 2)
400
-
401
- Repo.update_all(
402
- from(us in Auth.UserSession, where: us.token == ^session.token),
403
- set: [timeout_at: two_days_later, last_used_at: now]
404
- )
405
-
406
- assert refreshed_session = %Auth.UserSession{} = UserSessions.touch(session)
407
-
408
- assert refreshed_session.id == session.id
409
- assert Repo.reload(session)
410
- end
411
-
412
- test "handles deleted session case gracefully", %{session: session} do
413
- Repo.delete!(session)
414
-
415
- assert refreshed_session = %Auth.UserSession{} = UserSessions.touch(session)
416
-
417
- assert refreshed_session.id == session.id
418
-
419
- refute Repo.reload(session)
420
- end
421
-
422
- on_ee do
423
- test "only records last usage but does not refresh for SSO user", %{
424
- user: user,
425
- session: session
426
- } do
427
- sixty_five_minutes_later =
428
- NaiveDateTime.utc_now(:second)
429
- |> NaiveDateTime.shift(minute: 65)
430
-
431
- user |> Ecto.Changeset.change(type: :sso) |> Repo.update!()
432
-
433
- session = Repo.reload!(session)
434
-
435
- assert refreshed_session =
436
- %Auth.UserSession{} =
437
- UserSessions.touch(session, sixty_five_minutes_later)
438
-
439
- assert refreshed_session.id == session.id
440
-
441
- assert NaiveDateTime.compare(refreshed_session.last_used_at, sixty_five_minutes_later) ==
442
- :eq
443
-
444
- assert NaiveDateTime.compare(refreshed_session.timeout_at, session.timeout_at) == :eq
445
- end
446
- end
447
- end
448
-
449
- describe "revoke_by_id/2" do
450
- setup do
451
- user = new_user()
452
-
453
- session =
454
- user
455
- |> Auth.UserSession.new_session("A Device")
456
- |> Repo.insert!()
457
-
458
- {:ok, user: user, session: session}
459
- end
460
-
461
- test "deletes and disconnects user session", %{user: user, session: active_session} do
462
- live_socket_id = "user_sessions:" <> Base.url_encode64(active_session.token)
463
- Phoenix.PubSub.subscribe(Plausible.PubSub, live_socket_id)
464
-
465
- another_session =
466
- user
467
- |> Auth.UserSession.new_session("Some Device")
468
- |> Repo.insert!()
469
-
470
- assert :ok = UserSessions.revoke_by_id(user, active_session.id)
471
-
472
- assert [remaining_session] = Repo.preload(user, :sessions).sessions
473
- assert_broadcast "disconnect", %{}
474
- assert remaining_session.id == another_session.id
475
- refute Repo.reload(active_session)
476
- assert Repo.reload(another_session)
477
- end
478
-
479
- test "does not delete session of another user", %{user: user, session: active_session} do
480
- other_session =
481
- insert(:user)
482
- |> Auth.UserSession.new_session("Some Device")
483
- |> Repo.insert!()
484
-
485
- assert :ok = UserSessions.revoke_by_id(user, other_session.id)
486
-
487
- assert Repo.reload(active_session)
488
- assert Repo.reload(other_session)
489
- end
490
-
491
- test "executes gracefully when session does not exist", %{user: user, session: active_session} do
492
- Repo.delete!(active_session)
493
-
494
- assert :ok = UserSessions.revoke_by_id(user, active_session.id)
495
- end
496
- end
497
-
498
- describe "revoke_all/1,2" do
499
- setup do
500
- user = new_user()
501
-
502
- session =
503
- user
504
- |> Auth.UserSession.new_session("A Device")
505
- |> Repo.insert!()
506
-
507
- {:ok, user: user, session: session}
508
- end
509
-
510
- test "deletes and disconnects all user's sessions", %{user: user, session: active_session} do
511
- live_socket_id = "user_sessions:" <> Base.url_encode64(active_session.token)
512
- Phoenix.PubSub.subscribe(Plausible.PubSub, live_socket_id)
513
-
514
- another_session =
515
- user
516
- |> Auth.UserSession.new_session("Some Device")
517
- |> Repo.insert!()
518
-
519
- unrelated_session =
520
- insert(:user)
521
- |> Auth.UserSession.new_session("Some Device")
522
- |> Repo.insert!()
523
-
524
- assert :ok = UserSessions.revoke_all(user)
525
-
526
- assert [] = Repo.preload(user, :sessions).sessions
527
- assert_broadcast "disconnect", %{}
528
- refute Repo.reload(another_session)
529
- assert Repo.reload(unrelated_session)
530
- end
531
-
532
- test "executes gracefully when user has no sessions" do
533
- user = insert(:user)
534
-
535
- assert :ok = UserSessions.revoke_all(user)
536
- end
537
- end
538
-
539
- defp last_used_humanize(user, dt) do
540
- user
541
- |> insert_session("Some Device", dt)
542
- |> UserSessions.last_used_humanize()
543
- end
544
-
545
- defp insert_session(user, device_name, now) do
546
- user
547
- |> Auth.UserSession.new_session(device_name, now: now)
548
- |> Repo.insert!()
549
- end
550
- end