@memberjunction/communication-gmail 5.48.0 → 5.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Unit tests for the Gmail provider's push-notification subscription support.
3
+ * Tests: supported operations, SupportsPush, capabilities, CreateSubscription,
4
+ * DeleteSubscription (idempotent), and the pure ParseNotification parser.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ // ---------------------------------------------------------------------------
8
+ // Mocks (mirror GmailProvider.test.ts)
9
+ // ---------------------------------------------------------------------------
10
+ vi.mock('@memberjunction/communication-types', () => ({
11
+ BaseCommunicationProvider: class {
12
+ getSupportedOperations() { return []; }
13
+ // SupportsPush derives from GetSubscriptionCapabilities() in the real base class;
14
+ // replicate that here so the test exercises the same derivation.
15
+ get SupportsPush() { return this.GetSubscriptionCapabilities() !== undefined; }
16
+ GetSubscriptionCapabilities() { return undefined; }
17
+ },
18
+ resolveCredentialValue: (requestVal, envVal, disableFallback) => {
19
+ if (requestVal)
20
+ return requestVal;
21
+ if (!disableFallback && envVal)
22
+ return envVal;
23
+ return undefined;
24
+ },
25
+ validateRequiredCredentials: (creds, required, provider) => {
26
+ for (const key of required) {
27
+ if (!creds[key]) {
28
+ throw new Error(`${provider}: Missing required credential: ${key}`);
29
+ }
30
+ }
31
+ },
32
+ }));
33
+ vi.mock('@memberjunction/global', async (importOriginal) => {
34
+ const actual = await importOriginal();
35
+ return {
36
+ ...actual,
37
+ RegisterClass: () => (target) => target,
38
+ };
39
+ });
40
+ vi.mock('@memberjunction/core', () => ({
41
+ LogError: vi.fn(),
42
+ LogStatus: vi.fn(),
43
+ }));
44
+ vi.mock('env-var', () => {
45
+ const envMap = {
46
+ GMAIL_CLIENT_ID: 'env-client-id',
47
+ GMAIL_CLIENT_SECRET: 'env-client-secret',
48
+ GMAIL_REDIRECT_URI: 'http://localhost:3000/callback',
49
+ GMAIL_REFRESH_TOKEN: 'env-refresh-token',
50
+ GMAIL_SERVICE_ACCOUNT_EMAIL: 'service@example.com',
51
+ };
52
+ return {
53
+ default: {
54
+ get: (key) => ({
55
+ default: (def) => ({
56
+ asString: () => envMap[key] ?? def,
57
+ }),
58
+ }),
59
+ },
60
+ };
61
+ });
62
+ vi.mock('dotenv', () => ({
63
+ default: { config: vi.fn() },
64
+ }));
65
+ const { mockWatch, mockStop } = vi.hoisted(() => ({
66
+ mockWatch: vi.fn(),
67
+ mockStop: vi.fn(),
68
+ }));
69
+ vi.mock('googleapis', () => {
70
+ class FakeOAuth2 {
71
+ constructor() {
72
+ this.setCredentials = vi.fn();
73
+ }
74
+ }
75
+ return {
76
+ default: {
77
+ google: {
78
+ auth: {
79
+ OAuth2: FakeOAuth2,
80
+ },
81
+ gmail: vi.fn().mockReturnValue({
82
+ users: {
83
+ getProfile: vi.fn().mockResolvedValue({ data: { emailAddress: 'test@gmail.com' } }),
84
+ watch: mockWatch,
85
+ stop: mockStop,
86
+ messages: {
87
+ send: vi.fn(),
88
+ list: vi.fn(),
89
+ get: vi.fn(),
90
+ modify: vi.fn().mockResolvedValue({}),
91
+ trash: vi.fn().mockResolvedValue({}),
92
+ delete: vi.fn().mockResolvedValue({}),
93
+ },
94
+ labels: {
95
+ list: vi.fn().mockResolvedValue({ data: { labels: [] } }),
96
+ },
97
+ drafts: {
98
+ create: vi.fn().mockResolvedValue({ status: 200, data: { id: 'draft-1' } }),
99
+ },
100
+ },
101
+ }),
102
+ },
103
+ },
104
+ };
105
+ });
106
+ // ---------------------------------------------------------------------------
107
+ // Import after mocks
108
+ // ---------------------------------------------------------------------------
109
+ import { GmailProvider } from '../GmailProvider.js';
110
+ // ---------------------------------------------------------------------------
111
+ // Helpers
112
+ // ---------------------------------------------------------------------------
113
+ /** Builds a valid Gmail Pub/Sub push envelope with the given inner payload. */
114
+ const buildEnvelope = (inner) => {
115
+ const data = Buffer.from(JSON.stringify(inner), 'utf-8').toString('base64');
116
+ return JSON.stringify({
117
+ message: { data, messageId: 'msg-abc', publishTime: '2026-07-24T00:00:00Z' },
118
+ subscription: 'projects/proj/subscriptions/sub',
119
+ });
120
+ };
121
+ // ---------------------------------------------------------------------------
122
+ // Tests
123
+ // ---------------------------------------------------------------------------
124
+ describe('GmailProvider push-notification subscriptions', () => {
125
+ let provider;
126
+ beforeEach(() => {
127
+ vi.clearAllMocks();
128
+ provider = new GmailProvider();
129
+ });
130
+ describe('getSupportedOperations (subscriptions)', () => {
131
+ it('includes the four subscription operations', () => {
132
+ const ops = provider.getSupportedOperations();
133
+ expect(ops).toContain('CreateSubscription');
134
+ expect(ops).toContain('RenewSubscription');
135
+ expect(ops).toContain('DeleteSubscription');
136
+ expect(ops).toContain('ParseNotification');
137
+ });
138
+ it('capability invariant: capabilities defined IFF the four ops are present', () => {
139
+ const caps = provider.GetSubscriptionCapabilities();
140
+ const ops = provider.getSupportedOperations();
141
+ const subOps = ['CreateSubscription', 'RenewSubscription', 'DeleteSubscription', 'ParseNotification'];
142
+ const allPresent = subOps.every((op) => ops.includes(op));
143
+ expect(caps !== undefined).toBe(allPresent);
144
+ });
145
+ });
146
+ describe('SupportsPush', () => {
147
+ it('is true because the provider returns capabilities', () => {
148
+ expect(provider.SupportsPush).toBe(true);
149
+ });
150
+ });
151
+ describe('GetSubscriptionCapabilities', () => {
152
+ it('matches the Gmail watch spec', () => {
153
+ const caps = provider.GetSubscriptionCapabilities();
154
+ expect(caps).toEqual({
155
+ MaxLifetimeMinutes: 10080,
156
+ SupportedChangeTypes: ['created'],
157
+ RequiresEndpointValidation: false,
158
+ SupportsSubscriptionManagement: true,
159
+ DeliversPayloadInline: false,
160
+ });
161
+ });
162
+ });
163
+ describe('CreateSubscription', () => {
164
+ const topicName = 'projects/my-proj/topics/gmail-push';
165
+ it('calls users.watch with the topic + default INBOX label and returns userId + expiration', async () => {
166
+ const expiration = String(Date.now() + 7 * 24 * 60 * 60 * 1000);
167
+ mockWatch.mockResolvedValue({ data: { historyId: '12345', expiration } });
168
+ const result = await provider.CreateSubscription({
169
+ Identifier: 'watched@example.com',
170
+ ChangeTypes: ['created'],
171
+ NotificationUrl: '', // Gmail does not require a URL (Pub/Sub delivery)
172
+ ClientState: '',
173
+ ContextData: { topicName },
174
+ });
175
+ expect(result.Success).toBe(true);
176
+ // Gmail has no service-side subscription ID; the mailbox userId identifies the watch.
177
+ expect(result.SubscriptionID).toBe('watched@example.com');
178
+ expect(result.ExpiresAt).toEqual(new Date(Number(expiration)));
179
+ expect(mockWatch).toHaveBeenCalledTimes(1);
180
+ const call = mockWatch.mock.calls[0][0];
181
+ expect(call.userId).toBe('watched@example.com');
182
+ expect(call.requestBody.topicName).toBe(topicName);
183
+ expect(call.requestBody.labelIds).toEqual(['INBOX']);
184
+ });
185
+ it('defaults userId to "me" when no Identifier is provided', async () => {
186
+ mockWatch.mockResolvedValue({ data: { historyId: '1', expiration: '1000' } });
187
+ const result = await provider.CreateSubscription({
188
+ ChangeTypes: ['created'],
189
+ NotificationUrl: '',
190
+ ClientState: '',
191
+ ContextData: { topicName },
192
+ });
193
+ expect(result.Success).toBe(true);
194
+ expect(result.SubscriptionID).toBe('me');
195
+ expect(mockWatch.mock.calls[0][0].userId).toBe('me');
196
+ });
197
+ it('passes custom labelIds and labelFilterBehavior through', async () => {
198
+ mockWatch.mockResolvedValue({ data: { historyId: '1', expiration: '1000' } });
199
+ await provider.CreateSubscription({
200
+ ChangeTypes: ['created'],
201
+ NotificationUrl: '',
202
+ ClientState: '',
203
+ ContextData: { topicName, labelIds: ['INBOX', 'IMPORTANT'], labelFilterBehavior: 'include' },
204
+ });
205
+ const body = mockWatch.mock.calls[0][0].requestBody;
206
+ expect(body.labelIds).toEqual(['INBOX', 'IMPORTANT']);
207
+ expect(body.labelFilterBehavior).toBe('include');
208
+ });
209
+ it('fail-fast: rejects a missing Pub/Sub topic without touching Gmail', async () => {
210
+ const result = await provider.CreateSubscription({
211
+ Identifier: 'watched@example.com',
212
+ ChangeTypes: ['created'],
213
+ NotificationUrl: '',
214
+ ClientState: '',
215
+ ContextData: {},
216
+ });
217
+ expect(result.Success).toBe(false);
218
+ expect(result.ErrorMessage).toContain('topicName');
219
+ expect(mockWatch).not.toHaveBeenCalled();
220
+ });
221
+ it('surfaces a Gmail error in ErrorMessage', async () => {
222
+ mockWatch.mockRejectedValue(new Error('Insufficient permission on topic'));
223
+ const result = await provider.CreateSubscription({
224
+ ChangeTypes: ['created'],
225
+ NotificationUrl: '',
226
+ ClientState: '',
227
+ ContextData: { topicName },
228
+ });
229
+ expect(result.Success).toBe(false);
230
+ expect(result.ErrorMessage).toContain('Insufficient permission on topic');
231
+ });
232
+ });
233
+ describe('RenewSubscription', () => {
234
+ it('re-issues users.watch for the SubscriptionID mailbox', async () => {
235
+ mockWatch.mockResolvedValue({ data: { historyId: '99', expiration: '2000' } });
236
+ const result = await provider.RenewSubscription({
237
+ SubscriptionID: 'watched@example.com',
238
+ ContextData: { topicName: 'projects/p/topics/t' },
239
+ });
240
+ expect(result.Success).toBe(true);
241
+ expect(result.SubscriptionID).toBe('watched@example.com');
242
+ expect(mockWatch.mock.calls[0][0].userId).toBe('watched@example.com');
243
+ });
244
+ it('fail-fast: rejects a missing topic', async () => {
245
+ const result = await provider.RenewSubscription({ SubscriptionID: 'me', ContextData: {} });
246
+ expect(result.Success).toBe(false);
247
+ expect(mockWatch).not.toHaveBeenCalled();
248
+ });
249
+ });
250
+ describe('DeleteSubscription', () => {
251
+ it('calls users.stop and returns success', async () => {
252
+ mockStop.mockResolvedValue({});
253
+ const result = await provider.DeleteSubscription({ SubscriptionID: 'watched@example.com' });
254
+ expect(result.Success).toBe(true);
255
+ expect(mockStop).toHaveBeenCalledWith({ userId: 'watched@example.com' });
256
+ });
257
+ it('treats a 404 as success (idempotent delete)', async () => {
258
+ mockStop.mockRejectedValue({ code: 404 });
259
+ const result = await provider.DeleteSubscription({ SubscriptionID: 'already-gone' });
260
+ expect(result.Success).toBe(true);
261
+ });
262
+ it('treats a response.status 404 as success', async () => {
263
+ mockStop.mockRejectedValue({ response: { status: 404 } });
264
+ const result = await provider.DeleteSubscription({ SubscriptionID: 'already-gone' });
265
+ expect(result.Success).toBe(true);
266
+ });
267
+ it('surfaces a non-404 error as failure', async () => {
268
+ mockStop.mockRejectedValue(new Error('boom'));
269
+ const result = await provider.DeleteSubscription({ SubscriptionID: 'x' });
270
+ expect(result.Success).toBe(false);
271
+ expect(result.ErrorMessage).toContain('boom');
272
+ });
273
+ });
274
+ describe('ParseNotification', () => {
275
+ it('normalizes a well-formed Pub/Sub envelope (HINT-mode, empty MessageIDs)', async () => {
276
+ const inner = { emailAddress: 'watched@example.com', historyId: 987654 };
277
+ const result = await provider.ParseNotification({
278
+ Headers: {},
279
+ QueryParams: {},
280
+ RawBody: buildEnvelope(inner),
281
+ });
282
+ expect(result.Success).toBe(true);
283
+ expect(result.SuggestedResponseStatus).toBe(204);
284
+ expect(result.SignatureValid).toBeUndefined();
285
+ expect(result.Notifications).toHaveLength(1);
286
+ const n = result.Notifications[0];
287
+ expect(n.Kind).toBe('message');
288
+ expect(n.Identifier).toBe('watched@example.com');
289
+ expect(n.ChangeType).toBe('created');
290
+ expect(n.MessageIDs).toEqual([]);
291
+ expect(n.Message).toBeUndefined(); // HINT-mode: never inline
292
+ expect(n.RawData).toEqual(inner);
293
+ });
294
+ it('accepts a string historyId', async () => {
295
+ const result = await provider.ParseNotification({
296
+ Headers: {},
297
+ QueryParams: {},
298
+ RawBody: buildEnvelope({ emailAddress: 'a@b.com', historyId: '42' }),
299
+ });
300
+ expect(result.Success).toBe(true);
301
+ expect(result.Notifications[0].Identifier).toBe('a@b.com');
302
+ });
303
+ it('returns failure (400) on an empty body, never throwing', async () => {
304
+ const result = await provider.ParseNotification({ Headers: {}, QueryParams: {}, RawBody: '' });
305
+ expect(result.Success).toBe(false);
306
+ expect(result.SuggestedResponseStatus).toBe(400);
307
+ expect(result.Notifications).toEqual([]);
308
+ });
309
+ it('returns failure (400) on non-JSON body', async () => {
310
+ const result = await provider.ParseNotification({ Headers: {}, QueryParams: {}, RawBody: '{not json' });
311
+ expect(result.Success).toBe(false);
312
+ expect(result.SuggestedResponseStatus).toBe(400);
313
+ });
314
+ it('returns failure (400) when message.data is missing', async () => {
315
+ const result = await provider.ParseNotification({
316
+ Headers: {},
317
+ QueryParams: {},
318
+ RawBody: JSON.stringify({ message: {}, subscription: 's' }),
319
+ });
320
+ expect(result.Success).toBe(false);
321
+ expect(result.SuggestedResponseStatus).toBe(400);
322
+ expect(result.ErrorMessage).toContain('message.data');
323
+ });
324
+ it('returns failure (400) when message.data is not valid base64-encoded JSON', async () => {
325
+ // '@@@@' decodes to bytes that are not valid JSON -> inner JSON.parse throws.
326
+ const result = await provider.ParseNotification({
327
+ Headers: {},
328
+ QueryParams: {},
329
+ RawBody: JSON.stringify({ message: { data: '@@@@@@@@' }, subscription: 's' }),
330
+ });
331
+ expect(result.Success).toBe(false);
332
+ expect(result.SuggestedResponseStatus).toBe(400);
333
+ });
334
+ it('returns failure (400) when decoded payload is missing emailAddress', async () => {
335
+ const result = await provider.ParseNotification({
336
+ Headers: {},
337
+ QueryParams: {},
338
+ RawBody: buildEnvelope({ historyId: 5 }),
339
+ });
340
+ expect(result.Success).toBe(false);
341
+ expect(result.ErrorMessage).toContain('emailAddress');
342
+ });
343
+ it('returns failure (400) when decoded payload is missing historyId', async () => {
344
+ const result = await provider.ParseNotification({
345
+ Headers: {},
346
+ QueryParams: {},
347
+ RawBody: buildEnvelope({ emailAddress: 'a@b.com' }),
348
+ });
349
+ expect(result.Success).toBe(false);
350
+ expect(result.ErrorMessage).toContain('historyId');
351
+ });
352
+ it('never throws on hostile/garbage input (fuzz-ish)', async () => {
353
+ const garbage = ['', '[]', 'null', 'true', '"a string"', '{"message":null}', '{"message":42}', ' ', '{"message":{"data":123}}'];
354
+ for (const raw of garbage) {
355
+ const result = await provider.ParseNotification({ Headers: {}, QueryParams: {}, RawBody: raw });
356
+ expect(typeof result.Success).toBe('boolean');
357
+ expect(Array.isArray(result.Notifications)).toBe(true);
358
+ expect(result.SuggestedResponseStatus).toBe(400);
359
+ }
360
+ });
361
+ });
362
+ });
363
+ //# sourceMappingURL=GmailSubscriptions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GmailSubscriptions.test.js","sourceRoot":"","sources":["../../src/__tests__/GmailSubscriptions.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/communication-gmail",
3
3
  "type": "module",
4
- "version": "5.48.0",
4
+ "version": "5.50.0",
5
5
  "description": "Gmail/Google Suite provider for MemberJunction Communication framework",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -14,9 +14,9 @@
14
14
  "test": "vitest run"
15
15
  },
16
16
  "dependencies": {
17
- "@memberjunction/communication-types": "5.48.0",
18
- "@memberjunction/core": "5.48.0",
19
- "@memberjunction/global": "5.48.0",
17
+ "@memberjunction/communication-types": "5.50.0",
18
+ "@memberjunction/core": "5.50.0",
19
+ "@memberjunction/global": "5.50.0",
20
20
  "dotenv": "^17.2.4",
21
21
  "env-var": "^7.4.1",
22
22
  "googleapis": "^171.4.0"