"""Regression coverage for immutable planning suggestion snapshots.""" import unittest from pathlib import Path from unittest.mock import patch from services import planning_snapshot class PlanningSnapshotTest(unittest.TestCase): def test_counter_resets_and_restarts(self): self.assertEqual(planning_snapshot._next_counter(0, {'suggested_qty': 5, 'consecutive_days': 8}), 0) self.assertEqual(planning_snapshot._next_counter(10, {'suggested_qty': 0, 'consecutive_days': 0}), 1) self.assertEqual(planning_snapshot._next_counter(10, None), 1) self.assertEqual(planning_snapshot._next_counter(10, {'suggested_qty': 1, 'consecutive_days': 8}), 9) def test_rows_use_snapshot_value_and_default_to_zero(self): rows = [{'product_code': 'A', '建议下单数量': 99}, {'product_code': 'B', '建议下单数量': 10}] with patch.object(planning_snapshot, 'consecutive_days_map', return_value={'A': 4}): planning_snapshot.attach_consecutive_days(rows, '2026-10-20') self.assertEqual(rows[0]['连续建议天数'], 4) self.assertEqual(rows[1]['连续建议天数'], 0) def test_planning_page_and_export_expose_new_field(self): root = Path(__file__).resolve().parents[1] app_js = (root / 'static/js/app.js').read_text(encoding='utf-8') planning_py = (root / 'routes/planning.py').read_text(encoding='utf-8') self.assertIn("{field: '连续建议天数', label: '连续建议天数', defaultShow: true}", app_js) self.assertIn("'连续建议天数':1", app_js) self.assertIn("'建议下单数量','连续建议天数'", planning_py) if __name__ == '__main__': unittest.main()