mirror of
https://github.com/n8n-io/n8n.git
synced 2025-01-19 00:20:48 -08:00
test(Gmail Node): Add test coverage (no-changelog) (#12278)
This commit is contained in:
parent
6ba91b5e1e
commit
5c445314f8
|
@ -1,3 +1,6 @@
|
||||||
|
// Avoid tests failing because of difference between local and GitHub actions timezone
|
||||||
|
process.env.TZ = 'UTC';
|
||||||
|
|
||||||
/** @type {import('jest').Config} */
|
/** @type {import('jest').Config} */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
...require('../../jest.config'),
|
...require('../../jest.config'),
|
||||||
|
|
|
@ -0,0 +1,396 @@
|
||||||
|
/* eslint-disable n8n-nodes-base/node-param-display-name-miscased */
|
||||||
|
import { mock, mockDeep } from 'jest-mock-extended';
|
||||||
|
import { jsonParse, type ILoadOptionsFunctions, type INode } from 'n8n-workflow';
|
||||||
|
import nock from 'nock';
|
||||||
|
|
||||||
|
import { testWorkflows } from '@test/nodes/Helpers';
|
||||||
|
|
||||||
|
import labels from './fixtures/labels.json';
|
||||||
|
import messages from './fixtures/messages.json';
|
||||||
|
import { getGmailAliases, getLabels, getThreadMessages } from '../../v2/loadOptions';
|
||||||
|
|
||||||
|
describe('Test Gmail Node v2', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
jest
|
||||||
|
.useFakeTimers({ doNotFake: ['setImmediate', 'nextTick'] })
|
||||||
|
.setSystemTime(new Date('2024-12-16 12:34:56.789Z'));
|
||||||
|
|
||||||
|
nock.disableNetConnect();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
nock.restore();
|
||||||
|
jest.resetAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Messages', () => {
|
||||||
|
const gmailNock = nock('https://www.googleapis.com/gmail');
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
gmailNock.get('/v1/users/me/messages').query({ maxResults: 2 }).reply(200, {
|
||||||
|
messages,
|
||||||
|
});
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages')
|
||||||
|
.query({
|
||||||
|
includeSpamTrash: 'true',
|
||||||
|
labelIds: 'CHAT',
|
||||||
|
q: 'test from:Test Sender after:1734393600 before:1735171200',
|
||||||
|
readStatus: 'both',
|
||||||
|
dataPropertyAttachmentsPrefixName: 'attachment_',
|
||||||
|
downloadAttachments: 'true',
|
||||||
|
maxResults: '2',
|
||||||
|
})
|
||||||
|
.reply(200, { messages });
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/a1b2c3d4e5f6g7h8')
|
||||||
|
.query({
|
||||||
|
maxResults: '2',
|
||||||
|
format: 'metadata',
|
||||||
|
metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject'],
|
||||||
|
})
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/a1b2c3d4e5f6g7h8')
|
||||||
|
.query({
|
||||||
|
includeSpamTrash: 'true',
|
||||||
|
labelIds: 'CHAT',
|
||||||
|
q: 'test from:Test Sender after:1734393600 before:1735171200',
|
||||||
|
readStatus: 'both',
|
||||||
|
dataPropertyAttachmentsPrefixName: 'attachment_',
|
||||||
|
downloadAttachments: 'true',
|
||||||
|
maxResults: '2',
|
||||||
|
format: 'raw',
|
||||||
|
})
|
||||||
|
.reply(200, {
|
||||||
|
...messages[0],
|
||||||
|
raw: 'TUlNRS1WZXJzaW9uOiAxLjANCkRhdGU6IEZyaSwgMTMgRGVjIDIwMjQgMTE6MTU6MDEgKzAxMDANCk1lc3NhZ2UtSUQ6IDxDQUVHQVByb3d1ZEduS1h4cXJoTWpPdXhhbVRoN3lBcmp3UDdPRDlVQnEtSnBrYjBYOXdAbWFpbC5nbWFpbC5jb20-DQpTdWJqZWN0OiBUZXN0IGRyYWZ0DQpGcm9tOiBub2RlIHFhIDxub2RlOHFhQGdtYWlsLmNvbT4NClRvOiB0ZXN0QGdtYWlsLmNvbQ0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSIwMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyIg0KDQotLTAwMDAwMDAwMDAwMDlkNThiNjA2MjkyNDFhMjINCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiDQoNCmRyYWZ0IGJvZHkNCg0KLS0wMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iVVRGLTgiDQoNCjxkaXYgZGlyPSJsdHIiPmRyYWZ0IGJvZHk8YnI-PC9kaXY-DQoNCi0tMDAwMDAwMDAwMDAwOWQ1OGI2MDYyOTI0MWEyMi0t',
|
||||||
|
});
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/z9y8x7w6v5u4t3s2')
|
||||||
|
.query({
|
||||||
|
includeSpamTrash: 'true',
|
||||||
|
labelIds: 'CHAT',
|
||||||
|
q: 'test from:Test Sender after:1734393600 before:1735171200',
|
||||||
|
readStatus: 'both',
|
||||||
|
dataPropertyAttachmentsPrefixName: 'attachment_',
|
||||||
|
downloadAttachments: 'true',
|
||||||
|
maxResults: '2',
|
||||||
|
format: 'raw',
|
||||||
|
})
|
||||||
|
.reply(200, {
|
||||||
|
...messages[1],
|
||||||
|
raw: 'TUlNRS1WZXJzaW9uOiAxLjANCkRhdGU6IEZyaSwgMTMgRGVjIDIwMjQgMTE6MTU6MDEgKzAxMDANCk1lc3NhZ2UtSUQ6IDxDQUVHQVByb3d1ZEduS1h4cXJoTWpPdXhhbVRoN3lBcmp3UDdPRDlVQnEtSnBrYjBYOXdAbWFpbC5nbWFpbC5jb20-DQpTdWJqZWN0OiBUZXN0IGRyYWZ0DQpGcm9tOiBub2RlIHFhIDxub2RlOHFhQGdtYWlsLmNvbT4NClRvOiB0ZXN0QGdtYWlsLmNvbQ0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSIwMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyIg0KDQotLTAwMDAwMDAwMDAwMDlkNThiNjA2MjkyNDFhMjINCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiDQoNCmRyYWZ0IGJvZHkNCg0KLS0wMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iVVRGLTgiDQoNCjxkaXYgZGlyPSJsdHIiPmRyYWZ0IGJvZHk8YnI-PC9kaXY-DQoNCi0tMDAwMDAwMDAwMDAwOWQ1OGI2MDYyOTI0MWEyMi0t',
|
||||||
|
});
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/z9y8x7w6v5u4t3s2')
|
||||||
|
.query({
|
||||||
|
maxResults: '2',
|
||||||
|
format: 'metadata',
|
||||||
|
metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject'],
|
||||||
|
})
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.get('/v1/users/me/labels').reply(200, {
|
||||||
|
labels,
|
||||||
|
});
|
||||||
|
gmailNock.get('/v1/users/me/profile').times(2).reply(200, { emailAddress: 'test@n8n.io' });
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/messages/send')
|
||||||
|
.query({ format: 'metadata' })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.post('/v1/users/me/messages/send').reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/messages/send')
|
||||||
|
.query({ userId: 'me', uploadType: 'media' })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/messages/test/modify', (body) => 'addLabelIds' in body)
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/messages/test/modify', (body) => 'removeLabelIds' in body)
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.delete('/v1/users/me/messages/test').reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/test')
|
||||||
|
.query({
|
||||||
|
format: 'metadata',
|
||||||
|
metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject'],
|
||||||
|
})
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.get('/v1/users/me/labels').reply(200, { labels });
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/test')
|
||||||
|
.query({ format: 'raw' })
|
||||||
|
.reply(200, { raw: 'test email content' });
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/messages/test/modify', { removeLabelIds: ['UNREAD'] })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/messages/test/modify', { addLabelIds: ['UNREAD'] })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/test')
|
||||||
|
.query({
|
||||||
|
format: 'metadata',
|
||||||
|
})
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
testWorkflows(['nodes/Google/Gmail/test/v2/messages.workflow.json']);
|
||||||
|
|
||||||
|
it('should make the correct network calls', () => {
|
||||||
|
gmailNock.done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Labels', () => {
|
||||||
|
const gmailNock = nock('https://www.googleapis.com/gmail');
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/labels', {
|
||||||
|
labelListVisibility: 'labelShow',
|
||||||
|
messageListVisibility: 'show',
|
||||||
|
name: 'Test Label Name',
|
||||||
|
})
|
||||||
|
.reply(200, labels[0]);
|
||||||
|
gmailNock.delete('/v1/users/me/labels/test-label-id').reply(200, labels[0]);
|
||||||
|
gmailNock.get('/v1/users/me/labels/test-label-id').reply(200, labels[0]);
|
||||||
|
gmailNock.get('/v1/users/me/labels').reply(200, {
|
||||||
|
labels,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
testWorkflows(['nodes/Google/Gmail/test/v2/labels.workflow.json']);
|
||||||
|
|
||||||
|
it('should make the correct network calls', () => {
|
||||||
|
gmailNock.done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Drafts', () => {
|
||||||
|
const gmailNock = nock('https://www.googleapis.com/gmail');
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
gmailNock
|
||||||
|
.filteringRequestBody((body) => {
|
||||||
|
try {
|
||||||
|
const parsedBody = jsonParse<{ message: { raw: string; threadId: string } }>(body);
|
||||||
|
const mail = Buffer.from(parsedBody.message.raw, 'base64').toString('utf-8');
|
||||||
|
|
||||||
|
// Remove dynamic fields from mail
|
||||||
|
parsedBody.message.raw = Buffer.from(
|
||||||
|
mail
|
||||||
|
.replace(/boundary=".*"/g, 'boundary="--test-boundary"')
|
||||||
|
.replace(/----.*/g, '----test-boundary')
|
||||||
|
.replace(/Message-ID:.*/g, 'Message-ID: test-message-id'),
|
||||||
|
'utf-8',
|
||||||
|
).toString('base64');
|
||||||
|
|
||||||
|
return JSON.stringify(parsedBody);
|
||||||
|
} catch (error) {
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.post('/v1/users/me/drafts', {
|
||||||
|
message: {
|
||||||
|
raw: 'Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLXRlc3QtYm91bmRhcnkiDQpGcm9tOiB0ZXN0LWFsaWFzQG44bi5pbw0KVG86IHRlc3QtdG9AbjhuLmlvDQpDYzogdGVzdC1jY0BuOG4uaW8NCkJjYzogdGVzdC1iY2NAbjhuLmlvDQpSZXBseS1UbzogdGVzdC1yZXBseUBuOG4uaW8NClN1YmplY3Q6IFRlc3QgRHJhZnQgU3ViamVjdA0KTWVzc2FnZS1JRDogdGVzdC1tZXNzYWdlLWlkDQpEYXRlOiBNb24sIDE2IERlYyAyMDI0IDEyOjM0OjU2ICswMDAwDQpNSU1FLVZlcnNpb246IDEuMA0KDQotLS0tdGVzdC1ib3VuZGFyeQ0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04DQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQoNClRlc3QgRHJhZnQgTWVzc2FnZQ0KLS0tLXRlc3QtYm91bmRhcnkNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjsgbmFtZT1maWxlLmpzb24NCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NA0KQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZmlsZS5qc29uDQoNClczc2lZbWx1WVhKNUlqcDBjblZsZlYwPQ0KLS0tLXRlc3QtYm91bmRhcnkNCg==',
|
||||||
|
threadId: 'test-thread-id',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.query({ userId: 'me', uploadType: 'media' })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.delete('/v1/users/me/drafts/test-draft-id').reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/drafts/test-draft-id')
|
||||||
|
.query({ format: 'raw' })
|
||||||
|
.reply(200, {
|
||||||
|
message: {
|
||||||
|
...messages[0],
|
||||||
|
raw: 'TUlNRS1WZXJzaW9uOiAxLjANCkRhdGU6IEZyaSwgMTMgRGVjIDIwMjQgMTE6MTU6MDEgKzAxMDANCk1lc3NhZ2UtSUQ6IDxDQUVHQVByb3d1ZEduS1h4cXJoTWpPdXhhbVRoN3lBcmp3UDdPRDlVQnEtSnBrYjBYOXdAbWFpbC5nbWFpbC5jb20-DQpTdWJqZWN0OiBUZXN0IGRyYWZ0DQpGcm9tOiBub2RlIHFhIDxub2RlOHFhQGdtYWlsLmNvbT4NClRvOiB0ZXN0QGdtYWlsLmNvbQ0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSIwMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyIg0KDQotLTAwMDAwMDAwMDAwMDlkNThiNjA2MjkyNDFhMjINCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiDQoNCmRyYWZ0IGJvZHkNCg0KLS0wMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iVVRGLTgiDQoNCjxkaXYgZGlyPSJsdHIiPmRyYWZ0IGJvZHk8YnI-PC9kaXY-DQoNCi0tMDAwMDAwMDAwMDAwOWQ1OGI2MDYyOTI0MWEyMi0t',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/drafts')
|
||||||
|
.query({
|
||||||
|
dataPropertyAttachmentsPrefixName: 'attachment_',
|
||||||
|
downloadAttachments: true,
|
||||||
|
includeSpamTrash: true,
|
||||||
|
maxResults: 100,
|
||||||
|
})
|
||||||
|
.reply(200, { drafts: messages });
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/drafts/a1b2c3d4e5f6g7h8')
|
||||||
|
.query({
|
||||||
|
dataPropertyAttachmentsPrefixName: 'attachment_',
|
||||||
|
downloadAttachments: true,
|
||||||
|
includeSpamTrash: true,
|
||||||
|
maxResults: 100,
|
||||||
|
format: 'raw',
|
||||||
|
})
|
||||||
|
.reply(200, {
|
||||||
|
message: {
|
||||||
|
...messages[0],
|
||||||
|
raw: 'TUlNRS1WZXJzaW9uOiAxLjANCkRhdGU6IEZyaSwgMTMgRGVjIDIwMjQgMTE6MTU6MDEgKzAxMDANCk1lc3NhZ2UtSUQ6IDxDQUVHQVByb3d1ZEduS1h4cXJoTWpPdXhhbVRoN3lBcmp3UDdPRDlVQnEtSnBrYjBYOXdAbWFpbC5nbWFpbC5jb20-DQpTdWJqZWN0OiBUZXN0IGRyYWZ0DQpGcm9tOiBub2RlIHFhIDxub2RlOHFhQGdtYWlsLmNvbT4NClRvOiB0ZXN0QGdtYWlsLmNvbQ0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSIwMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyIg0KDQotLTAwMDAwMDAwMDAwMDlkNThiNjA2MjkyNDFhMjINCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiDQoNCmRyYWZ0IGJvZHkNCg0KLS0wMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iVVRGLTgiDQoNCjxkaXYgZGlyPSJsdHIiPmRyYWZ0IGJvZHk8YnI-PC9kaXY-DQoNCi0tMDAwMDAwMDAwMDAwOWQ1OGI2MDYyOTI0MWEyMi0t',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/drafts/z9y8x7w6v5u4t3s2')
|
||||||
|
.query({
|
||||||
|
dataPropertyAttachmentsPrefixName: 'attachment_',
|
||||||
|
downloadAttachments: true,
|
||||||
|
includeSpamTrash: true,
|
||||||
|
maxResults: 100,
|
||||||
|
format: 'raw',
|
||||||
|
})
|
||||||
|
.reply(200, {
|
||||||
|
message: {
|
||||||
|
...messages[1],
|
||||||
|
raw: 'TUlNRS1WZXJzaW9uOiAxLjANCkRhdGU6IEZyaSwgMTMgRGVjIDIwMjQgMTE6MTU6MDEgKzAxMDANCk1lc3NhZ2UtSUQ6IDxDQUVHQVByb3d1ZEduS1h4cXJoTWpPdXhhbVRoN3lBcmp3UDdPRDlVQnEtSnBrYjBYOXdAbWFpbC5nbWFpbC5jb20-DQpTdWJqZWN0OiBUZXN0IGRyYWZ0DQpGcm9tOiBub2RlIHFhIDxub2RlOHFhQGdtYWlsLmNvbT4NClRvOiB0ZXN0QGdtYWlsLmNvbQ0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSIwMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyIg0KDQotLTAwMDAwMDAwMDAwMDlkNThiNjA2MjkyNDFhMjINCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiDQoNCmRyYWZ0IGJvZHkNCg0KLS0wMDAwMDAwMDAwMDA5ZDU4YjYwNjI5MjQxYTIyDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iVVRGLTgiDQoNCjxkaXYgZGlyPSJsdHIiPmRyYWZ0IGJvZHk8YnI-PC9kaXY-DQoNCi0tMDAwMDAwMDAwMDAwOWQ1OGI2MDYyOTI0MWEyMi0t',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
testWorkflows(['nodes/Google/Gmail/test/v2/drafts.workflow.json']);
|
||||||
|
|
||||||
|
it('should make the correct network calls', () => {
|
||||||
|
gmailNock.done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Threads', () => {
|
||||||
|
const gmailNock = nock('https://www.googleapis.com/gmail');
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
gmailNock.get('/v1/users/me/threads').query({ maxResults: 2 }).reply(200, {
|
||||||
|
threads: messages,
|
||||||
|
});
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/threads')
|
||||||
|
.query((query) => {
|
||||||
|
return (
|
||||||
|
query.includeSpamTrash === 'true' &&
|
||||||
|
query.labelIds === 'CHAT' &&
|
||||||
|
!!query.q &&
|
||||||
|
query.q.includes('has:attachment') &&
|
||||||
|
query.q.includes('before:') &&
|
||||||
|
query.q.includes('after:')
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.reply(200, { threads: messages });
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/threads/test-thread-id/modify', { addLabelIds: ['CHAT'] })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/threads/test-thread-id/modify', { removeLabelIds: ['CHAT'] })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.delete('/v1/users/me/threads/test-thread-id').reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/threads/test-thread-id')
|
||||||
|
.query({
|
||||||
|
format: 'metadata',
|
||||||
|
metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject'],
|
||||||
|
})
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.get('/v1/users/me/labels').times(2).reply(200, { labels });
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/threads/test-thread-id')
|
||||||
|
.query({ format: 'full' })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.post('/v1/users/me/threads/test-thread-id/trash').reply(200, messages[0]);
|
||||||
|
gmailNock.post('/v1/users/me/threads/test-thread-id/untrash').reply(200, messages[0]);
|
||||||
|
gmailNock
|
||||||
|
.get('/v1/users/me/messages/test%20snippet')
|
||||||
|
.query({
|
||||||
|
userId: 'me',
|
||||||
|
uploadType: 'media',
|
||||||
|
format: 'metadata',
|
||||||
|
})
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
gmailNock.get('/v1/users/me/profile').reply(200, { emailAddress: 'test@n8n.io' });
|
||||||
|
gmailNock
|
||||||
|
.post('/v1/users/me/messages/send')
|
||||||
|
.query({ userId: 'me', uploadType: 'media', format: 'metadata' })
|
||||||
|
.reply(200, messages[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
testWorkflows(['nodes/Google/Gmail/test/v2/threads.workflow.json']);
|
||||||
|
|
||||||
|
it('should make the correct network calls', () => {
|
||||||
|
gmailNock.done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('loadOptions', () => {
|
||||||
|
describe('getLabels', () => {
|
||||||
|
it('should return a list of Gmail labels', async () => {
|
||||||
|
const loadOptionsFunctions = mockDeep<ILoadOptionsFunctions>({
|
||||||
|
getNode: jest.fn(() => mock<INode>()),
|
||||||
|
helpers: mock<ILoadOptionsFunctions['helpers']>({
|
||||||
|
requestWithAuthentication: jest
|
||||||
|
.fn()
|
||||||
|
// 2 pages of labels
|
||||||
|
.mockImplementationOnce(async () => ({ labels, nextPageToken: 'nextPageToken' }))
|
||||||
|
.mockImplementationOnce(async () => ({ labels })),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(await getLabels.call(loadOptionsFunctions)).toEqual([
|
||||||
|
{ name: 'CHAT', value: 'CHAT' },
|
||||||
|
{ name: 'CHAT', value: 'CHAT' },
|
||||||
|
{ name: 'SENT', value: 'SENT' },
|
||||||
|
{ name: 'SENT', value: 'SENT' },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getThreadMessages', () => {
|
||||||
|
it('should return a list of Gmail thread messages', async () => {
|
||||||
|
const loadOptionsFunctions = mockDeep<ILoadOptionsFunctions>({
|
||||||
|
getNode: jest.fn(() => mock<INode>()),
|
||||||
|
helpers: mock<ILoadOptionsFunctions['helpers']>({
|
||||||
|
requestWithAuthentication: jest.fn(async () => ({ messages })),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(await getThreadMessages.call(loadOptionsFunctions)).toEqual([
|
||||||
|
{
|
||||||
|
name: "Don't miss our exclusive holiday discounts on all items! Act now before the sale ends.",
|
||||||
|
value: 'a1b2c3d4e5f6g7h8',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Your friend John just shared a new photo with you! Check it out now.',
|
||||||
|
value: 'z9y8x7w6v5u4t3s2',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getGmailAliases', () => {
|
||||||
|
it('should return a list of Gmail aliases', async () => {
|
||||||
|
const loadOptionsFunctions = mockDeep<ILoadOptionsFunctions>({
|
||||||
|
getNode: jest.fn(() => mock<INode>()),
|
||||||
|
helpers: mock<ILoadOptionsFunctions['helpers']>({
|
||||||
|
requestWithAuthentication: jest.fn(async () => ({
|
||||||
|
sendAs: [
|
||||||
|
{ isDefault: false, sendAsEmail: 'alias1@n8n.io' },
|
||||||
|
{ isDefault: true, sendAsEmail: 'alias2@n8n.io' },
|
||||||
|
],
|
||||||
|
})),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(await getGmailAliases.call(loadOptionsFunctions)).toEqual([
|
||||||
|
{
|
||||||
|
name: 'alias1@n8n.io',
|
||||||
|
value: 'alias1@n8n.io',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'alias2@n8n.io (Default)',
|
||||||
|
value: 'alias2@n8n.io',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,386 @@
|
||||||
|
{
|
||||||
|
"name": "My workflow 130",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"parameters": {},
|
||||||
|
"type": "n8n-nodes-base.manualTrigger",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [-60, 100],
|
||||||
|
"id": "636b40bc-2c98-4b9a-8ce2-9d1322294518",
|
||||||
|
"name": "When clicking ‘Test workflow’"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "draft",
|
||||||
|
"operation": "get",
|
||||||
|
"messageId": "test-draft-id",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [440, 200],
|
||||||
|
"id": "8802fdb5-2741-407b-82a4-ccedc4055076",
|
||||||
|
"name": "Gmail - Drafts - Get",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "draft",
|
||||||
|
"operation": "delete",
|
||||||
|
"messageId": "test-draft-id"
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [440, 20],
|
||||||
|
"id": "ed979c3a-b2ea-413e-be63-0392cc1714a5",
|
||||||
|
"name": "Gmail - Drafts - Delete",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "draft",
|
||||||
|
"subject": "Test Draft Subject",
|
||||||
|
"message": "Test Draft Message",
|
||||||
|
"options": {
|
||||||
|
"attachmentsUi": {
|
||||||
|
"attachmentsBinary": [
|
||||||
|
{
|
||||||
|
"property": "data"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"bccList": "test-bcc@n8n.io",
|
||||||
|
"ccList": "test-cc@n8n.io",
|
||||||
|
"fromAlias": "=test-alias@n8n.io",
|
||||||
|
"replyTo": "test-reply@n8n.io",
|
||||||
|
"threadId": "test-thread-id",
|
||||||
|
"sendTo": "test-to@n8n.io"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [840, -180],
|
||||||
|
"id": "45758452-3b5b-478d-aece-001e117ce69d",
|
||||||
|
"name": "Gmail - Drafts - Create",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "draft",
|
||||||
|
"operation": "getAll",
|
||||||
|
"returnAll": true,
|
||||||
|
"options": {
|
||||||
|
"dataPropertyAttachmentsPrefixName": "attachment_",
|
||||||
|
"downloadAttachments": true,
|
||||||
|
"includeSpamTrash": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [440, 400],
|
||||||
|
"id": "bae81586-7641-4fdc-81a4-0006b289bf9d",
|
||||||
|
"name": "Gmail - Drafts - Get Many",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"assignments": {
|
||||||
|
"assignments": [
|
||||||
|
{
|
||||||
|
"id": "491590a8-27a6-4d14-b342-493947775d16",
|
||||||
|
"name": "binary",
|
||||||
|
"value": true,
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.set",
|
||||||
|
"typeVersion": 3.4,
|
||||||
|
"position": [420, -180],
|
||||||
|
"id": "d630c018-1d7b-4779-a280-9f4a21c6a764",
|
||||||
|
"name": "Edit Fields"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"operation": "toJson",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.convertToFile",
|
||||||
|
"typeVersion": 1.1,
|
||||||
|
"position": [640, -180],
|
||||||
|
"id": "fc3bdb76-c278-44f6-9aac-153b79c8177b",
|
||||||
|
"name": "Convert to File"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pinData": {
|
||||||
|
"Gmail - Drafts - Create": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": "a1b2c3d4e5f6g7h8",
|
||||||
|
"threadId": "a1b2c3d4e5f6g7h8",
|
||||||
|
"labelIds": ["UNREAD", "CATEGORY_PROMOTIONS", "INBOX"],
|
||||||
|
"snippet": "Don't miss our exclusive holiday discounts on all items! Act now before the sale ends.",
|
||||||
|
"payload": {
|
||||||
|
"partId": "",
|
||||||
|
"mimeType": "multipart/alternative",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{ "name": "Delivered-To", "value": "exampleuser@gmail.com" },
|
||||||
|
{
|
||||||
|
"name": "Received",
|
||||||
|
"value": "by 2001:db8::abcd with SMTP id xyz123abc456; Thu, 5 Dec 2024 08:30:00 -0800 (PST)"
|
||||||
|
},
|
||||||
|
{ "name": "X-Google-Smtp-Source", "value": "ABC12345+EXAMPLE123456789" },
|
||||||
|
{
|
||||||
|
"name": "X-Received",
|
||||||
|
"value": "by 192.0.2.1 with SMTP id 12345abc67890; Thu, 5 Dec 2024 08:30:00 -0800 (PST)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Seal",
|
||||||
|
"value": "i=1; a=rsa-sha256; t=1733405400; cv=none; d=example.com; s=arc-20241205; b=ABCDEFG123456="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Message-Signature",
|
||||||
|
"value": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=arc-20241205; bh=EXAMPLEHASH12345="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Authentication-Results",
|
||||||
|
"value": "i=1; mx.example.com; dkim=pass header.i=@promotion.example.com; spf=pass smtp.mailfrom=promo@promotion.example.com; dmarc=pass header.from=example.com"
|
||||||
|
},
|
||||||
|
{ "name": "Return-Path", "value": "<promo@promotion.example.com>" },
|
||||||
|
{ "name": "Date", "value": "Thu, 5 Dec 2024 08:30:00 -0800" },
|
||||||
|
{ "name": "From", "value": "Holiday Deals <promo@promotion.example.com>" },
|
||||||
|
{ "name": "To", "value": "exampleuser@gmail.com" },
|
||||||
|
{ "name": "Message-ID", "value": "<12345abc67890@promotion.example.com>" },
|
||||||
|
{ "name": "Subject", "value": "Exclusive Holiday Discounts!" },
|
||||||
|
{ "name": "MIME-Version", "value": "1.0" },
|
||||||
|
{
|
||||||
|
"name": "Content-Type",
|
||||||
|
"value": "multipart/alternative; boundary=\"----=_Part_12345_67890.1733405400000\""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": { "size": 0 },
|
||||||
|
"parts": [
|
||||||
|
{
|
||||||
|
"partId": "0",
|
||||||
|
"mimeType": "text/plain",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{ "name": "Content-Type", "value": "text/plain; charset=utf-8" },
|
||||||
|
{ "name": "Content-Transfer-Encoding", "value": "quoted-printable" }
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 1234,
|
||||||
|
"data": "VGhpcyBpcyBhbiBleGFtcGxlIG1lc3NhZ2UuIFRoYW5rIHlvdSBmb3Igc2hvcHBpbmcgd2l0aCB1cy4="
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"partId": "1",
|
||||||
|
"mimeType": "text/html",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{ "name": "Content-Type", "value": "text/html; charset=\"utf-8\"" },
|
||||||
|
{ "name": "Content-Transfer-Encoding", "value": "quoted-printable" }
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 5678,
|
||||||
|
"data": "PGRpdiBzdHlsZT0nZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyc+VGhpcyBpcyBhbiBleGFtcGxlIGh0bWwgbWVzc2FnZS4gPGI+VGhhbmsgeW91IGZvciBzaG9wcGluZyB3aXRoIHVzLjwvYj48L2Rpdj4="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"sizeEstimate": 67890,
|
||||||
|
"historyId": "54321",
|
||||||
|
"internalDate": "1733405400000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Gmail - Drafts - Delete": [{ "json": { "success": true } }],
|
||||||
|
"Gmail - Drafts - Get": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"threadId": "a1b2c3d4e5f6g7h8",
|
||||||
|
"labelIds": ["UNREAD", "CATEGORY_PROMOTIONS", "INBOX"],
|
||||||
|
"sizeEstimate": 67890,
|
||||||
|
"headers": {
|
||||||
|
"mime-version": "MIME-Version: 1.0",
|
||||||
|
"date": "Date: Fri, 13 Dec 2024 11:15:01 +0100",
|
||||||
|
"message-id": "Message-ID: <CAEGAProwudGnKXxqrhMjOuxamTh7yArjwP7OD9UBq-Jpkb0X9w@mail.gmail.com>",
|
||||||
|
"subject": "Subject: Test draft",
|
||||||
|
"from": "From: node qa <node8qa@gmail.com>",
|
||||||
|
"to": "To: test@gmail.com",
|
||||||
|
"content-type": "Content-Type: multipart/alternative; boundary=\"0000000000009d58b60629241a22\""
|
||||||
|
},
|
||||||
|
"html": "<div dir=\"ltr\">draft body<br></div>\n",
|
||||||
|
"text": "draft body\n",
|
||||||
|
"textAsHtml": "<p>draft body</p>",
|
||||||
|
"subject": "Test draft",
|
||||||
|
"date": "2024-12-13T10:15:01.000Z",
|
||||||
|
"to": {
|
||||||
|
"value": [{ "address": "test@gmail.com", "name": "" }],
|
||||||
|
"html": "<span class=\"mp_address_group\"><a href=\"mailto:test@gmail.com\" class=\"mp_address_email\">test@gmail.com</a></span>",
|
||||||
|
"text": "test@gmail.com"
|
||||||
|
},
|
||||||
|
"from": {
|
||||||
|
"value": [{ "address": "node8qa@gmail.com", "name": "node qa" }],
|
||||||
|
"html": "<span class=\"mp_address_group\"><span class=\"mp_address_name\">node qa</span> <<a href=\"mailto:node8qa@gmail.com\" class=\"mp_address_email\">node8qa@gmail.com</a>></span>",
|
||||||
|
"text": "\"node qa\" <node8qa@gmail.com>"
|
||||||
|
},
|
||||||
|
"messageId": "a1b2c3d4e5f6g7h8"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Gmail - Drafts - Get Many": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"threadId": "a1b2c3d4e5f6g7h8",
|
||||||
|
"labelIds": ["UNREAD", "CATEGORY_PROMOTIONS", "INBOX"],
|
||||||
|
"sizeEstimate": 67890,
|
||||||
|
"headers": {
|
||||||
|
"mime-version": "MIME-Version: 1.0",
|
||||||
|
"date": "Date: Fri, 13 Dec 2024 11:15:01 +0100",
|
||||||
|
"message-id": "Message-ID: <CAEGAProwudGnKXxqrhMjOuxamTh7yArjwP7OD9UBq-Jpkb0X9w@mail.gmail.com>",
|
||||||
|
"subject": "Subject: Test draft",
|
||||||
|
"from": "From: node qa <node8qa@gmail.com>",
|
||||||
|
"to": "To: test@gmail.com",
|
||||||
|
"content-type": "Content-Type: multipart/alternative; boundary=\"0000000000009d58b60629241a22\""
|
||||||
|
},
|
||||||
|
"html": "<div dir=\"ltr\">draft body<br></div>\n",
|
||||||
|
"text": "draft body\n",
|
||||||
|
"textAsHtml": "<p>draft body</p>",
|
||||||
|
"subject": "Test draft",
|
||||||
|
"date": "2024-12-13T10:15:01.000Z",
|
||||||
|
"to": {
|
||||||
|
"value": [{ "address": "test@gmail.com", "name": "" }],
|
||||||
|
"html": "<span class=\"mp_address_group\"><a href=\"mailto:test@gmail.com\" class=\"mp_address_email\">test@gmail.com</a></span>",
|
||||||
|
"text": "test@gmail.com"
|
||||||
|
},
|
||||||
|
"from": {
|
||||||
|
"value": [{ "address": "node8qa@gmail.com", "name": "node qa" }],
|
||||||
|
"html": "<span class=\"mp_address_group\"><span class=\"mp_address_name\">node qa</span> <<a href=\"mailto:node8qa@gmail.com\" class=\"mp_address_email\">node8qa@gmail.com</a>></span>",
|
||||||
|
"text": "\"node qa\" <node8qa@gmail.com>"
|
||||||
|
},
|
||||||
|
"messageId": "a1b2c3d4e5f6g7h8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"threadId": "z9y8x7w6v5u4t3s2",
|
||||||
|
"labelIds": ["UNREAD", "CATEGORY_SOCIAL", "INBOX"],
|
||||||
|
"sizeEstimate": 54321,
|
||||||
|
"headers": {
|
||||||
|
"mime-version": "MIME-Version: 1.0",
|
||||||
|
"date": "Date: Fri, 13 Dec 2024 11:15:01 +0100",
|
||||||
|
"message-id": "Message-ID: <CAEGAProwudGnKXxqrhMjOuxamTh7yArjwP7OD9UBq-Jpkb0X9w@mail.gmail.com>",
|
||||||
|
"subject": "Subject: Test draft",
|
||||||
|
"from": "From: node qa <node8qa@gmail.com>",
|
||||||
|
"to": "To: test@gmail.com",
|
||||||
|
"content-type": "Content-Type: multipart/alternative; boundary=\"0000000000009d58b60629241a22\""
|
||||||
|
},
|
||||||
|
"html": "<div dir=\"ltr\">draft body<br></div>\n",
|
||||||
|
"text": "draft body\n",
|
||||||
|
"textAsHtml": "<p>draft body</p>",
|
||||||
|
"subject": "Test draft",
|
||||||
|
"date": "2024-12-13T10:15:01.000Z",
|
||||||
|
"to": {
|
||||||
|
"value": [{ "address": "test@gmail.com", "name": "" }],
|
||||||
|
"html": "<span class=\"mp_address_group\"><a href=\"mailto:test@gmail.com\" class=\"mp_address_email\">test@gmail.com</a></span>",
|
||||||
|
"text": "test@gmail.com"
|
||||||
|
},
|
||||||
|
"from": {
|
||||||
|
"value": [{ "address": "node8qa@gmail.com", "name": "node qa" }],
|
||||||
|
"html": "<span class=\"mp_address_group\"><span class=\"mp_address_name\">node qa</span> <<a href=\"mailto:node8qa@gmail.com\" class=\"mp_address_email\">node8qa@gmail.com</a>></span>",
|
||||||
|
"text": "\"node qa\" <node8qa@gmail.com>"
|
||||||
|
},
|
||||||
|
"messageId": "z9y8x7w6v5u4t3s2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"connections": {
|
||||||
|
"When clicking ‘Test workflow’": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Gmail - Drafts - Get Many",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Gmail - Drafts - Get",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Gmail - Drafts - Delete",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Edit Fields",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Edit Fields": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Convert to File",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Convert to File": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Gmail - Drafts - Create",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"active": false,
|
||||||
|
"settings": {
|
||||||
|
"executionOrder": "v1"
|
||||||
|
},
|
||||||
|
"versionId": "84fb11a4-4166-45bd-bd9f-60fa378d9e68",
|
||||||
|
"meta": {
|
||||||
|
"instanceId": "27cc9b56542ad45b38725555722c50a1c3fee1670bbb67980558314ee08517c4"
|
||||||
|
},
|
||||||
|
"id": "09KDcfGmfDrLInDE",
|
||||||
|
"tags": []
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "CHAT",
|
||||||
|
"name": "CHAT",
|
||||||
|
"messageListVisibility": "hide",
|
||||||
|
"labelListVisibility": "labelHide",
|
||||||
|
"type": "system"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "SENT",
|
||||||
|
"name": "SENT",
|
||||||
|
"type": "system"
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,240 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "a1b2c3d4e5f6g7h8",
|
||||||
|
"threadId": "a1b2c3d4e5f6g7h8",
|
||||||
|
"labelIds": ["UNREAD", "CATEGORY_PROMOTIONS", "INBOX"],
|
||||||
|
"snippet": "Don't miss our exclusive holiday discounts on all items! Act now before the sale ends.",
|
||||||
|
"payload": {
|
||||||
|
"partId": "",
|
||||||
|
"mimeType": "multipart/alternative",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"name": "Delivered-To",
|
||||||
|
"value": "exampleuser@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Received",
|
||||||
|
"value": "by 2001:db8::abcd with SMTP id xyz123abc456; Thu, 5 Dec 2024 08:30:00 -0800 (PST)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "X-Google-Smtp-Source",
|
||||||
|
"value": "ABC12345+EXAMPLE123456789"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "X-Received",
|
||||||
|
"value": "by 192.0.2.1 with SMTP id 12345abc67890; Thu, 5 Dec 2024 08:30:00 -0800 (PST)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Seal",
|
||||||
|
"value": "i=1; a=rsa-sha256; t=1733405400; cv=none; d=example.com; s=arc-20241205; b=ABCDEFG123456="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Message-Signature",
|
||||||
|
"value": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=arc-20241205; bh=EXAMPLEHASH12345="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Authentication-Results",
|
||||||
|
"value": "i=1; mx.example.com; dkim=pass header.i=@promotion.example.com; spf=pass smtp.mailfrom=promo@promotion.example.com; dmarc=pass header.from=example.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Return-Path",
|
||||||
|
"value": "<promo@promotion.example.com>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Date",
|
||||||
|
"value": "Thu, 5 Dec 2024 08:30:00 -0800"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "From",
|
||||||
|
"value": "Holiday Deals <promo@promotion.example.com>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "To",
|
||||||
|
"value": "exampleuser@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Message-ID",
|
||||||
|
"value": "<12345abc67890@promotion.example.com>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Subject",
|
||||||
|
"value": "Exclusive Holiday Discounts!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MIME-Version",
|
||||||
|
"value": "1.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Content-Type",
|
||||||
|
"value": "multipart/alternative; boundary=\"----=_Part_12345_67890.1733405400000\""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 0
|
||||||
|
},
|
||||||
|
"parts": [
|
||||||
|
{
|
||||||
|
"partId": "0",
|
||||||
|
"mimeType": "text/plain",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"name": "Content-Type",
|
||||||
|
"value": "text/plain; charset=utf-8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Content-Transfer-Encoding",
|
||||||
|
"value": "quoted-printable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 1234,
|
||||||
|
"data": "VGhpcyBpcyBhbiBleGFtcGxlIG1lc3NhZ2UuIFRoYW5rIHlvdSBmb3Igc2hvcHBpbmcgd2l0aCB1cy4="
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"partId": "1",
|
||||||
|
"mimeType": "text/html",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"name": "Content-Type",
|
||||||
|
"value": "text/html; charset=\"utf-8\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Content-Transfer-Encoding",
|
||||||
|
"value": "quoted-printable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 5678,
|
||||||
|
"data": "PGRpdiBzdHlsZT0nZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyc+VGhpcyBpcyBhbiBleGFtcGxlIGh0bWwgbWVzc2FnZS4gPGI+VGhhbmsgeW91IGZvciBzaG9wcGluZyB3aXRoIHVzLjwvYj48L2Rpdj4="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"sizeEstimate": 67890,
|
||||||
|
"historyId": "54321",
|
||||||
|
"internalDate": "1733405400000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "z9y8x7w6v5u4t3s2",
|
||||||
|
"threadId": "z9y8x7w6v5u4t3s2",
|
||||||
|
"labelIds": ["UNREAD", "CATEGORY_SOCIAL", "INBOX"],
|
||||||
|
"snippet": "Your friend John just shared a new photo with you! Check it out now.",
|
||||||
|
"payload": {
|
||||||
|
"partId": "",
|
||||||
|
"mimeType": "multipart/alternative",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"name": "Delivered-To",
|
||||||
|
"value": "exampleuser2@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Received",
|
||||||
|
"value": "by 2001:db8::abcd with SMTP id def456ghi789; Fri, 6 Dec 2024 09:45:00 -0800 (PST)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "X-Google-Smtp-Source",
|
||||||
|
"value": "XYZ67890+EXAMPLE0987654321"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "X-Received",
|
||||||
|
"value": "by 198.51.100.2 with SMTP id 67890def12345; Fri, 6 Dec 2024 09:45:00 -0800 (PST)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Seal",
|
||||||
|
"value": "i=1; a=rsa-sha256; t=1733490900; cv=none; d=example2.com; s=arc-20241206; b=HIJKLMN987654="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Message-Signature",
|
||||||
|
"value": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=example2.com; s=arc-20241206; bh=EXAMPLEHASH67890="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ARC-Authentication-Results",
|
||||||
|
"value": "i=1; mx.example2.com; dkim=pass header.i=@social.example2.com; spf=pass smtp.mailfrom=notifications@social.example2.com; dmarc=pass header.from=example2.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Return-Path",
|
||||||
|
"value": "<notifications@social.example2.com>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Date",
|
||||||
|
"value": "Fri, 6 Dec 2024 09:45:00 -0800"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "From",
|
||||||
|
"value": "John's Photos <notifications@social.example2.com>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "To",
|
||||||
|
"value": "exampleuser2@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Message-ID",
|
||||||
|
"value": "<67890def12345@social.example2.com>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Subject",
|
||||||
|
"value": "John shared a new photo with you!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MIME-Version",
|
||||||
|
"value": "1.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Content-Type",
|
||||||
|
"value": "multipart/alternative; boundary=\"----=_Part_67890_12345.1733490900000\""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 0
|
||||||
|
},
|
||||||
|
"parts": [
|
||||||
|
{
|
||||||
|
"partId": "0",
|
||||||
|
"mimeType": "text/plain",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"name": "Content-Type",
|
||||||
|
"value": "text/plain; charset=utf-8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Content-Transfer-Encoding",
|
||||||
|
"value": "quoted-printable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 4321,
|
||||||
|
"data": "U2VlIHRoZSBhdHRhY2hlZCBwaG90byBhbmQgcmVwbHkgdG8gSm9obi4gV2UgaG9wZSB5b3UgbGlrZSBpdCE="
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"partId": "1",
|
||||||
|
"mimeType": "text/html",
|
||||||
|
"filename": "",
|
||||||
|
"headers": [
|
||||||
|
{
|
||||||
|
"name": "Content-Type",
|
||||||
|
"value": "text/html; charset=\"utf-8\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Content-Transfer-Encoding",
|
||||||
|
"value": "quoted-printable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"size": 8765,
|
||||||
|
"data": "PGRpdiBzdHlsZT0nZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyc+U2VlIHRoZSBhdHRhY2hlZCBwaG90byBhbmQgcmVwbHkgdG8gPGI+Sm9obi48L2I+IFdlIGhvcGUgeW91IGxpa2UgaXQhPC9kaXY+"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"sizeEstimate": 54321,
|
||||||
|
"historyId": "98765",
|
||||||
|
"internalDate": "1733490900000"
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,163 @@
|
||||||
|
{
|
||||||
|
"name": "My workflow 130",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"parameters": {},
|
||||||
|
"type": "n8n-nodes-base.manualTrigger",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [-60, 100],
|
||||||
|
"id": "636b40bc-2c98-4b9a-8ce2-9d1322294518",
|
||||||
|
"name": "When clicking ‘Test workflow’"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "label",
|
||||||
|
"operation": "create",
|
||||||
|
"name": "Test Label Name",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [220, -180],
|
||||||
|
"id": "45758452-3b5b-478d-aece-001e117ce69d",
|
||||||
|
"name": "Gmail - Labels - Create",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "label",
|
||||||
|
"operation": "delete",
|
||||||
|
"labelId": "test-label-id"
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [220, 20],
|
||||||
|
"id": "ed979c3a-b2ea-413e-be63-0392cc1714a5",
|
||||||
|
"name": "Gmail - Labels - Delete",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "label",
|
||||||
|
"operation": "get",
|
||||||
|
"labelId": "test-label-id"
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [220, 200],
|
||||||
|
"id": "8802fdb5-2741-407b-82a4-ccedc4055076",
|
||||||
|
"name": "Gmail - Labels - Get",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"resource": "label",
|
||||||
|
"limit": 2
|
||||||
|
},
|
||||||
|
"type": "n8n-nodes-base.gmail",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [220, 400],
|
||||||
|
"id": "bae81586-7641-4fdc-81a4-0006b289bf9d",
|
||||||
|
"name": "Gmail - Labels - Get Many",
|
||||||
|
"webhookId": "3b8b38e0-2f4b-40bc-8b67-37e7ea95cb60",
|
||||||
|
"credentials": {
|
||||||
|
"gmailOAuth2": {
|
||||||
|
"id": "22",
|
||||||
|
"name": "Gmail 0auth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pinData": {
|
||||||
|
"Gmail - Labels - Create": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": "CHAT",
|
||||||
|
"name": "CHAT",
|
||||||
|
"messageListVisibility": "hide",
|
||||||
|
"labelListVisibility": "labelHide",
|
||||||
|
"type": "system"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Gmail - Labels - Delete": [{ "json": { "success": true } }],
|
||||||
|
"Gmail - Labels - Get": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": "CHAT",
|
||||||
|
"name": "CHAT",
|
||||||
|
"messageListVisibility": "hide",
|
||||||
|
"labelListVisibility": "labelHide",
|
||||||
|
"type": "system"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Gmail - Labels - Get Many": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": "CHAT",
|
||||||
|
"name": "CHAT",
|
||||||
|
"messageListVisibility": "hide",
|
||||||
|
"labelListVisibility": "labelHide",
|
||||||
|
"type": "system"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ "json": { "id": "SENT", "name": "SENT", "type": "system" } }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"connections": {
|
||||||
|
"When clicking ‘Test workflow’": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Gmail - Labels - Create",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Gmail - Labels - Delete",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Gmail - Labels - Get",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Gmail - Labels - Get Many",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"active": false,
|
||||||
|
"settings": {
|
||||||
|
"executionOrder": "v1"
|
||||||
|
},
|
||||||
|
"versionId": "",
|
||||||
|
"meta": {
|
||||||
|
"instanceId": "27cc9b56542ad45b38725555722c50a1c3fee1670bbb67980558314ee08517c4"
|
||||||
|
},
|
||||||
|
"tags": []
|
||||||
|
}
|
File diff suppressed because it is too large
Load diff
1174
packages/nodes-base/nodes/Google/Gmail/test/v2/threads.workflow.json
Normal file
1174
packages/nodes-base/nodes/Google/Gmail/test/v2/threads.workflow.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1,9 +1,7 @@
|
||||||
import type {
|
import type {
|
||||||
IExecuteFunctions,
|
|
||||||
IDataObject,
|
IDataObject,
|
||||||
ILoadOptionsFunctions,
|
IExecuteFunctions,
|
||||||
INodeExecutionData,
|
INodeExecutionData,
|
||||||
INodePropertyOptions,
|
|
||||||
INodeType,
|
INodeType,
|
||||||
INodeTypeBaseDescription,
|
INodeTypeBaseDescription,
|
||||||
INodeTypeDescription,
|
INodeTypeDescription,
|
||||||
|
@ -15,7 +13,16 @@ import {
|
||||||
WAIT_INDEFINITELY,
|
WAIT_INDEFINITELY,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
|
|
||||||
|
import { draftFields, draftOperations } from './DraftDescription';
|
||||||
|
import { labelFields, labelOperations } from './LabelDescription';
|
||||||
|
import { messageFields, messageOperations } from './MessageDescription';
|
||||||
|
import { threadFields, threadOperations } from './ThreadDescription';
|
||||||
import type { IEmail } from '../../../../utils/sendAndWait/interfaces';
|
import type { IEmail } from '../../../../utils/sendAndWait/interfaces';
|
||||||
|
import {
|
||||||
|
createEmail,
|
||||||
|
getSendAndWaitProperties,
|
||||||
|
sendAndWaitWebhook,
|
||||||
|
} from '../../../../utils/sendAndWait/utils';
|
||||||
import {
|
import {
|
||||||
encodeEmail,
|
encodeEmail,
|
||||||
googleApiRequest,
|
googleApiRequest,
|
||||||
|
@ -29,20 +36,7 @@ import {
|
||||||
simplifyOutput,
|
simplifyOutput,
|
||||||
unescapeSnippets,
|
unescapeSnippets,
|
||||||
} from '../GenericFunctions';
|
} from '../GenericFunctions';
|
||||||
|
import { getGmailAliases, getLabels, getThreadMessages } from './loadOptions';
|
||||||
import { messageFields, messageOperations } from './MessageDescription';
|
|
||||||
|
|
||||||
import { labelFields, labelOperations } from './LabelDescription';
|
|
||||||
|
|
||||||
import { draftFields, draftOperations } from './DraftDescription';
|
|
||||||
|
|
||||||
import { threadFields, threadOperations } from './ThreadDescription';
|
|
||||||
|
|
||||||
import {
|
|
||||||
getSendAndWaitProperties,
|
|
||||||
createEmail,
|
|
||||||
sendAndWaitWebhook,
|
|
||||||
} from '../../../../utils/sendAndWait/utils';
|
|
||||||
|
|
||||||
const versionDescription: INodeTypeDescription = {
|
const versionDescription: INodeTypeDescription = {
|
||||||
displayName: 'Gmail',
|
displayName: 'Gmail',
|
||||||
|
@ -187,78 +181,9 @@ export class GmailV2 implements INodeType {
|
||||||
|
|
||||||
methods = {
|
methods = {
|
||||||
loadOptions: {
|
loadOptions: {
|
||||||
// Get all the labels to display them to user so that they can
|
getLabels,
|
||||||
// select them easily
|
getThreadMessages,
|
||||||
async getLabels(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
|
getGmailAliases,
|
||||||
const returnData: INodePropertyOptions[] = [];
|
|
||||||
|
|
||||||
const labels = await googleApiRequestAllItems.call(
|
|
||||||
this,
|
|
||||||
'labels',
|
|
||||||
'GET',
|
|
||||||
'/gmail/v1/users/me/labels',
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const label of labels) {
|
|
||||||
returnData.push({
|
|
||||||
name: label.name,
|
|
||||||
value: label.id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnData.sort((a, b) => {
|
|
||||||
if (a.name < b.name) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (a.name > b.name) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
async getThreadMessages(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
|
|
||||||
const returnData: INodePropertyOptions[] = [];
|
|
||||||
|
|
||||||
const id = this.getNodeParameter('threadId', 0) as string;
|
|
||||||
const { messages } = await googleApiRequest.call(
|
|
||||||
this,
|
|
||||||
'GET',
|
|
||||||
`/gmail/v1/users/me/threads/${id}`,
|
|
||||||
{},
|
|
||||||
{ format: 'minimal' },
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const message of messages || []) {
|
|
||||||
returnData.push({
|
|
||||||
name: message.snippet,
|
|
||||||
value: message.id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnData;
|
|
||||||
},
|
|
||||||
|
|
||||||
async getGmailAliases(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
|
|
||||||
const returnData: INodePropertyOptions[] = [];
|
|
||||||
const { sendAs } = await googleApiRequest.call(
|
|
||||||
this,
|
|
||||||
'GET',
|
|
||||||
'/gmail/v1/users/me/settings/sendAs',
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const alias of sendAs || []) {
|
|
||||||
const displayName = alias.isDefault
|
|
||||||
? `${alias.sendAsEmail} (Default)`
|
|
||||||
: alias.sendAsEmail;
|
|
||||||
returnData.push({
|
|
||||||
name: displayName,
|
|
||||||
value: alias.sendAsEmail,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnData;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
75
packages/nodes-base/nodes/Google/Gmail/v2/loadOptions.ts
Normal file
75
packages/nodes-base/nodes/Google/Gmail/v2/loadOptions.ts
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
import type { ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
|
||||||
|
|
||||||
|
import { googleApiRequest, googleApiRequestAllItems } from '../GenericFunctions';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the labels to display them to user so that they can select them easily
|
||||||
|
*/
|
||||||
|
export async function getLabels(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
|
||||||
|
const returnData: INodePropertyOptions[] = [];
|
||||||
|
|
||||||
|
const labels = await googleApiRequestAllItems.call(
|
||||||
|
this,
|
||||||
|
'labels',
|
||||||
|
'GET',
|
||||||
|
'/gmail/v1/users/me/labels',
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const label of labels) {
|
||||||
|
returnData.push({
|
||||||
|
name: label.name,
|
||||||
|
value: label.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnData.sort((a, b) => {
|
||||||
|
if (a.name < b.name) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (a.name > b.name) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getThreadMessages(
|
||||||
|
this: ILoadOptionsFunctions,
|
||||||
|
): Promise<INodePropertyOptions[]> {
|
||||||
|
const returnData: INodePropertyOptions[] = [];
|
||||||
|
|
||||||
|
const id = this.getNodeParameter('threadId', 0) as string;
|
||||||
|
const { messages } = await googleApiRequest.call(
|
||||||
|
this,
|
||||||
|
'GET',
|
||||||
|
`/gmail/v1/users/me/threads/${id}`,
|
||||||
|
{},
|
||||||
|
{ format: 'minimal' },
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const message of messages || []) {
|
||||||
|
returnData.push({
|
||||||
|
name: message.snippet,
|
||||||
|
value: message.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnData;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getGmailAliases(
|
||||||
|
this: ILoadOptionsFunctions,
|
||||||
|
): Promise<INodePropertyOptions[]> {
|
||||||
|
const returnData: INodePropertyOptions[] = [];
|
||||||
|
const { sendAs } = await googleApiRequest.call(this, 'GET', '/gmail/v1/users/me/settings/sendAs');
|
||||||
|
|
||||||
|
for (const alias of sendAs || []) {
|
||||||
|
const displayName = alias.isDefault ? `${alias.sendAsEmail} (Default)` : alias.sendAsEmail;
|
||||||
|
returnData.push({
|
||||||
|
name: displayName,
|
||||||
|
value: alias.sendAsEmail,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnData;
|
||||||
|
}
|
|
@ -125,6 +125,25 @@ BQIDAQAB
|
||||||
accessToken: 'testToken',
|
accessToken: 'testToken',
|
||||||
baseUrl: 'https://api.telegram.org',
|
baseUrl: 'https://api.telegram.org',
|
||||||
},
|
},
|
||||||
|
gmailOAuth2: {
|
||||||
|
grantType: 'authorizationCode',
|
||||||
|
authUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
||||||
|
accessTokenUrl: 'https://oauth2.googleapis.com/token',
|
||||||
|
clientId: 'CLIENTID',
|
||||||
|
clientSecret: 'CLIENTSECRET',
|
||||||
|
scope:
|
||||||
|
'https://www.googleapis.com/auth/gmail.labels https://www.googleapis.com/auth/gmail.addons.current.action.compose https://www.googleapis.com/auth/gmail.addons.current.message.action https://mail.google.com/ https://www.googleapis.com/auth/gmail.modify https://www.googleapis.com/auth/gmail.compose',
|
||||||
|
authQueryParameters: 'access_type=offline&prompt=consent',
|
||||||
|
authentication: 'body',
|
||||||
|
oauthTokenData: {
|
||||||
|
access_token: 'ACCESSTOKEN',
|
||||||
|
refresh_token: 'REFRESHTOKEN',
|
||||||
|
scope:
|
||||||
|
'https://www.googleapis.com/auth/gmail.labels https://www.googleapis.com/auth/gmail.addons.current.action.compose https://www.googleapis.com/auth/gmail.addons.current.message.action https://mail.google.com/ https://www.googleapis.com/auth/gmail.modify https://www.googleapis.com/auth/gmail.compose',
|
||||||
|
token_type: 'bearer',
|
||||||
|
expires_in: 86400,
|
||||||
|
},
|
||||||
|
},
|
||||||
notionApi: {
|
notionApi: {
|
||||||
apiKey: 'key123',
|
apiKey: 'key123',
|
||||||
},
|
},
|
||||||
|
|
|
@ -332,7 +332,7 @@ export const equalityTest = async (testData: WorkflowTestData, types: INodeTypes
|
||||||
return expect(resultData, msg).toEqual(testData.output.nodeData[nodeName]);
|
return expect(resultData, msg).toEqual(testData.output.nodeData[nodeName]);
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(result.finished).toEqual(true);
|
expect(result.finished || result.status === 'waiting').toEqual(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
const preparePinData = (pinData: IDataObject) => {
|
const preparePinData = (pinData: IDataObject) => {
|
||||||
|
|
Loading…
Reference in a new issue