- increase timing threshold in session activity test (flaky at 50ms) - show org name instead of agent ID in admin agents list - fix agent live tests wiping auth session with init_test_session - add resilient error handling in FourOhFourTracker for missing redis
111 lines
3.3 KiB
Elixir
111 lines
3.3 KiB
Elixir
defmodule ToweropsWeb.Plugs.UpdateSessionActivityTest do
|
|
use ToweropsWeb.ConnCase, async: true
|
|
|
|
import Towerops.AccountsFixtures
|
|
|
|
alias Towerops.Accounts
|
|
alias ToweropsWeb.Plugs.UpdateSessionActivity
|
|
|
|
describe "init/1" do
|
|
test "returns options unchanged" do
|
|
assert UpdateSessionActivity.init([]) == []
|
|
assert UpdateSessionActivity.init(some: :option) == [some: :option]
|
|
end
|
|
end
|
|
|
|
describe "call/2" do
|
|
test "returns conn unchanged" do
|
|
conn = Plug.Test.init_test_session(build_conn(), %{})
|
|
|
|
result = UpdateSessionActivity.call(conn, [])
|
|
|
|
assert result == conn
|
|
end
|
|
|
|
test "spawns background task to update session activity" do
|
|
user = user_fixture()
|
|
{token, user_token} = Accounts.generate_user_session_token_with_record(user)
|
|
|
|
now = DateTime.utc_now()
|
|
|
|
# Create browser session
|
|
{:ok, _session} =
|
|
Accounts.create_browser_session(%{
|
|
user_id: user.id,
|
|
user_token_id: user_token.id,
|
|
device_name: "Test Browser",
|
|
ip_address: "127.0.0.1",
|
|
user_agent: "Mozilla/5.0 Test",
|
|
last_activity_at: now,
|
|
expires_at: DateTime.add(now, 30, :day)
|
|
})
|
|
|
|
# Call plug with session token - should spawn background task without blocking
|
|
result =
|
|
build_conn()
|
|
|> Plug.Test.init_test_session(%{user_token: token})
|
|
|> UpdateSessionActivity.call([])
|
|
|
|
# Should return immediately (not block on background task)
|
|
assert result
|
|
end
|
|
|
|
test "handles missing session token gracefully" do
|
|
build_conn()
|
|
|> Plug.Test.init_test_session(%{})
|
|
|> UpdateSessionActivity.call([])
|
|
|
|
# Should not raise an error - test passes if no exception
|
|
end
|
|
|
|
test "handles invalid session token gracefully" do
|
|
build_conn()
|
|
|> Plug.Test.init_test_session(%{user_token: "invalid-token-does-not-exist"})
|
|
|> UpdateSessionActivity.call([])
|
|
|
|
# Wait for background task to complete
|
|
Process.sleep(100)
|
|
|
|
# Should not raise an error - test passes if no exception
|
|
end
|
|
|
|
test "does not block the request while updating" do
|
|
user = user_fixture()
|
|
{token, user_token} = Accounts.generate_user_session_token_with_record(user)
|
|
|
|
now = DateTime.utc_now()
|
|
|
|
{:ok, _session} =
|
|
Accounts.create_browser_session(%{
|
|
user_id: user.id,
|
|
user_token_id: user_token.id,
|
|
device_name: "Test Browser",
|
|
ip_address: "127.0.0.1",
|
|
user_agent: "Mozilla/5.0 Test",
|
|
last_activity_at: now,
|
|
expires_at: DateTime.add(now, 30, :day)
|
|
})
|
|
|
|
# Time the request - should be fast even though update happens in background
|
|
start_time = System.monotonic_time(:millisecond)
|
|
|
|
build_conn()
|
|
|> Plug.Test.init_test_session(%{user_token: token})
|
|
|> UpdateSessionActivity.call([])
|
|
|
|
end_time = System.monotonic_time(:millisecond)
|
|
duration = end_time - start_time
|
|
|
|
# Should complete very quickly since update is async
|
|
assert duration < 200
|
|
end
|
|
|
|
test "handles nil token gracefully" do
|
|
build_conn()
|
|
|> Plug.Test.init_test_session(%{user_token: nil})
|
|
|> UpdateSessionActivity.call([])
|
|
|
|
# Should not raise an error - test passes if no exception
|
|
end
|
|
end
|
|
end
|