Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/hesabixAPI/tests/test_quick_sales_service.py

102 lines
3.6 KiB
Python

"""تست سرویس تنظیمات فروش سریع — پیش‌فرض اشتراک‌گذاری."""
from __future__ import annotations
from unittest.mock import MagicMock
import pytest
from adapters.db.seed_data.notification_event_types_seed import (
INVOICE_SHARE_LINK_EVENT_CODES,
NOTIFICATION_EVENT_TYPES_ROWS,
)
from app.core.responses import ApiError
from app.services.quick_sales_service import (
DEFAULT_SHARE_CHANNELS,
DEFAULT_SHARE_EXPIRY_HOURS,
normalize_default_share_channels,
normalize_share_expiry_hours,
get_quick_sales_settings,
_share_settings_from_obj,
)
def test_normalize_default_share_channels_defaults() -> None:
assert normalize_default_share_channels(None) == DEFAULT_SHARE_CHANNELS
def test_normalize_default_share_channels_filters_invalid() -> None:
assert normalize_default_share_channels(["sms", "telegram", "email"]) == ["sms", "email"]
def test_normalize_default_share_channels_json_string() -> None:
assert normalize_default_share_channels('["email", "native"]') == ["email", "native"]
def test_normalize_default_share_channels_empty_list_falls_back() -> None:
assert normalize_default_share_channels([]) == DEFAULT_SHARE_CHANNELS
def test_normalize_share_expiry_hours_clamps() -> None:
assert normalize_share_expiry_hours(0) == 1
assert normalize_share_expiry_hours(9999) == 720
assert normalize_share_expiry_hours("336") == 336
def test_normalize_share_expiry_hours_invalid() -> None:
assert normalize_share_expiry_hours("bad") == DEFAULT_SHARE_EXPIRY_HOURS
def test_share_settings_from_obj_none() -> None:
data = _share_settings_from_obj(None)
assert data["default_share_online_payment"] is True
assert data["default_share_gateway_id"] is None
assert data["default_share_channels"] == DEFAULT_SHARE_CHANNELS
assert data["default_share_expiry_hours"] == DEFAULT_SHARE_EXPIRY_HOURS
def test_get_quick_sales_settings_includes_share_defaults_when_missing_row() -> None:
db = MagicMock()
settings_query = MagicMock()
settings_query.filter.return_value.first.return_value = None
business = MagicMock()
business.default_currency_id = 42
business_query = MagicMock()
business_query.filter.return_value.first.return_value = business
def _query_side(model):
name = getattr(model, "__name__", "")
if name == "QuickSalesSetting":
return settings_query
if name == "Business":
return business_query
return MagicMock()
db.query.side_effect = _query_side
result = get_quick_sales_settings(db, 1)
assert result["default_share_online_payment"] is True
assert result["default_share_channels"] == DEFAULT_SHARE_CHANNELS
assert result["default_share_expiry_hours"] == 168
assert result["default_currency_id"] == 42
def test_invoice_share_link_event_type_in_seed_catalog() -> None:
codes = {row["code"] for row in NOTIFICATION_EVENT_TYPES_ROWS}
assert INVOICE_SHARE_LINK_EVENT_CODES <= codes
row = next(r for r in NOTIFICATION_EVENT_TYPES_ROWS if r["code"] == "invoice_share_link")
assert "share_link" in row["default_sms_template"]
assert "share_link" in row["default_email_template"]
def test_validate_share_gateway_id_rejects_unknown_gateway() -> None:
from app.services.quick_sales_service import _validate_share_gateway_id
db = MagicMock()
gw_query = MagicMock()
gw_query.filter.return_value.first.return_value = None
db.query.return_value = gw_query
with pytest.raises(ApiError) as exc:
_validate_share_gateway_id(db, 1, 99)
assert exc.value.detail["error"]["code"] == "GATEWAY_NOT_FOUND"