Files
ghostwire/tests/history_read.cjs
T

41 lines
1.8 KiB
JavaScript
Raw Normal View History

const assert = require('node:assert/strict');
const vm = require('node:vm');
const fs = require('node:fs');
const probe = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
const rows = [90, 20, 60, 10, 70, 30, 40, 0].map((t, i) => ({id: String(i), t}));
const reads = [];
let closed = false;
const store = {openCursor() {
const request = {}; let index = 0;
function advance() {queueMicrotask(() => {
const row = rows[index++];
request.result = row ? {primaryKey: row.id, value: row, continue: advance} : null;
request.onsuccess();
});}
advance(); return request;
}};
const db = {transaction(name, mode) {
assert.equal(name, 'message'); assert.equal(mode, 'readonly');
return {objectStore: () => store};
}, close: () => {closed = true;}};
const modules = {
WAWebSchemaMessage: {getMessageTable: () => ({get: async key => {
reads.push(key); return rows.find(r => r.id === key);
}})},
WAWebDBMessageSerialization: {messageFromDbRow: row => ({...row, type: 'chat', body: 'fixture-' + row.id})},
};
(async () => {
const result = await vm.runInNewContext(probe, {
location: {origin: 'https://web.whatsapp.com'}, require: n => modules[n],
indexedDB: {databases: async () => [{name: 'model-storage'}], open: () => {
const request = {}; queueMicrotask(() => {request.result = db; request.onsuccess();}); return request;
}},
});
assert.deepEqual(Array.from(result.messages, m => m.timestamp), [10, 20, 30, 40, 60]);
assert.equal(result.scanned, 8);
assert.equal(reads.length, 5);
assert.ok(result.messages.every(m => m.body.startsWith('fixture-')));
assert.equal(result.cdp, false);
assert.equal(closed, true);
console.log('PASS: oldest selection, bounded app decryption, decoded text, readonly transaction, cleanup');
})().catch(error => {console.error(error); process.exitCode = 1;});