-module(core_review_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). setup() -> mnesia:start(), mnesia:create_table(review, [ {attributes, record_info(fields, review)}, {ram_copies, [node()]} ]), ok. cleanup(_) -> mnesia:delete_table(review), mnesia:stop(), ok. core_review_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"Create review test", fun test_create_review/0}, {"Get review by id test", fun test_get_by_id/0}, {"List reviews by target test", fun test_list_by_target/0}, {"List reviews by user test", fun test_list_by_user/0}, {"Update review test", fun test_update_review/0}, {"Delete review test", fun test_delete_review/0}, {"Hide/unhide review test", fun test_hide_unhide/0}, {"Average rating test", fun test_average_rating/0}, {"Has user reviewed test", fun test_has_user_reviewed/0} ]}. test_create_review() -> UserId = <<"user123">>, TargetType = event, TargetId = <<"event123">>, Rating = 5, Comment = <<"Great event!">>, {ok, Review} = core_review:create(UserId, TargetType, TargetId, Rating, Comment), ?assertEqual(UserId, Review#review.user_id), ?assertEqual(TargetType, Review#review.target_type), ?assertEqual(TargetId, Review#review.target_id), ?assertEqual(Rating, Review#review.rating), ?assertEqual(Comment, Review#review.comment), ?assertEqual(visible, Review#review.status), ?assert(is_binary(Review#review.id)). test_get_by_id() -> UserId = <<"user123">>, {ok, Review} = core_review:create(UserId, event, <<"ev1">>, 4, <<"Good">>), {ok, Found} = core_review:get_by_id(Review#review.id), ?assertEqual(Review#review.id, Found#review.id), {error, not_found} = core_review:get_by_id(<<"nonexistent">>). test_list_by_target() -> UserId1 = <<"user1">>, UserId2 = <<"user2">>, EventId = <<"event123">>, {ok, _} = core_review:create(UserId1, event, EventId, 5, <<"Awesome">>), {ok, _} = core_review:create(UserId2, event, EventId, 3, <<"Okay">>), {ok, _} = core_review:create(UserId1, calendar, <<"cal1">>, 4, <<"Nice">>), {ok, Reviews} = core_review:list_by_target(event, EventId), ?assertEqual(2, length(Reviews)). test_list_by_user() -> UserId1 = <<"user1">>, UserId2 = <<"user2">>, {ok, _} = core_review:create(UserId1, event, <<"ev1">>, 5, <<"">>), {ok, _} = core_review:create(UserId1, event, <<"ev2">>, 4, <<"">>), {ok, _} = core_review:create(UserId2, event, <<"ev3">>, 3, <<"">>), {ok, Reviews} = core_review:list_by_user(UserId1), ?assertEqual(2, length(Reviews)). test_update_review() -> UserId = <<"user123">>, {ok, Review} = core_review:create(UserId, event, <<"ev1">>, 3, <<"Old">>), timer:sleep(2000), Updates = [{rating, 5}, {comment, <<"Updated!">>}], {ok, Updated} = core_review:update(Review#review.id, Updates), ?assertEqual(5, Updated#review.rating), ?assertEqual(<<"Updated!">>, Updated#review.comment), ?assert(Updated#review.updated_at > Review#review.updated_at). test_delete_review() -> UserId = <<"user123">>, {ok, Review} = core_review:create(UserId, event, <<"ev1">>, 4, <<"">>), {ok, deleted} = core_review:delete(Review#review.id), {error, not_found} = core_review:get_by_id(Review#review.id). test_hide_unhide() -> UserId = <<"user123">>, {ok, Review} = core_review:create(UserId, event, <<"ev1">>, 4, <<"">>), {ok, Hidden} = core_review:hide(Review#review.id), ?assertEqual(hidden, Hidden#review.status), {ok, Unhidden} = core_review:unhide(Review#review.id), ?assertEqual(visible, Unhidden#review.status). test_average_rating() -> UserId1 = <<"user1">>, UserId2 = <<"user2">>, EventId = <<"event123">>, {ok, _} = core_review:create(UserId1, event, EventId, 5, <<"">>), {ok, _} = core_review:create(UserId2, event, EventId, 3, <<"">>), {Avg, Count} = core_review:get_average_rating(event, EventId), ?assertEqual(4.0, Avg), ?assertEqual(2, Count). test_has_user_reviewed() -> UserId = <<"user123">>, EventId = <<"event123">>, ?assertNot(core_review:has_user_reviewed(UserId, event, EventId)), {ok, _} = core_review:create(UserId, event, EventId, 5, <<"">>), ?assert(core_review:has_user_reviewed(UserId, event, EventId)).