@simplens/nodemailer-gmail 1.0.4 → 1.0.6

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.
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const gmailNotificationSchema: z.ZodObject<{
12
12
  notification_id: z.ZodString;
13
13
  request_id: z.ZodString;
14
14
  client_id: z.ZodString;
15
+ provider: z.ZodOptional<z.ZodString>;
15
16
  variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
16
17
  webhook_url: z.ZodString;
17
18
  retry_count: z.ZodNumber;
@@ -38,14 +39,8 @@ declare const gmailNotificationSchema: z.ZodObject<{
38
39
  subject?: string | undefined;
39
40
  }>;
40
41
  created_at: z.ZodDate;
41
- }, z.core.$strip, z.ZodTypeAny, {
42
- notification_id: string;
43
- request_id: string;
44
- client_id: string;
42
+ }, "strip", z.ZodTypeAny, {
45
43
  channel: "email";
46
- webhook_url: string;
47
- retry_count: number;
48
- created_at: Date;
49
44
  recipient: {
50
45
  user_id: string;
51
46
  email: string;
@@ -54,15 +49,16 @@ declare const gmailNotificationSchema: z.ZodObject<{
54
49
  message: string;
55
50
  subject?: string | undefined;
56
51
  };
57
- variables?: Record<string, string> | undefined;
58
- }, {
52
+ created_at: Date;
59
53
  notification_id: string;
60
54
  request_id: string;
61
55
  client_id: string;
62
- channel: "email";
63
56
  webhook_url: string;
64
57
  retry_count: number;
65
- created_at: Date;
58
+ provider?: string | undefined;
59
+ variables?: Record<string, string> | undefined;
60
+ }, {
61
+ channel: "email";
66
62
  recipient: {
67
63
  user_id: string;
68
64
  email: string;
@@ -71,6 +67,13 @@ declare const gmailNotificationSchema: z.ZodObject<{
71
67
  message: string;
72
68
  subject?: string | undefined;
73
69
  };
70
+ created_at: Date;
71
+ notification_id: string;
72
+ request_id: string;
73
+ client_id: string;
74
+ webhook_url: string;
75
+ retry_count: number;
76
+ provider?: string | undefined;
74
77
  variables?: Record<string, string> | undefined;
75
78
  }>;
76
79
  /**
@@ -100,6 +103,7 @@ export declare class GmailProvider implements SimpleNSProvider<GmailNotification
100
103
  notification_id: z.ZodString;
101
104
  request_id: z.ZodString;
102
105
  client_id: z.ZodString;
106
+ provider: z.ZodOptional<z.ZodString>;
103
107
  variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
104
108
  webhook_url: z.ZodString;
105
109
  retry_count: z.ZodNumber;
@@ -126,14 +130,8 @@ export declare class GmailProvider implements SimpleNSProvider<GmailNotification
126
130
  subject?: string | undefined;
127
131
  }>;
128
132
  created_at: z.ZodDate;
129
- }, z.core.$strip, z.ZodTypeAny, {
130
- notification_id: string;
131
- request_id: string;
132
- client_id: string;
133
+ }, "strip", z.ZodTypeAny, {
133
134
  channel: "email";
134
- webhook_url: string;
135
- retry_count: number;
136
- created_at: Date;
137
135
  recipient: {
138
136
  user_id: string;
139
137
  email: string;
@@ -142,15 +140,16 @@ export declare class GmailProvider implements SimpleNSProvider<GmailNotification
142
140
  message: string;
143
141
  subject?: string | undefined;
144
142
  };
145
- variables?: Record<string, string> | undefined;
146
- }, {
143
+ created_at: Date;
147
144
  notification_id: string;
148
145
  request_id: string;
149
146
  client_id: string;
150
- channel: "email";
151
147
  webhook_url: string;
152
148
  retry_count: number;
153
- created_at: Date;
149
+ provider?: string | undefined;
150
+ variables?: Record<string, string> | undefined;
151
+ }, {
152
+ channel: "email";
154
153
  recipient: {
155
154
  user_id: string;
156
155
  email: string;
@@ -159,6 +158,13 @@ export declare class GmailProvider implements SimpleNSProvider<GmailNotification
159
158
  message: string;
160
159
  subject?: string | undefined;
161
160
  };
161
+ created_at: Date;
162
+ notification_id: string;
163
+ request_id: string;
164
+ client_id: string;
165
+ webhook_url: string;
166
+ retry_count: number;
167
+ provider?: string | undefined;
162
168
  variables?: Record<string, string> | undefined;
163
169
  }>;
164
170
  getRecipientSchema(): z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACH,CAAC,EACD,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EAIvB,MAAM,eAAe,CAAC;AAkBvB;;GAEG;AACH,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK3B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,YAAW,gBAAgB,CAAC,iBAAiB,CAAC;IACrE,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAA+B;IAE7C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAUjC;IAEF,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIrB,kBAAkB;;;;;;;;;;IAIlB,gBAAgB;;;;;;;;;;IAIhB,kBAAkB,IAAI,eAAe;IAa/B,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAe/B,IAAI,CAAC,YAAY,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAqE9D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAOlC;AAGD,eAAe,aAAa,CAAC;AAG7B,wBAAgB,cAAc,IAAI,aAAa,CAE9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACH,CAAC,EACD,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EAIvB,MAAM,eAAe,CAAC;AAkBvB;;GAEG;AACH,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK3B,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,YAAW,gBAAgB,CAAC,iBAAiB,CAAC;IACrE,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAA+B;IAE7C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAUjC;IAEF,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIrB,kBAAkB;;;;;;;;;;IAIlB,gBAAgB;;;;;;;;;;IAIhB,kBAAkB,IAAI,eAAe;IAa/B,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAe/B,IAAI,CAAC,YAAY,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAqE9D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAOlC;AAGD,eAAe,aAAa,CAAC;AAG7B,wBAAgB,cAAc,IAAI,aAAa,CAE9C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,484 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import nodemailer from 'nodemailer';
3
+ import { GmailProvider, createProvider } from './index.js';
4
+ // Mock nodemailer
5
+ vi.mock('nodemailer', () => ({
6
+ default: {
7
+ createTransport: vi.fn(),
8
+ },
9
+ }));
10
+ // Mock @simplens/sdk
11
+ vi.mock('@simplens/sdk', async () => {
12
+ const { z } = await import('zod');
13
+ return {
14
+ z,
15
+ baseNotificationSchema: z.object({
16
+ notification_id: z.string(),
17
+ channel: z.string(),
18
+ priority: z.enum(['high', 'normal', 'low']).optional(),
19
+ variables: z.record(z.string(), z.unknown()).optional(),
20
+ }),
21
+ replaceVariables: vi.fn((message, variables) => {
22
+ let result = message;
23
+ for (const [key, value] of Object.entries(variables)) {
24
+ result = result.replace(new RegExp(`{{${key}}}`, 'g'), String(value));
25
+ }
26
+ return result;
27
+ }),
28
+ isHtmlContent: vi.fn((content) => {
29
+ return /<[^>]+>/.test(content);
30
+ }),
31
+ };
32
+ });
33
+ describe('GmailProvider', () => {
34
+ let provider;
35
+ let mockTransporter;
36
+ beforeEach(() => {
37
+ provider = new GmailProvider();
38
+ mockTransporter = {
39
+ verify: vi.fn(),
40
+ sendMail: vi.fn(),
41
+ close: vi.fn(),
42
+ };
43
+ vi.mocked(nodemailer.createTransport).mockReturnValue(mockTransporter);
44
+ // Suppress console.log/error during tests
45
+ vi.spyOn(console, 'log').mockImplementation(() => { });
46
+ vi.spyOn(console, 'error').mockImplementation(() => { });
47
+ });
48
+ afterEach(() => {
49
+ vi.clearAllMocks();
50
+ });
51
+ describe('manifest', () => {
52
+ it('should have correct manifest properties', () => {
53
+ expect(provider.manifest).toEqual({
54
+ name: 'simplens-plugin-nodemailer-gmail',
55
+ version: '1.0.0',
56
+ channel: 'email',
57
+ displayName: 'Gmail (Nodemailer)',
58
+ description: 'Send emails via Gmail SMTP using Nodemailer',
59
+ author: 'Adhish Krishna S',
60
+ homepage: 'https://github.com/SimpleNotificationSystem/plugin-nodemailer-gmail',
61
+ requiredCredentials: ['EMAIL_USER', 'EMAIL_PASS'],
62
+ optionalConfig: ['EMAIL_HOST', 'EMAIL_PORT', 'EMAIL_FROM'],
63
+ });
64
+ });
65
+ });
66
+ describe('getNotificationSchema', () => {
67
+ it('should return a valid zod schema', () => {
68
+ const schema = provider.getNotificationSchema();
69
+ expect(schema).toBeDefined();
70
+ expect(typeof schema.parse).toBe('function');
71
+ });
72
+ });
73
+ describe('getRecipientSchema', () => {
74
+ it('should return a valid zod schema', () => {
75
+ const schema = provider.getRecipientSchema();
76
+ expect(schema).toBeDefined();
77
+ expect(typeof schema.parse).toBe('function');
78
+ });
79
+ it('should validate correct recipient', () => {
80
+ const schema = provider.getRecipientSchema();
81
+ const result = schema.safeParse({
82
+ user_id: 'user123',
83
+ email: 'test@example.com',
84
+ });
85
+ expect(result.success).toBe(true);
86
+ });
87
+ it('should reject invalid email', () => {
88
+ const schema = provider.getRecipientSchema();
89
+ const result = schema.safeParse({
90
+ user_id: 'user123',
91
+ email: 'invalid-email',
92
+ });
93
+ expect(result.success).toBe(false);
94
+ });
95
+ });
96
+ describe('getContentSchema', () => {
97
+ it('should return a valid zod schema', () => {
98
+ const schema = provider.getContentSchema();
99
+ expect(schema).toBeDefined();
100
+ expect(typeof schema.parse).toBe('function');
101
+ });
102
+ it('should validate content with subject', () => {
103
+ const schema = provider.getContentSchema();
104
+ const result = schema.safeParse({
105
+ subject: 'Test Subject',
106
+ message: 'Test message',
107
+ });
108
+ expect(result.success).toBe(true);
109
+ });
110
+ it('should validate content without subject (optional)', () => {
111
+ const schema = provider.getContentSchema();
112
+ const result = schema.safeParse({
113
+ message: 'Test message',
114
+ });
115
+ expect(result.success).toBe(true);
116
+ });
117
+ it('should reject content without message', () => {
118
+ const schema = provider.getContentSchema();
119
+ const result = schema.safeParse({
120
+ subject: 'Test Subject',
121
+ });
122
+ expect(result.success).toBe(false);
123
+ });
124
+ });
125
+ describe('getRateLimitConfig', () => {
126
+ it('should return default rate limit config when not initialized', () => {
127
+ const config = provider.getRateLimitConfig();
128
+ expect(config).toEqual({
129
+ maxTokens: 100,
130
+ refillRate: 10,
131
+ });
132
+ });
133
+ it('should return custom rate limit config from options', async () => {
134
+ await provider.initialize({
135
+ id: 'test',
136
+ credentials: {
137
+ EMAIL_USER: 'test@gmail.com',
138
+ EMAIL_PASS: 'password123',
139
+ },
140
+ options: {
141
+ rateLimit: {
142
+ maxTokens: 200,
143
+ refillRate: 20,
144
+ },
145
+ },
146
+ });
147
+ const config = provider.getRateLimitConfig();
148
+ expect(config).toEqual({
149
+ maxTokens: 200,
150
+ refillRate: 20,
151
+ });
152
+ });
153
+ });
154
+ describe('initialize', () => {
155
+ it('should initialize with required credentials', async () => {
156
+ await provider.initialize({
157
+ id: 'test',
158
+ credentials: {
159
+ EMAIL_USER: 'test@gmail.com',
160
+ EMAIL_PASS: 'password123',
161
+ },
162
+ });
163
+ expect(nodemailer.createTransport).toHaveBeenCalledWith({
164
+ host: 'smtp.gmail.com',
165
+ port: 587,
166
+ secure: false,
167
+ auth: { user: 'test@gmail.com', pass: 'password123' },
168
+ connectionTimeout: 10000,
169
+ greetingTimeout: 10000,
170
+ socketTimeout: 30000,
171
+ });
172
+ });
173
+ it('should use custom host and port', async () => {
174
+ await provider.initialize({
175
+ id: 'test',
176
+ credentials: {
177
+ EMAIL_USER: 'test@example.com',
178
+ EMAIL_PASS: 'password123',
179
+ EMAIL_HOST: 'smtp.example.com',
180
+ EMAIL_PORT: '465',
181
+ },
182
+ });
183
+ expect(nodemailer.createTransport).toHaveBeenCalledWith({
184
+ host: 'smtp.example.com',
185
+ port: 465,
186
+ secure: true, // Port 465 should be secure
187
+ auth: { user: 'test@example.com', pass: 'password123' },
188
+ connectionTimeout: 10000,
189
+ greetingTimeout: 10000,
190
+ socketTimeout: 30000,
191
+ });
192
+ });
193
+ it('should throw error when EMAIL_USER is missing', async () => {
194
+ await expect(provider.initialize({
195
+ id: 'test',
196
+ credentials: {
197
+ EMAIL_PASS: 'password123',
198
+ },
199
+ })).rejects.toThrow('EMAIL_USER and EMAIL_PASS are required');
200
+ });
201
+ it('should throw error when EMAIL_PASS is missing', async () => {
202
+ await expect(provider.initialize({
203
+ id: 'test',
204
+ credentials: {
205
+ EMAIL_USER: 'test@gmail.com',
206
+ },
207
+ })).rejects.toThrow('EMAIL_USER and EMAIL_PASS are required');
208
+ });
209
+ });
210
+ describe('healthCheck', () => {
211
+ it('should return false when transporter is not initialized', async () => {
212
+ const result = await provider.healthCheck();
213
+ expect(result).toBe(false);
214
+ });
215
+ it('should return true when transporter verification succeeds', async () => {
216
+ mockTransporter.verify.mockResolvedValue(true);
217
+ await provider.initialize({
218
+ id: 'test',
219
+ credentials: {
220
+ EMAIL_USER: 'test@gmail.com',
221
+ EMAIL_PASS: 'password123',
222
+ },
223
+ });
224
+ const result = await provider.healthCheck();
225
+ expect(result).toBe(true);
226
+ expect(mockTransporter.verify).toHaveBeenCalled();
227
+ });
228
+ it('should return false when transporter verification fails', async () => {
229
+ mockTransporter.verify.mockRejectedValue(new Error('Connection failed'));
230
+ await provider.initialize({
231
+ id: 'test',
232
+ credentials: {
233
+ EMAIL_USER: 'test@gmail.com',
234
+ EMAIL_PASS: 'password123',
235
+ },
236
+ });
237
+ const result = await provider.healthCheck();
238
+ expect(result).toBe(false);
239
+ });
240
+ });
241
+ describe('send', () => {
242
+ const createNotification = (overrides = {}) => ({
243
+ notification_id: 'notif-123',
244
+ request_id: crypto.randomUUID(),
245
+ client_id: crypto.randomUUID(),
246
+ channel: 'email',
247
+ recipient: {
248
+ user_id: 'user-456',
249
+ email: 'recipient@example.com',
250
+ },
251
+ webhook_url: 'https://example.com/webhook',
252
+ retry_count: 3,
253
+ content: {
254
+ subject: 'Test Subject',
255
+ message: 'Hello, this is a test message.',
256
+ },
257
+ created_at: new Date(),
258
+ ...overrides,
259
+ });
260
+ it('should return error when transporter is not initialized', async () => {
261
+ const notification = createNotification();
262
+ const result = await provider.send(notification);
263
+ expect(result.success).toBe(false);
264
+ expect(result.error).toEqual({
265
+ code: 'NOT_INITIALIZED',
266
+ message: 'Transporter not initialized',
267
+ retryable: false,
268
+ });
269
+ });
270
+ it('should send email successfully with plain text', async () => {
271
+ mockTransporter.sendMail.mockResolvedValue({
272
+ messageId: '<msg-id-123@gmail.com>',
273
+ });
274
+ await provider.initialize({
275
+ id: 'test',
276
+ credentials: {
277
+ EMAIL_USER: 'sender@gmail.com',
278
+ EMAIL_PASS: 'password123',
279
+ },
280
+ });
281
+ const notification = createNotification();
282
+ const result = await provider.send(notification);
283
+ expect(result.success).toBe(true);
284
+ expect(result.messageId).toBe('<msg-id-123@gmail.com>');
285
+ expect(mockTransporter.sendMail).toHaveBeenCalledWith({
286
+ from: 'sender@gmail.com',
287
+ to: 'recipient@example.com',
288
+ subject: 'Test Subject',
289
+ text: 'Hello, this is a test message.',
290
+ });
291
+ });
292
+ it('should send email with HTML content', async () => {
293
+ mockTransporter.sendMail.mockResolvedValue({
294
+ messageId: '<msg-id-456@gmail.com>',
295
+ });
296
+ await provider.initialize({
297
+ id: 'test',
298
+ credentials: {
299
+ EMAIL_USER: 'sender@gmail.com',
300
+ EMAIL_PASS: 'password123',
301
+ },
302
+ });
303
+ const notification = createNotification({
304
+ content: {
305
+ subject: 'HTML Email',
306
+ message: '<h1>Hello</h1><p>This is HTML content</p>',
307
+ },
308
+ });
309
+ const result = await provider.send(notification);
310
+ expect(result.success).toBe(true);
311
+ expect(mockTransporter.sendMail).toHaveBeenCalledWith({
312
+ from: 'sender@gmail.com',
313
+ to: 'recipient@example.com',
314
+ subject: 'HTML Email',
315
+ html: '<h1>Hello</h1><p>This is HTML content</p>',
316
+ });
317
+ });
318
+ it('should use default subject when not provided', async () => {
319
+ mockTransporter.sendMail.mockResolvedValue({
320
+ messageId: '<msg-id-789@gmail.com>',
321
+ });
322
+ await provider.initialize({
323
+ id: 'test',
324
+ credentials: {
325
+ EMAIL_USER: 'sender@gmail.com',
326
+ EMAIL_PASS: 'password123',
327
+ },
328
+ });
329
+ const notification = createNotification({
330
+ content: {
331
+ message: 'Message without subject',
332
+ },
333
+ });
334
+ const result = await provider.send(notification);
335
+ expect(result.success).toBe(true);
336
+ expect(mockTransporter.sendMail).toHaveBeenCalledWith(expect.objectContaining({
337
+ subject: 'Notification',
338
+ }));
339
+ });
340
+ it('should replace template variables', async () => {
341
+ mockTransporter.sendMail.mockResolvedValue({
342
+ messageId: '<msg-id-var@gmail.com>',
343
+ });
344
+ await provider.initialize({
345
+ id: 'test',
346
+ credentials: {
347
+ EMAIL_USER: 'sender@gmail.com',
348
+ EMAIL_PASS: 'password123',
349
+ },
350
+ });
351
+ const notification = createNotification({
352
+ content: {
353
+ subject: 'Welcome',
354
+ message: 'Hello {{name}}, your order {{orderId}} is confirmed.',
355
+ },
356
+ variables: {
357
+ name: 'John',
358
+ orderId: '12345',
359
+ },
360
+ });
361
+ const result = await provider.send(notification);
362
+ expect(result.success).toBe(true);
363
+ expect(mockTransporter.sendMail).toHaveBeenCalledWith(expect.objectContaining({
364
+ text: 'Hello John, your order 12345 is confirmed.',
365
+ }));
366
+ });
367
+ it('should use custom FROM address', async () => {
368
+ mockTransporter.sendMail.mockResolvedValue({
369
+ messageId: '<msg-id-from@gmail.com>',
370
+ });
371
+ await provider.initialize({
372
+ id: 'test',
373
+ credentials: {
374
+ EMAIL_USER: 'sender@gmail.com',
375
+ EMAIL_PASS: 'password123',
376
+ EMAIL_FROM: 'noreply@mycompany.com',
377
+ },
378
+ });
379
+ const notification = createNotification();
380
+ const result = await provider.send(notification);
381
+ expect(result.success).toBe(true);
382
+ expect(mockTransporter.sendMail).toHaveBeenCalledWith(expect.objectContaining({
383
+ from: 'noreply@mycompany.com',
384
+ }));
385
+ });
386
+ it('should return retryable error for connection issues', async () => {
387
+ mockTransporter.sendMail.mockRejectedValue(new Error('Connection timeout'));
388
+ await provider.initialize({
389
+ id: 'test',
390
+ credentials: {
391
+ EMAIL_USER: 'sender@gmail.com',
392
+ EMAIL_PASS: 'password123',
393
+ },
394
+ });
395
+ const notification = createNotification();
396
+ const result = await provider.send(notification);
397
+ expect(result.success).toBe(false);
398
+ expect(result.error).toEqual({
399
+ code: 'SEND_FAILED',
400
+ message: 'Connection timeout',
401
+ retryable: true,
402
+ });
403
+ });
404
+ it('should return non-retryable error for authentication failure', async () => {
405
+ mockTransporter.sendMail.mockRejectedValue(new Error('Invalid login credentials'));
406
+ await provider.initialize({
407
+ id: 'test',
408
+ credentials: {
409
+ EMAIL_USER: 'sender@gmail.com',
410
+ EMAIL_PASS: 'wrong-password',
411
+ },
412
+ });
413
+ const notification = createNotification();
414
+ const result = await provider.send(notification);
415
+ expect(result.success).toBe(false);
416
+ expect(result.error?.retryable).toBe(false);
417
+ });
418
+ it('should return non-retryable error for invalid email address', async () => {
419
+ mockTransporter.sendMail.mockRejectedValue(new Error('Invalid email address'));
420
+ await provider.initialize({
421
+ id: 'test',
422
+ credentials: {
423
+ EMAIL_USER: 'sender@gmail.com',
424
+ EMAIL_PASS: 'password123',
425
+ },
426
+ });
427
+ const notification = createNotification();
428
+ const result = await provider.send(notification);
429
+ expect(result.success).toBe(false);
430
+ expect(result.error?.retryable).toBe(false);
431
+ });
432
+ it('should handle unknown error type', async () => {
433
+ mockTransporter.sendMail.mockRejectedValue('String error');
434
+ await provider.initialize({
435
+ id: 'test',
436
+ credentials: {
437
+ EMAIL_USER: 'sender@gmail.com',
438
+ EMAIL_PASS: 'password123',
439
+ },
440
+ });
441
+ const notification = createNotification();
442
+ const result = await provider.send(notification);
443
+ expect(result.success).toBe(false);
444
+ expect(result.error?.message).toBe('Unknown error');
445
+ });
446
+ });
447
+ describe('shutdown', () => {
448
+ it('should close transporter when initialized', async () => {
449
+ await provider.initialize({
450
+ id: 'test',
451
+ credentials: {
452
+ EMAIL_USER: 'test@gmail.com',
453
+ EMAIL_PASS: 'password123',
454
+ },
455
+ });
456
+ await provider.shutdown();
457
+ expect(mockTransporter.close).toHaveBeenCalled();
458
+ });
459
+ it('should do nothing when transporter is not initialized', async () => {
460
+ await provider.shutdown();
461
+ expect(mockTransporter.close).not.toHaveBeenCalled();
462
+ });
463
+ it('should set transporter to null after shutdown', async () => {
464
+ await provider.initialize({
465
+ id: 'test',
466
+ credentials: {
467
+ EMAIL_USER: 'test@gmail.com',
468
+ EMAIL_PASS: 'password123',
469
+ },
470
+ });
471
+ await provider.shutdown();
472
+ // Verify transporter is null by checking healthCheck returns false
473
+ const result = await provider.healthCheck();
474
+ expect(result).toBe(false);
475
+ });
476
+ });
477
+ });
478
+ describe('createProvider', () => {
479
+ it('should create a new GmailProvider instance', () => {
480
+ const provider = createProvider();
481
+ expect(provider).toBeInstanceOf(GmailProvider);
482
+ });
483
+ });
484
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplens/nodemailer-gmail",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Gmail/SMTP email provider plugin for SimpleNS using Nodemailer",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -14,6 +14,9 @@
14
14
  "type": "module",
15
15
  "scripts": {
16
16
  "build": "tsc",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
19
+ "test:coverage": "vitest run --coverage",
17
20
  "prepublishOnly": "npm run build"
18
21
  },
19
22
  "keywords": [
@@ -27,12 +30,13 @@
27
30
  "author": "SimpleNS Team",
28
31
  "license": "MIT",
29
32
  "dependencies": {
30
- "@simplens/sdk": "^1.0.3",
33
+ "@simplens/sdk": "^1.0.4",
31
34
  "nodemailer": "^6.9.0"
32
35
  },
33
36
  "devDependencies": {
34
37
  "@types/nodemailer": "^6.4.0",
35
- "typescript": "^5.0.0"
38
+ "typescript": "^5.0.0",
39
+ "vitest": "^4.0.16"
36
40
  },
37
41
  "files": [
38
42
  "dist",