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)
}
}