-module(core_admin_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). -define(TABLES, [admin]). setup() -> eh_test_support:start_mnesia(), eh_test_support:ensure_tables(?TABLES), ok. cleanup(_) -> eh_test_support:clear_tables(?TABLES), eh_test_support:delete_tables(?TABLES), eh_test_support:stop_mnesia(), ok. core_admin_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"Create admin", fun test_create/0}, {"Create admin – email exists", fun test_create_email_exists/0}, {"Get by id", fun test_get_by_id/0}, {"Get by email", fun test_get_by_email/0}, {"List all", fun test_list_all/0}, {"Update fields", fun test_update/0}, {"Update role", fun test_update_role/0}, {"Block and unblock", fun test_block_unblock/0}, {"Update last login", fun test_update_last_login/0}, {"Delete", fun test_delete/0} ]}. test_create() -> Email = <<"admin1@test.local">>, {ok, Admin} = core_admin:create(Email, <<"secret123">>, admin), ?assertEqual(Email, Admin#admin.email), ?assertEqual(admin, Admin#admin.role), ?assertEqual(active, Admin#admin.status), ?assertEqual(<<"admin1">>, Admin#admin.nickname), ?assert(is_binary(Admin#admin.id)), ?assert(is_binary(Admin#admin.password_hash)), ?assert(Admin#admin.password_hash =/= <<"secret123">>). test_create_email_exists() -> Email = <<"dup@test.local">>, {ok, _} = core_admin:create(Email, <<"pass1">>, admin), ?assertEqual({error, email_exists}, core_admin:create(Email, <<"pass2">>, moderator)). test_get_by_id() -> {ok, Admin} = core_admin:create(<<"byid@test.local">>, <<"pass">>, admin), {ok, Found} = core_admin:get_by_id(Admin#admin.id), ?assertEqual(Admin#admin.id, Found#admin.id), ?assertEqual(Admin#admin.email, Found#admin.email), ?assertEqual({error, not_found}, core_admin:get_by_id(<<"missing">>)). test_get_by_email() -> Email = <<"byemail@test.local">>, {ok, Admin} = core_admin:create(Email, <<"pass">>, support), {ok, Found} = core_admin:get_by_email(Email), ?assertEqual(Admin#admin.id, Found#admin.id), ?assertEqual({error, not_found}, core_admin:get_by_email(<<"nope@test.local">>)). test_list_all() -> ?assertEqual([], core_admin:list_all()), {ok, _} = core_admin:create(<<"a1@test.local">>, <<"pass">>, admin), {ok, _} = core_admin:create(<<"a2@test.local">>, <<"pass">>, moderator), List = core_admin:list_all(), ?assertEqual(2, length(List)). test_update() -> {ok, Admin} = core_admin:create(<<"upd@test.local">>, <<"pass">>, admin), {ok, Updated} = core_admin:update(Admin#admin.id, [ {nickname, <<"nick">>}, {phone, <<"+7999">>}, {timezone, <<"Europe/Moscow">>} ]), ?assertEqual(<<"nick">>, Updated#admin.nickname), ?assertEqual(<<"+7999">>, Updated#admin.phone), ?assertEqual(<<"Europe/Moscow">>, Updated#admin.timezone), ?assertEqual({error, not_found}, core_admin:update(<<"missing">>, [{nickname, <<"x">>}])). test_update_role() -> {ok, Admin} = core_admin:create(<<"role@test.local">>, <<"pass">>, admin), {ok, Updated} = core_admin:update_role(Admin#admin.id, superadmin), ?assertEqual(superadmin, Updated#admin.role), {ok, Loaded} = core_admin:get_by_id(Admin#admin.id), ?assertEqual(superadmin, Loaded#admin.role), ?assertEqual({error, not_found}, core_admin:update_role(<<"missing">>, admin)). test_block_unblock() -> {ok, Admin} = core_admin:create(<<"block@test.local">>, <<"pass">>, admin), {ok, Blocked} = core_admin:block(Admin#admin.id), ?assertEqual(blocked, Blocked#admin.status), {ok, Active} = core_admin:unblock(Admin#admin.id), ?assertEqual(active, Active#admin.status), ?assertEqual({error, not_found}, core_admin:block(<<"missing">>)), ?assertEqual({error, not_found}, core_admin:unblock(<<"missing">>)). test_update_last_login() -> {ok, Admin} = core_admin:create(<<"login@test.local">>, <<"pass">>, admin), OldLogin = Admin#admin.last_login, {ok, Updated} = core_admin:update_last_login(Admin#admin.id), ?assert(Updated#admin.last_login >= OldLogin), ?assertEqual({error, not_found}, core_admin:update_last_login(<<"missing">>)). test_delete() -> {ok, Admin} = core_admin:create(<<"del@test.local">>, <<"pass">>, admin), ?assertEqual({ok, deleted}, core_admin:delete(Admin#admin.id)), ?assertEqual({error, not_found}, core_admin:get_by_id(Admin#admin.id)), ?assertEqual({error, not_found}, core_admin:delete(<<"missing">>)).