127 lines
3.7 KiB
Python
127 lines
3.7 KiB
Python
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()
|