-module(logic_moderation_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). -define(TABLES, [user, admin, calendar, event, report, banned_word]). %% ---------------------------------------------------------------- %% Фикстуры %% ---------------------------------------------------------------- setup() -> eh_test_support:start_mnesia(), eh_test_support:ensure_tables(?TABLES), ok. cleanup(_) -> eh_test_support:delete_tables(?TABLES), eh_test_support:stop_mnesia(), ok. %% ---------------------------------------------------------------- %% Тесты %% ---------------------------------------------------------------- logic_moderation_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"Create report test", fun test_create_report/0}, {"Get reports test", fun test_get_reports/0}, {"Resolve report test", fun test_resolve_report/0}, {"Add banned word test", fun test_add_banned_word/0}, {"Remove banned word test", fun test_remove_banned_word/0}, {"Auto freeze by reports test", fun test_auto_freeze/0}, {"Freeze/unfreeze calendar test", fun test_freeze_calendar/0}, {"Freeze/unfreeze event test", fun test_freeze_event/0}, {"Check content test", fun test_check_content/0} ]}. %% ── Вспомогательные функции ────────────────────────────── create_test_user() -> UserId = base64:encode(crypto:strong_rand_bytes(16), #{mode => urlsafe, padding => false}), User = eh_test_support:make_user(#{id => UserId, email => <>}), mnesia:dirty_write(User), UserId. create_test_admin() -> AdminId = base64:encode(crypto:strong_rand_bytes(16), #{mode => urlsafe, padding => false}), Admin = eh_test_support:seed_admin(#{id => AdminId, email => <>}), Admin#admin.id. create_test_calendar(OwnerId) -> {ok, Calendar} = core_calendar:create(OwnerId, <<"Test">>, <<"">>, manual), Calendar#calendar.id. create_test_event(CalendarId) -> {ok, Event} = core_event:create(CalendarId, <<"Event">>, eh_test_support:future_start(), 60), Event#event.id. %% ── Тесты ───────────────────────────────────────────────── test_create_report() -> ReporterId = create_test_user(), OwnerId = create_test_user(), CalendarId = create_test_calendar(OwnerId), EventId = create_test_event(CalendarId), {ok, Report} = logic_moderation:create_report(ReporterId, event, EventId, <<"Bad content">>), ?assertEqual(ReporterId, Report#report.reporter_id), ?assertEqual(pending, Report#report.status). test_get_reports() -> AdminId = create_test_admin(), ReporterId = create_test_user(), OwnerId = create_test_user(), CalendarId = create_test_calendar(OwnerId), EventId = create_test_event(CalendarId), {ok, _} = logic_moderation:create_report(ReporterId, event, EventId, <<"">>), Reports = logic_moderation:get_reports(AdminId), ?assertEqual(1, length(Reports)). test_resolve_report() -> AdminId = create_test_admin(), ReporterId = create_test_user(), OwnerId = create_test_user(), CalendarId = create_test_calendar(OwnerId), EventId = create_test_event(CalendarId), {ok, Report} = logic_moderation:create_report(ReporterId, event, EventId, <<"">>), {ok, Resolved} = logic_moderation:resolve_report(AdminId, Report#report.id, reviewed), ?assertEqual(reviewed, Resolved#report.status), ?assertEqual(AdminId, Resolved#report.resolved_by). test_add_banned_word() -> AdminId = create_test_admin(), {ok, BW} = logic_moderation:add_banned_word(AdminId, <<"badword">>), ?assertEqual(<<"badword">>, BW#banned_word.word), ?assertEqual(AdminId, BW#banned_word.added_by). test_remove_banned_word() -> AdminId = create_test_admin(), {ok, _} = logic_moderation:add_banned_word(AdminId, <<"badword">>), {ok, deleted} = logic_moderation:remove_banned_word(AdminId, <<"badword">>), ?assertEqual([], core_banned_words:list_banned_words()). test_auto_freeze() -> Reporter1 = create_test_user(), Reporter2 = create_test_user(), Reporter3 = create_test_user(), OwnerId = create_test_user(), CalendarId = create_test_calendar(OwnerId), EventId = create_test_event(CalendarId), {ok, _} = logic_moderation:create_report(Reporter1, event, EventId, <<"">>), {ok, _} = logic_moderation:create_report(Reporter2, event, EventId, <<"">>), {ok, _} = logic_moderation:create_report(Reporter3, event, EventId, <<"">>), {ok, Event} = core_event:get_by_id(EventId), ?assertEqual(frozen, Event#event.status). test_freeze_calendar() -> AdminId = create_test_admin(), OwnerId = create_test_user(), CalendarId = create_test_calendar(OwnerId), {ok, Frozen} = logic_moderation:freeze_calendar(AdminId, CalendarId), ?assertEqual(frozen, Frozen#calendar.status), {ok, Unfrozen} = logic_moderation:unfreeze_calendar(AdminId, CalendarId), ?assertEqual(active, Unfrozen#calendar.status). test_freeze_event() -> AdminId = create_test_admin(), OwnerId = create_test_user(), CalendarId = create_test_calendar(OwnerId), EventId = create_test_event(CalendarId), {ok, Frozen} = logic_moderation:freeze_event(AdminId, EventId), ?assertEqual(frozen, Frozen#event.status), {ok, Unfrozen} = logic_moderation:unfreeze_event(AdminId, EventId), ?assertEqual(active, Unfrozen#event.status). test_check_content() -> AdminId = create_test_admin(), {ok, _} = logic_moderation:add_banned_word(AdminId, <<"bad">>), ?assertNot(logic_moderation:check_content(<<"Hello">>)), ?assert(logic_moderation:check_content(<<"This is bad">>)), ?assertEqual(<<"Hello">>, logic_moderation:auto_moderate(<<"Hello">>)), ?assertEqual(<<"This is ***">>, logic_moderation:auto_moderate(<<"This is bad">>)).