e4d62df7e3
- 智能供应商识别(蓉城易购/烟草/杨碧月/通用) - 百度 OCR 表格识别集成 - 规则引擎(列映射/数据清洗/单位转换/规格推断) - 条码映射管理与云端同步(Gitea REST API) - 云端同步支持:条码映射、供应商配置、商品资料、采购模板 - 拖拽一键处理(图片→OCR→Excel→合并) - 191 个单元测试 - 移除无用的模板管理功能 - 清理 IDE 产物目录 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
125 lines
3.8 KiB
Python
125 lines
3.8 KiB
Python
"""app.core.utils.string_utils 单元测试"""
|
|
|
|
import pytest
|
|
from app.core.utils.string_utils import parse_monetary_string, format_barcode
|
|
|
|
|
|
class TestParseMonetaryString:
|
|
"""parse_monetary_string 金额/数量字符串解析测试"""
|
|
|
|
# --- 基本类型 ---
|
|
def test_none_returns_none(self):
|
|
assert parse_monetary_string(None) is None
|
|
|
|
def test_int_passthrough(self):
|
|
assert parse_monetary_string(42) == 42.0
|
|
|
|
def test_float_passthrough(self):
|
|
assert parse_monetary_string(3.14) == 3.14
|
|
|
|
def test_zero_int(self):
|
|
assert parse_monetary_string(0) == 0.0
|
|
|
|
# --- 正常字符串 ---
|
|
def test_plain_number(self):
|
|
assert parse_monetary_string("123.45") == 123.45
|
|
|
|
def test_integer_string(self):
|
|
assert parse_monetary_string("100") == 100.0
|
|
|
|
# --- 货币符号 ---
|
|
def test_yen_prefix(self):
|
|
assert parse_monetary_string("¥1234.56") == 1234.56
|
|
|
|
def test_dollar_prefix(self):
|
|
assert parse_monetary_string("$99.9") == 99.9
|
|
|
|
def test_yuan_suffix(self):
|
|
assert parse_monetary_string("100元") == 100.0
|
|
|
|
# --- 逗号处理 ---
|
|
def test_comma_as_decimal_point(self):
|
|
"""逗号当小数点: "1,5" = 1.5"""
|
|
assert parse_monetary_string("1,5") == 1.5
|
|
|
|
def test_comma_as_thousands_sep(self):
|
|
"""逗号当千位分隔符: "1,234.56" = 1234.56"""
|
|
assert parse_monetary_string("1,234.56") == 1234.56
|
|
|
|
def test_multiple_commas_thousands(self):
|
|
"""多个逗号: "1,234,567" = 1234567"""
|
|
assert parse_monetary_string("1,234,567") == 1234567.0
|
|
|
|
# --- 空值/无效值 ---
|
|
def test_empty_string(self):
|
|
assert parse_monetary_string("") is None
|
|
|
|
def test_whitespace_only(self):
|
|
assert parse_monetary_string(" ") is None
|
|
|
|
def test_o_string(self):
|
|
"""OCR 常见误识别: 字母 o 当数字 0"""
|
|
assert parse_monetary_string("o") is None
|
|
|
|
def test_none_string(self):
|
|
assert parse_monetary_string("none") is None
|
|
|
|
def test_null_string(self):
|
|
assert parse_monetary_string("null") is None
|
|
|
|
def test_dash(self):
|
|
assert parse_monetary_string("-") is None
|
|
|
|
def test_double_dash(self):
|
|
assert parse_monetary_string("--") is None
|
|
|
|
def test_no_digits(self):
|
|
assert parse_monetary_string("赠品") is None
|
|
|
|
# --- 负数 ---
|
|
def test_negative_number(self):
|
|
assert parse_monetary_string("-5.5") == -5.5
|
|
|
|
# --- 非字符串非数字类型 ---
|
|
def test_list_returns_none(self):
|
|
assert parse_monetary_string([1, 2]) is None
|
|
|
|
def test_dict_returns_none(self):
|
|
assert parse_monetary_string({"a": 1}) is None
|
|
|
|
|
|
class TestFormatBarcode:
|
|
"""format_barcode 条码格式化测试"""
|
|
|
|
def test_none_returns_empty(self):
|
|
assert format_barcode(None) == ""
|
|
|
|
def test_normal_digit_string(self):
|
|
assert format_barcode("6920584471055") == "6920584471055"
|
|
|
|
def test_integer_input(self):
|
|
assert format_barcode(6920584471055) == "6920584471055"
|
|
|
|
def test_float_with_zero_decimal(self):
|
|
assert format_barcode(6920584471055.0) == "6920584471055"
|
|
|
|
def test_scientific_notation(self):
|
|
assert format_barcode("6.920584e+12") == "6920584000000"
|
|
|
|
def test_trailing_zeros_stripped(self):
|
|
assert format_barcode("123456.0") == "123456"
|
|
|
|
def test_long_barcode_with_trailing_zeros(self):
|
|
"""14位条码末尾是0时应截断到13位"""
|
|
assert format_barcode("69205844710550") == "6920584471055"
|
|
|
|
def test_long_barcode_without_trailing_zeros(self):
|
|
"""14位条码末尾不是0时不截断"""
|
|
assert format_barcode("69205844710551") == "69205844710551"
|
|
|
|
def test_non_digit_chars_removed(self):
|
|
assert format_barcode("692-058-4471055") == "6920584471055"
|
|
|
|
def test_empty_string(self):
|
|
assert format_barcode("") == ""
|