Files
EventHubBack/test/unit/core_auth_session_tests.erl
T
aleksey 0690020e81
CI / test (push) Failing after 10m52s
CI / deploy-ift (push) Has been skipped
CI / e2e-ift (push) Has been skipped
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped
feat(auth): list/revoke sessions with device_name and client_type. Fixes EventHub/EventHubBack#74
2026-08-16 18:30:05 +03:00

86 lines
3.6 KiB
Erlang

-module(core_auth_session_tests).
-include_lib("eunit/include/eunit.hrl").
-include("records.hrl").
-define(ADMIN_JWT_SECRET, <<"test-admin-secret-key-32-b">>).
setup() ->
mnesia:start(),
catch ets:new(eventhub_counters, [named_table, public, set, {write_concurrency, true}]),
mnesia:create_table(auth_session, [
{attributes, record_info(fields, auth_session)},
{ram_copies, [node()]}
]),
mnesia:add_table_index(auth_session, #auth_session.family_id),
mnesia:add_table_index(auth_session, #auth_session.subject_id),
application:set_env(eventhub, admin_jwt_secret, ?ADMIN_JWT_SECRET),
{ok, _} = application:ensure_all_started(jose),
ok.
cleanup(_) ->
mnesia:delete_table(auth_session),
catch ets:delete(eventhub_counters),
application:unset_env(eventhub, admin_jwt_secret),
application:stop(jose),
mnesia:stop(),
ok.
core_auth_session_test_() ->
{foreach, fun setup/0, fun cleanup/1, [
{"Create session", fun test_create/0},
{"Create with device", fun test_create_device/0},
{"Rotate session updates jti", fun test_rotate/0},
{"Reuse detection", fun test_reuse/0},
{"Revoke family", fun test_revoke_family/0},
{"List active and revoke others", fun test_list_and_revoke_others/0}
]}.
test_create() ->
{ok, Session} = core_auth_session:create(<<"admin1">>, admin, <<"admin">>),
?assertEqual(<<"admin1">>, Session#auth_session.subject_id),
?assertEqual(admin, Session#auth_session.subject_type),
?assertEqual(false, Session#auth_session.revoked),
?assertEqual(<<>>, Session#auth_session.device_name),
{ok, Loaded} = core_auth_session:get(Session#auth_session.session_id),
?assertEqual(Session#auth_session.session_id, Loaded#auth_session.session_id).
test_create_device() ->
{ok, Session} = core_auth_session:create(
<<"u1">>, user, <<"web">>, <<"Chrome · Win">>, <<"Mozilla">>),
?assertEqual(<<"Chrome · Win">>, Session#auth_session.device_name),
?assertEqual(<<"Mozilla">>, Session#auth_session.user_agent).
test_rotate() ->
{ok, Session} = core_auth_session:create(<<"admin1">>, admin, <<"admin">>),
OldJti = Session#auth_session.current_jti,
{ok, NewJti, _} = core_auth_session:rotate(Session#auth_session.session_id, OldJti),
?assertNotEqual(OldJti, NewJti),
?assertMatch({error, reuse_detected},
core_auth_session:rotate(Session#auth_session.session_id, OldJti)).
test_reuse() ->
{ok, Session} = core_auth_session:create(<<"admin1">>, admin, <<"admin">>),
Jti = Session#auth_session.current_jti,
{ok, _, _} = core_auth_session:rotate(Session#auth_session.session_id, Jti),
?assertMatch({error, reuse_detected},
core_auth_session:rotate(Session#auth_session.session_id, Jti)).
test_revoke_family() ->
{ok, S1} = core_auth_session:create(<<"admin1">>, admin, <<"admin">>),
ok = core_auth_session:revoke_family(S1#auth_session.family_id),
?assertMatch({error, revoked},
core_auth_session:rotate(S1#auth_session.session_id, S1#auth_session.current_jti)).
test_list_and_revoke_others() ->
{ok, Keep} = core_auth_session:create(<<"u1">>, user, <<"web">>, <<"A">>, <<"ua">>),
{ok, Other} = core_auth_session:create(<<"u1">>, user, <<"mobile">>, <<"B">>, <<"ub">>),
Active = core_auth_session:list_active_for_subject(<<"u1">>, user),
?assertEqual(2, length(Active)),
{ok, 1} = core_auth_session:revoke_others_for_subject(
<<"u1">>, user, Keep#auth_session.session_id),
Left = core_auth_session:list_active_for_subject(<<"u1">>, user),
?assertEqual(1, length(Left)),
?assertEqual(Keep#auth_session.session_id, (hd(Left))#auth_session.session_id),
{ok, Revoked} = core_auth_session:get(Other#auth_session.session_id),
?assertEqual(true, Revoked#auth_session.revoked).