feat: 接入 CoinGlass 清算热力图隔离链路
Some checks failed
ci / build + vet + guard + race (push) Has been cancelled
Some checks failed
ci / build + vet + guard + race (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
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())
|
||||
}
|
||||
Reference in New Issue
Block a user