package model import ( "encoding/json" "testing" "go.mongodb.org/mongo-driver/v2/bson" ) func TestCryptoAddressPaymentDataReadsAssetFromGenericDocument(t *testing.T) { // The intermediate BSON document produced by PATCH decodes a nested asset // as bson.D before the payment service record is encoded. var payload any if err := json.Unmarshal([]byte(`{"asset":{"chain":"tron_mainnet","token_symbol":"usdt"},"address":"TXabc","memo":"tag-1"}`), &payload); err != nil { t.Fatalf("unmarshal payload: %v", err) } raw, err := bson.Marshal(payload) if err != nil { t.Fatalf("marshal payload: %v", err) } var data CryptoAddressPaymentData if err := bson.Unmarshal(raw, &data); err != nil { t.Fatalf("unmarshal crypto data: %v", err) } if got, want := string(data.Currency), "USDT"; got != want { t.Fatalf("currency mismatch: got=%q want=%q", got, want) } if got, want := data.Network, "TRON_MAINNET"; got != want { t.Fatalf("network mismatch: got=%q want=%q", got, want) } if got, want := data.Address, "TXabc"; got != want { t.Fatalf("address mismatch: got=%q want=%q", got, want) } if got, want := strPtr(data.DestinationTag), "tag-1"; got != want { t.Fatalf("destination tag mismatch: got=%q want=%q", got, want) } } func TestCryptoAddressPaymentDataReadsAssetFromMapDocument(t *testing.T) { raw, err := bson.Marshal(bson.M{ "asset": bson.M{"chain": "arbitrum_one", "tokenSymbol": "usdc"}, "address": "0xabc", }) if err != nil { t.Fatalf("marshal crypto data: %v", err) } var data CryptoAddressPaymentData if err := bson.Unmarshal(raw, &data); err != nil { t.Fatalf("unmarshal crypto data: %v", err) } if got, want := string(data.Currency), "USDC"; got != want { t.Fatalf("currency mismatch: got=%q want=%q", got, want) } if got, want := data.Network, "ARBITRUM_ONE"; got != want { t.Fatalf("network mismatch: got=%q want=%q", got, want) } } func TestCryptoAddressPaymentDataReadsStoredFlatShape(t *testing.T) { raw, err := bson.Marshal(CryptoAddressPaymentData{ Currency: "USDT", Address: "TXabc", Network: "TRON_MAINNET", }) if err != nil { t.Fatalf("marshal crypto data: %v", err) } var data CryptoAddressPaymentData if err := bson.Unmarshal(raw, &data); err != nil { t.Fatalf("unmarshal crypto data: %v", err) } if got, want := string(data.Currency), "USDT"; got != want { t.Fatalf("currency mismatch: got=%q want=%q", got, want) } if got, want := data.Network, "TRON_MAINNET"; got != want { t.Fatalf("network mismatch: got=%q want=%q", got, want) } }