""" 采购单生成模块测试 - 测试采购单生成和计算功能 """ import unittest import os import tempfile import gc from database import DatabaseManager, get_db_connection class TestPurchaseOrder(unittest.TestCase): """采购单测试类""" def setUp(self): self.temp_dir = tempfile.mkdtemp() self.db_path = os.path.join(self.temp_dir, "test_po.db") self.db_manager = DatabaseManager(self.db_path) self.conn = None self._setup_test_data() def tearDown(self): if self.conn: try: self.conn.close() except: pass gc.collect() try: if os.path.exists(self.db_path): os.remove(self.db_path) if os.path.exists(self.temp_dir): os.rmdir(self.temp_dir) except: pass def get_conn(self): self.conn = get_db_connection(self.db_path) return self.conn def _setup_test_data(self): """准备测试数据""" with get_db_connection(self.db_path) as conn: conn.execute( "INSERT INTO garments (style_number) VALUES (?)", ("PO-001",) ) conn.execute(''' INSERT INTO garment_materials (style_number, category, model, usage_per_piece, unit) VALUES (?, ?, ?, ?, ?) ''', ("PO-001", "A料", "M001", 0.5, "米")) conn.execute(''' INSERT INTO garment_materials (style_number, category, model, usage_per_piece, unit) VALUES (?, ?, ?, ?, ?) ''', ("PO-001", "B料", "M002", 0.3, "米")) conn.commit() def test_get_materials_for_style(self): """测试获取款式材料""" with self.get_conn() as conn: cursor = conn.execute(''' SELECT category, model, usage_per_piece, unit FROM garment_materials WHERE style_number = ? AND usage_per_piece > 0 ORDER BY id ''', ("PO-001",)) rows = cursor.fetchall() self.assertEqual(len(rows), 2) self.assertEqual(rows[0][0], "A料") self.assertEqual(rows[1][0], "B料") def test_calculate_total_usage(self): """测试计算总用量""" usage_per_piece = 0.5 quantity = 100 loss_rate = 0.05 total = usage_per_piece * quantity * (1 + loss_rate) self.assertEqual(total, 52.5) def test_calculate_total_usage_no_loss(self): """测试无损耗计算""" usage_per_piece = 0.5 quantity = 100 loss_rate = 0.0 total = usage_per_piece * quantity * (1 + loss_rate) self.assertEqual(total, 50.0) def test_calculate_total_usage_high_loss(self): """测试高损耗计算""" usage_per_piece = 0.5 quantity = 100 loss_rate = 0.10 total = usage_per_piece * quantity * (1 + loss_rate) self.assertAlmostEqual(total, 55.0, places=2) def test_empty_style_materials(self): """测试空款式材料""" with self.get_conn() as conn: cursor = conn.execute(''' SELECT category, model, usage_per_piece, unit FROM garment_materials WHERE style_number = ? AND usage_per_piece > 0 ''', ("NOT-EXIST",)) rows = cursor.fetchall() self.assertEqual(len(rows), 0) if __name__ == "__main__": unittest.main()