from datetime import date, datetime from sqlalchemy import create_engine, select from sqlalchemy.orm import sessionmaker from app.database import Base from app.models import ( AttendancePoint, DeviceQRCode, Personnel, Product, ProductionReport, ProductionReportItem, ReportStatus, Role, SessionStatus, WorkSession, WorkSessionDevice, ) from app.routers.products import delete_product def _db_session(): engine = create_engine("sqlite+pysqlite:///:memory:", future=True) Base.metadata.create_all(engine) SessionLocal = sessionmaker(bind=engine, future=True) return SessionLocal() def test_delete_product_removes_qrcode_but_keeps_history(): db = _db_session() try: point = "测试考勤点" user = Personnel(phone="13900000000", name="管理员") user.role = Role.manager db.add_all([ AttendancePoint(name=point, radius_meters=500, is_active=True), user, Product( attendance_point_name=point, project_no="测试", product_name="测试", device_no="", process_name="1", stamping_method="普通", operator_count=1, standard_beat=1, standard_workload=0, ), DeviceQRCode( attendance_point_name=point, device_no="测试", process_name="1", qr_scene="mold=old", created_by=user.phone, ), ]) db.flush() session = WorkSession( id=1, attendance_point_name=point, employee_phone=user.phone, start_at=datetime(2026, 6, 23, 8, 0), status=SessionStatus.submitted, ) db.add(session) db.flush() report = ProductionReport( id=1, attendance_point_name=point, session_id=session.id, employee_phone=user.phone, report_date=date(2026, 6, 23), start_at=datetime(2026, 6, 23, 8, 0), end_at=datetime(2026, 6, 23, 9, 0), status=ReportStatus.pending, ) db.add(report) db.flush() history_device = WorkSessionDevice( id=1, session_id=session.id, attendance_point_name=point, device_no="测试", process_name="1", scanned_at=datetime(2026, 6, 23, 8, 0), sort_order=0, ) history_item = ProductionReportItem( id=1, report_id=report.id, attendance_point_name=point, device_no="28#", project_no="测试", product_name="测试", process_name="1", standard_beat=1, ) db.add_all([history_device, history_item]) db.commit() delete_product( attendance_point_name=point, project_no="测试", product_name="测试", process_name="1", user=user, db=db, ) assert db.get(Product, { "attendance_point_name": point, "project_no": "测试", "product_name": "测试", "device_no": "", "process_name": "1", }) is None assert db.get(DeviceQRCode, { "attendance_point_name": point, "device_no": "测试", "process_name": "1", }) is None assert db.scalar(select(ProductionReportItem).where(ProductionReportItem.id == history_item.id)) is not None assert db.scalar(select(WorkSessionDevice).where(WorkSessionDevice.id == history_device.id)) is not None finally: db.close()