- Remove all 25ms and 50ms sleeps from agent_channel_test - Add poll_until helper for async DB operations (early exit on success) - Reduce timeout test sleeps from 100ms to 60ms - Reduce polling delays from 10ms to 5ms in multiple tests - Remove unnecessary timestamp and background task sleeps - Reduce circuit breaker recovery sleep from 150ms to 110ms Performance: 30.3s → 28.3s (6.6% faster) Total improvement from baseline: 52s → 28.3s (45.6% faster)
108 lines
3.2 KiB
Elixir
108 lines
3.2 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([])
|
|
|
|
# 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
|