imapflow
Version:
IMAP Client for Node
154 lines (121 loc) • 5.22 kB
JavaScript
;
const { parseCopyUid } = require('../lib/commands/copyuid-parser');
/**
* Builds a minimal IMAP response object with a COPYUID-style section.
*
* @param {Array} section - Array of section elements with value properties
* @returns {Object} Response object suitable for parseCopyUid
*/
function makeResponse(section) {
return { attributes: [{ section }] };
}
// ============================================
// Single UID pair
// ============================================
module.exports['CopyUID Parser: single UID pair sets uidValidity and uidMap entry'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'COPYUID' }, { value: '12345' }, { value: '1' }, { value: '100' }]), map);
test.equal(map.uidValidity, BigInt('12345'));
test.ok(map.uidMap instanceof Map);
test.equal(map.uidMap.get(1), 100);
test.equal(map.uidMap.size, 1);
test.done();
};
// ============================================
// UID ranges
// ============================================
module.exports['CopyUID Parser: contiguous UID range maps all source UIDs to destinations'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'COPYUID' }, { value: '99' }, { value: '1:3' }, { value: '10:12' }]), map);
test.equal(map.uidValidity, BigInt('99'));
test.ok(map.uidMap instanceof Map);
test.equal(map.uidMap.size, 3);
test.equal(map.uidMap.get(1), 10);
test.equal(map.uidMap.get(2), 11);
test.equal(map.uidMap.get(3), 12);
test.done();
};
// ============================================
// Comma-separated UIDs
// ============================================
module.exports['CopyUID Parser: comma-separated UIDs map each source to its destination'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'COPYUID' }, { value: '200' }, { value: '1,5,9' }, { value: '100,105,109' }]), map);
test.equal(map.uidMap.size, 3);
test.equal(map.uidMap.get(1), 100);
test.equal(map.uidMap.get(5), 105);
test.equal(map.uidMap.get(9), 109);
test.done();
};
// ============================================
// Non-COPYUID response code
// ============================================
module.exports['CopyUID Parser: non-COPYUID response code leaves map unchanged'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'APPENDUID' }, { value: '12345' }, { value: '1' }, { value: '100' }]), map);
test.equal(map.uidValidity, undefined);
test.equal(map.uidMap, undefined);
test.done();
};
// ============================================
// Missing / malformed input
// ============================================
module.exports['CopyUID Parser: missing attributes leaves map unchanged'] = test => {
let map = {};
parseCopyUid({}, map);
test.equal(map.uidValidity, undefined);
test.equal(map.uidMap, undefined);
test.done();
};
module.exports['CopyUID Parser: empty attributes array leaves map unchanged'] = test => {
let map = {};
parseCopyUid({ attributes: [] }, map);
test.equal(map.uidValidity, undefined);
test.equal(map.uidMap, undefined);
test.done();
};
module.exports['CopyUID Parser: null section leaves map unchanged'] = test => {
let map = {};
parseCopyUid({ attributes: [{ section: null }] }, map);
test.equal(map.uidValidity, undefined);
test.equal(map.uidMap, undefined);
test.done();
};
// ============================================
// Non-numeric uidValidity
// ============================================
module.exports['CopyUID Parser: non-numeric uidValidity skips uidValidity but still builds uidMap'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'COPYUID' }, { value: 'abc' }, { value: '1' }, { value: '100' }]), map);
test.equal(map.uidValidity, undefined);
test.ok(map.uidMap instanceof Map);
test.equal(map.uidMap.get(1), 100);
test.done();
};
// ============================================
// Mismatched source/destination lengths
// ============================================
module.exports['CopyUID Parser: mismatched source and destination lengths sets uidValidity but skips uidMap'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'COPYUID' }, { value: '12345' }, { value: '1:3' }, { value: '10' }]), map);
test.equal(map.uidValidity, BigInt('12345'));
test.equal(map.uidMap, undefined);
test.done();
};
// ============================================
// Large uidValidity
// ============================================
module.exports['CopyUID Parser: large uidValidity is stored as BigInt'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'COPYUID' }, { value: '999999999999' }, { value: '1' }, { value: '100' }]), map);
test.equal(map.uidValidity, BigInt('999999999999'));
test.done();
};
module.exports['CopyUID Parser: uidValidity zero is stored as BigInt(0)'] = test => {
let map = {};
parseCopyUid(makeResponse([{ value: 'COPYUID' }, { value: '0' }, { value: '1' }, { value: '100' }]), map);
test.strictEqual(map.uidValidity, BigInt(0));
test.ok(map.uidMap instanceof Map);
test.equal(map.uidMap.get(1), 100);
test.done();
};