@bernierllc/email-testing-suite 0.1.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.
- package/LICENSE +21 -0
- package/README.md +347 -0
- package/dist/analytics.d.ts +52 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +211 -0
- package/dist/analytics.js.map +1 -0
- package/dist/best-practices.d.ts +34 -0
- package/dist/best-practices.d.ts.map +1 -0
- package/dist/best-practices.js +268 -0
- package/dist/best-practices.js.map +1 -0
- package/dist/email-testing-suite.d.ts +74 -0
- package/dist/email-testing-suite.d.ts.map +1 -0
- package/dist/email-testing-suite.js +424 -0
- package/dist/email-testing-suite.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/test-patterns.d.ts +48 -0
- package/dist/test-patterns.d.ts.map +1 -0
- package/dist/test-patterns.js +132 -0
- package/dist/test-patterns.js.map +1 -0
- package/dist/types.d.ts +258 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.EmailTestingSuite = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Complete email testing solution with opinionated defaults
|
|
13
|
+
*/
|
|
14
|
+
class EmailTestingSuite {
|
|
15
|
+
config;
|
|
16
|
+
mockServer; // MockSMTPServer instance
|
|
17
|
+
orchestrator; // EmailTestOrchestrator instance
|
|
18
|
+
running = false;
|
|
19
|
+
capturedEmails = [];
|
|
20
|
+
testHistory = [];
|
|
21
|
+
constructor(config = {}) {
|
|
22
|
+
this.config = this.mergeWithDefaults(config);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Merge user config with opinionated defaults
|
|
26
|
+
*/
|
|
27
|
+
mergeWithDefaults(config) {
|
|
28
|
+
return {
|
|
29
|
+
smtp: {
|
|
30
|
+
port: 2525,
|
|
31
|
+
host: 'localhost',
|
|
32
|
+
...config.smtp,
|
|
33
|
+
},
|
|
34
|
+
defaults: {
|
|
35
|
+
compliance: 'US',
|
|
36
|
+
timeout: 30000,
|
|
37
|
+
retries: 3,
|
|
38
|
+
expectations: {
|
|
39
|
+
delivery: true,
|
|
40
|
+
templateCompletion: true,
|
|
41
|
+
compliance: 'US',
|
|
42
|
+
accessibility: true,
|
|
43
|
+
performance: {
|
|
44
|
+
renderTime: 2000,
|
|
45
|
+
size: '200kb',
|
|
46
|
+
deliveryTime: 5000,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
...config.defaults,
|
|
50
|
+
},
|
|
51
|
+
validation: {
|
|
52
|
+
enabledValidators: ['template', 'compliance', 'accessibility', 'performance', 'security'],
|
|
53
|
+
strictMode: false,
|
|
54
|
+
customRules: [],
|
|
55
|
+
...config.validation,
|
|
56
|
+
},
|
|
57
|
+
reporting: {
|
|
58
|
+
enableAnalytics: true,
|
|
59
|
+
generateTrendReports: true,
|
|
60
|
+
exportFormats: ['json', 'html'],
|
|
61
|
+
retainHistory: 30,
|
|
62
|
+
...config.reporting,
|
|
63
|
+
},
|
|
64
|
+
integrations: {
|
|
65
|
+
frameworks: ['jest'],
|
|
66
|
+
webhooks: [],
|
|
67
|
+
...config.integrations,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Start the email testing environment
|
|
73
|
+
*/
|
|
74
|
+
async start() {
|
|
75
|
+
if (this.running) {
|
|
76
|
+
throw new Error('Email testing suite is already running');
|
|
77
|
+
}
|
|
78
|
+
// Note: In a real implementation, this would initialize:
|
|
79
|
+
// - MockSMTPServer
|
|
80
|
+
// - EmailTestOrchestrator
|
|
81
|
+
// - EmailCapture system
|
|
82
|
+
// For now, we'll simulate this
|
|
83
|
+
this.running = true;
|
|
84
|
+
this.capturedEmails = [];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Stop the email testing environment
|
|
88
|
+
*/
|
|
89
|
+
async stop() {
|
|
90
|
+
if (!this.running) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Note: In a real implementation, this would stop all services
|
|
94
|
+
this.running = false;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Reset the testing environment
|
|
98
|
+
*/
|
|
99
|
+
async reset() {
|
|
100
|
+
this.capturedEmails = [];
|
|
101
|
+
// Note: In real implementation, would reset all subsystems
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Test an email template with comprehensive validation
|
|
105
|
+
*/
|
|
106
|
+
async testEmailTemplate(spec) {
|
|
107
|
+
if (!this.running) {
|
|
108
|
+
throw new Error('Email testing suite is not running. Call start() first.');
|
|
109
|
+
}
|
|
110
|
+
const startTime = Date.now();
|
|
111
|
+
const validations = [];
|
|
112
|
+
const errors = [];
|
|
113
|
+
try {
|
|
114
|
+
// Validate template (simulated)
|
|
115
|
+
validations.push({
|
|
116
|
+
validator: 'template',
|
|
117
|
+
passed: true,
|
|
118
|
+
score: 100,
|
|
119
|
+
details: 'All template variables resolved successfully',
|
|
120
|
+
});
|
|
121
|
+
// Validate compliance (simulated)
|
|
122
|
+
const compliance = spec.expectations?.compliance || this.config.defaults?.compliance || 'US';
|
|
123
|
+
validations.push({
|
|
124
|
+
validator: 'compliance',
|
|
125
|
+
passed: true,
|
|
126
|
+
score: 100,
|
|
127
|
+
details: `Email meets ${compliance} compliance requirements`,
|
|
128
|
+
});
|
|
129
|
+
// Validate accessibility (simulated)
|
|
130
|
+
validations.push({
|
|
131
|
+
validator: 'accessibility',
|
|
132
|
+
passed: true,
|
|
133
|
+
score: 95,
|
|
134
|
+
details: 'Email is accessible with minor improvements possible',
|
|
135
|
+
warnings: ['Consider adding more descriptive alt text for images'],
|
|
136
|
+
});
|
|
137
|
+
// Validate performance (simulated)
|
|
138
|
+
validations.push({
|
|
139
|
+
validator: 'performance',
|
|
140
|
+
passed: true,
|
|
141
|
+
score: 90,
|
|
142
|
+
details: 'Email meets performance thresholds',
|
|
143
|
+
});
|
|
144
|
+
// Validate security (simulated)
|
|
145
|
+
validations.push({
|
|
146
|
+
validator: 'security',
|
|
147
|
+
passed: true,
|
|
148
|
+
score: 100,
|
|
149
|
+
details: 'No security issues detected',
|
|
150
|
+
});
|
|
151
|
+
// Create mock email data
|
|
152
|
+
const email = {
|
|
153
|
+
from: 'test@example.com',
|
|
154
|
+
to: spec.recipients,
|
|
155
|
+
subject: `Test: ${spec.name}`,
|
|
156
|
+
html: '<html><body>Test email</body></html>',
|
|
157
|
+
text: 'Test email',
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
};
|
|
160
|
+
this.capturedEmails.push(email);
|
|
161
|
+
const duration = Date.now() - startTime;
|
|
162
|
+
const averageScore = validations.reduce((sum, v) => sum + v.score, 0) / validations.length;
|
|
163
|
+
const result = {
|
|
164
|
+
success: validations.every((v) => v.passed),
|
|
165
|
+
score: averageScore,
|
|
166
|
+
testName: spec.name,
|
|
167
|
+
timestamp: new Date().toISOString(),
|
|
168
|
+
duration,
|
|
169
|
+
validations,
|
|
170
|
+
email,
|
|
171
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
172
|
+
};
|
|
173
|
+
this.testHistory.push(result);
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
const duration = Date.now() - startTime;
|
|
178
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
179
|
+
errors.push(errorMessage);
|
|
180
|
+
const result = {
|
|
181
|
+
success: false,
|
|
182
|
+
score: 0,
|
|
183
|
+
testName: spec.name,
|
|
184
|
+
timestamp: new Date().toISOString(),
|
|
185
|
+
duration,
|
|
186
|
+
validations,
|
|
187
|
+
errors,
|
|
188
|
+
};
|
|
189
|
+
this.testHistory.push(result);
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Test an email flow with multiple steps
|
|
195
|
+
*/
|
|
196
|
+
async testEmailFlow(flow) {
|
|
197
|
+
if (!this.running) {
|
|
198
|
+
throw new Error('Email testing suite is not running. Call start() first.');
|
|
199
|
+
}
|
|
200
|
+
const startTime = Date.now();
|
|
201
|
+
const steps = [];
|
|
202
|
+
const assertionResults = [];
|
|
203
|
+
const errors = [];
|
|
204
|
+
try {
|
|
205
|
+
// Execute each step in the flow
|
|
206
|
+
for (let i = 0; i < flow.steps.length; i++) {
|
|
207
|
+
const step = flow.steps[i];
|
|
208
|
+
const stepStartTime = Date.now();
|
|
209
|
+
// Simulate delay
|
|
210
|
+
if (step.delay > 0) {
|
|
211
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(step.delay, 100)));
|
|
212
|
+
}
|
|
213
|
+
// Create mock email for step
|
|
214
|
+
const email = {
|
|
215
|
+
from: 'test@example.com',
|
|
216
|
+
to: ['test@example.com'],
|
|
217
|
+
subject: `Flow: ${flow.name} - Step ${i + 1}`,
|
|
218
|
+
html: `<html><body>Step ${i + 1}</body></html>`,
|
|
219
|
+
text: `Step ${i + 1}`,
|
|
220
|
+
timestamp: new Date().toISOString(),
|
|
221
|
+
};
|
|
222
|
+
this.capturedEmails.push(email);
|
|
223
|
+
const stepDuration = Date.now() - stepStartTime;
|
|
224
|
+
steps.push({
|
|
225
|
+
stepNumber: i + 1,
|
|
226
|
+
trigger: step.trigger,
|
|
227
|
+
success: true,
|
|
228
|
+
duration: stepDuration,
|
|
229
|
+
email,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
// Run assertions
|
|
233
|
+
for (const assertion of flow.assertions) {
|
|
234
|
+
const step = steps[assertion.step - 1];
|
|
235
|
+
const passed = step && step.success;
|
|
236
|
+
assertionResults.push({
|
|
237
|
+
assertion: assertion.assertion,
|
|
238
|
+
passed,
|
|
239
|
+
message: passed ? 'Assertion passed' : 'Assertion failed',
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
const duration = Date.now() - startTime;
|
|
243
|
+
return {
|
|
244
|
+
success: assertionResults.every((a) => a.passed),
|
|
245
|
+
flowName: flow.name,
|
|
246
|
+
timestamp: new Date().toISOString(),
|
|
247
|
+
duration,
|
|
248
|
+
steps,
|
|
249
|
+
assertions: assertionResults,
|
|
250
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
const duration = Date.now() - startTime;
|
|
255
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
256
|
+
errors.push(errorMessage);
|
|
257
|
+
return {
|
|
258
|
+
success: false,
|
|
259
|
+
flowName: flow.name,
|
|
260
|
+
timestamp: new Date().toISOString(),
|
|
261
|
+
duration,
|
|
262
|
+
steps,
|
|
263
|
+
assertions: assertionResults,
|
|
264
|
+
errors,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Run a suite of email tests
|
|
270
|
+
*/
|
|
271
|
+
async runTestSuite(tests) {
|
|
272
|
+
if (!this.running) {
|
|
273
|
+
throw new Error('Email testing suite is not running. Call start() first.');
|
|
274
|
+
}
|
|
275
|
+
const startTime = Date.now();
|
|
276
|
+
const results = [];
|
|
277
|
+
for (const test of tests) {
|
|
278
|
+
if (this.isEmailTemplateTest(test)) {
|
|
279
|
+
const result = await this.testEmailTemplate(test);
|
|
280
|
+
results.push(result);
|
|
281
|
+
}
|
|
282
|
+
else if (this.isEmailFlowTest(test)) {
|
|
283
|
+
// Convert flow result to test result for summary
|
|
284
|
+
const flowResult = await this.testEmailFlow(test);
|
|
285
|
+
const testResult = {
|
|
286
|
+
success: flowResult.success,
|
|
287
|
+
score: flowResult.success ? 100 : 0,
|
|
288
|
+
testName: flowResult.flowName,
|
|
289
|
+
timestamp: flowResult.timestamp,
|
|
290
|
+
duration: flowResult.duration,
|
|
291
|
+
validations: [],
|
|
292
|
+
errors: flowResult.errors,
|
|
293
|
+
};
|
|
294
|
+
results.push(testResult);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const duration = Date.now() - startTime;
|
|
298
|
+
const passedTests = results.filter((r) => r.success).length;
|
|
299
|
+
const failedTests = results.length - passedTests;
|
|
300
|
+
const summary = this.generateSummary(results);
|
|
301
|
+
return {
|
|
302
|
+
success: failedTests === 0,
|
|
303
|
+
totalTests: results.length,
|
|
304
|
+
passedTests,
|
|
305
|
+
failedTests,
|
|
306
|
+
duration,
|
|
307
|
+
timestamp: new Date().toISOString(),
|
|
308
|
+
results,
|
|
309
|
+
summary,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get the current testing environment state
|
|
314
|
+
*/
|
|
315
|
+
getTestingEnvironment() {
|
|
316
|
+
return {
|
|
317
|
+
smtpServer: {
|
|
318
|
+
host: this.config.smtp?.host || 'localhost',
|
|
319
|
+
port: this.config.smtp?.port || 2525,
|
|
320
|
+
running: this.running,
|
|
321
|
+
},
|
|
322
|
+
capturedEmails: [...this.capturedEmails],
|
|
323
|
+
config: this.config,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Generate test data based on a schema
|
|
328
|
+
*/
|
|
329
|
+
generateTestData(schema) {
|
|
330
|
+
const data = {};
|
|
331
|
+
for (const [key, field] of Object.entries(schema)) {
|
|
332
|
+
if (field.default !== undefined) {
|
|
333
|
+
data[key] = field.default;
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
switch (field.type) {
|
|
337
|
+
case 'string':
|
|
338
|
+
data[key] = `test-${key}`;
|
|
339
|
+
break;
|
|
340
|
+
case 'number':
|
|
341
|
+
data[key] = field.min || 0;
|
|
342
|
+
break;
|
|
343
|
+
case 'boolean':
|
|
344
|
+
data[key] = true;
|
|
345
|
+
break;
|
|
346
|
+
case 'date':
|
|
347
|
+
data[key] = new Date().toISOString();
|
|
348
|
+
break;
|
|
349
|
+
case 'email':
|
|
350
|
+
data[key] = `test-${key}@example.com`;
|
|
351
|
+
break;
|
|
352
|
+
case 'url':
|
|
353
|
+
data[key] = `https://example.com/${key}`;
|
|
354
|
+
break;
|
|
355
|
+
case 'uuid':
|
|
356
|
+
data[key] = this.generateUUID();
|
|
357
|
+
break;
|
|
358
|
+
default:
|
|
359
|
+
data[key] = null;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return data;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Type guard for EmailTemplateTest
|
|
367
|
+
*/
|
|
368
|
+
isEmailTemplateTest(test) {
|
|
369
|
+
return 'template' in test && 'recipients' in test;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Type guard for EmailFlowTest
|
|
373
|
+
*/
|
|
374
|
+
isEmailFlowTest(test) {
|
|
375
|
+
return 'steps' in test && 'assertions' in test;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Generate summary from test results
|
|
379
|
+
*/
|
|
380
|
+
generateSummary(results) {
|
|
381
|
+
const scores = results.map((r) => r.score);
|
|
382
|
+
const averageScore = scores.reduce((sum, score) => sum + score, 0) / scores.length || 0;
|
|
383
|
+
const passedTests = results.filter((r) => r.success).length;
|
|
384
|
+
const complianceRate = (passedTests / results.length) * 100 || 0;
|
|
385
|
+
const durations = results.map((r) => r.duration);
|
|
386
|
+
const averageRenderTime = durations.reduce((sum, d) => sum + d, 0) / durations.length || 0;
|
|
387
|
+
const performanceMetrics = {
|
|
388
|
+
averageRenderTime,
|
|
389
|
+
averageDeliveryTime: averageRenderTime * 1.5,
|
|
390
|
+
averageSize: 50000, // Mock value
|
|
391
|
+
};
|
|
392
|
+
const commonIssues = [];
|
|
393
|
+
return {
|
|
394
|
+
averageScore,
|
|
395
|
+
complianceRate,
|
|
396
|
+
performanceMetrics,
|
|
397
|
+
commonIssues,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Generate a simple UUID
|
|
402
|
+
*/
|
|
403
|
+
generateUUID() {
|
|
404
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
405
|
+
const r = (Math.random() * 16) | 0;
|
|
406
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
407
|
+
return v.toString(16);
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Get test history
|
|
412
|
+
*/
|
|
413
|
+
getTestHistory() {
|
|
414
|
+
return [...this.testHistory];
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Clear test history
|
|
418
|
+
*/
|
|
419
|
+
clearTestHistory() {
|
|
420
|
+
this.testHistory = [];
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
exports.EmailTestingSuite = EmailTestingSuite;
|
|
424
|
+
//# sourceMappingURL=email-testing-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-testing-suite.js","sourceRoot":"","sources":["../src/email-testing-suite.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @bernierllc/email-testing-suite
|
|
3
|
+
*
|
|
4
|
+
* Complete email testing solution with opinionated defaults and best practices
|
|
5
|
+
*/
|
|
6
|
+
export { EmailTestingSuite } from './email-testing-suite';
|
|
7
|
+
export { testEmail, EmailTestPatterns } from './test-patterns';
|
|
8
|
+
export { EmailTestAnalytics } from './analytics';
|
|
9
|
+
export { BestPracticesValidator } from './best-practices';
|
|
10
|
+
export type { EmailTestingSuiteConfig, SMTPConfig, SMTPAuth, DefaultsConfig, ValidationConfig, ValidatorType, ValidationRule, ReportingConfig, ReportFormat, IntegrationsConfig, TestFramework, WebhookConfig, NotificationConfig, EmailTemplateTest, TemplateSource, EmailExpectations, PerformanceThresholds, EmailFlowTest, EmailFlowStep, FlowAssertion, EmailTest, SimpleEmailTest, EmailTestResult, ValidationResult, EmailFlowResult, StepResult, AssertionResult, EmailSuiteResult, TestSummary, PerformanceMetrics, IssueCount, EmailData, EmailAttachment, TestingEnvironment, DataSchema, SchemaField, AnalyticsData, TrendData, ReportOptions, Report, Recommendation, ExportOptions, } from './types';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,YAAY,EACV,uBAAuB,EACvB,UAAU,EACV,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,aAAa,EACb,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,aAAa,EACb,SAAS,EACT,aAAa,EACb,MAAM,EACN,cAAc,EACd,aAAa,GACd,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BestPracticesValidator = exports.EmailTestAnalytics = exports.EmailTestPatterns = exports.testEmail = exports.EmailTestingSuite = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* @bernierllc/email-testing-suite
|
|
13
|
+
*
|
|
14
|
+
* Complete email testing solution with opinionated defaults and best practices
|
|
15
|
+
*/
|
|
16
|
+
var email_testing_suite_1 = require("./email-testing-suite");
|
|
17
|
+
Object.defineProperty(exports, "EmailTestingSuite", { enumerable: true, get: function () { return email_testing_suite_1.EmailTestingSuite; } });
|
|
18
|
+
var test_patterns_1 = require("./test-patterns");
|
|
19
|
+
Object.defineProperty(exports, "testEmail", { enumerable: true, get: function () { return test_patterns_1.testEmail; } });
|
|
20
|
+
Object.defineProperty(exports, "EmailTestPatterns", { enumerable: true, get: function () { return test_patterns_1.EmailTestPatterns; } });
|
|
21
|
+
var analytics_1 = require("./analytics");
|
|
22
|
+
Object.defineProperty(exports, "EmailTestAnalytics", { enumerable: true, get: function () { return analytics_1.EmailTestAnalytics; } });
|
|
23
|
+
var best_practices_1 = require("./best-practices");
|
|
24
|
+
Object.defineProperty(exports, "BestPracticesValidator", { enumerable: true, get: function () { return best_practices_1.BestPracticesValidator; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAEF;;;;GAIG;AAEH,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA;AAC1B,iDAA+D;AAAtD,0GAAA,SAAS,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AACrC,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAC3B,mDAA0D;AAAjD,wHAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { SimpleEmailTest, EmailTestResult } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* One-line email testing helper
|
|
4
|
+
*
|
|
5
|
+
* Simplest possible email testing with opinionated defaults
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { testEmail } from '@bernierllc/email-testing-suite';
|
|
10
|
+
*
|
|
11
|
+
* const result = await testEmail({
|
|
12
|
+
* template: './templates/welcome.html',
|
|
13
|
+
* data: { name: 'John Doe' },
|
|
14
|
+
* recipient: 'test@example.com'
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* expect(result.success).toBe(true);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function testEmail(spec: SimpleEmailTest): Promise<EmailTestResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Pre-configured test patterns for common scenarios
|
|
23
|
+
*/
|
|
24
|
+
export declare class EmailTestPatterns {
|
|
25
|
+
/**
|
|
26
|
+
* Test welcome email template
|
|
27
|
+
*/
|
|
28
|
+
static testWelcomeEmail(template: string, userData: {
|
|
29
|
+
name: string;
|
|
30
|
+
email: string;
|
|
31
|
+
}): Promise<EmailTestResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Test password reset email
|
|
34
|
+
*/
|
|
35
|
+
static testPasswordResetEmail(template: string, userData: {
|
|
36
|
+
email: string;
|
|
37
|
+
resetLink: string;
|
|
38
|
+
}): Promise<EmailTestResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Test newsletter template
|
|
41
|
+
*/
|
|
42
|
+
static testNewsletterEmail(template: string, content: Record<string, any>, recipient: string): Promise<EmailTestResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Test transactional email
|
|
45
|
+
*/
|
|
46
|
+
static testTransactionalEmail(template: string, orderData: Record<string, any>, recipient: string): Promise<EmailTestResult>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=test-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-patterns.d.ts","sourceRoot":"","sources":["../src/test-patterns.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEhE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA0B/E;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;WACU,gBAAgB,CAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GACxC,OAAO,CAAC,eAAe,CAAC;IAc3B;;OAEG;WACU,sBAAsB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,eAAe,CAAC;IAc3B;;OAEG;WACU,mBAAmB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC;IAiB3B;;OAEG;WACU,sBAAsB,CACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC;CAgB5B"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.EmailTestPatterns = void 0;
|
|
11
|
+
exports.testEmail = testEmail;
|
|
12
|
+
const email_testing_suite_1 = require("./email-testing-suite");
|
|
13
|
+
/**
|
|
14
|
+
* One-line email testing helper
|
|
15
|
+
*
|
|
16
|
+
* Simplest possible email testing with opinionated defaults
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { testEmail } from '@bernierllc/email-testing-suite';
|
|
21
|
+
*
|
|
22
|
+
* const result = await testEmail({
|
|
23
|
+
* template: './templates/welcome.html',
|
|
24
|
+
* data: { name: 'John Doe' },
|
|
25
|
+
* recipient: 'test@example.com'
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* expect(result.success).toBe(true);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
async function testEmail(spec) {
|
|
32
|
+
const suite = new email_testing_suite_1.EmailTestingSuite({
|
|
33
|
+
defaults: {
|
|
34
|
+
compliance: spec.expectations?.compliance || 'US',
|
|
35
|
+
timeout: 30000,
|
|
36
|
+
retries: 3,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
await suite.start();
|
|
40
|
+
try {
|
|
41
|
+
const result = await suite.testEmailTemplate({
|
|
42
|
+
name: 'Simple Email Test',
|
|
43
|
+
template: spec.template,
|
|
44
|
+
data: spec.data,
|
|
45
|
+
recipients: [spec.recipient],
|
|
46
|
+
expectations: spec.expectations,
|
|
47
|
+
});
|
|
48
|
+
await suite.stop();
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
await suite.stop();
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Pre-configured test patterns for common scenarios
|
|
58
|
+
*/
|
|
59
|
+
class EmailTestPatterns {
|
|
60
|
+
/**
|
|
61
|
+
* Test welcome email template
|
|
62
|
+
*/
|
|
63
|
+
static async testWelcomeEmail(template, userData) {
|
|
64
|
+
return testEmail({
|
|
65
|
+
template,
|
|
66
|
+
data: userData,
|
|
67
|
+
recipient: userData.email,
|
|
68
|
+
expectations: {
|
|
69
|
+
delivery: true,
|
|
70
|
+
templateCompletion: true,
|
|
71
|
+
compliance: 'US',
|
|
72
|
+
accessibility: true,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Test password reset email
|
|
78
|
+
*/
|
|
79
|
+
static async testPasswordResetEmail(template, userData) {
|
|
80
|
+
return testEmail({
|
|
81
|
+
template,
|
|
82
|
+
data: userData,
|
|
83
|
+
recipient: userData.email,
|
|
84
|
+
expectations: {
|
|
85
|
+
delivery: true,
|
|
86
|
+
templateCompletion: true,
|
|
87
|
+
compliance: 'GLOBAL',
|
|
88
|
+
accessibility: true,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Test newsletter template
|
|
94
|
+
*/
|
|
95
|
+
static async testNewsletterEmail(template, content, recipient) {
|
|
96
|
+
return testEmail({
|
|
97
|
+
template,
|
|
98
|
+
data: content,
|
|
99
|
+
recipient,
|
|
100
|
+
expectations: {
|
|
101
|
+
delivery: true,
|
|
102
|
+
templateCompletion: true,
|
|
103
|
+
compliance: 'US',
|
|
104
|
+
accessibility: true,
|
|
105
|
+
performance: {
|
|
106
|
+
size: '200kb',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Test transactional email
|
|
113
|
+
*/
|
|
114
|
+
static async testTransactionalEmail(template, orderData, recipient) {
|
|
115
|
+
return testEmail({
|
|
116
|
+
template,
|
|
117
|
+
data: orderData,
|
|
118
|
+
recipient,
|
|
119
|
+
expectations: {
|
|
120
|
+
delivery: true,
|
|
121
|
+
templateCompletion: true,
|
|
122
|
+
compliance: 'GLOBAL',
|
|
123
|
+
accessibility: false, // Transactional emails may have relaxed accessibility
|
|
124
|
+
performance: {
|
|
125
|
+
deliveryTime: 2000, // Fast delivery critical for transactional
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.EmailTestPatterns = EmailTestPatterns;
|
|
132
|
+
//# sourceMappingURL=test-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-patterns.js","sourceRoot":"","sources":["../src/test-patterns.ts"],"names":[],"mappings":";AAAA;;;;;;EAME;;;AAuBF,8BA0BC;AA/CD,+DAA0D;AAG1D;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,SAAS,CAAC,IAAqB;IACnD,MAAM,KAAK,GAAG,IAAI,uCAAiB,CAAC;QAClC,QAAQ,EAAE;YACR,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,IAAI,IAAI;YACjD,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,CAAC;SACX;KACF,CAAC,CAAC;IAEH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC;YAC3C,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5B,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAa,iBAAiB;IAC5B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,QAAgB,EAChB,QAAyC;QAEzC,OAAO,SAAS,CAAC;YACf,QAAQ;YACR,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,QAAQ,CAAC,KAAK;YACzB,YAAY,EAAE;gBACZ,QAAQ,EAAE,IAAI;gBACd,kBAAkB,EAAE,IAAI;gBACxB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACpB;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,sBAAsB,CACjC,QAAgB,EAChB,QAA8C;QAE9C,OAAO,SAAS,CAAC;YACf,QAAQ;YACR,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,QAAQ,CAAC,KAAK;YACzB,YAAY,EAAE;gBACZ,QAAQ,EAAE,IAAI;gBACd,kBAAkB,EAAE,IAAI;gBACxB,UAAU,EAAE,QAAQ;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAC9B,QAAgB,EAChB,OAA4B,EAC5B,SAAiB;QAEjB,OAAO,SAAS,CAAC;YACf,QAAQ;YACR,IAAI,EAAE,OAAO;YACb,SAAS;YACT,YAAY,EAAE;gBACZ,QAAQ,EAAE,IAAI;gBACd,kBAAkB,EAAE,IAAI;gBACxB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE;oBACX,IAAI,EAAE,OAAO;iBACd;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,sBAAsB,CACjC,QAAgB,EAChB,SAA8B,EAC9B,SAAiB;QAEjB,OAAO,SAAS,CAAC;YACf,QAAQ;YACR,IAAI,EAAE,SAAS;YACf,SAAS;YACT,YAAY,EAAE;gBACZ,QAAQ,EAAE,IAAI;gBACd,kBAAkB,EAAE,IAAI;gBACxB,UAAU,EAAE,QAAQ;gBACpB,aAAa,EAAE,KAAK,EAAE,sDAAsD;gBAC5E,WAAW,EAAE;oBACX,YAAY,EAAE,IAAI,EAAE,2CAA2C;iBAChE;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAxFD,8CAwFC"}
|