Files
cryptoHermes/internal/repo/persistent/postgres/coinglass_liq_heatmap_repo_test.go
dela 1b61541ff5
Some checks failed
ci / build + vet + guard + race (push) Has been cancelled
feat: 接入 CoinGlass 清算热力图隔离链路
2026-05-25 16:57:22 +08:00

100 lines
3.1 KiB
Go

package postgres
import (
"context"
"errors"
"testing"
"cryptoHermes/internal/entity"
"github.com/pashagolub/pgxmock/v4"
"github.com/stretchr/testify/require"
)
func TestCoinglassLiqHeatMapRepo_UpsertMany_HappyPath(t *testing.T) {
mock, err := pgxmock.NewPool()
require.NoError(t, err)
defer mock.Close()
mock.ExpectBegin()
mock.ExpectExec("INSERT INTO coinglass_liq_heatmap").
WithArgs("coinglass", "BTCUSDT", "5", int64(1700000000000), "1000.5", "2000.5", `{"liq":[[1,2,3]]}`).
WillReturnResult(pgxmock.NewResult("INSERT", 1))
mock.ExpectCommit()
mock.ExpectRollback()
r := &CoinglassLiqHeatMapRepo{pool: mock}
err = r.UpsertMany(context.Background(), []entity.CGLiqHeatMap{{
Symbol: "BTCUSDT",
Interval: "5",
Timestamp: 1700000000000,
PriceMin: "1000.5",
PriceMax: "2000.5",
RawGrid: []byte(`{"liq":[[1,2,3]]}`),
}})
require.NoError(t, err)
require.NoError(t, mock.ExpectationsWereMet())
}
func TestCoinglassLiqHeatMapRepo_UpsertMany_SkipsInvalidRows(t *testing.T) {
mock, err := pgxmock.NewPool()
require.NoError(t, err)
defer mock.Close()
mock.ExpectBegin()
mock.ExpectCommit()
mock.ExpectRollback()
r := &CoinglassLiqHeatMapRepo{pool: mock}
err = r.UpsertMany(context.Background(), []entity.CGLiqHeatMap{
{Symbol: "", Interval: "5", Timestamp: 1, RawGrid: []byte(`{}`)},
{Symbol: "BTCUSDT", Interval: "", Timestamp: 1, RawGrid: []byte(`{}`)},
{Symbol: "BTCUSDT", Interval: "5", Timestamp: 0, RawGrid: []byte(`{}`)},
{Symbol: "BTCUSDT", Interval: "5", Timestamp: 1, RawGrid: []byte(`not-json`)},
})
require.NoError(t, err)
require.NoError(t, mock.ExpectationsWereMet())
}
func TestCoinglassLiqHeatMapRepo_UpsertMany_ExecError(t *testing.T) {
mock, err := pgxmock.NewPool()
require.NoError(t, err)
defer mock.Close()
mock.ExpectBegin()
mock.ExpectExec("INSERT INTO coinglass_liq_heatmap").
WithArgs(pgxmock.AnyArg(), pgxmock.AnyArg(), pgxmock.AnyArg(), pgxmock.AnyArg(), pgxmock.AnyArg(), pgxmock.AnyArg(), pgxmock.AnyArg()).
WillReturnError(errors.New("db down"))
mock.ExpectRollback()
r := &CoinglassLiqHeatMapRepo{pool: mock}
err = r.UpsertMany(context.Background(), []entity.CGLiqHeatMap{{
Symbol: "BTCUSDT", Interval: "5", Timestamp: 1, RawGrid: []byte(`{}`),
}})
require.Error(t, err)
require.Contains(t, err.Error(), "upsert coinglass liq heatmap")
require.NoError(t, mock.ExpectationsWereMet())
}
func TestCoinglassLiqHeatMapRepo_FindRecent_HappyPath(t *testing.T) {
mock, err := pgxmock.NewPool()
require.NoError(t, err)
defer mock.Close()
rows := mock.NewRows([]string{"symbol", "interval", "timestamp", "price_min", "price_max", "raw_grid"}).
AddRow("BTCUSDT", "5", int64(2), "100", "200", `{"b":2}`).
AddRow("BTCUSDT", "5", int64(1), "90", "210", `{"a":1}`)
mock.ExpectQuery("SELECT symbol, interval, timestamp").
WithArgs("coinglass", "BTCUSDT", "5", 288).
WillReturnRows(rows)
r := &CoinglassLiqHeatMapRepo{pool: mock}
got, err := r.FindRecent(context.Background(), "BTCUSDT", "5", 0)
require.NoError(t, err)
require.Len(t, got, 2)
require.Equal(t, int64(1), got[0].Timestamp)
require.JSONEq(t, `{"b":2}`, string(got[1].RawGrid))
require.NoError(t, mock.ExpectationsWereMet())
}