Files
EventHubBack/test/unit/core_user_tests.erl
T

162 lines
6.4 KiB
Erlang
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-module(core_user_tests).
-include_lib("eunit/include/eunit.hrl").
-include("records.hrl").
-define(TABLES, [user]).
setup() ->
eh_test_support:start_mnesia(),
eh_test_support:ensure_tables(?TABLES),
case mnesia:add_table_index(user, email) of
{atomic, ok} -> ok;
{aborted, {already_exists, user, email}} -> ok;
{aborted, Reason} -> error({add_index_failed, Reason})
end,
ok.
cleanup(_) ->
eh_test_support:clear_tables(?TABLES),
eh_test_support:delete_tables(?TABLES),
eh_test_support:stop_mnesia(),
ok.
core_user_test_() ->
{foreach, fun setup/0, fun cleanup/1, [
{"Create user", fun test_create/0},
{"Create user email exists", fun test_create_email_exists/0},
{"Get by id", fun test_get_by_id/0},
{"Get by email / email_exists", fun test_get_by_email/0},
{"List all and list_users", fun test_list/0},
{"Update fields", fun test_update/0},
{"Update status", fun test_update_status/0},
{"Update last login", fun test_update_last_login/0},
{"Block and unblock", fun test_block_unblock/0},
{"Soft delete", fun test_delete/0},
{"Count helpers", fun test_counts/0},
{"Create and delete bot", fun test_bot/0}
]}.
test_create() ->
Email = <<"user1@test.local">>,
{ok, User} = core_user:create(Email, <<"secret123">>),
?assertEqual(Email, User#user.email),
?assertEqual(user, User#user.role),
?assertEqual(pending, User#user.status),
?assertEqual(<<"user1">>, User#user.nickname),
?assert(is_binary(User#user.id)),
?assert(is_binary(User#user.password_hash)),
?assert(User#user.password_hash =/= <<"secret123">>).
test_create_email_exists() ->
Email = <<"dup@test.local">>,
{ok, _} = core_user:create(Email, <<"pass1">>),
?assertEqual({error, email_exists}, core_user:create(Email, <<"pass2">>)).
test_get_by_id() ->
{ok, User} = core_user:create(<<"byid@test.local">>, <<"pass">>),
{ok, Found} = core_user:get_by_id(User#user.id),
?assertEqual(User#user.id, Found#user.id),
?assertEqual({error, not_found}, core_user:get_by_id(<<"missing">>)).
test_get_by_email() ->
Email = <<"byemail@test.local">>,
{ok, User} = core_user:create(Email, <<"pass">>),
{ok, Found} = core_user:get_by_email(Email),
?assertEqual(User#user.id, Found#user.id),
?assertEqual(true, core_user:email_exists(Email)),
?assertEqual(false, core_user:email_exists(<<"nope@test.local">>)),
?assertEqual({error, not_found}, core_user:get_by_email(<<"nope@test.local">>)).
test_list() ->
?assertEqual([], core_user:list_all()),
{ok, U1} = core_user:create(<<"a@test.local">>, <<"pass">>),
{ok, U2} = core_user:create(<<"b@test.local">>, <<"pass">>),
?assertEqual(2, length(core_user:list_all())),
{ok, _} = core_user:delete(U1#user.id),
All = core_user:list_all(),
?assertEqual(2, length(All)),
{ok, ActiveMaps} = core_user:list_users(),
?assertEqual(1, length(ActiveMaps)),
[Map] = ActiveMaps,
?assertEqual(U2#user.id, maps:get(id, Map)),
?assertEqual(<<"b@test.local">>, maps:get(email, Map)).
test_update() ->
{ok, User} = core_user:create(<<"upd@test.local">>, <<"pass">>),
{ok, Updated} = core_user:update(User#user.id, [
{nickname, <<"nick">>},
{phone, <<"+7000">>},
{timezone, <<"UTC">>},
{status, active}
]),
?assertEqual(<<"nick">>, Updated#user.nickname),
?assertEqual(<<"+7000">>, Updated#user.phone),
?assertEqual(<<"UTC">>, Updated#user.timezone),
?assertEqual(active, Updated#user.status),
?assertEqual({error, not_found}, core_user:update(<<"missing">>, [{nickname, <<"x">>}])).
test_update_status() ->
{ok, User} = core_user:create(<<"st@test.local">>, <<"pass">>),
{ok, Updated} = core_user:update_status(User#user.id, frozen, <<"review">>),
?assertEqual(frozen, Updated#user.status),
?assertEqual(<<"review">>, Updated#user.reason),
?assertEqual({error, not_found},
core_user:update_status(<<"missing">>, active, <<>>)).
test_update_last_login() ->
{ok, User} = core_user:create(<<"login@test.local">>, <<"pass">>),
OldLogin = User#user.last_login,
{ok, Updated} = core_user:update_last_login(User#user.id),
?assert(Updated#user.last_login >= OldLogin),
?assertEqual({error, not_found}, core_user:update_last_login(<<"missing">>)).
test_block_unblock() ->
{ok, User} = core_user:create(<<"block@test.local">>, <<"pass">>),
{ok, Blocked} = core_user:block(User#user.id, <<"spam">>),
?assertEqual(blocked, Blocked#user.status),
?assertEqual(<<"spam">>, Blocked#user.reason),
{ok, Active} = core_user:unblock(User#user.id, <<"ok">>),
?assertEqual(active, Active#user.status),
?assertEqual(<<"ok">>, Active#user.reason),
?assertEqual({error, not_found}, core_user:block(<<"missing">>, <<"x">>)),
?assertEqual({error, not_found}, core_user:unblock(<<"missing">>, <<"x">>)).
test_delete() ->
{ok, User} = core_user:create(<<"del@test.local">>, <<"pass">>),
{ok, Deleted} = core_user:delete(User#user.id),
?assertEqual(deleted, Deleted#user.status),
{ok, StillThere} = core_user:get_by_id(User#user.id),
?assertEqual(deleted, StillThere#user.status),
?assertEqual({error, not_found}, core_user:delete(<<"missing">>)).
test_counts() ->
{ok, U1} = core_user:create(<<"c1@test.local">>, <<"pass">>),
{ok, _} = core_user:create(<<"c2@test.local">>, <<"pass">>),
{ok, _} = core_user:update_status(U1#user.id, active, <<>>),
?assertEqual(2, core_user:count_users()),
?assertEqual(1, core_user:count_pending_users()),
ByRole = core_user:count_users_by_role(),
?assertEqual(2, proplists:get_value(user, ByRole)),
ByStatus = core_user:count_users_by_status(),
?assertEqual(1, proplists:get_value(pending, ByStatus)),
?assertEqual(1, proplists:get_value(active, ByStatus)),
Now = calendar:universal_time(),
{{Y, M, D}, _} = Now,
From = {{Y, M, D}, {0, 0, 0}},
To = {{Y, M, D}, {23, 59, 59}},
ByDate = core_user:count_users_by_date(From, To),
?assert(lists:keyfind({Y, M, D}, 1, ByDate) =/= false),
PendingByDate = core_user:count_pending_users_by_date(From, To),
{_, PendingCount} = lists:keyfind({Y, M, D}, 1, PendingByDate),
?assertEqual(1, PendingCount).
test_bot() ->
Email = <<"bot@test.local">>,
{ok, Bot} = core_user:create_bot(Email, <<"botpass">>),
?assertEqual(bot, Bot#user.role),
?assertEqual(active, Bot#user.status),
?assertEqual({error, email_exists}, core_user:create_bot(Email, <<"other">>)),
?assertEqual(ok, core_user:delete_bot(Bot#user.id)),
?assertEqual({error, not_found}, core_user:get_by_id(Bot#user.id)),
?assertEqual({error, not_found}, core_user:delete_bot(<<"missing">>)).