|
| 1 | +package service |
| 2 | + |
| 3 | +import ( |
| 4 | + "strings" |
| 5 | + "testing" |
| 6 | + "time" |
| 7 | + |
| 8 | + "github.com/GMWalletApp/epusdt/internal/testutil" |
| 9 | + "github.com/GMWalletApp/epusdt/model/dao" |
| 10 | + "github.com/GMWalletApp/epusdt/model/mdb" |
| 11 | + "github.com/GMWalletApp/epusdt/notify" |
| 12 | +) |
| 13 | + |
| 14 | +func TestSendPaymentNotificationUsesLatestOrderUpdatedAt(t *testing.T) { |
| 15 | + cleanup := testutil.SetupTestDatabases(t) |
| 16 | + defer cleanup() |
| 17 | + |
| 18 | + const channelType = "test-pay-success-time" |
| 19 | + got := make(chan string, 1) |
| 20 | + notify.RegisterSender(channelType, func(config, text string) error { |
| 21 | + got <- text |
| 22 | + return nil |
| 23 | + }) |
| 24 | + |
| 25 | + if err := dao.Mdb.Create(&mdb.NotificationChannel{ |
| 26 | + Type: channelType, |
| 27 | + Name: "test", |
| 28 | + Config: "{}", |
| 29 | + Events: `{"pay_success":true}`, |
| 30 | + Enabled: true, |
| 31 | + }).Error; err != nil { |
| 32 | + t.Fatalf("seed notification channel: %v", err) |
| 33 | + } |
| 34 | + |
| 35 | + order := &mdb.Orders{ |
| 36 | + TradeId: "T202604270001", |
| 37 | + OrderId: "ORD202604270001", |
| 38 | + Amount: 100, |
| 39 | + Currency: "cny", |
| 40 | + ActualAmount: 14.28, |
| 41 | + Token: "USDT", |
| 42 | + Network: mdb.NetworkTron, |
| 43 | + ReceiveAddress: "TTestAddress", |
| 44 | + Status: mdb.StatusWaitPay, |
| 45 | + } |
| 46 | + if err := dao.Mdb.Create(order).Error; err != nil { |
| 47 | + t.Fatalf("seed order: %v", err) |
| 48 | + } |
| 49 | + |
| 50 | + const createdAt = "2026-04-27 09:00:00" |
| 51 | + const staleUpdatedAt = "2026-04-27 09:01:00" |
| 52 | + const paidAt = "2026-04-27 10:20:30" |
| 53 | + if err := dao.Mdb.Exec("UPDATE orders SET created_at = ?, updated_at = ? WHERE trade_id = ?", createdAt, staleUpdatedAt, order.TradeId).Error; err != nil { |
| 54 | + t.Fatalf("set initial timestamps: %v", err) |
| 55 | + } |
| 56 | + |
| 57 | + var staleOrderModel mdb.Orders |
| 58 | + if err := dao.Mdb.Where("trade_id = ?", order.TradeId).Take(&staleOrderModel).Error; err != nil { |
| 59 | + t.Fatalf("load stale order: %v", err) |
| 60 | + } |
| 61 | + |
| 62 | + if err := dao.Mdb.Exec("UPDATE orders SET status = ?, updated_at = ? WHERE trade_id = ?", mdb.StatusPaySuccess, paidAt, order.TradeId).Error; err != nil { |
| 63 | + t.Fatalf("set paid timestamp: %v", err) |
| 64 | + } |
| 65 | + |
| 66 | + sendPaymentNotification(&staleOrderModel) |
| 67 | + |
| 68 | + select { |
| 69 | + case text := <-got: |
| 70 | + if !strings.Contains(text, "支付时间:"+paidAt) { |
| 71 | + t.Fatalf("notification payment time = %q, want %s", text, paidAt) |
| 72 | + } |
| 73 | + if strings.Contains(text, "支付时间:"+staleUpdatedAt) { |
| 74 | + t.Fatalf("notification used stale payment time: %q", text) |
| 75 | + } |
| 76 | + case <-time.After(2 * time.Second): |
| 77 | + t.Fatal("timed out waiting for notification") |
| 78 | + } |
| 79 | +} |
0 commit comments