-module(logic_calendar_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). setup() -> mnesia:start(), mnesia:create_table(user, [ {attributes, record_info(fields, user)}, {ram_copies, [node()]} ]), mnesia:create_table(calendar, [ {attributes, record_info(fields, calendar)}, {ram_copies, [node()]} ]), ok. cleanup(_) -> mnesia:delete_table(calendar), mnesia:delete_table(user), mnesia:stop(), ok. logic_calendar_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"Create calendar test", fun test_create_calendar/0}, {"Get calendar test", fun test_get_calendar/0}, {"List calendars test", fun test_list_calendars/0}, {"Update calendar test", fun test_update_calendar/0}, {"Delete calendar test", fun test_delete_calendar/0}, {"Access control test", fun test_access_control/0} ]}. create_test_user() -> UserId = base64:encode(crypto:strong_rand_bytes(16), #{mode => urlsafe, padding => false}), User = #user{ id = UserId, email = <<"test@example.com">>, password_hash = <<"hash">>, role = user, status = active, created_at = calendar:universal_time(), updated_at = calendar:universal_time() }, mnesia:dirty_write(User), UserId. test_create_calendar() -> UserId = create_test_user(), Title = <<"Test Calendar">>, Description = <<"Test Description">>, Confirmation = auto, {ok, Calendar} = logic_calendar:create_calendar(UserId, Title, Description, Confirmation), ?assertEqual(UserId, Calendar#calendar.owner_id), ?assertEqual(Title, Calendar#calendar.title), ?assertEqual(personal, Calendar#calendar.type), ?assertEqual(Confirmation, Calendar#calendar.confirmation). test_get_calendar() -> UserId = create_test_user(), {ok, Calendar} = logic_calendar:create_calendar(UserId, <<"Test">>, <<"">>, manual), case logic_calendar:get_calendar(UserId, Calendar#calendar.id) of {ok, Found} -> ?assertEqual(Calendar#calendar.id, Found#calendar.id); Other -> ?assert(false, {unexpected_result, Other}) end, OtherUserId = create_test_user(), ?assertMatch({error, access_denied}, logic_calendar:get_calendar(OtherUserId, Calendar#calendar.id)). test_list_calendars() -> UserId = create_test_user(), {ok, _} = logic_calendar:create_calendar(UserId, <<"Calendar 1">>, <<"">>, manual), {ok, _} = logic_calendar:create_calendar(UserId, <<"Calendar 2">>, <<"">>, auto), {ok, Calendars} = logic_calendar:list_calendars(UserId), ?assertEqual(2, length(Calendars)). test_update_calendar() -> UserId = create_test_user(), {ok, Calendar} = logic_calendar:create_calendar(UserId, <<"Original">>, <<"">>, manual), Updates = [{title, <<"Updated">>}, {type, commercial}, {confirmation, auto}], {ok, Updated} = logic_calendar:update_calendar(UserId, Calendar#calendar.id, Updates), ?assertEqual(<<"Updated">>, Updated#calendar.title), ?assertEqual(commercial, Updated#calendar.type), ?assertEqual(auto, Updated#calendar.confirmation), OtherUserId = create_test_user(), ?assertMatch({error, access_denied}, logic_calendar:update_calendar(OtherUserId, Calendar#calendar.id, Updates)). test_delete_calendar() -> UserId = create_test_user(), {ok, Calendar} = logic_calendar:create_calendar(UserId, <<"Test">>, <<"">>, manual), {ok, Deleted} = logic_calendar:delete_calendar(UserId, Calendar#calendar.id), ?assertEqual(deleted, Deleted#calendar.status), ?assertMatch({error, access_denied}, logic_calendar:get_calendar(UserId, Calendar#calendar.id)). test_access_control() -> OwnerId = create_test_user(), OtherId = create_test_user(), {ok, PersonalCalendar} = logic_calendar:create_calendar(OwnerId, <<"Personal">>, <<"">>, manual), ?assert(logic_calendar:can_edit(OwnerId, PersonalCalendar)), ?assertNot(logic_calendar:can_edit(OtherId, PersonalCalendar)), ?assertNot(logic_calendar:can_access(OtherId, PersonalCalendar)), {ok, CommercialCalendar} = logic_calendar:update_calendar(OwnerId, PersonalCalendar#calendar.id, [{type, commercial}]), ?assert(logic_calendar:can_access(OtherId, CommercialCalendar)), ?assertNot(logic_calendar:can_edit(OtherId, CommercialCalendar)), {ok, Frozen} = core_calendar:update(CommercialCalendar#calendar.id, [{status, frozen}]), ?assertNot(logic_calendar:can_access(OtherId, Frozen)), ?assertNot(logic_calendar:can_access(OwnerId, Frozen)).