Files
EventHubBack/test/unit/logic_subscription_tests.erl
T
aleksey 5ac23219ca
CI / test (push) Successful in 6m55s
CI / deploy-ift (push) Successful in 3m33s
CI / e2e-ift (push) Failing after 1m4s
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped
fix: owner event bookings list and paid plan durations from plan_to_months.
Fixes EventHub/EventHubBack#51
Fixes EventHub/EventHubBack#52

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 20:18:49 +03:00

156 lines
6.5 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(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},
{"Activate quarterly duration", fun test_activate_quarterly_duration/0},
{"Activate monthly duration", fun test_activate_monthly_duration/0},
{"Activate biannual duration", fun test_activate_biannual_duration/0},
{"Activate annual duration", fun test_activate_annual_duration/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 = <<UserId/binary, "@test.com">>,
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).
%% Длительность при активации (в т.ч. первой платной с trial_used=false) из Plan.
assert_plan_duration(Sub, Months) ->
{{Y1, M1, D1}, _} = Sub#subscription.started_at,
{{Y2, M2, D2}, Time2} = Sub#subscription.expires_at,
StartDays = calendar:date_to_gregorian_days({Y1, M1, D1}),
EndDays = calendar:date_to_gregorian_days({Y2, M2, D2}),
?assertEqual(Months * 30, EndDays - StartDays),
?assertEqual({0, 0, 0}, Time2).
test_activate_monthly_duration() ->
UserId = create_test_user(),
{ok, Sub} = logic_subscription:activate_subscription(UserId, monthly, #{card => "4242"}),
?assertEqual(false, Sub#subscription.trial_used),
assert_plan_duration(Sub, 1).
test_activate_quarterly_duration() ->
UserId = create_test_user(),
{ok, Sub} = logic_subscription:activate_subscription(UserId, quarterly, #{card => "4242"}),
?assertEqual(quarterly, Sub#subscription.plan),
?assertEqual(false, Sub#subscription.trial_used),
assert_plan_duration(Sub, 3).
test_activate_biannual_duration() ->
UserId = create_test_user(),
{ok, Sub} = logic_subscription:activate_subscription(UserId, biannual, #{card => "4242"}),
assert_plan_duration(Sub, 6).
test_activate_annual_duration() ->
UserId = create_test_user(),
{ok, Sub} = logic_subscription:activate_subscription(UserId, annual, #{card => "4242"}),
assert_plan_duration(Sub, 12).
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).