基于 skill-template 脚手架开发,包含: - payroll_config(费率配置,可编辑)+ payslip_snapshots(解析历史,只读)2 张业务表 - 全国默认 + 北上广 4 套费率(社保/公积金/个税起征点/7 级税率表) - 5 个业务 Action:calculate-payslip-simple / calculate-payslip-full / explain-term / view-config / edit-config - 个税累计预扣法计算,支持多月历史累加 - 20 个薪资名词库(社保/公积金/个税/全勤/加班费等) - 完整市场文档(README/TUTORIAL/DEMO/CHANGELOG) - 296 测试全部通过
88 lines
3.3 KiB
Python
88 lines
3.3 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""slug 语义校验(verb-noun-platform)。"""
|
||
from __future__ import annotations
|
||
|
||
import unittest
|
||
|
||
from util.slug_naming import (
|
||
LEGACY_EXEMPT_SLUGS,
|
||
classify_slug_form,
|
||
parse_slug_segments,
|
||
validate_slug_semantics,
|
||
)
|
||
|
||
|
||
class TestSlugNaming(unittest.TestCase):
|
||
def test_parse_slug_segments(self) -> None:
|
||
self.assertEqual(parse_slug_segments("download-settlement-report-amazon"), [
|
||
"download",
|
||
"settlement",
|
||
"report",
|
||
"amazon",
|
||
])
|
||
|
||
def test_classify_standard(self) -> None:
|
||
segments = parse_slug_segments("download-settlement-report-amazon")
|
||
self.assertEqual(classify_slug_form(segments, slug="download-settlement-report-amazon"), "standard")
|
||
|
||
def test_classify_scope(self) -> None:
|
||
segments = parse_slug_segments("generate-article-all")
|
||
self.assertEqual(classify_slug_form(segments, slug="generate-article-all"), "scope")
|
||
|
||
def test_classify_legacy_exempt(self) -> None:
|
||
segments = parse_slug_segments("query-payslip-default")
|
||
self.assertEqual(classify_slug_form(segments, slug="query-payslip-default"), "legacy_exempt")
|
||
|
||
def test_valid_hyphenated_platform_slug(self) -> None:
|
||
slug = "fill-export-declaration-single-window"
|
||
segments = parse_slug_segments(slug)
|
||
self.assertEqual(classify_slug_form(segments, slug=slug), "standard")
|
||
errors, warnings = validate_slug_semantics(slug)
|
||
self.assertEqual(errors, [], msg=f"errors={errors!r} warnings={warnings!r}")
|
||
|
||
def test_valid_standard_slugs(self) -> None:
|
||
for slug in (
|
||
"download-settlement-report-amazon",
|
||
"add-product-shopee",
|
||
"generate-article-all",
|
||
"query-payslip-default",
|
||
"account-manager",
|
||
):
|
||
with self.subTest(slug=slug):
|
||
errors, warnings = validate_slug_semantics(slug)
|
||
self.assertEqual(errors, [], msg=f"errors={errors!r} warnings={warnings!r}")
|
||
|
||
def test_invalid_slugs(self) -> None:
|
||
cases = (
|
||
"amazon-download-settlement-report",
|
||
"enter-cross-border-sales-receipt-voucher-kingdee",
|
||
"reconcile-finance",
|
||
"download-settlement-report-unknownplat",
|
||
"foobar-settlement-report-amazon",
|
||
)
|
||
for slug in cases:
|
||
with self.subTest(slug=slug):
|
||
errors, _warnings = validate_slug_semantics(slug)
|
||
self.assertTrue(errors, msg=f"expected errors for {slug!r}")
|
||
|
||
def test_length_boundary_48_passes(self) -> None:
|
||
slug = "query-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-amazon"
|
||
self.assertEqual(len(slug), 48)
|
||
errors, _warnings = validate_slug_semantics(slug)
|
||
self.assertEqual(errors, [])
|
||
|
||
def test_length_boundary_49_fails(self) -> None:
|
||
slug = "query-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-amazon"
|
||
self.assertEqual(len(slug), 49)
|
||
errors, _warnings = validate_slug_semantics(slug)
|
||
self.assertTrue(errors)
|
||
self.assertTrue(any("48" in err for err in errors))
|
||
|
||
def test_legacy_exempt_set(self) -> None:
|
||
self.assertIn("query-payslip-default", LEGACY_EXEMPT_SLUGS)
|
||
self.assertIn("account-manager", LEGACY_EXEMPT_SLUGS)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
unittest.main()
|