import io import unittest from datetime import datetime from unittest.mock import patch from zoneinfo import ZoneInfo from flask import Flask, jsonify import openpyxl from routes import planning class PlanningDailySortTest(unittest.TestCase): def test_daily_boundary_and_manual_override(self): tz = ZoneInfo('Asia/Shanghai') for hour, minute, expected in [(9, 59, ('', 'asc')), (10, 0, ('建议下单数量', 'desc')), (23, 59, ('建议下单数量', 'desc')), (0, 0, ('', 'asc'))]: now = datetime(2026, 10, 21, hour, minute, tzinfo=tz) self.assertEqual(planning.planning_sort(now=now), expected) self.assertEqual(planning.planning_sort('库存', 'asc', now), ('库存', 'asc')) def test_export_reuses_filtered_list_and_preserves_row_order(self): app = Flask(__name__) app.secret_key = 'test' payload = {'view': 'external', 'search': 'SKU', 'sort_by': '建议下单数量', 'sort_order': 'desc', 'custom_field': '__multi__', 'custom_value': '[]', 'columns': [{'field': 'product_code', 'label': '编号'}, {'field': '建议下单数量', 'label': '建议下单数量'}]} with app.test_request_context('/api/planning/export', method='POST', json=payload), \ patch.object(planning, '_ensure_global_config', return_value={}), \ patch.object(planning.planning_list, '__wrapped__') as listing: listing.return_value = jsonify({'data': {'rows': [ {'product_code': 'SKU-B', '建议下单数量': 100}, {'product_code': 'SKU-A', '建议下单数量': 2}]}}) response = planning.planning_export.__wrapped__() listing.assert_called_once_with(dict(payload, page=1, size=1000000)) response.direct_passthrough = False book = openpyxl.load_workbook(io.BytesIO(response.get_data())) self.assertEqual(list(book.active.values), [('编号', '建议下单数量'), ('SKU-B', 100), ('SKU-A', 2)]) def test_export_keeps_999_as_integer(self): app = Flask(__name__) payload = {'columns': [{'field': 'product_code', 'label': '货品编号'}, {'field': '库存可支撑天数', 'label': '库存可支撑天数'}]} with app.test_request_context('/api/planning/export', method='POST', json=payload), \ patch.object(planning, '_ensure_global_config', return_value={}), \ patch.object(planning.planning_list, '__wrapped__') as listing: listing.return_value = jsonify({'data': {'rows': [ {'product_code': 'SKU-999', '库存可支撑天数': 999}]}}) response = planning.planning_export.__wrapped__() response.direct_passthrough = False book = openpyxl.load_workbook(io.BytesIO(response.get_data())) self.assertEqual(list(book.active.values), [('货品编号', '库存可支撑天数'), ('SKU-999', 999)]) if __name__ == '__main__': unittest.main()