100 lines
3.1 KiB
Go
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())
|
|
}
|