57 lines
2.2 KiB
Go
57 lines
2.2 KiB
Go
package walletnotice
|
|
|
|
import (
|
|
"context"
|
|
"regexp"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
)
|
|
|
|
func TestLoadWalletOutboxMessageRejectsEmptyAppInsteadOfDefaultingToLalu(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
if err != nil {
|
|
t.Fatalf("create sqlmock: %v", err)
|
|
}
|
|
defer db.Close()
|
|
repository := &MySQLRepository{db: db, walletOutboxTable: "`hyapp_wallet`.`wallet_outbox`"}
|
|
if _, err := repository.LoadWalletOutboxMessage(context.Background(), " ", "evt-1"); err == nil {
|
|
t.Fatal("empty app_code must be rejected before owner table access")
|
|
}
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Fatalf("empty key unexpectedly queried wallet owner table: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestLoadWalletOutboxMessageUsesExactImmutablePrivateFact(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
if err != nil {
|
|
t.Fatalf("create sqlmock: %v", err)
|
|
}
|
|
defer db.Close()
|
|
repository := &MySQLRepository{db: db, walletOutboxTable: "`hyapp_wallet`.`wallet_outbox`"}
|
|
mock.ExpectQuery(regexp.QuoteMeta(`
|
|
SELECT app_code, event_id, event_type, transaction_id, command_id, user_id,
|
|
asset_type, available_delta, frozen_delta,
|
|
COALESCE(CAST(payload AS CHAR), '{}'), created_at_ms
|
|
FROM `+"`hyapp_wallet`.`wallet_outbox`"+`
|
|
WHERE app_code = ? AND event_id = ?
|
|
AND event_type IN (?, ?) AND asset_type <> ?`)).
|
|
WithArgs("fami", "wallet:evt-1", eventWalletBalance, eventVIPActivated, robotCoinAssetType).
|
|
WillReturnRows(sqlmock.NewRows([]string{
|
|
"app_code", "event_id", "event_type", "transaction_id", "command_id", "user_id",
|
|
"asset_type", "available_delta", "frozen_delta", "payload", "created_at_ms",
|
|
}).AddRow("fami", "wallet:evt-1", eventWalletBalance, "tx-1", "cmd-1", int64(42), "COIN", int64(100), int64(0), `{"balance_after":100}`, int64(1700000000000)))
|
|
|
|
message, err := repository.LoadWalletOutboxMessage(context.Background(), " FAMI ", "wallet:evt-1")
|
|
if err != nil {
|
|
t.Fatalf("load exact wallet owner fact: %v", err)
|
|
}
|
|
if message.AppCode != "fami" || message.EventID != "wallet:evt-1" || message.UserID != 42 || message.PayloadJSON != `{"balance_after":100}` {
|
|
t.Fatalf("wallet owner snapshot mismatch: %+v", message)
|
|
}
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Fatalf("wallet replay query mismatch: %v", err)
|
|
}
|
|
}
|