Stage 10 final

This commit is contained in:
2026-04-22 23:15:20 +03:00
parent e3a08cfa04
commit 081dcf9588
85 changed files with 2116 additions and 160 deletions

View File

@@ -0,0 +1,120 @@
-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 = <<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).
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).