Refactor tests for reuse of the fixture subprovider
This commit is contained in:
@@ -14,86 +14,79 @@ chaiSetup.configure();
|
||||
|
||||
describe('NonceTrackerSubprovider', () => {
|
||||
let provider: Web3ProviderEngine;
|
||||
const getTransactionCountPayload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_getTransactionCount',
|
||||
params: ['0x0', 'pending'],
|
||||
id: 1,
|
||||
};
|
||||
const sendTransactionPayload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_sendRawTransaction',
|
||||
params: [],
|
||||
id: 1,
|
||||
};
|
||||
const txParams = [
|
||||
'0x',
|
||||
'0x09184e72a000',
|
||||
'0x2710',
|
||||
'0x0000000000000000000000000000000000000000',
|
||||
'0x',
|
||||
'0x7f7465737432000000000000000000000000000000000000000000000000000000600057',
|
||||
'0x1c',
|
||||
'0x5e1d3a76fbf824220eafc8c79ad578ad2b67d01b0c2425eb1f1347e8f50882ab',
|
||||
'0x5bd428537f05f9830e93792f90ea6a3e2d1ee84952dd96edbae9f658f831ab13',
|
||||
];
|
||||
function createFixtureSubprovider() {
|
||||
let called = false;
|
||||
const fixedBlockNumberAndTransactionCountProvider = new FixtureSubprovider({
|
||||
eth_getBlockByNumber: '0x01',
|
||||
eth_getTransactionCount: (data: any, next: any, end: any) => {
|
||||
if (called) {
|
||||
return end(null, '0x99');
|
||||
} else {
|
||||
called = true;
|
||||
end(null, '0x00');
|
||||
}
|
||||
},
|
||||
});
|
||||
return fixedBlockNumberAndTransactionCountProvider;
|
||||
}
|
||||
it('successfully caches the transaction count', async () => {
|
||||
provider = new Web3ProviderEngine();
|
||||
let called = false;
|
||||
const nonceTrackerSubprovider = new NonceTrackerSubprovider();
|
||||
provider.addProvider(nonceTrackerSubprovider);
|
||||
provider.addProvider(
|
||||
new FixtureSubprovider({
|
||||
eth_getBlockByNumber: '0x01',
|
||||
eth_getTransactionCount: (data: any, next: any, end: any) => {
|
||||
if (called) {
|
||||
return end(null, '0x99');
|
||||
} else {
|
||||
called = true;
|
||||
end(null, '0x01');
|
||||
}
|
||||
},
|
||||
}),
|
||||
);
|
||||
provider.addProvider(createFixtureSubprovider());
|
||||
provider.start();
|
||||
|
||||
const payload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_getTransactionCount',
|
||||
params: ['0x0', 'pending'],
|
||||
id: 1,
|
||||
};
|
||||
const payload = { ...getTransactionCountPayload, params: ['0x0', 'pending'] };
|
||||
|
||||
const response = await promisify(provider.sendAsync, provider)(payload);
|
||||
expect(response.result).to.be.eq('0x01');
|
||||
expect(response.result).to.be.eq('0x00');
|
||||
const secondResponse = await promisify(provider.sendAsync, provider)(payload);
|
||||
expect(secondResponse.result).to.be.eq('0x01');
|
||||
expect(secondResponse.result).to.be.eq('0x00');
|
||||
});
|
||||
it('does not cache the result for latest transaction count', async () => {
|
||||
provider = new Web3ProviderEngine();
|
||||
let called = false;
|
||||
const nonceTrackerSubprovider = new NonceTrackerSubprovider();
|
||||
provider.addProvider(nonceTrackerSubprovider);
|
||||
provider.addProvider(
|
||||
new FixtureSubprovider({
|
||||
eth_getBlockByNumber: '0x01',
|
||||
eth_getTransactionCount: (data: any, next: any, end: any) => {
|
||||
if (called) {
|
||||
return end(null, '0x99');
|
||||
} else {
|
||||
called = true;
|
||||
end(null, '0x01');
|
||||
}
|
||||
},
|
||||
}),
|
||||
);
|
||||
provider.addProvider(createFixtureSubprovider());
|
||||
provider.start();
|
||||
|
||||
const payload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_getTransactionCount',
|
||||
params: ['0x0', 'latest'],
|
||||
id: 1,
|
||||
};
|
||||
const payload = { ...getTransactionCountPayload, params: ['0x0', 'latest'] };
|
||||
|
||||
const response = await promisify(provider.sendAsync, provider)(payload);
|
||||
expect(response.result).to.be.eq('0x01');
|
||||
expect(response.result).to.be.eq('0x00');
|
||||
const secondResponse = await promisify(provider.sendAsync, provider)(payload);
|
||||
expect(secondResponse.result).to.be.eq('0x99');
|
||||
});
|
||||
it('clears the cache on a Nonce Too Low Error', async () => {
|
||||
provider = new Web3ProviderEngine();
|
||||
let called = false;
|
||||
const nonceTrackerSubprovider = new NonceTrackerSubprovider();
|
||||
provider.addProvider(nonceTrackerSubprovider);
|
||||
provider.addProvider(createFixtureSubprovider());
|
||||
provider.addProvider(
|
||||
new FixtureSubprovider({
|
||||
eth_getBlockByNumber: '0x01',
|
||||
eth_getTransactionCount: (data: any, next: any, end: any) => {
|
||||
if (called) {
|
||||
return end(null, '0x99');
|
||||
} else {
|
||||
called = true;
|
||||
end(null, '0x01');
|
||||
}
|
||||
},
|
||||
eth_sendRawTransaction: (data: any, next: any, end: any) => {
|
||||
end(new Error('Transaction nonce is too low'));
|
||||
},
|
||||
@@ -102,35 +95,19 @@ describe('NonceTrackerSubprovider', () => {
|
||||
provider.start();
|
||||
|
||||
const noncePayload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_getTransactionCount',
|
||||
...getTransactionCountPayload,
|
||||
params: ['0x1f36f546477cda21bf2296c50976f2740247906f', 'pending'],
|
||||
id: 1,
|
||||
};
|
||||
const txParams = [
|
||||
'0x',
|
||||
'0x09184e72a000',
|
||||
'0x2710',
|
||||
'0x0000000000000000000000000000000000000000',
|
||||
'0x',
|
||||
'0x7f7465737432000000000000000000000000000000000000000000000000000000600057',
|
||||
'0x1c',
|
||||
'0x5e1d3a76fbf824220eafc8c79ad578ad2b67d01b0c2425eb1f1347e8f50882ab',
|
||||
'0x5bd428537f05f9830e93792f90ea6a3e2d1ee84952dd96edbae9f658f831ab13',
|
||||
];
|
||||
|
||||
const transaction = new EthereumTx(txParams);
|
||||
const txPayload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_sendRawTransaction',
|
||||
...sendTransactionPayload,
|
||||
params: [transaction.serialize()],
|
||||
id: 1,
|
||||
};
|
||||
|
||||
const response = await promisify(provider.sendAsync, provider)(noncePayload);
|
||||
expect(response.result).to.be.eq('0x01');
|
||||
expect(response.result).to.be.eq('0x00');
|
||||
const secondResponse = await promisify(provider.sendAsync, provider)(noncePayload);
|
||||
expect(secondResponse.result).to.be.eq('0x01');
|
||||
expect(secondResponse.result).to.be.eq('0x00');
|
||||
try {
|
||||
await promisify(provider.sendAsync, provider)(txPayload);
|
||||
} catch (err) {
|
||||
@@ -138,22 +115,13 @@ describe('NonceTrackerSubprovider', () => {
|
||||
expect(thirdResponse.result).to.be.eq('0x99');
|
||||
}
|
||||
});
|
||||
it('increments the used nonce', async () => {
|
||||
it('increments the used nonce when a transaction successfully submits', async () => {
|
||||
provider = new Web3ProviderEngine();
|
||||
let called = false;
|
||||
const nonceTrackerSubprovider = new NonceTrackerSubprovider();
|
||||
provider.addProvider(nonceTrackerSubprovider);
|
||||
provider.addProvider(createFixtureSubprovider());
|
||||
provider.addProvider(
|
||||
new FixtureSubprovider({
|
||||
eth_getBlockByNumber: '0x01',
|
||||
eth_getTransactionCount: (data: any, next: any, end: any) => {
|
||||
if (called) {
|
||||
return end(null, '0x99');
|
||||
} else {
|
||||
called = true;
|
||||
end(null, '0x00');
|
||||
}
|
||||
},
|
||||
eth_sendRawTransaction: (data: any, next: any, end: any) => {
|
||||
end(null);
|
||||
},
|
||||
@@ -162,29 +130,13 @@ describe('NonceTrackerSubprovider', () => {
|
||||
provider.start();
|
||||
|
||||
const noncePayload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_getTransactionCount',
|
||||
...getTransactionCountPayload,
|
||||
params: ['0x1f36f546477cda21bf2296c50976f2740247906f', 'pending'],
|
||||
id: 1,
|
||||
};
|
||||
const txParams = [
|
||||
'0x',
|
||||
'0x09184e72a000',
|
||||
'0x2710',
|
||||
'0x0000000000000000000000000000000000000000',
|
||||
'0x',
|
||||
'0x7f7465737432000000000000000000000000000000000000000000000000000000600057',
|
||||
'0x1c',
|
||||
'0x5e1d3a76fbf824220eafc8c79ad578ad2b67d01b0c2425eb1f1347e8f50882ab',
|
||||
'0x5bd428537f05f9830e93792f90ea6a3e2d1ee84952dd96edbae9f658f831ab13',
|
||||
];
|
||||
|
||||
const transaction = new EthereumTx(txParams);
|
||||
const txPayload = {
|
||||
jsonrpc: '2.0',
|
||||
method: 'eth_sendRawTransaction',
|
||||
...sendTransactionPayload,
|
||||
params: [transaction.serialize()],
|
||||
id: 1,
|
||||
};
|
||||
|
||||
const response = await promisify(provider.sendAsync, provider)(noncePayload);
|
||||
|
Reference in New Issue
Block a user