chore: fix test flakiness and add mock helper (#10956)
This commit is contained in:
parent
e50227745d
commit
c06505934f
@ -16,6 +16,7 @@ import {url} from './url';
|
|||||||
import {sleep} from '../src/util/sleep';
|
import {sleep} from '../src/util/sleep';
|
||||||
import {BLOCKHASH_CACHE_TIMEOUT_MS} from '../src/connection';
|
import {BLOCKHASH_CACHE_TIMEOUT_MS} from '../src/connection';
|
||||||
import type {SignatureStatus, TransactionError} from '../src/connection';
|
import type {SignatureStatus, TransactionError} from '../src/connection';
|
||||||
|
import {mockConfirmTransaction} from './mockrpc/confirm-transaction';
|
||||||
|
|
||||||
// Testing blockhash cache takes around 30s to complete
|
// Testing blockhash cache takes around 30s to complete
|
||||||
jest.setTimeout(40000);
|
jest.setTimeout(40000);
|
||||||
@ -1629,33 +1630,13 @@ test('transaction', async () => {
|
|||||||
'0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
|
'0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
mockRpc.push([
|
const airdropFromSig = await connection.requestAirdrop(
|
||||||
url,
|
accountFrom.publicKey,
|
||||||
{
|
minimumAmount + 100010,
|
||||||
method: 'getSignatureStatuses',
|
);
|
||||||
params: [
|
mockConfirmTransaction(airdropFromSig);
|
||||||
[
|
await connection.confirmTransaction(airdropFromSig, 0);
|
||||||
'0WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
error: null,
|
|
||||||
result: {
|
|
||||||
context: {
|
|
||||||
slot: 11,
|
|
||||||
},
|
|
||||||
value: [
|
|
||||||
{
|
|
||||||
slot: 0,
|
|
||||||
confirmations: 0,
|
|
||||||
status: {Ok: null},
|
|
||||||
err: null,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
mockRpc.push([
|
mockRpc.push([
|
||||||
url,
|
url,
|
||||||
{
|
{
|
||||||
@ -1672,11 +1653,6 @@ test('transaction', async () => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
const airdropFromSig = await connection.requestAirdrop(
|
|
||||||
accountFrom.publicKey,
|
|
||||||
minimumAmount + 100010,
|
|
||||||
);
|
|
||||||
await connection.confirmTransaction(airdropFromSig, 0);
|
|
||||||
expect(await connection.getBalance(accountFrom.publicKey)).toBe(
|
expect(await connection.getBalance(accountFrom.publicKey)).toBe(
|
||||||
minimumAmount + 100010,
|
minimumAmount + 100010,
|
||||||
);
|
);
|
||||||
@ -1767,34 +1743,7 @@ test('transaction', async () => {
|
|||||||
{skipPreflight: true},
|
{skipPreflight: true},
|
||||||
);
|
);
|
||||||
|
|
||||||
mockRpc.push([
|
mockConfirmTransaction(signature);
|
||||||
url,
|
|
||||||
{
|
|
||||||
method: 'getSignatureStatuses',
|
|
||||||
params: [
|
|
||||||
[
|
|
||||||
'1WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
error: null,
|
|
||||||
result: {
|
|
||||||
context: {
|
|
||||||
slot: 11,
|
|
||||||
},
|
|
||||||
value: [
|
|
||||||
{
|
|
||||||
slot: 0,
|
|
||||||
confirmations: 0,
|
|
||||||
status: {Ok: null},
|
|
||||||
err: null,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
let confirmResult = (await connection.confirmTransaction(signature, 0)).value;
|
let confirmResult = (await connection.confirmTransaction(signature, 0)).value;
|
||||||
verifySignatureStatus(confirmResult);
|
verifySignatureStatus(confirmResult);
|
||||||
|
|
||||||
@ -1826,6 +1775,9 @@ test('transaction', async () => {
|
|||||||
expect(signature).not.toEqual(signature2);
|
expect(signature).not.toEqual(signature2);
|
||||||
expect(transaction.recentBlockhash).not.toEqual(transaction2.recentBlockhash);
|
expect(transaction.recentBlockhash).not.toEqual(transaction2.recentBlockhash);
|
||||||
|
|
||||||
|
mockConfirmTransaction(signature2);
|
||||||
|
await connection.confirmTransaction(signature2, 0);
|
||||||
|
|
||||||
mockRpc.push([
|
mockRpc.push([
|
||||||
url,
|
url,
|
||||||
{
|
{
|
||||||
@ -1844,11 +1796,18 @@ test('transaction', async () => {
|
|||||||
toPubkey: accountTo.publicKey,
|
toPubkey: accountTo.publicKey,
|
||||||
lamports: 9,
|
lamports: 9,
|
||||||
});
|
});
|
||||||
await connection.sendTransaction(transaction3, [accountFrom], {
|
const signature3 = await connection.sendTransaction(
|
||||||
skipPreflight: true,
|
transaction3,
|
||||||
});
|
[accountFrom],
|
||||||
|
{
|
||||||
|
skipPreflight: true,
|
||||||
|
},
|
||||||
|
);
|
||||||
expect(transaction2.recentBlockhash).toEqual(transaction3.recentBlockhash);
|
expect(transaction2.recentBlockhash).toEqual(transaction3.recentBlockhash);
|
||||||
|
|
||||||
|
mockConfirmTransaction(signature3);
|
||||||
|
await connection.confirmTransaction(signature3, 0);
|
||||||
|
|
||||||
// Sleep until blockhash cache times out
|
// Sleep until blockhash cache times out
|
||||||
await sleep(
|
await sleep(
|
||||||
Math.max(0, 1000 + BLOCKHASH_CACHE_TIMEOUT_MS - (Date.now() - lastFetch)),
|
Math.max(0, 1000 + BLOCKHASH_CACHE_TIMEOUT_MS - (Date.now() - lastFetch)),
|
||||||
@ -1873,9 +1832,15 @@ test('transaction', async () => {
|
|||||||
lamports: 13,
|
lamports: 13,
|
||||||
});
|
});
|
||||||
|
|
||||||
await connection.sendTransaction(transaction4, [accountFrom], {
|
const signature4 = await connection.sendTransaction(
|
||||||
skipPreflight: true,
|
transaction4,
|
||||||
});
|
[accountFrom],
|
||||||
|
{
|
||||||
|
skipPreflight: true,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
mockConfirmTransaction(signature4);
|
||||||
|
await connection.confirmTransaction(signature4, 0);
|
||||||
|
|
||||||
expect(transaction4.recentBlockhash).not.toEqual(
|
expect(transaction4.recentBlockhash).not.toEqual(
|
||||||
transaction3.recentBlockhash,
|
transaction3.recentBlockhash,
|
||||||
|
31
web3.js/test/mockrpc/confirm-transaction.js
Normal file
31
web3.js/test/mockrpc/confirm-transaction.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// @flow
|
||||||
|
|
||||||
|
import type {TransactionSignature} from '../../src/transaction';
|
||||||
|
import {url} from '../url';
|
||||||
|
import {mockRpc} from '../__mocks__/node-fetch';
|
||||||
|
|
||||||
|
export function mockConfirmTransaction(signature: TransactionSignature) {
|
||||||
|
mockRpc.push([
|
||||||
|
url,
|
||||||
|
{
|
||||||
|
method: 'getSignatureStatuses',
|
||||||
|
params: [[signature]],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
error: null,
|
||||||
|
result: {
|
||||||
|
context: {
|
||||||
|
slot: 11,
|
||||||
|
},
|
||||||
|
value: [
|
||||||
|
{
|
||||||
|
slot: 0,
|
||||||
|
confirmations: null,
|
||||||
|
status: {Ok: null},
|
||||||
|
err: null,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
}
|
@ -7,6 +7,7 @@ import {NONCE_ACCOUNT_LENGTH} from '../src/nonce-account';
|
|||||||
import {mockRpc, mockRpcEnabled} from './__mocks__/node-fetch';
|
import {mockRpc, mockRpcEnabled} from './__mocks__/node-fetch';
|
||||||
import {mockGetRecentBlockhash} from './mockrpc/get-recent-blockhash';
|
import {mockGetRecentBlockhash} from './mockrpc/get-recent-blockhash';
|
||||||
import {url} from './url';
|
import {url} from './url';
|
||||||
|
import {mockConfirmTransaction} from './mockrpc/confirm-transaction';
|
||||||
|
|
||||||
if (!mockRpcEnabled) {
|
if (!mockRpcEnabled) {
|
||||||
// Testing max commitment level takes around 20s to complete
|
// Testing max commitment level takes around 20s to complete
|
||||||
@ -58,7 +59,12 @@ test('create and query nonce account', async () => {
|
|||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await connection.requestAirdrop(from.publicKey, minimumAmount * 2);
|
const signature = await connection.requestAirdrop(
|
||||||
|
from.publicKey,
|
||||||
|
minimumAmount * 2,
|
||||||
|
);
|
||||||
|
mockConfirmTransaction(signature);
|
||||||
|
await connection.confirmTransaction(signature, 0);
|
||||||
|
|
||||||
mockRpc.push([
|
mockRpc.push([
|
||||||
url,
|
url,
|
||||||
@ -99,9 +105,15 @@ test('create and query nonce account', async () => {
|
|||||||
authorizedPubkey: from.publicKey,
|
authorizedPubkey: from.publicKey,
|
||||||
lamports: minimumAmount,
|
lamports: minimumAmount,
|
||||||
});
|
});
|
||||||
await connection.sendTransaction(transaction, [from, nonceAccount], {
|
const nonceSignature = await connection.sendTransaction(
|
||||||
skipPreflight: true,
|
transaction,
|
||||||
});
|
[from, nonceAccount],
|
||||||
|
{
|
||||||
|
skipPreflight: true,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
mockConfirmTransaction(nonceSignature);
|
||||||
|
await connection.confirmTransaction(nonceSignature, 0);
|
||||||
|
|
||||||
mockRpc.push([
|
mockRpc.push([
|
||||||
url,
|
url,
|
||||||
@ -173,7 +185,12 @@ test('create and query nonce account with seed', async () => {
|
|||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await connection.requestAirdrop(from.publicKey, minimumAmount * 2);
|
const signature = await connection.requestAirdrop(
|
||||||
|
from.publicKey,
|
||||||
|
minimumAmount * 2,
|
||||||
|
);
|
||||||
|
mockConfirmTransaction(signature);
|
||||||
|
await connection.confirmTransaction(signature, 0);
|
||||||
|
|
||||||
mockRpc.push([
|
mockRpc.push([
|
||||||
url,
|
url,
|
||||||
@ -216,7 +233,11 @@ test('create and query nonce account with seed', async () => {
|
|||||||
authorizedPubkey: from.publicKey,
|
authorizedPubkey: from.publicKey,
|
||||||
lamports: minimumAmount,
|
lamports: minimumAmount,
|
||||||
});
|
});
|
||||||
await connection.sendTransaction(transaction, [from], {skipPreflight: true});
|
const nonceSignature = await connection.sendTransaction(transaction, [from], {
|
||||||
|
skipPreflight: true,
|
||||||
|
});
|
||||||
|
mockConfirmTransaction(nonceSignature);
|
||||||
|
await connection.confirmTransaction(nonceSignature, 0);
|
||||||
|
|
||||||
mockRpc.push([
|
mockRpc.push([
|
||||||
url,
|
url,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user