code.vegaprotocol.io/vega@v0.79.0/datanode/sqlstore/deposits_test.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package sqlstore_test 17 18 import ( 19 "context" 20 "encoding/hex" 21 "fmt" 22 "strconv" 23 "testing" 24 "time" 25 26 "code.vegaprotocol.io/vega/datanode/entities" 27 "code.vegaprotocol.io/vega/datanode/sqlstore" 28 vgrand "code.vegaprotocol.io/vega/libs/rand" 29 "code.vegaprotocol.io/vega/protos/vega" 30 31 "github.com/georgysavva/scany/pgxscan" 32 "github.com/stretchr/testify/assert" 33 "github.com/stretchr/testify/require" 34 ) 35 36 const testAmount = "1000" 37 38 var testID = hex.EncodeToString([]byte(vgrand.RandomStr(5))) 39 40 func TestDeposits(t *testing.T) { 41 t.Run("Upsert should insert deposits if one doesn't exist for the block", testAddDepositForNewBlock) 42 t.Run("Upsert should update deposits if one already exists for the block", testUpdateDepositForBlockIfExists) 43 t.Run("Upsert should insert deposit updates if the same deposit id is inserted in a different block", testInsertDepositUpdatesIfNewBlock) 44 t.Run("GetByID should retrieve the latest state of the deposit with the given ID", testDepositsGetByID) 45 t.Run("GetByParty should retrieve the latest state of all deposits for a given party", testDepositsGetByParty) 46 t.Run("GetByTxHash", testDepositsGetTxhash) 47 } 48 49 func TestDepositsPagination(t *testing.T) { 50 t.Run("should return all deposits if no pagination is specified", testDepositsPaginationNoPagination) 51 t.Run("should return the first page of results if first is provided", testDepositsPaginationFirst) 52 t.Run("should return the last page of results if last is provided", testDepositsPaginationLast) 53 t.Run("should return the specified page of results if first and after are provided", testDepositsPaginationFirstAfter) 54 t.Run("should return the specified page of results if last and before are provided", testDepositsPaginationLastBefore) 55 56 t.Run("should return all deposits if no pagination is specified - newest first", testDepositsPaginationNoPaginationNewestFirst) 57 t.Run("should return the first page of results if first is provided - newest first", testDepositsPaginationFirstNewestFirst) 58 t.Run("should return the last page of results if last is provided - newest first", testDepositsPaginationLastNewestFirst) 59 t.Run("should return the specified page of results if first and after are provided - newest first", testDepositsPaginationFirstAfterNewestFirst) 60 t.Run("should return the specified page of results if last and before are provided - newest first", testDepositsPaginationLastBeforeNewestFirst) 61 62 t.Run("should return all deposits between dates if no pagination is specified", testDepositsPaginationBetweenDatesNoPagination) 63 t.Run("should return the first page of results between dates if first is provided", testDepositsPaginationBetweenDatesFirst) 64 t.Run("should return the last page of results between dates if last is provided", testDepositsPaginationBetweenDatesLast) 65 t.Run("should return the specified page of results between dates if first and after are provided", testDepositsPaginationBetweenDatesFirstAfter) 66 t.Run("should return the specified page of results between dates if last and before are provided", testDepositsPaginationBetweenDatesLastBefore) 67 68 t.Run("should return all deposits between dates if no pagination is specified - newest first", testDepositsPaginationBetweenDatesNoPaginationNewestFirst) 69 t.Run("should return the first page of results between dates if first is provided - newest first", testDepositsPaginationBetweenDatesFirstNewestFirst) 70 t.Run("should return the last page of results between dates if last is provided - newest first", testDepositsPaginationBetweenDatesLastNewestFirst) 71 t.Run("should return the specified page of results between dates if first and after are provided - newest first", testDepositsPaginationBetweenDatesFirstAfterNewestFirst) 72 t.Run("should return the specified page of results between dates if last and before are provided - newest first", testDepositsPaginationBetweenDatesLastBeforeNewestFirst) 73 } 74 75 func setupDepositStoreTests(t *testing.T) (*sqlstore.Blocks, *sqlstore.Deposits, sqlstore.Connection) { 76 t.Helper() 77 bs := sqlstore.NewBlocks(connectionSource) 78 ds := sqlstore.NewDeposits(connectionSource) 79 return bs, ds, connectionSource 80 } 81 82 func testAddDepositForNewBlock(t *testing.T) { 83 ctx := tempTransaction(t) 84 85 bs, ds, conn := setupDepositStoreTests(t) 86 87 var rowCount int 88 89 err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 90 require.NoError(t, err) 91 assert.Equal(t, 0, rowCount) 92 93 block := addTestBlock(t, ctx, bs) 94 95 depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano()) 96 97 deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) 98 require.NoError(t, err, "Converting market proto to database entity") 99 100 err = ds.Upsert(ctx, deposit) 101 require.NoError(t, err) 102 err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 103 assert.NoError(t, err) 104 assert.Equal(t, 1, rowCount) 105 } 106 107 func testUpdateDepositForBlockIfExists(t *testing.T) { 108 ctx := tempTransaction(t) 109 110 bs, ds, conn := setupDepositStoreTests(t) 111 112 var rowCount int 113 114 err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 115 require.NoError(t, err) 116 assert.Equal(t, 0, rowCount) 117 118 block := addTestBlock(t, ctx, bs) 119 depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano()) 120 121 deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) 122 require.NoError(t, err, "Converting market proto to database entity") 123 124 err = ds.Upsert(ctx, deposit) 125 require.NoError(t, err) 126 err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 127 assert.NoError(t, err) 128 assert.Equal(t, 1, rowCount) 129 130 deposit.Status = entities.DepositStatus(vega.Deposit_STATUS_FINALIZED) 131 132 err = ds.Upsert(ctx, deposit) 133 require.NoError(t, err) 134 err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 135 assert.NoError(t, err) 136 assert.Equal(t, 1, rowCount) 137 138 var status entities.DepositStatus 139 err = pgxscan.Get(ctx, conn, &status, `select status from deposits where id = $1 and vega_time = $2`, deposit.ID, deposit.VegaTime) 140 assert.NoError(t, err) 141 assert.Equal(t, entities.DepositStatusFinalized, status) 142 } 143 144 func testInsertDepositUpdatesIfNewBlock(t *testing.T) { 145 ctx := tempTransaction(t) 146 147 bs, ds, conn := setupDepositStoreTests(t) 148 149 var rowCount int 150 151 err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 152 require.NoError(t, err) 153 assert.Equal(t, 0, rowCount) 154 155 source := &testBlockSource{bs, time.Now()} 156 block := source.getNextBlock(t, ctx) 157 depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano()) 158 159 deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) 160 require.NoError(t, err, "Converting market proto to database entity") 161 162 err = ds.Upsert(ctx, deposit) 163 require.NoError(t, err) 164 err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 165 assert.NoError(t, err) 166 assert.Equal(t, 1, rowCount) 167 168 block = source.getNextBlock(t, ctx) 169 depositProto.Status = vega.Deposit_STATUS_FINALIZED 170 deposit, err = entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) 171 require.NoError(t, err, "Converting market proto to database entity") 172 173 err = ds.Upsert(ctx, deposit) 174 require.NoError(t, err) 175 err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 176 assert.NoError(t, err) 177 assert.Equal(t, 2, rowCount) 178 179 var status entities.DepositStatus 180 err = pgxscan.Get(ctx, conn, &status, `select status from deposits where id = $1 and vega_time = $2`, deposit.ID, deposit.VegaTime) 181 assert.NoError(t, err) 182 assert.Equal(t, entities.DepositStatusFinalized, status) 183 } 184 185 func testDepositsGetByID(t *testing.T) { 186 ctx := tempTransaction(t) 187 188 bs, ds, conn := setupDepositStoreTests(t) 189 var rowCount int 190 191 err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 192 require.NoError(t, err) 193 assert.Equal(t, 0, rowCount) 194 195 source := &testBlockSource{bs, time.Now()} 196 block := source.getNextBlock(t, ctx) 197 depositProto := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano()) 198 199 deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) 200 require.NoError(t, err, "Converting market proto to database entity") 201 202 err = ds.Upsert(ctx, deposit) 203 require.NoError(t, err) 204 err = conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 205 assert.NoError(t, err) 206 assert.Equal(t, 1, rowCount) 207 208 block = source.getNextBlock(t, ctx) 209 depositProto.Status = vega.Deposit_STATUS_FINALIZED 210 deposit, err = entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) 211 require.NoError(t, err, "Converting market proto to database entity") 212 213 err = ds.Upsert(ctx, deposit) 214 require.NoError(t, err) 215 216 got, err := ds.GetByID(ctx, depositProto.Id) 217 assert.NoError(t, err) 218 219 // We need to truncate the timestamp because the postgres database will truncate to microseconds 220 deposit.CreatedTimestamp = deposit.CreatedTimestamp.Truncate(time.Microsecond) 221 deposit.CreditedTimestamp = deposit.CreditedTimestamp.Truncate(time.Microsecond) 222 223 assert.Equal(t, *deposit, got) 224 } 225 226 func testDepositsGetByParty(t *testing.T) { 227 ctx := tempTransaction(t) 228 229 bs, ds, conn := setupDepositStoreTests(t) 230 231 var rowCount int 232 233 err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 234 require.NoError(t, err) 235 assert.Equal(t, 0, rowCount) 236 237 source := &testBlockSource{bs, time.Now()} 238 block := source.getNextBlock(t, ctx) 239 depositProto1 := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano()) 240 depositProto1.Id = "deadbeef01" 241 242 depositProto2 := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano()) 243 depositProto2.Id = "deadbeef02" 244 245 want := make([]entities.Deposit, 0) 246 247 deposit, err := entities.DepositFromProto(depositProto1, generateTxHash(), block.VegaTime) 248 require.NoError(t, err, "Converting market proto to database entity") 249 250 err = ds.Upsert(ctx, deposit) 251 require.NoError(t, err) 252 253 block = source.getNextBlock(t, ctx) 254 depositProto1.Status = vega.Deposit_STATUS_FINALIZED 255 deposit, err = entities.DepositFromProto(depositProto1, generateTxHash(), block.VegaTime) 256 require.NoError(t, err, "Converting market proto to database entity") 257 258 err = ds.Upsert(ctx, deposit) 259 require.NoError(t, err) 260 261 deposit.CreatedTimestamp = deposit.CreatedTimestamp.Truncate(time.Microsecond) 262 deposit.CreditedTimestamp = deposit.CreditedTimestamp.Truncate(time.Microsecond) 263 264 want = append(want, *deposit) 265 266 block = source.getNextBlock(t, ctx) 267 deposit, err = entities.DepositFromProto(depositProto2, generateTxHash(), block.VegaTime) 268 require.NoError(t, err, "Converting market proto to database entity") 269 270 err = ds.Upsert(ctx, deposit) 271 require.NoError(t, err) 272 273 block = source.getNextBlock(t, ctx) 274 deposit, err = entities.DepositFromProto(depositProto2, generateTxHash(), block.VegaTime) 275 depositProto2.Status = vega.Deposit_STATUS_FINALIZED 276 require.NoError(t, err, "Converting market proto to database entity") 277 278 err = ds.Upsert(ctx, deposit) 279 require.NoError(t, err) 280 281 deposit.CreatedTimestamp = deposit.CreatedTimestamp.Truncate(time.Microsecond) 282 deposit.CreditedTimestamp = deposit.CreditedTimestamp.Truncate(time.Microsecond) 283 284 want = append(want, *deposit) 285 286 got, _, err := ds.GetByParty(ctx, depositProto1.PartyId, false, entities.CursorPagination{}, entities.DateRange{}) 287 assert.NoError(t, err) 288 assert.Equal(t, want, got) 289 } 290 291 func testDepositsGetTxhash(t *testing.T) { 292 ctx := tempTransaction(t) 293 294 bs, ds, conn := setupDepositStoreTests(t) 295 296 var rowCount int 297 298 err := conn.QueryRow(ctx, `select count(*) from deposits`).Scan(&rowCount) 299 require.NoError(t, err) 300 assert.Equal(t, 0, rowCount) 301 302 block := addTestBlock(t, ctx, bs) 303 depositProto1 := getTestDeposit(testID, testID, testID, testAmount, testID, time.Now().UnixNano()) 304 depositProto1.Id = "deadbeef01" 305 306 deposit, err := entities.DepositFromProto(depositProto1, generateTxHash(), block.VegaTime) 307 require.NoError(t, err, "Converting market proto to database entity") 308 309 err = ds.Upsert(ctx, deposit) 310 require.NoError(t, err) 311 312 deposits, err := ds.GetByTxHash(ctx, deposit.TxHash) 313 assert.NoError(t, err) 314 assert.Equal(t, *deposit, deposits[0]) 315 } 316 317 func getTestDeposit(id, party, asset, amount, txHash string, ts int64) *vega.Deposit { 318 return &vega.Deposit{ 319 Id: id, 320 Status: vega.Deposit_STATUS_OPEN, 321 PartyId: party, 322 Asset: asset, 323 Amount: amount, 324 TxHash: txHash, 325 CreditedTimestamp: ts, 326 CreatedTimestamp: ts, 327 } 328 } 329 330 func addDeposits(ctx context.Context, t *testing.T, bs *sqlstore.Blocks, ds *sqlstore.Deposits) []entities.Deposit { 331 t.Helper() 332 vegaTime := time.Now().Truncate(time.Microsecond) 333 amount := int64(1000) 334 deposits := make([]entities.Deposit, 0, 10) 335 source := &testBlockSource{bs, time.Now()} 336 for i := 0; i < 10; i++ { 337 source.getNextBlock(t, ctx) 338 depositProto := getTestDeposit(fmt.Sprintf("deadbeef%02d", i+1), testID, testID, 339 strconv.FormatInt(amount, 10), GenerateID(), vegaTime.UnixNano()) 340 deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), vegaTime) 341 require.NoError(t, err, "Converting deposit proto to database entity") 342 err = ds.Upsert(ctx, deposit) 343 deposits = append(deposits, *deposit) 344 require.NoError(t, err) 345 346 vegaTime = vegaTime.Add(time.Second) 347 amount += 100 348 } 349 350 return deposits 351 } 352 353 func testDepositsPaginationNoPagination(t *testing.T) { 354 ctx := tempTransaction(t) 355 356 bs, ds, _ := setupDepositStoreTests(t) 357 358 testDeposits := addDeposits(ctx, t, bs, ds) 359 360 pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, false) 361 require.NoError(t, err) 362 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 363 364 require.NoError(t, err) 365 assert.Equal(t, testDeposits, got) 366 assert.Equal(t, entities.PageInfo{ 367 HasNextPage: false, 368 HasPreviousPage: false, 369 StartCursor: testDeposits[0].Cursor().Encode(), 370 EndCursor: testDeposits[9].Cursor().Encode(), 371 }, pageInfo) 372 } 373 374 func testDepositsPaginationFirst(t *testing.T) { 375 ctx := tempTransaction(t) 376 377 bs, ds, _ := setupDepositStoreTests(t) 378 379 testDeposits := addDeposits(ctx, t, bs, ds) 380 381 first := int32(3) 382 pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, false) 383 require.NoError(t, err) 384 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 385 386 require.NoError(t, err) 387 want := testDeposits[:3] 388 assert.Equal(t, want, got) 389 assert.Equal(t, entities.PageInfo{ 390 HasNextPage: true, 391 HasPreviousPage: false, 392 StartCursor: testDeposits[0].Cursor().Encode(), 393 EndCursor: testDeposits[2].Cursor().Encode(), 394 }, pageInfo) 395 } 396 397 func testDepositsPaginationLast(t *testing.T) { 398 ctx := tempTransaction(t) 399 400 bs, ds, _ := setupDepositStoreTests(t) 401 402 testDeposits := addDeposits(ctx, t, bs, ds) 403 404 last := int32(3) 405 pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, false) 406 require.NoError(t, err) 407 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 408 409 require.NoError(t, err) 410 want := testDeposits[7:] 411 assert.Equal(t, want, got) 412 assert.Equal(t, entities.PageInfo{ 413 HasNextPage: false, 414 HasPreviousPage: true, 415 StartCursor: testDeposits[7].Cursor().Encode(), 416 EndCursor: testDeposits[9].Cursor().Encode(), 417 }, pageInfo) 418 } 419 420 func testDepositsPaginationFirstAfter(t *testing.T) { 421 ctx := tempTransaction(t) 422 423 bs, ds, _ := setupDepositStoreTests(t) 424 425 testDeposits := addDeposits(ctx, t, bs, ds) 426 427 first := int32(3) 428 after := testDeposits[2].Cursor().Encode() 429 pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, false) 430 require.NoError(t, err) 431 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 432 433 require.NoError(t, err) 434 want := testDeposits[3:6] 435 assert.Equal(t, want, got) 436 assert.Equal(t, entities.PageInfo{ 437 HasNextPage: true, 438 HasPreviousPage: true, 439 StartCursor: testDeposits[3].Cursor().Encode(), 440 EndCursor: testDeposits[5].Cursor().Encode(), 441 }, pageInfo) 442 } 443 444 func testDepositsPaginationLastBefore(t *testing.T) { 445 ctx := tempTransaction(t) 446 447 bs, ds, _ := setupDepositStoreTests(t) 448 449 testDeposits := addDeposits(ctx, t, bs, ds) 450 451 last := int32(3) 452 before := testDeposits[7].Cursor().Encode() 453 pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, false) 454 require.NoError(t, err) 455 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 456 457 require.NoError(t, err) 458 want := testDeposits[4:7] 459 assert.Equal(t, want, got) 460 assert.Equal(t, entities.PageInfo{ 461 HasNextPage: true, 462 HasPreviousPage: true, 463 StartCursor: testDeposits[4].Cursor().Encode(), 464 EndCursor: testDeposits[6].Cursor().Encode(), 465 }, pageInfo) 466 } 467 468 func testDepositsPaginationNoPaginationNewestFirst(t *testing.T) { 469 ctx := tempTransaction(t) 470 471 bs, ds, _ := setupDepositStoreTests(t) 472 473 testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds)) 474 475 pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) 476 require.NoError(t, err) 477 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 478 479 require.NoError(t, err) 480 assert.Equal(t, testDeposits, got) 481 assert.Equal(t, entities.PageInfo{ 482 HasNextPage: false, 483 HasPreviousPage: false, 484 StartCursor: testDeposits[0].Cursor().Encode(), 485 EndCursor: testDeposits[9].Cursor().Encode(), 486 }, pageInfo) 487 } 488 489 func testDepositsPaginationFirstNewestFirst(t *testing.T) { 490 ctx := tempTransaction(t) 491 492 bs, ds, _ := setupDepositStoreTests(t) 493 494 testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds)) 495 496 first := int32(3) 497 pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, true) 498 require.NoError(t, err) 499 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 500 501 require.NoError(t, err) 502 want := testDeposits[:3] 503 assert.Equal(t, want, got) 504 assert.Equal(t, entities.PageInfo{ 505 HasNextPage: true, 506 HasPreviousPage: false, 507 StartCursor: testDeposits[0].Cursor().Encode(), 508 EndCursor: testDeposits[2].Cursor().Encode(), 509 }, pageInfo) 510 } 511 512 func testDepositsPaginationLastNewestFirst(t *testing.T) { 513 ctx := tempTransaction(t) 514 515 bs, ds, _ := setupDepositStoreTests(t) 516 517 testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds)) 518 519 last := int32(3) 520 pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, true) 521 require.NoError(t, err) 522 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 523 524 require.NoError(t, err) 525 want := testDeposits[7:] 526 assert.Equal(t, want, got) 527 assert.Equal(t, entities.PageInfo{ 528 HasNextPage: false, 529 HasPreviousPage: true, 530 StartCursor: testDeposits[7].Cursor().Encode(), 531 EndCursor: testDeposits[9].Cursor().Encode(), 532 }, pageInfo) 533 } 534 535 func testDepositsPaginationFirstAfterNewestFirst(t *testing.T) { 536 ctx := tempTransaction(t) 537 538 bs, ds, _ := setupDepositStoreTests(t) 539 540 testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds)) 541 542 first := int32(3) 543 after := testDeposits[2].Cursor().Encode() 544 pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, true) 545 require.NoError(t, err) 546 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 547 548 require.NoError(t, err) 549 want := testDeposits[3:6] 550 assert.Equal(t, want, got) 551 assert.Equal(t, entities.PageInfo{ 552 HasNextPage: true, 553 HasPreviousPage: true, 554 StartCursor: testDeposits[3].Cursor().Encode(), 555 EndCursor: testDeposits[5].Cursor().Encode(), 556 }, pageInfo) 557 } 558 559 func testDepositsPaginationLastBeforeNewestFirst(t *testing.T) { 560 ctx := tempTransaction(t) 561 562 bs, ds, _ := setupDepositStoreTests(t) 563 564 testDeposits := entities.ReverseSlice(addDeposits(ctx, t, bs, ds)) 565 566 last := int32(3) 567 before := testDeposits[7].Cursor().Encode() 568 pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, true) 569 require.NoError(t, err) 570 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{}) 571 572 require.NoError(t, err) 573 want := testDeposits[4:7] 574 assert.Equal(t, want, got) 575 assert.Equal(t, entities.PageInfo{ 576 HasNextPage: true, 577 HasPreviousPage: true, 578 StartCursor: testDeposits[4].Cursor().Encode(), 579 EndCursor: testDeposits[6].Cursor().Encode(), 580 }, pageInfo) 581 } 582 583 func testDepositsPaginationBetweenDatesNoPagination(t *testing.T) { 584 ctx := tempTransaction(t) 585 586 bs, ds, _ := setupDepositStoreTests(t) 587 588 testDeposits := addDeposits(ctx, t, bs, ds) 589 590 pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, false) 591 require.NoError(t, err) 592 593 startDate := testDeposits[3].VegaTime 594 endDate := testDeposits[8].VegaTime 595 596 t.Run("Between start and end dates", func(t *testing.T) { 597 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 598 Start: &startDate, 599 End: &endDate, 600 }) 601 602 want := testDeposits[3:8] 603 604 require.NoError(t, err) 605 assert.Equal(t, want, got) 606 assert.Equal(t, entities.PageInfo{ 607 HasNextPage: false, 608 HasPreviousPage: false, 609 StartCursor: testDeposits[3].Cursor().Encode(), 610 EndCursor: testDeposits[7].Cursor().Encode(), 611 }, pageInfo) 612 }) 613 614 t.Run("From start date only", func(t *testing.T) { 615 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 616 Start: &startDate, 617 }) 618 619 want := testDeposits[3:] 620 621 require.NoError(t, err) 622 assert.Equal(t, want, got) 623 assert.Equal(t, entities.PageInfo{ 624 HasNextPage: false, 625 HasPreviousPage: false, 626 StartCursor: testDeposits[3].Cursor().Encode(), 627 EndCursor: testDeposits[9].Cursor().Encode(), 628 }, pageInfo) 629 }) 630 631 t.Run("To end date only", func(t *testing.T) { 632 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 633 End: &endDate, 634 }) 635 636 want := testDeposits[:8] 637 638 require.NoError(t, err) 639 assert.Equal(t, want, got) 640 assert.Equal(t, entities.PageInfo{ 641 HasNextPage: false, 642 HasPreviousPage: false, 643 StartCursor: testDeposits[0].Cursor().Encode(), 644 EndCursor: testDeposits[7].Cursor().Encode(), 645 }, pageInfo) 646 }) 647 } 648 649 func testDepositsPaginationBetweenDatesFirst(t *testing.T) { 650 ctx := tempTransaction(t) 651 652 bs, ds, _ := setupDepositStoreTests(t) 653 654 testDeposits := addDeposits(ctx, t, bs, ds) 655 656 first := int32(3) 657 pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, false) 658 require.NoError(t, err) 659 660 startDate := testDeposits[2].VegaTime 661 endDate := testDeposits[8].VegaTime 662 663 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 664 Start: &startDate, 665 End: &endDate, 666 }) 667 668 require.NoError(t, err) 669 want := testDeposits[2:5] 670 assert.Equal(t, want, got) 671 assert.Equal(t, entities.PageInfo{ 672 HasNextPage: true, 673 HasPreviousPage: false, 674 StartCursor: testDeposits[2].Cursor().Encode(), 675 EndCursor: testDeposits[4].Cursor().Encode(), 676 }, pageInfo) 677 } 678 679 func testDepositsPaginationBetweenDatesLast(t *testing.T) { 680 ctx := tempTransaction(t) 681 682 bs, ds, _ := setupDepositStoreTests(t) 683 684 testDeposits := addDeposits(ctx, t, bs, ds) 685 686 last := int32(3) 687 pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, false) 688 require.NoError(t, err) 689 690 startDate := testDeposits[2].VegaTime 691 endDate := testDeposits[8].VegaTime 692 693 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 694 Start: &startDate, 695 End: &endDate, 696 }) 697 698 require.NoError(t, err) 699 want := testDeposits[5:8] 700 assert.Equal(t, want, got) 701 assert.Equal(t, entities.PageInfo{ 702 HasNextPage: false, 703 HasPreviousPage: true, 704 StartCursor: testDeposits[5].Cursor().Encode(), 705 EndCursor: testDeposits[7].Cursor().Encode(), 706 }, pageInfo) 707 } 708 709 func testDepositsPaginationBetweenDatesFirstAfter(t *testing.T) { 710 ctx := tempTransaction(t) 711 712 bs, ds, _ := setupDepositStoreTests(t) 713 714 testDeposits := addDeposits(ctx, t, bs, ds) 715 716 first := int32(3) 717 after := testDeposits[4].Cursor().Encode() 718 pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, false) 719 require.NoError(t, err) 720 721 startDate := testDeposits[2].VegaTime 722 endDate := testDeposits[8].VegaTime 723 724 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 725 Start: &startDate, 726 End: &endDate, 727 }) 728 729 require.NoError(t, err) 730 want := testDeposits[5:8] 731 assert.Equal(t, want, got) 732 assert.Equal(t, entities.PageInfo{ 733 HasNextPage: false, 734 HasPreviousPage: true, 735 StartCursor: testDeposits[5].Cursor().Encode(), 736 EndCursor: testDeposits[7].Cursor().Encode(), 737 }, pageInfo) 738 } 739 740 func testDepositsPaginationBetweenDatesLastBefore(t *testing.T) { 741 ctx := tempTransaction(t) 742 743 bs, ds, _ := setupDepositStoreTests(t) 744 745 testDeposits := addDeposits(ctx, t, bs, ds) 746 747 last := int32(3) 748 before := testDeposits[6].Cursor().Encode() 749 pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, false) 750 require.NoError(t, err) 751 752 startDate := testDeposits[2].VegaTime 753 endDate := testDeposits[8].VegaTime 754 755 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 756 Start: &startDate, 757 End: &endDate, 758 }) 759 760 require.NoError(t, err) 761 want := testDeposits[3:6] 762 assert.Equal(t, want, got) 763 assert.Equal(t, entities.PageInfo{ 764 HasNextPage: true, 765 HasPreviousPage: true, 766 StartCursor: testDeposits[3].Cursor().Encode(), 767 EndCursor: testDeposits[5].Cursor().Encode(), 768 }, pageInfo) 769 } 770 771 func testDepositsPaginationBetweenDatesNoPaginationNewestFirst(t *testing.T) { 772 ctx := tempTransaction(t) 773 774 bs, ds, _ := setupDepositStoreTests(t) 775 776 testDeposits := addDeposits(ctx, t, bs, ds) 777 startDate := testDeposits[2].VegaTime 778 endDate := testDeposits[8].VegaTime 779 want := entities.ReverseSlice(testDeposits[2:8]) 780 781 pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) 782 require.NoError(t, err) 783 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 784 Start: &startDate, 785 End: &endDate, 786 }) 787 788 require.NoError(t, err) 789 assert.Equal(t, want, got) 790 assert.Equal(t, entities.PageInfo{ 791 HasNextPage: false, 792 HasPreviousPage: false, 793 StartCursor: want[0].Cursor().Encode(), 794 EndCursor: want[5].Cursor().Encode(), 795 }, pageInfo) 796 } 797 798 func testDepositsPaginationBetweenDatesFirstNewestFirst(t *testing.T) { 799 ctx := tempTransaction(t) 800 801 bs, ds, _ := setupDepositStoreTests(t) 802 803 testDeposits := addDeposits(ctx, t, bs, ds) 804 startDate := testDeposits[2].VegaTime 805 endDate := testDeposits[8].VegaTime 806 want := entities.ReverseSlice(testDeposits[2:8]) 807 808 first := int32(3) 809 pagination, err := entities.NewCursorPagination(&first, nil, nil, nil, true) 810 require.NoError(t, err) 811 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 812 Start: &startDate, 813 End: &endDate, 814 }) 815 816 require.NoError(t, err) 817 want = want[:3] 818 assert.Equal(t, want, got) 819 assert.Equal(t, entities.PageInfo{ 820 HasNextPage: true, 821 HasPreviousPage: false, 822 StartCursor: want[0].Cursor().Encode(), 823 EndCursor: want[2].Cursor().Encode(), 824 }, pageInfo) 825 } 826 827 func testDepositsPaginationBetweenDatesLastNewestFirst(t *testing.T) { 828 ctx := tempTransaction(t) 829 830 bs, ds, _ := setupDepositStoreTests(t) 831 832 testDeposits := addDeposits(ctx, t, bs, ds) 833 834 last := int32(3) 835 pagination, err := entities.NewCursorPagination(nil, nil, &last, nil, true) 836 require.NoError(t, err) 837 838 startDate := testDeposits[2].VegaTime 839 endDate := testDeposits[8].VegaTime 840 841 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 842 Start: &startDate, 843 End: &endDate, 844 }) 845 want := entities.ReverseSlice(testDeposits[2:8]) 846 847 require.NoError(t, err) 848 want = want[3:] 849 assert.Equal(t, want, got) 850 assert.Equal(t, entities.PageInfo{ 851 HasNextPage: false, 852 HasPreviousPage: true, 853 StartCursor: want[0].Cursor().Encode(), 854 EndCursor: want[2].Cursor().Encode(), 855 }, pageInfo) 856 } 857 858 func testDepositsPaginationBetweenDatesFirstAfterNewestFirst(t *testing.T) { 859 ctx := tempTransaction(t) 860 861 bs, ds, _ := setupDepositStoreTests(t) 862 863 testDeposits := addDeposits(ctx, t, bs, ds) 864 want := entities.ReverseSlice(testDeposits[2:8]) 865 866 first := int32(3) 867 after := want[1].Cursor().Encode() 868 pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, true) 869 require.NoError(t, err) 870 871 startDate := testDeposits[2].VegaTime 872 endDate := testDeposits[8].VegaTime 873 874 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 875 Start: &startDate, 876 End: &endDate, 877 }) 878 879 require.NoError(t, err) 880 want = want[2:5] 881 assert.Equal(t, want, got) 882 assert.Equal(t, entities.PageInfo{ 883 HasNextPage: true, 884 HasPreviousPage: true, 885 StartCursor: want[0].Cursor().Encode(), 886 EndCursor: want[2].Cursor().Encode(), 887 }, pageInfo) 888 } 889 890 func testDepositsPaginationBetweenDatesLastBeforeNewestFirst(t *testing.T) { 891 ctx := tempTransaction(t) 892 893 bs, ds, _ := setupDepositStoreTests(t) 894 895 testDeposits := addDeposits(ctx, t, bs, ds) 896 want := entities.ReverseSlice(testDeposits[2:8]) 897 898 last := int32(3) 899 before := want[4].Cursor().Encode() 900 pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, true) 901 require.NoError(t, err) 902 903 startDate := testDeposits[2].VegaTime 904 endDate := testDeposits[8].VegaTime 905 906 got, pageInfo, err := ds.GetByParty(ctx, testID, false, pagination, entities.DateRange{ 907 Start: &startDate, 908 End: &endDate, 909 }) 910 911 require.NoError(t, err) 912 want = want[1:4] 913 assert.Equal(t, want, got) 914 assert.Equal(t, entities.PageInfo{ 915 HasNextPage: true, 916 HasPreviousPage: true, 917 StartCursor: want[0].Cursor().Encode(), 918 EndCursor: want[2].Cursor().Encode(), 919 }, pageInfo) 920 } 921 922 func TestDeposits_DepositStatusEnum(t *testing.T) { 923 var depositStatus vega.Deposit_Status 924 925 states := getEnums(t, depositStatus) 926 assert.Len(t, states, 5) 927 for e, state := range states { 928 t.Run(state, func(t *testing.T) { 929 ctx := tempTransaction(t) 930 bs, ds, _ := setupDepositStoreTests(t) 931 block := addTestBlock(t, ctx, bs) 932 amount := int64(1000) 933 934 depositProto := getTestDeposit(fmt.Sprintf("deadbeef%02d", e), testID, testID, 935 strconv.FormatInt(amount, 10), GenerateID(), block.VegaTime.UnixNano()) 936 depositProto.Status = vega.Deposit_Status(e) 937 938 deposit, err := entities.DepositFromProto(depositProto, generateTxHash(), block.VegaTime) 939 require.NoError(t, err, "Converting deposit proto to database entity") 940 require.NoError(t, ds.Upsert(ctx, deposit)) 941 942 got, err := ds.GetByID(ctx, depositProto.Id) 943 require.NoError(t, err) 944 assert.Equal(t, deposit.Status, got.Status) 945 }) 946 } 947 }