文件
shanghaipeiwan/server/tests/order-state-machine.spec.ts

71 行
2.7 KiB
TypeScript

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('非法状态流转');
});
});
});