import pathlib, textwrap from sync.config import load_config, FileMapping def test_load_config_parses_fields(tmp_path): cfg_text = textwrap.dedent(""" sql_server: conn_str: "Driver={ODBC Driver 17 for SQL Server};Server=s;Database=d;UID=u;PWD=p;" sync_queue_table: "dbo.SyncQueue" access: driver: "{Microsoft Access Driver (*.accdb, *.mdb)}" roots: 2026: "\\\\\\\\srv\\\\2026" 2025: "\\\\\\\\srv\\\\2025" runtime: poll_interval_seconds: 10 capture_batch_size: 500 apply_batch_size: 200 max_retries: 5 retry_backoff_seconds: 30 cleanup_batch_size: 200 cleanup_lock_retries: 3 files: - file: "氩弧焊.accdb" root: 2026 schema: "TIGWelding" year_suffix: "_YEAR2026" exclude_tables: ["TableChangeLog", "氩弧焊每日催货落实记录_停"] """) p = tmp_path / "config.yaml" p.write_text(cfg_text, encoding="utf-8") cfg = load_config(str(p)) assert cfg.sql_server.sync_queue_table == "dbo.SyncQueue" assert cfg.runtime.poll_interval_seconds == 10 assert cfg.files[0].schema == "TIGWelding" assert cfg.files[0].year_suffix == "_YEAR2026" assert "2026" in cfg.files[0].source_path(cfg) def test_file_mapping_target_table_applies_year_suffix(): fm = FileMapping(file="x.accdb", root="2026", schema="s", year_suffix="_YEAR2026", exclude_tables=[], include_tables=None) assert fm.target_table("一车间记录") == "一车间记录_YEAR2026" fm2 = FileMapping(file="y.accdb", root="2025", schema="s", year_suffix="", exclude_tables=[], include_tables=None) assert fm2.target_table("26年压力表合同数据") == "26年压力表合同数据"