feat: add multicurrency tariff payments
This commit is contained in:
@@ -232,6 +232,38 @@ def test_payment_method_keyboard_uses_custom_telegram_text_without_changing_call
|
||||
assert button.callback_data == "pay_wata:1:150:subscription"
|
||||
|
||||
|
||||
def test_payment_method_keyboard_filters_providers_by_payment_currency(monkeypatch):
|
||||
monkeypatch.setenv("YOOKASSA_ENABLED", "True")
|
||||
monkeypatch.setenv("WATA_ENABLED", "True")
|
||||
build_provider_configs(force=True)
|
||||
|
||||
settings = Settings(
|
||||
_env_file=None,
|
||||
BOT_TOKEN="token",
|
||||
POSTGRES_USER="app_user",
|
||||
POSTGRES_PASSWORD="app_password",
|
||||
TARIFFS_CONFIG_PATH="missing-tariffs.json",
|
||||
PAYMENT_METHODS_ORDER="yookassa,wata",
|
||||
)
|
||||
i18n = SimpleNamespace(gettext=lambda _lang, key, **_kwargs: key)
|
||||
|
||||
markup = get_payment_method_keyboard(
|
||||
months=1,
|
||||
price=10,
|
||||
stars_price=None,
|
||||
currency_symbol_val="USD",
|
||||
lang="en",
|
||||
i18n_instance=i18n,
|
||||
settings=settings,
|
||||
)
|
||||
|
||||
callbacks = [
|
||||
button.callback_data for row in markup.inline_keyboard for button in row if button.callback_data
|
||||
]
|
||||
assert "pay_wata:1:10:subscription" in callbacks
|
||||
assert all(not callback.startswith("pay_yk:") for callback in callbacks)
|
||||
|
||||
|
||||
def test_admin_only_provider_is_visible_only_to_admins(monkeypatch):
|
||||
from bot.app.web.webapp.serializers import _serialize_payment_methods
|
||||
|
||||
@@ -288,6 +320,34 @@ def test_admin_only_provider_is_visible_only_to_admins(monkeypatch):
|
||||
assert _serialize_payment_methods(settings, app, "en", is_admin=True)[0]["id"] == "wata"
|
||||
|
||||
|
||||
def test_webapp_payment_methods_filter_by_default_currency(monkeypatch):
|
||||
from bot.app.web.webapp.serializers import _serialize_payment_methods
|
||||
|
||||
monkeypatch.setenv("YOOKASSA_ENABLED", "True")
|
||||
monkeypatch.setenv("WATA_ENABLED", "True")
|
||||
build_provider_configs(force=True)
|
||||
|
||||
settings = Settings(
|
||||
_env_file=None,
|
||||
BOT_TOKEN="token",
|
||||
POSTGRES_USER="app_user",
|
||||
POSTGRES_PASSWORD="app_password",
|
||||
TARIFFS_CONFIG_PATH="missing-tariffs.json",
|
||||
PAYMENT_METHODS_ORDER="yookassa,wata",
|
||||
DEFAULT_CURRENCY_SYMBOL="USD",
|
||||
STARS_ENABLED=False,
|
||||
)
|
||||
app = {
|
||||
"yookassa_service": SimpleNamespace(configured=True),
|
||||
"wata_service": SimpleNamespace(configured=True),
|
||||
}
|
||||
|
||||
methods = _serialize_payment_methods(settings, app, "en", is_admin=False)
|
||||
|
||||
assert [method["id"] for method in methods] == ["wata"]
|
||||
|
||||
|
||||
|
||||
def test_admin_only_provider_toggle_pairs_are_declared():
|
||||
pairs = set(provider_admin_only_pairs())
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import json
|
||||
import unittest
|
||||
|
||||
from config.tariffs_config import TariffsConfig, load_tariffs_config
|
||||
from config.tariffs_config import TariffsConfig, load_tariffs_config, normalize_currency_key
|
||||
|
||||
|
||||
def _valid_config():
|
||||
@@ -128,6 +128,27 @@ class TariffsConfigTests(unittest.TestCase):
|
||||
with self.assertRaises(ValueError):
|
||||
TariffsConfig.model_validate(data)
|
||||
|
||||
def test_default_currency_prices_load_from_generic_map(self):
|
||||
data = _valid_config()
|
||||
data["default_currency"] = "USD"
|
||||
data["tariffs"][0].pop("prices_rub")
|
||||
data["tariffs"][0]["prices"] = {"usd": {"1": 4.99}}
|
||||
data["tariffs"][1]["traffic_packages"] = {"usd": [{"gb": 10, "price": 2.5}]}
|
||||
|
||||
config = TariffsConfig.model_validate(data)
|
||||
period = config.require("standard")
|
||||
traffic = config.require("traffic")
|
||||
|
||||
self.assertEqual(config.default_currency, "usd")
|
||||
self.assertEqual(config.default_payment_currency_code, "USD")
|
||||
self.assertEqual(period.period_price(1, "usd"), 4.99)
|
||||
self.assertIsNone(period.period_price(1, "rub"))
|
||||
self.assertEqual(traffic.traffic_packages.for_currency("usd")[0].price, 2.5)
|
||||
self.assertEqual(traffic.currency_per_gb_for_conversion("usd"), 0.25)
|
||||
|
||||
def test_currency_symbol_falls_back_to_default_key(self):
|
||||
self.assertEqual(normalize_currency_key("₽"), "rub")
|
||||
|
||||
def test_hwid_device_limit_and_packages_load(self):
|
||||
data = _valid_config()
|
||||
data["tariffs"][0]["hwid_device_limit"] = 5
|
||||
|
||||
Reference in New Issue
Block a user