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