package app import ( "sync/atomic" "testing" "time" ) func TestParseSlotFromRemark(t *testing.T) { r := parseSlotFromRemark("lottery:activity:1|issue:2|count:1|slot:42") if r != 42 { t.Fatalf("slot parse failed: %d", r) } r2 := parseSlotFromRemark("lottery:activity:1|issue:2|count:1") if r2 != -1 { t.Fatalf("expected -1, got %d", r2) } } // TestShouldTriggerInstantDraw 验证即时开奖触发条件 func TestShouldTriggerInstantDraw(t *testing.T) { testCases := []struct { name string orderStatus int32 drawMode string shouldTrigger bool }{ {"已支付+即时开奖", 2, "instant", true}, {"已支付+定时开奖", 2, "scheduled", false}, {"未支付+即时开奖", 1, "instant", false}, {"未支付+定时开奖", 1, "scheduled", false}, {"已取消+即时开奖", 3, "instant", false}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { result := shouldTriggerInstantDraw(tc.orderStatus, tc.drawMode) if result != tc.shouldTrigger { t.Errorf("期望触发=%v,实际触发=%v", tc.shouldTrigger, result) } }) } } // TestInstantDrawTriggerOnce 验证即时开奖只触发一次 // 这个测试模拟 JoinLottery 中的触发逻辑,确保不会重复触发 func TestInstantDrawTriggerOnce(t *testing.T) { var callCount int32 = 0 // 模拟 ProcessOrderLottery 的调用 processOrderLottery := func() { atomic.AddInt32(&callCount, 1) } // 模拟订单状态 orderStatus := int32(2) drawMode := "instant" // 执行触发逻辑(使用辅助函数,避免重复代码) if shouldTriggerInstantDraw(orderStatus, drawMode) { go processOrderLottery() } // 等待 goroutine 完成 time.Sleep(100 * time.Millisecond) // 验证只调用一次 if callCount != 1 { t.Errorf("ProcessOrderLottery 应该只被调用 1 次,实际调用了 %d 次", callCount) } }