handleRpc answers both methods itself before it reaches its proxy branch, so the two list entries were never used and the list named two methods that are never sent to the RPC endpoint. No other entry is answered earlier. PROXY_METHODS is now exported from the background script so that tests/proxyMethods.test.js can send every listed method from a page and fail on any that does not reach the RPC endpoint. Model: opus-5-5
90 lines
2.7 KiB
JavaScript
90 lines
2.7 KiB
JavaScript
// Every method in PROXY_METHODS is sent to the RPC node.
|
|
//
|
|
// handleRpc answers some methods itself before it reaches its proxy branch. A
|
|
// method listed in PROXY_METHODS but answered earlier never reaches the node,
|
|
// so the list would name a method that is not proxied
|
|
// (https://git.eeqj.de/sneak/AutistMask/issues/326). Each method is sent from
|
|
// a page here and must come back with what the node answered.
|
|
|
|
const { makeStorageStub } = require("./support/storageStub");
|
|
|
|
async function settle() {
|
|
for (let i = 0; i < 50; i++) await Promise.resolve();
|
|
}
|
|
|
|
afterEach(() => {
|
|
delete global.chrome;
|
|
delete global.fetch;
|
|
});
|
|
|
|
test("every method in PROXY_METHODS reaches the RPC node", async () => {
|
|
jest.resetModules();
|
|
|
|
jest.doMock("../src/shared/balances", () => ({
|
|
getProvider: () => ({}),
|
|
refreshBalances: jest.fn(async () => {}),
|
|
}));
|
|
jest.doMock("../src/shared/phishingDomains", () => ({
|
|
isPhishingDomain: () => false,
|
|
}));
|
|
jest.doMock("../src/shared/alarms", () => ({
|
|
BALANCE_REFRESH_ALARM: "balance",
|
|
BALANCE_REFRESH_PERIOD_MINUTES: 1,
|
|
ensureRecurringAlarms: jest.fn(async () => {}),
|
|
registerAlarmHandlers: jest.fn(),
|
|
}));
|
|
|
|
// The node answers each method with a value naming that method.
|
|
global.fetch = jest.fn(async (url, opts) => ({
|
|
status: 200,
|
|
json: async () => ({
|
|
jsonrpc: "2.0",
|
|
id: 1,
|
|
result: "node answered " + JSON.parse(opts.body).method,
|
|
}),
|
|
}));
|
|
|
|
let messageListener = null;
|
|
global.chrome = {
|
|
storage: makeStorageStub({
|
|
autistmask: {
|
|
networkId: "mainnet",
|
|
wallets: [],
|
|
allowedSites: {},
|
|
deniedSites: {},
|
|
},
|
|
}),
|
|
runtime: {
|
|
getURL: (path) => "chrome-extension://autistmask/" + path,
|
|
onMessage: {
|
|
addListener: (fn) => {
|
|
messageListener = fn;
|
|
},
|
|
},
|
|
onConnect: { addListener: () => {} },
|
|
lastError: null,
|
|
},
|
|
windows: { onRemoved: { addListener: () => {} } },
|
|
action: { setPopup: () => {} },
|
|
};
|
|
|
|
const { PROXY_METHODS } = require("../src/background/index");
|
|
|
|
const answers = {};
|
|
const expected = {};
|
|
for (const method of PROXY_METHODS) {
|
|
messageListener(
|
|
{ type: "AUTISTMASK_RPC", method, params: [] },
|
|
{ origin: "https://dapp.example" },
|
|
(r) => {
|
|
answers[method] = r;
|
|
},
|
|
);
|
|
await settle();
|
|
expected[method] = { result: "node answered " + method };
|
|
}
|
|
|
|
expect(PROXY_METHODS.length).toBeGreaterThan(0);
|
|
expect(answers).toEqual(expected);
|
|
});
|