aboutsummaryrefslogtreecommitdiffstats
path: root/test/wamail-mime.test.js
blob: a2ff7cb89c1900f2cc0dd2523419113a80b95d57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import assert from 'node:assert/strict';
import fs from 'node:fs';
import test from 'node:test';
import { addresses, decodeWords, parseMessage, unflow } from '../src/wamail/mime.js';

const fixture = (name) => fs.readFileSync(new URL(`./fixtures/${name}`, import.meta.url));

test('neomutt: 8-bit flowed text + QP attachment with an RFC 2231 filename', () => {
    const m = parseMessage(fixture('neomutt-adjunto.eml'));
    assert.equal(m.header('Subject'), 'asunto ñ');
    assert.deepEqual(addresses(m.header('To')), ['5491122334455@c.us']);
    assert.match(m.text, /^hola, ¿qué tal\? ñandú 🎉\n\n> línea citada\n-- \nfirma/);
    assert.equal(m.attachments.length, 1);
    assert.equal(m.attachments[0].filename, 'informe año.pdf');
    assert.equal(m.attachments[0].contentType, 'application/pdf');
    assert.equal(m.attachments[0].data.toString(), 'PDF-FAKE-'.repeat(50));
});

test('neomutt: reply with In-Reply-To and several recipients', () => {
    const m = parseMessage(fixture('neomutt-respuesta.eml'));
    assert.equal(m.header('In-Reply-To'), '<3EB0AAA1@wa>');
    assert.deepEqual(addresses(m.header('To')), ['5491122334455@c.us', '120363000000@g.us']);
    assert.equal(m.attachments.length, 0);
    assert.match(m.text, /la otra vez \nOn Wed, Juan wrote:\n> ¿venís mañana\?/); // "vez " + empty line = soft break
});

test('encoded-words, flowed and addresses', () => {
    assert.equal(decodeWords('=?UTF-8?B?SnVhbiBQw6lyZXo=?= <x@c.us>'), 'Juan Pérez <x@c.us>');
    assert.equal(decodeWords('=?utf-8?Q?a=C3=B1o?= =?utf-8?Q?_nuevo?='), 'año nuevo');
    assert.equal(unflow('una línea \nlarga\n-- \nfirma'), 'una línea larga\n-- \nfirma');
    assert.deepEqual(addresses('"Pérez, Juan" <1@c.us>, 2@g.us'), ['1@c.us', '2@g.us']);
});

test('multipart with base64 and a latin1 charset', () => {
    const raw = [
        'To: 1@c.us', 'Subject: =?iso-8859-1?Q?caf=E9?=', 'MIME-Version: 1.0',
        'Content-Type: multipart/mixed; boundary="b1"', '',
        '--b1', 'Content-Type: multipart/alternative; boundary="b2"', '',
        '--b2', 'Content-Type: text/plain; charset=iso-8859-1', 'Content-Transfer-Encoding: quoted-printable', '', 'caf=E9 con leche', '--b2--',
        '--b1', 'Content-Type: image/png; name="foto.png"', 'Content-Transfer-Encoding: base64', '', Buffer.from('PNG!').toString('base64'),
        '--b1--', '',
    ].join('\r\n');
    const m = parseMessage(raw);
    assert.equal(m.header('subject'), 'café');
    assert.equal(m.text, 'café con leche');
    assert.equal(m.attachments[0].filename, 'foto.png');
    assert.equal(m.attachments[0].data.toString(), 'PNG!');
});