From 15bf0a3cf24e7fc99af56347f648f925a6e49498 Mon Sep 17 00:00:00 2001 From: IshaVenikar Date: Tue, 24 Sep 2024 11:47:20 +0530 Subject: [PATCH] Add a test for release-funds command and use multiple accounts --- .gitignore | 3 +- test/cli.test.ts | 170 ++++++++++++++++++++++++++++++++++------------- 2 files changed, 124 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index c36d7c2..d1c0f4f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ dist/* out config.yml +.env *~ -.idea \ No newline at end of file +.idea diff --git a/test/cli.test.ts b/test/cli.test.ts index 90f15f5..f284598 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -715,13 +715,43 @@ describe('Test laconic CLI commands', () => { }, (AUCTION_COMMIT_DURATION + 5) * 1000); }); - describe('Provider Auction operations', () => { + describe.only('Provider Auction operations', () => { const commitFee = 1000; const revealFee = 1000; const maxPrice = 1000000; - const numProviders = 5; - const bidAmount = 25000; - let bidRevealFilePath: string; + const numProviders = 2; + const bidderInitialBlanace = 1000000000; + const txFees = 200000; + testAuctionId = '5e9dd5501e965f25db4fa62635d0ce5f6c59d73ab1a2ea999f8c5bf2f6fb6350'; + + const bidderAccounts = [ + { + privateKey: 'f40f8e2c9ba70595b6d1cf3bcc47ba539e7d6ad2bcdb16e26c1e369378fd5a55', + address: 'laconic13cd6ntlcf5y0zmafg6wf96y6vsnq46xagpmjtc', + bidAmount: 25000 + }, + { + privateKey: '2c70e81c285e12f196837911aa258b11dff7e4189fc0f11e28cb228956807881', + address: 'laconic15x7sw49w3x2pahjlr48hunp5gpr7hm54eg3f8h', + bidAmount: 25300 + }, + { + privateKey: '1d3a47900e1a5980b171419ac700e779330bc0f85389a4113ff608ca314e25bb', + address: 'laconic1lkgay8ejvcwmngj3jua2ancdxxkukecz7hty89', + bidAmount: 25200 + } + ]; + const winnerAccounts = [bidderAccounts[0], bidderAccounts[2]]; + const winnerPrice = bidderAccounts[2].bidAmount; + + const bidRevealFilePaths: string[] = []; + + beforeAll(() => { + // Fund all bidder accounts + bidderAccounts.forEach(account => { + spawnSync('laconic', ['registry', 'tokens', 'send', '--address', account.address, '--type', TOKEN_TYPE, '--quantity', bidderInitialBlanace.toString()]); + }); + }); test('laconic registry auction create --kind --commits-duration --reveals-duration --denom --commit-fee --reveal-fee --max-price --num-providers ', async () => { const createAuctionResult = spawnSync('laconic', [ @@ -763,65 +793,71 @@ describe('Test laconic CLI commands', () => { }); test('laconic registry auction bid commit ', async () => { - const result = spawnSync('laconic', ['registry', 'auction', 'bid', 'commit', testAuctionId, bidAmount.toString(), TOKEN_TYPE]); - const outputObj = checkResultAndRetrieveOutput(result); + for (const bidderAccount of bidderAccounts) { + const result = spawnSync('laconic', ['registry', 'auction', 'bid', 'commit', testAuctionId, bidderAccount.bidAmount.toString(), TOKEN_TYPE, '--txKey', bidderAccount.privateKey]); + const outputObj = checkResultAndRetrieveOutput(result); - // Expected output - expect(outputObj.reveal_file).toBeDefined(); + // Expected output + expect(outputObj.reveal_file).toBeDefined(); - bidRevealFilePath = outputObj.reveal_file; + bidRevealFilePaths.push(outputObj.reveal_file); + } + + const auctionResult = spawnSync('laconic', ['registry', 'auction', 'get', testAuctionId]); + const auctionOutputObj = checkResultAndRetrieveOutput(auctionResult); + + const expectedBids = bidderAccounts.map(account => ({ + bidderAddress: account.address, + status: AUCTION_STATUS.COMMIT, + bidAmount: { quantity: 0 } + })); + const expectedAuctionObjPartial = { + status: AUCTION_STATUS.COMMIT, + ownerAddress: testAccount, + winnerAddresses: [], + winnerBids: [], + bids: expectedBids + }; + expect(auctionOutputObj[0]).toMatchObject(expectedAuctionObjPartial); }); test('laconic registry auction bid reveal ', async () => { // Wait for auction commits duration (60s) await delay(AUCTION_COMMIT_DURATION * 1000); - let auctionResult = spawnSync('laconic', ['registry', 'auction', 'get', testAuctionId]); - let auctionOutputObj = checkResultAndRetrieveOutput(auctionResult); - - const expectedAuctionObjPartial = { - status: AUCTION_STATUS.REVEAL, - ownerAddress: testAccount, - winnerAddresses: [], - winnerBids: [], - bids: [{ - bidderAddress: testAccount, - status: AUCTION_STATUS.COMMIT, - bidAmount: { quantity: 0 } - }] - }; - expect(auctionOutputObj[0]).toMatchObject(expectedAuctionObjPartial); - // Reveal bid - const result = spawnSync('laconic', ['registry', 'auction', 'bid', 'reveal', testAuctionId, bidRevealFilePath]); - const outputObj = checkResultAndRetrieveOutput(result); + for (let i = 0; i < bidderAccounts.length; i++) { + const result = spawnSync('laconic', ['registry', 'auction', 'bid', 'reveal', testAuctionId, bidRevealFilePaths[i], '--txKey', bidderAccounts[i].privateKey]); + const outputObj = checkResultAndRetrieveOutput(result); - // Expected output - expect(outputObj).toEqual({ success: true }); + // Expected output + expect(outputObj).toEqual({ success: true }); - const revealObject = JSON.parse(fs.readFileSync(bidRevealFilePath, 'utf8')); - expect(revealObject).toMatchObject({ - chainId: CHAIN_ID, - auctionId: testAuctionId, - bidderAddress: testAccount, - bidAmount: `${bidAmount}${TOKEN_TYPE}` - }); + const revealObject = JSON.parse(fs.readFileSync(bidRevealFilePaths[i], 'utf8')); + expect(revealObject).toMatchObject({ + chainId: CHAIN_ID, + auctionId: testAuctionId, + bidderAddress: bidderAccounts[i].address, + bidAmount: `${bidderAccounts[i].bidAmount}${TOKEN_TYPE}` + }); + } // Get auction with revealed bid - auctionResult = spawnSync('laconic', ['registry', 'auction', 'get', testAuctionId]); - auctionOutputObj = checkResultAndRetrieveOutput(auctionResult); + const auctionResult = spawnSync('laconic', ['registry', 'auction', 'get', testAuctionId]); + const auctionOutputObj = checkResultAndRetrieveOutput(auctionResult); + const expectedBids = bidderAccounts.map(account => ({ + bidderAddress: account.address, + status: AUCTION_STATUS.REVEAL, + bidAmount: { quantity: account.bidAmount } + })); const expectedAuctionObjPartialOnBidReveal = { status: AUCTION_STATUS.REVEAL, winnerAddresses: [], - bids: [{ - bidderAddress: testAccount, - status: AUCTION_STATUS.REVEAL, - bidAmount: { quantity: bidAmount } - }] + bids: expectedBids }; expect(auctionOutputObj[0]).toMatchObject(expectedAuctionObjPartialOnBidReveal); - }, (AUCTION_COMMIT_DURATION + 5) * 1000); + }, (AUCTION_COMMIT_DURATION + 60) * 1000); test('laconic registry auction get ', async () => { // Wait for auction reveals duration (60s) @@ -830,15 +866,53 @@ describe('Test laconic CLI commands', () => { const auctionResult = spawnSync('laconic', ['registry', 'auction', 'get', testAuctionId]); const auctionOutputObj = checkResultAndRetrieveOutput(auctionResult); + const expectedWinnerAddresses = winnerAccounts.map(account => account.address); + const expectedWinnerBids = winnerAccounts.map(account => ({ quantity: account.bidAmount })); + const expectedAuctionObjPartial = { status: AUCTION_STATUS.COMPLETED, ownerAddress: testAccount, - winnerAddresses: [testAccount], - winnerBids: [{ quantity: bidAmount }], - winnerPrice: { quantity: bidAmount } + winnerAddresses: expectedWinnerAddresses, + winnerBids: expectedWinnerBids, + winnerPrice: { quantity: winnerPrice }, + fundsReleased: false }; expect(auctionOutputObj[0]).toMatchObject(expectedAuctionObjPartial); - }, (AUCTION_COMMIT_DURATION + 5) * 1000); + }, (AUCTION_REVEAL_DURATION + 5) * 1000); + + test('laconic registry auction release-funds ', async () => { + const result = spawnSync('laconic', ['registry', 'auction', 'release-funds', testAuctionId]); + const outputObj = checkResultAndRetrieveOutput(result); + + expect(outputObj).toEqual({ success: true }); + + const auctionResult = spawnSync('laconic', ['registry', 'auction', 'get', testAuctionId]); + const auctionOutputObj = checkResultAndRetrieveOutput(auctionResult); + + const expectedAuctionObjPartial = { + status: AUCTION_STATUS.COMPLETED, + ownerAddress: testAccount, + fundsReleased: true + }; + expect(auctionOutputObj[0]).toMatchObject(expectedAuctionObjPartial); + + const expectedBalances = [ + bidderInitialBlanace - (commitFee) - (2 * txFees) + winnerPrice, + bidderInitialBlanace - (commitFee) - (2 * txFees), + bidderInitialBlanace - (commitFee) - (2 * txFees) + winnerPrice + ]; + + for (let i = 0; i < bidderAccounts.length; i++) { + const result = spawnSync('laconic', ['registry', 'account', 'get', '--address', bidderAccounts[i].address]); + const outputObj = checkResultAndRetrieveOutput(result); + + // Expected account + const expectedAccount = getAccountObj({ address: bidderAccounts[i].address, balance: expectedBalances[i] }); + + expect(outputObj.length).toEqual(1); + expect(outputObj[0]).toMatchObject(expectedAccount); + } + }); }); describe('Gas and fees config', () => {