5ac23219ca
Fixes EventHub/EventHubBack#51 Fixes EventHub/EventHubBack#52 Co-authored-by: Cursor <cursoragent@cursor.com>
156 lines
6.5 KiB
Erlang
156 lines
6.5 KiB
Erlang
-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). |