Files
EventHubBack/test/unit/logic_subscription_tests.erl
T
aleksey 81728301e2
CI / test (push) Failing after 6m52s
CI / deploy-ift (push) Has been skipped
CI / e2e-ift (push) Has been skipped
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped
fix: persist specialist_id on event create; 402 commercial without active sub. Fixes EventHub/EventHubBack#61
2026-07-27 21:17:15 +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 (no 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() ->
% Без активной подписки/trial create commercial запрещён (trial — явно через start_trial)
UserId = create_test_user(),
?assertNot(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).