-module(logic_subscription_tests). -include_lib("eunit/include/eunit.hrl"). -include("records.hrl"). logic_subscription_test_() -> {foreach, fun setup/0, fun cleanup/1, [ {"Start trial", fun test_start_trial/0}, {"Start trial duplicate", fun test_start_trial_duplicate/0}, {"Activate subscription (no trial)", fun test_activate_subscription_no_trial/0}, {"Activate subscription (after trial)", fun test_activate_subscription_after_trial/0}, {"Check subscription - free", fun test_check_free/0}, {"Check subscription - trial", fun test_check_trial/0}, {"Check subscription - paid", fun test_check_paid/0}, {"Can create commercial - free (auto-trial)", fun test_can_create_commercial_free/0}, {"Can create commercial - trial", fun test_can_create_commercial_trial/0}, {"Can create commercial - paid", fun test_can_create_commercial_paid/0}, {"Get user subscription - free", fun test_get_user_subscription_free/0}, {"Get user subscription - trial", fun test_get_user_subscription_trial/0}, {"Get user subscription - paid", fun test_get_user_subscription_paid/0} ]}. 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()]}]), mnesia:create_table(subscription, [{attributes, record_info(fields, subscription)}, {ram_copies, [node()]}]), ok. cleanup(_) -> mnesia:delete_table(subscription), mnesia:delete_table(calendar), mnesia:delete_table(user), mnesia:stop(), ok. create_test_user() -> UserId = base64:encode(crypto:strong_rand_bytes(16), #{mode => urlsafe, padding => false}), User = #user{ id = UserId, email = <>, password_hash = <<"hash">>, role = user, status = active, created_at = calendar:universal_time(), updated_at = calendar:universal_time() }, mnesia:dirty_write(User), UserId. %% ============ Тесты ============ test_start_trial() -> UserId = create_test_user(), {ok, Sub} = logic_subscription:start_trial(UserId), ?assertEqual(trial, Sub#subscription.plan), ?assertEqual(true, Sub#subscription.trial_used). test_start_trial_duplicate() -> UserId = create_test_user(), {ok, _} = logic_subscription:start_trial(UserId), {error, already_has_subscription} = logic_subscription:start_trial(UserId). test_activate_subscription_no_trial() -> UserId = create_test_user(), {ok, Sub} = logic_subscription:activate_subscription(UserId, monthly, #{card => "4242"}), ?assertEqual(monthly, Sub#subscription.plan), ?assertEqual(false, Sub#subscription.trial_used). test_activate_subscription_after_trial() -> UserId = create_test_user(), {ok, _} = logic_subscription:start_trial(UserId), {ok, Sub} = logic_subscription:activate_subscription(UserId, monthly, #{card => "4242"}), ?assertEqual(monthly, Sub#subscription.plan), ?assertEqual(true, Sub#subscription.trial_used). test_check_free() -> UserId = create_test_user(), {ok, free, free} = logic_subscription:check_user_subscription(UserId). test_check_trial() -> UserId = create_test_user(), {ok, _} = logic_subscription:start_trial(UserId), {ok, active, trial} = logic_subscription:check_user_subscription(UserId). test_check_paid() -> UserId = create_test_user(), {ok, _} = logic_subscription:activate_subscription(UserId, monthly, #{card => "4242"}), {ok, active, monthly} = logic_subscription:check_user_subscription(UserId). test_can_create_commercial_free() -> % Новый пользователь автоматически получает пробный период при проверке UserId = create_test_user(), ?assert(logic_subscription:can_create_commercial_calendar(UserId)). test_can_create_commercial_trial() -> UserId = create_test_user(), {ok, _} = logic_subscription:start_trial(UserId), ?assert(logic_subscription:can_create_commercial_calendar(UserId)). test_can_create_commercial_paid() -> UserId = create_test_user(), {ok, _} = logic_subscription:activate_subscription(UserId, monthly, #{card => "4242"}), ?assert(logic_subscription:can_create_commercial_calendar(UserId)). test_get_user_subscription_free() -> UserId = create_test_user(), {ok, #{status := free}} = logic_subscription:get_user_subscription(UserId). test_get_user_subscription_trial() -> UserId = create_test_user(), {ok, _} = logic_subscription:start_trial(UserId), {ok, #{status := active, plan := trial}} = logic_subscription:get_user_subscription(UserId). test_get_user_subscription_paid() -> UserId = create_test_user(), {ok, _} = logic_subscription:activate_subscription(UserId, annual, #{card => "4242"}), {ok, #{status := active, plan := annual}} = logic_subscription:get_user_subscription(UserId).