import { OrderStateMachine, OrderStatus, OrderEvent } from '../src/core/order/order-state-machine'; describe('OrderStateMachine (TDD 测试套件: 陪玩订单状态机驱动)', () => { let stateMachine: OrderStateMachine; beforeEach(() => { stateMachine = new OrderStateMachine(); }); describe('1. 正向订单履约流转', () => { it('正常流程: 待付款 -> 待接单 -> 服务中 -> 待确认 -> 已完成', () => { let state = OrderStatus.PENDING_PAYMENT; state = stateMachine.transition(state, OrderEvent.PAY_SUCCESS); expect(state).toBe(OrderStatus.PENDING_ACCEPT); state = stateMachine.transition(state, OrderEvent.EXPERT_ACCEPT); expect(state).toBe(OrderStatus.IN_SERVICE); state = stateMachine.transition(state, OrderEvent.EXPERT_APPLY_FINISH); expect(state).toBe(OrderStatus.PENDING_CONFIRM); state = stateMachine.transition(state, OrderEvent.BUYER_CONFIRM); expect(state).toBe(OrderStatus.COMPLETED); }); }); describe('2. 取消与拒单退款流转', () => { it('待付款状态下买家取消,变为已取消', () => { const state = stateMachine.transition(OrderStatus.PENDING_PAYMENT, OrderEvent.CANCEL); expect(state).toBe(OrderStatus.CANCELLED); }); it('待接单状态下大神拒单或超时,变为已退款', () => { const state = stateMachine.transition(OrderStatus.PENDING_ACCEPT, OrderEvent.EXPERT_REJECT); expect(state).toBe(OrderStatus.REFUNDED); }); }); describe('3. 售后与仲裁介入流转', () => { it('待确认状态下买家发起申诉仲裁,进入仲裁中', () => { const state = stateMachine.transition(OrderStatus.PENDING_CONFIRM, OrderEvent.BUYER_DISPUTE); expect(state).toBe(OrderStatus.DISPUTED); }); it('仲裁判定买家胜诉,转为已退款', () => { const state = stateMachine.transition(OrderStatus.DISPUTED, OrderEvent.ARBITRATE_REFUND); expect(state).toBe(OrderStatus.REFUNDED); }); it('仲裁驳回申诉,转为已完成', () => { const state = stateMachine.transition(OrderStatus.DISPUTED, OrderEvent.ARBITRATE_RELEASE); expect(state).toBe(OrderStatus.COMPLETED); }); }); describe('4. 非法状态跃迁防御', () => { it('待付款状态直接跳至已完成应抛出非法操作异常', () => { expect(() => { stateMachine.transition(OrderStatus.PENDING_PAYMENT, OrderEvent.BUYER_CONFIRM); }).toThrow('非法状态流转'); }); it('已完成订单不可再次发起退款或取消', () => { expect(() => { stateMachine.transition(OrderStatus.COMPLETED, OrderEvent.CANCEL); }).toThrow('非法状态流转'); }); }); });