@memberjunction/communication-types 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.
- package/dist/AddressUtils.d.ts +27 -0
- package/dist/AddressUtils.d.ts.map +1 -0
- package/dist/AddressUtils.js +73 -0
- package/dist/AddressUtils.js.map +1 -0
- package/dist/BaseEngine.d.ts.map +1 -1
- package/dist/BaseEngine.js +3 -0
- package/dist/BaseEngine.js.map +1 -1
- package/dist/BaseProvider.d.ts +385 -1
- package/dist/BaseProvider.d.ts.map +1 -1
- package/dist/BaseProvider.js +112 -0
- package/dist/BaseProvider.js.map +1 -1
- package/dist/__tests__/AddressUtils.test.d.ts +2 -0
- package/dist/__tests__/AddressUtils.test.d.ts.map +1 -0
- package/dist/__tests__/AddressUtils.test.js +67 -0
- package/dist/__tests__/AddressUtils.test.js.map +1 -0
- package/dist/__tests__/BaseProvider.test.js +169 -0
- package/dist/__tests__/BaseProvider.test.js.map +1 -1
- package/dist/__tests__/DryRunContract.test.d.ts +2 -0
- package/dist/__tests__/DryRunContract.test.d.ts.map +1 -0
- package/dist/__tests__/DryRunContract.test.js +154 -0
- package/dist/__tests__/DryRunContract.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/BaseProvider.js
CHANGED
|
@@ -205,6 +205,118 @@ export class BaseCommunicationProvider {
|
|
|
205
205
|
ErrorMessage: `${this.ProviderName} does not support DownloadAttachment (MessageID: ${params.MessageID}, AttachmentID: ${params.AttachmentID}, credentials provided: ${!!credentials})`
|
|
206
206
|
};
|
|
207
207
|
}
|
|
208
|
+
// ========================================================================
|
|
209
|
+
// PUSH-NOTIFICATION SUBSCRIPTIONS - Override in subclasses to provide push support
|
|
210
|
+
// Default implementations return "not supported". Providers stay stateless: they
|
|
211
|
+
// create/renew/delete subscriptions with the remote service and parse inbound
|
|
212
|
+
// notifications, but never persist subscription state. See the type docs above.
|
|
213
|
+
//
|
|
214
|
+
// TWO PUSH SHAPES (a provider is one or the other, never neither-when-SupportsPush):
|
|
215
|
+
// • Subscription-managed (Graph, Gmail): the provider programmatically creates the
|
|
216
|
+
// registration (CreateSubscription), the service delivers HINT notifications, the
|
|
217
|
+
// consumer re-fetches via GetMessages. May expire (RenewSubscription).
|
|
218
|
+
// • Inbound-parse (SendGrid, Twilio): the notification carries the payload inline;
|
|
219
|
+
// ParseNotification populates NormalizedNotification.Message. Management may exist
|
|
220
|
+
// (Twilio SmsUrl, SendGrid Parse Settings) but there is no expiry/renewal.
|
|
221
|
+
//
|
|
222
|
+
// CAPABILITY GATE: SupportsPush === (GetSubscriptionCapabilities() !== undefined). The
|
|
223
|
+
// default SupportsPush getter derives from capabilities, so a provider "opts in" simply
|
|
224
|
+
// by returning capabilities - no separate flag to keep in sync (avoids the drift a hand-
|
|
225
|
+
// maintained boolean invites). Any push provider MUST implement ParseNotification and
|
|
226
|
+
// list it in getSupportedOperations(). Whether it ALSO implements Create/Renew/Delete is
|
|
227
|
+
// expressed by SubscriptionCapabilities.SupportsSubscriptionManagement + MaxLifetimeMinutes,
|
|
228
|
+
// and those ops must appear in getSupportedOperations() when implemented.
|
|
229
|
+
// ========================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Convenience gate: `true` when this provider supports inbound push in ANY form
|
|
232
|
+
* (subscription-managed or inbound-parse), `false` otherwise. Lets callers cleanly
|
|
233
|
+
* short-circuit — `if (provider.SupportsPush) { ... }` — instead of probing individual
|
|
234
|
+
* operations.
|
|
235
|
+
*
|
|
236
|
+
* Derived from {@link GetSubscriptionCapabilities} so it stays in lockstep with actual
|
|
237
|
+
* capability: providers that support push return capabilities and thereby report
|
|
238
|
+
* `SupportsPush === true` for free; providers that don't return `undefined` and report
|
|
239
|
+
* `false`. Subclasses normally do NOT override this — override
|
|
240
|
+
* {@link GetSubscriptionCapabilities} instead.
|
|
241
|
+
*/
|
|
242
|
+
get SupportsPush() {
|
|
243
|
+
return this.GetSubscriptionCapabilities() !== undefined;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Creates a push-notification subscription with the remote messaging service.
|
|
247
|
+
* Override in subclasses that support this operation.
|
|
248
|
+
* @param params - Parameters describing what to watch and where to notify
|
|
249
|
+
* @param credentials - Optional credentials override for this request
|
|
250
|
+
* @returns Promise<SubscriptionResult> - The created subscription's ID and expiration
|
|
251
|
+
*/
|
|
252
|
+
async CreateSubscription(params, credentials) {
|
|
253
|
+
return {
|
|
254
|
+
Success: false,
|
|
255
|
+
ErrorMessage: `${this.ProviderName} does not support CreateSubscription (Identifier: ${params.Identifier}, credentials provided: ${!!credentials})`
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Renews an existing subscription before it expires. The caller MUST pass credentials
|
|
260
|
+
* for the same account/app registration used to create the subscription.
|
|
261
|
+
* Override in subclasses that support this operation.
|
|
262
|
+
* @param params - Parameters identifying the subscription and the new expiration
|
|
263
|
+
* @param credentials - Optional credentials override for this request
|
|
264
|
+
* @returns Promise<SubscriptionResult> - The renewed subscription's expiration
|
|
265
|
+
*/
|
|
266
|
+
async RenewSubscription(params, credentials) {
|
|
267
|
+
return {
|
|
268
|
+
Success: false,
|
|
269
|
+
ErrorMessage: `${this.ProviderName} does not support RenewSubscription (SubscriptionID: ${params.SubscriptionID}, credentials provided: ${!!credentials})`
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Deletes an existing subscription. The caller MUST pass credentials for the same
|
|
274
|
+
* account/app registration used to create the subscription. Implementations should
|
|
275
|
+
* treat "already gone" (e.g. 404) as success - deletion is idempotent from the
|
|
276
|
+
* consumer's perspective.
|
|
277
|
+
* Override in subclasses that support this operation.
|
|
278
|
+
* @param params - Parameters identifying the subscription to delete
|
|
279
|
+
* @param credentials - Optional credentials override for this request
|
|
280
|
+
* @returns Promise<BaseMessageResult> - Result of the delete operation
|
|
281
|
+
*/
|
|
282
|
+
async DeleteSubscription(params, credentials) {
|
|
283
|
+
return {
|
|
284
|
+
Success: false,
|
|
285
|
+
ErrorMessage: `${this.ProviderName} does not support DeleteSubscription (SubscriptionID: ${params.SubscriptionID}, credentials provided: ${!!credentials})`
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Parses and validates an inbound push notification. This is a pure operation: no
|
|
290
|
+
* network calls. It MUST be safe on hostile/garbage input - never throw on malformed
|
|
291
|
+
* payloads; return `Success: false` with `SuggestedResponseStatus: 400` instead.
|
|
292
|
+
*
|
|
293
|
+
* When the result carries a {@link ParseNotificationResult.Handshake}, the consumer
|
|
294
|
+
* must send exactly that response and process nothing else (endpoint validation).
|
|
295
|
+
* Override in subclasses that support this operation.
|
|
296
|
+
* @param input - Transport-neutral capture of the inbound webhook request
|
|
297
|
+
* @param credentials - Optional credentials override (for schemes that verify signatures)
|
|
298
|
+
* @returns Promise<ParseNotificationResult> - Normalized notifications and/or handshake
|
|
299
|
+
*/
|
|
300
|
+
async ParseNotification(input, credentials) {
|
|
301
|
+
return {
|
|
302
|
+
Success: false,
|
|
303
|
+
ErrorMessage: `${this.ProviderName} does not support ParseNotification (body length: ${input.RawBody?.length ?? 0}, credentials provided: ${!!credentials})`,
|
|
304
|
+
Notifications: [],
|
|
305
|
+
SuggestedResponseStatus: 400
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Returns this provider's subscription capabilities, or `undefined` when subscriptions
|
|
310
|
+
* are not supported. Consumers use this to schedule renewals and validate change types
|
|
311
|
+
* generically. Override in subclasses that support subscriptions.
|
|
312
|
+
*
|
|
313
|
+
* INVARIANT: returning a defined value here REQUIRES the four subscription operations
|
|
314
|
+
* to appear in {@link getSupportedOperations}.
|
|
315
|
+
* @returns SubscriptionCapabilities when supported, otherwise undefined
|
|
316
|
+
*/
|
|
317
|
+
GetSubscriptionCapabilities() {
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
208
320
|
}
|
|
209
321
|
let MJCommunicationProviderEntityExtended = class MJCommunicationProviderEntityExtended extends MJCommunicationProviderEntity {
|
|
210
322
|
get MessageTypes() {
|
package/dist/BaseProvider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseProvider.js","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,6BAA6B,EAAgG,MAAM,+BAA+B,CAAC;AAG5K;;GAEG;AACH,MAAM,OAAO,gBAAgB;CAe5B;AAGD;;GAEG;AACH,MAAM,OAAO,OAAO;
|
|
1
|
+
{"version":3,"file":"BaseProvider.js","sourceRoot":"","sources":["../src/BaseProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddressUtils.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/AddressUtils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for AddressUtils — RFC 5322 address-list header parsing.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { ParseEmailAddressList } from '../AddressUtils.js';
|
|
6
|
+
describe('ParseEmailAddressList', () => {
|
|
7
|
+
describe('empty and absent input', () => {
|
|
8
|
+
it('returns [] for undefined', () => {
|
|
9
|
+
expect(ParseEmailAddressList(undefined)).toEqual([]);
|
|
10
|
+
});
|
|
11
|
+
it('returns [] for null', () => {
|
|
12
|
+
expect(ParseEmailAddressList(null)).toEqual([]);
|
|
13
|
+
});
|
|
14
|
+
it('returns [] for an empty string', () => {
|
|
15
|
+
expect(ParseEmailAddressList('')).toEqual([]);
|
|
16
|
+
});
|
|
17
|
+
it('returns [] for whitespace-only input', () => {
|
|
18
|
+
expect(ParseEmailAddressList(' ')).toEqual([]);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('bare addresses', () => {
|
|
22
|
+
it('parses a single bare address', () => {
|
|
23
|
+
expect(ParseEmailAddressList('jane@example.com')).toEqual(['jane@example.com']);
|
|
24
|
+
});
|
|
25
|
+
it('parses multiple comma-separated bare addresses', () => {
|
|
26
|
+
expect(ParseEmailAddressList('a@x.com, b@y.com,c@z.com')).toEqual(['a@x.com', 'b@y.com', 'c@z.com']);
|
|
27
|
+
});
|
|
28
|
+
it('trims surrounding whitespace', () => {
|
|
29
|
+
expect(ParseEmailAddressList(' a@x.com , b@y.com ')).toEqual(['a@x.com', 'b@y.com']);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('display-name forms', () => {
|
|
33
|
+
it('extracts the address from an unquoted display name with angle brackets', () => {
|
|
34
|
+
expect(ParseEmailAddressList('Jane Doe <jane@example.com>')).toEqual(['jane@example.com']);
|
|
35
|
+
});
|
|
36
|
+
it('extracts the address from a quoted display name', () => {
|
|
37
|
+
expect(ParseEmailAddressList('"Jane Doe" <jane@example.com>')).toEqual(['jane@example.com']);
|
|
38
|
+
});
|
|
39
|
+
it('keeps quoted display names containing commas intact', () => {
|
|
40
|
+
expect(ParseEmailAddressList('"Doe, Jane" <jane@example.com>, bob@example.com')).toEqual([
|
|
41
|
+
'jane@example.com',
|
|
42
|
+
'bob@example.com'
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
it('handles multiple quoted-comma names in one list', () => {
|
|
46
|
+
expect(ParseEmailAddressList('"Doe, Jane" <jane@x.com>, "Smith, Bob" <bob@y.com>, plain@z.com')).toEqual(['jane@x.com', 'bob@y.com', 'plain@z.com']);
|
|
47
|
+
});
|
|
48
|
+
it('handles a display name containing an @ by preferring the angle-bracket address', () => {
|
|
49
|
+
expect(ParseEmailAddressList('"jane@old.example" <jane@new.example>')).toEqual(['jane@new.example']);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('mixed and malformed entries', () => {
|
|
53
|
+
it('parses a mix of bare, named, and quoted forms preserving order', () => {
|
|
54
|
+
expect(ParseEmailAddressList('first@x.com, Second Person <second@y.com>, "Third, Person" <third@z.com>')).toEqual(['first@x.com', 'second@y.com', 'third@z.com']);
|
|
55
|
+
});
|
|
56
|
+
it('drops entries with no plausible address', () => {
|
|
57
|
+
expect(ParseEmailAddressList('undisclosed-recipients:;, real@example.com')).toEqual(['real@example.com']);
|
|
58
|
+
});
|
|
59
|
+
it('drops empty segments from trailing or doubled commas', () => {
|
|
60
|
+
expect(ParseEmailAddressList('a@x.com,, b@y.com,')).toEqual(['a@x.com', 'b@y.com']);
|
|
61
|
+
});
|
|
62
|
+
it('drops an angle-bracket entry whose address part has no @', () => {
|
|
63
|
+
expect(ParseEmailAddressList('Broken <not-an-address>, ok@example.com')).toEqual(['ok@example.com']);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=AddressUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddressUtils.test.js","sourceRoot":"","sources":["../../src/__tests__/AddressUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,67 @@ class TestProvider extends BaseCommunicationProvider {
|
|
|
38
38
|
return { Success: true };
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
+
// A subscription-managed, HINT-mode push provider (Graph/Gmail shape): full CRUD, the
|
|
42
|
+
// notification only carries MessageIDs to re-fetch with — never an inline Message.
|
|
43
|
+
class SubscriptionManagedPushProvider extends TestProvider {
|
|
44
|
+
getSupportedOperations() {
|
|
45
|
+
return [
|
|
46
|
+
...super.getSupportedOperations(),
|
|
47
|
+
'CreateSubscription',
|
|
48
|
+
'RenewSubscription',
|
|
49
|
+
'DeleteSubscription',
|
|
50
|
+
'ParseNotification',
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
GetSubscriptionCapabilities() {
|
|
54
|
+
return {
|
|
55
|
+
MaxLifetimeMinutes: 4230,
|
|
56
|
+
SupportedChangeTypes: ['created'],
|
|
57
|
+
RequiresEndpointValidation: true,
|
|
58
|
+
SupportsSubscriptionManagement: true,
|
|
59
|
+
DeliversPayloadInline: false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async ParseNotification(_input) {
|
|
63
|
+
return {
|
|
64
|
+
Success: true,
|
|
65
|
+
Notifications: [{ Kind: 'message', MessageIDs: ['ext-1'] }],
|
|
66
|
+
SuggestedResponseStatus: 202,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// A parse-only, INLINE-mode push provider (SendGrid shape): no renewal, the notification
|
|
71
|
+
// carries the full message inline in NormalizedNotification.Message (no re-fetch path).
|
|
72
|
+
class InlineParsePushProvider extends TestProvider {
|
|
73
|
+
getSupportedOperations() {
|
|
74
|
+
return [
|
|
75
|
+
...super.getSupportedOperations(),
|
|
76
|
+
'CreateSubscription',
|
|
77
|
+
'DeleteSubscription',
|
|
78
|
+
'ParseNotification',
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
GetSubscriptionCapabilities() {
|
|
82
|
+
return {
|
|
83
|
+
MaxLifetimeMinutes: undefined,
|
|
84
|
+
SupportedChangeTypes: ['created'],
|
|
85
|
+
RequiresEndpointValidation: false,
|
|
86
|
+
SupportsSubscriptionManagement: true,
|
|
87
|
+
DeliversPayloadInline: true,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async ParseNotification(_input) {
|
|
91
|
+
return {
|
|
92
|
+
Success: true,
|
|
93
|
+
Notifications: [{
|
|
94
|
+
Kind: 'message',
|
|
95
|
+
MessageIDs: [],
|
|
96
|
+
Message: { From: 'a@x.com', To: 'b@y.com', Body: 'hello', Subject: 'hi' },
|
|
97
|
+
}],
|
|
98
|
+
SuggestedResponseStatus: 200,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
41
102
|
describe('Message', () => {
|
|
42
103
|
it('should create a new Message with default properties', () => {
|
|
43
104
|
const msg = new Message();
|
|
@@ -183,6 +244,114 @@ describe('BaseCommunicationProvider', () => {
|
|
|
183
244
|
expect(result.ErrorMessage).toContain('credentials provided: false');
|
|
184
245
|
});
|
|
185
246
|
});
|
|
247
|
+
describe('subscription default implementations', () => {
|
|
248
|
+
it('CreateSubscription should return not supported', async () => {
|
|
249
|
+
const result = await provider.CreateSubscription({
|
|
250
|
+
ChangeTypes: ['created'],
|
|
251
|
+
NotificationUrl: 'https://example.com/hook',
|
|
252
|
+
ClientState: 'secret',
|
|
253
|
+
Identifier: 'mailbox@test.com',
|
|
254
|
+
});
|
|
255
|
+
expect(result.Success).toBe(false);
|
|
256
|
+
expect(result.ErrorMessage).toContain('does not support CreateSubscription');
|
|
257
|
+
expect(result.ErrorMessage).toContain('mailbox@test.com');
|
|
258
|
+
});
|
|
259
|
+
it('RenewSubscription should return not supported', async () => {
|
|
260
|
+
const result = await provider.RenewSubscription({ SubscriptionID: 'sub-1' });
|
|
261
|
+
expect(result.Success).toBe(false);
|
|
262
|
+
expect(result.ErrorMessage).toContain('does not support RenewSubscription');
|
|
263
|
+
expect(result.ErrorMessage).toContain('sub-1');
|
|
264
|
+
});
|
|
265
|
+
it('DeleteSubscription should return not supported', async () => {
|
|
266
|
+
const result = await provider.DeleteSubscription({ SubscriptionID: 'sub-1' });
|
|
267
|
+
expect(result.Success).toBe(false);
|
|
268
|
+
expect(result.ErrorMessage).toContain('does not support DeleteSubscription');
|
|
269
|
+
expect(result.ErrorMessage).toContain('sub-1');
|
|
270
|
+
});
|
|
271
|
+
it('ParseNotification should return not supported with empty notifications and a 400', async () => {
|
|
272
|
+
const result = await provider.ParseNotification({
|
|
273
|
+
Headers: {},
|
|
274
|
+
QueryParams: {},
|
|
275
|
+
RawBody: '{}',
|
|
276
|
+
});
|
|
277
|
+
expect(result.Success).toBe(false);
|
|
278
|
+
expect(result.ErrorMessage).toContain('does not support ParseNotification');
|
|
279
|
+
expect(result.Notifications).toEqual([]);
|
|
280
|
+
expect(result.SuggestedResponseStatus).toBe(400);
|
|
281
|
+
});
|
|
282
|
+
it('GetSubscriptionCapabilities should return undefined by default', () => {
|
|
283
|
+
expect(provider.GetSubscriptionCapabilities()).toBeUndefined();
|
|
284
|
+
});
|
|
285
|
+
it('subscription operations are absent from getSupportedOperations by default', () => {
|
|
286
|
+
expect(provider.supportsOperation('CreateSubscription')).toBe(false);
|
|
287
|
+
expect(provider.supportsOperation('RenewSubscription')).toBe(false);
|
|
288
|
+
expect(provider.supportsOperation('DeleteSubscription')).toBe(false);
|
|
289
|
+
expect(provider.supportsOperation('ParseNotification')).toBe(false);
|
|
290
|
+
});
|
|
291
|
+
it('SupportsPush is false by default (no capabilities)', () => {
|
|
292
|
+
expect(provider.SupportsPush).toBe(false);
|
|
293
|
+
});
|
|
294
|
+
it('capability gate holds for the default provider: no capabilities, no push, no ops', () => {
|
|
295
|
+
expect(provider.GetSubscriptionCapabilities()).toBeUndefined();
|
|
296
|
+
expect(provider.SupportsPush).toBe(false);
|
|
297
|
+
const ops = provider.getSupportedOperations();
|
|
298
|
+
expect(ops.includes('ParseNotification')).toBe(false);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
describe('push capability gate (SupportsPush + generalized invariant)', () => {
|
|
302
|
+
it('SupportsPush derives from GetSubscriptionCapabilities (subscription-managed provider)', () => {
|
|
303
|
+
const p = new SubscriptionManagedPushProvider();
|
|
304
|
+
expect(p.GetSubscriptionCapabilities()).toBeDefined();
|
|
305
|
+
expect(p.SupportsPush).toBe(true);
|
|
306
|
+
});
|
|
307
|
+
it('SupportsPush derives from GetSubscriptionCapabilities (inline-parse provider)', () => {
|
|
308
|
+
const p = new InlineParsePushProvider();
|
|
309
|
+
expect(p.GetSubscriptionCapabilities()).toBeDefined();
|
|
310
|
+
expect(p.SupportsPush).toBe(true);
|
|
311
|
+
});
|
|
312
|
+
it('GENERALIZED INVARIANT: SupportsPush IFF capabilities defined, for every shape', () => {
|
|
313
|
+
for (const p of [new TestProvider(), new SubscriptionManagedPushProvider(), new InlineParsePushProvider()]) {
|
|
314
|
+
expect(p.SupportsPush).toBe(p.GetSubscriptionCapabilities() !== undefined);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
it('a push provider MUST support ParseNotification (the common denominator)', () => {
|
|
318
|
+
for (const p of [new SubscriptionManagedPushProvider(), new InlineParsePushProvider()]) {
|
|
319
|
+
expect(p.SupportsPush).toBe(true);
|
|
320
|
+
expect(p.supportsOperation('ParseNotification')).toBe(true);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
it('SupportsSubscriptionManagement agrees with Create/Delete ops being present', () => {
|
|
324
|
+
for (const p of [new SubscriptionManagedPushProvider(), new InlineParsePushProvider()]) {
|
|
325
|
+
const caps = p.GetSubscriptionCapabilities();
|
|
326
|
+
const hasCreate = p.supportsOperation('CreateSubscription');
|
|
327
|
+
const hasDelete = p.supportsOperation('DeleteSubscription');
|
|
328
|
+
expect(caps.SupportsSubscriptionManagement).toBe(hasCreate && hasDelete);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
it('RenewSubscription op present IFF the service has a finite MaxLifetimeMinutes', () => {
|
|
332
|
+
const managed = new SubscriptionManagedPushProvider();
|
|
333
|
+
expect(managed.GetSubscriptionCapabilities().MaxLifetimeMinutes).toBeTypeOf('number');
|
|
334
|
+
expect(managed.supportsOperation('RenewSubscription')).toBe(true);
|
|
335
|
+
const inline = new InlineParsePushProvider();
|
|
336
|
+
expect(inline.GetSubscriptionCapabilities().MaxLifetimeMinutes).toBeUndefined();
|
|
337
|
+
expect(inline.supportsOperation('RenewSubscription')).toBe(false);
|
|
338
|
+
});
|
|
339
|
+
it('HINT-mode notifications carry MessageIDs and no inline Message', async () => {
|
|
340
|
+
const p = new SubscriptionManagedPushProvider();
|
|
341
|
+
expect(p.GetSubscriptionCapabilities().DeliversPayloadInline).toBe(false);
|
|
342
|
+
const result = await p.ParseNotification({ Headers: {}, QueryParams: {}, RawBody: '{}' });
|
|
343
|
+
expect(result.Notifications[0].MessageIDs.length).toBeGreaterThan(0);
|
|
344
|
+
expect(result.Notifications[0].Message).toBeUndefined();
|
|
345
|
+
});
|
|
346
|
+
it('INLINE-mode notifications carry the Message payload directly (no re-fetch)', async () => {
|
|
347
|
+
const p = new InlineParsePushProvider();
|
|
348
|
+
expect(p.GetSubscriptionCapabilities().DeliversPayloadInline).toBe(true);
|
|
349
|
+
const result = await p.ParseNotification({ Headers: {}, QueryParams: {}, RawBody: '' });
|
|
350
|
+
expect(result.Notifications[0].Message).toBeDefined();
|
|
351
|
+
expect(result.Notifications[0].Message?.Body).toBe('hello');
|
|
352
|
+
expect(result.Notifications[0].MessageIDs).toEqual([]);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
186
355
|
});
|
|
187
356
|
describe('MJCommunicationProviderEntityExtended', () => {
|
|
188
357
|
it('should get and set MessageTypes', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseProvider.test.js","sourceRoot":"","sources":["../../src/__tests__/BaseProvider.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseProvider.test.js","sourceRoot":"","sources":["../../src/__tests__/BaseProvider.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,6BAA6B;AAC7B,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE;KAAQ;IACpB,QAAQ,EAAE;KAAQ;CACrB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,aAAa,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;CAChC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,6BAA6B,EAAE;KAAQ;IACvC,wCAAwC,EAAE;KAAQ;IAClD,wBAAwB,EAAE;KAAQ;IAClC,wBAAwB,EAAE;KAAQ;CACrC,CAAC,CAAC,CAAC;AAEJ,OAAO,EACH,OAAO,EACP,gBAAgB,EAChB,aAAa,EACb,yBAAyB,EACzB,qCAAqC,GAIxC,MAAM,iBAAiB,CAAC;AAEzB,qDAAqD;AACrD,MAAM,YAAa,SAAQ,yBAAyB;IACzC,KAAK,CAAC,iBAAiB,CAAC,OAAyB;QACpD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC1D,CAAC;IACM,KAAK,CAAC,WAAW;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IACM,KAAK,CAAC,cAAc;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACM,KAAK,CAAC,cAAc;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACM,KAAK,CAAC,WAAW;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;CACJ;AAED,sFAAsF;AACtF,mFAAmF;AACnF,MAAM,+BAAgC,SAAQ,YAAY;IACtC,sBAAsB;QAClC,OAAO;YACH,GAAG,KAAK,CAAC,sBAAsB,EAAE;YACjC,oBAA6B;YAC7B,mBAA4B;YAC5B,oBAA6B;YAC7B,mBAA4B;SAC/B,CAAC;IACN,CAAC;IACe,2BAA2B;QACvC,OAAO;YACH,kBAAkB,EAAE,IAAI;YACxB,oBAAoB,EAAE,CAAC,SAAkB,CAAC;YAC1C,0BAA0B,EAAE,IAAI;YAChC,8BAA8B,EAAE,IAAI;YACpC,qBAAqB,EAAE,KAAK;SAC/B,CAAC;IACN,CAAC;IACe,KAAK,CAAC,iBAAiB,CAAC,MAAgC;QACpE,OAAO;YACH,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,uBAAuB,EAAE,GAAG;SAC/B,CAAC;IACN,CAAC;CACJ;AAED,yFAAyF;AACzF,wFAAwF;AACxF,MAAM,uBAAwB,SAAQ,YAAY;IAC9B,sBAAsB;QAClC,OAAO;YACH,GAAG,KAAK,CAAC,sBAAsB,EAAE;YACjC,oBAA6B;YAC7B,oBAA6B;YAC7B,mBAA4B;SAC/B,CAAC;IACN,CAAC;IACe,2BAA2B;QACvC,OAAO;YACH,kBAAkB,EAAE,SAAS;YAC7B,oBAAoB,EAAE,CAAC,SAAkB,CAAC;YAC1C,0BAA0B,EAAE,KAAK;YACjC,8BAA8B,EAAE,IAAI;YACpC,qBAAqB,EAAE,IAAI;SAC9B,CAAC;IACN,CAAC;IACe,KAAK,CAAC,iBAAiB,CAAC,MAAgC;QACpE,OAAO;YACH,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,CAAC;oBACZ,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,EAAE;oBACd,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;iBAC5E,CAAC;YACF,uBAAuB,EAAE,GAAG;SAC/B,CAAC;IACN,CAAC;CACJ;AAED,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACnE,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAClC,QAAQ,CAAC,EAAE,GAAG,oBAAoB,CAAC;QACnC,QAAQ,CAAC,OAAO,GAAG,cAAc,CAAC;QAClC,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC;QAC5B,QAAQ,CAAC,YAAY,GAAG,CAAC,aAAa,CAAC,CAAC;QACxC,QAAQ,CAAC,aAAa,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1C,QAAQ,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QAE3C,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACrE,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,SAAS,CAAC,EAAE,GAAG,eAAe,CAAC;QAC/B,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC;QACjC,SAAS,CAAC,WAAW,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAEzC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QAElB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACvC,IAAI,QAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACZ,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACnD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7D,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACzD,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,CAAC;YACnG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3F,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;YAChG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAC1C,EAAE,SAAS,EAAE,OAAO,EAAE,EACtB,EAAE,0BAA0B,EAAE,KAAK,EAAE,CACxC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC;gBAC7C,WAAW,EAAE,CAAC,SAAS,CAAC;gBACxB,eAAe,EAAE,0BAA0B;gBAC3C,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE,kBAAkB;aACjC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;YAC7E,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;YAC5E,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;YAC7E,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;YAC9F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC;gBAC5C,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE;gBACf,OAAO,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;YAC5E,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACtE,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;YACjF,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC1D,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;YACxF,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;YAC/D,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACzE,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;YAC7F,MAAM,CAAC,GAAG,IAAI,+BAA+B,EAAE,CAAC;YAChD,MAAM,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;YACrF,MAAM,CAAC,GAAG,IAAI,uBAAuB,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;YACrF,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,EAAE,IAAI,+BAA+B,EAAE,EAAE,IAAI,uBAAuB,EAAE,CAAC,EAAE,CAAC;gBACzG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B,EAAE,KAAK,SAAS,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YAC/E,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,+BAA+B,EAAE,EAAE,IAAI,uBAAuB,EAAE,CAAC,EAAE,CAAC;gBACrF,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;YAClF,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,+BAA+B,EAAE,EAAE,IAAI,uBAAuB,EAAE,CAAC,EAAE,CAAC;gBACrF,MAAM,IAAI,GAAG,CAAC,CAAC,2BAA2B,EAAG,CAAC;gBAC9C,MAAM,SAAS,GAAG,CAAC,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,CAAC,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;YAC7E,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;YACpF,MAAM,OAAO,GAAG,IAAI,+BAA+B,EAAE,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAG,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvF,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElE,MAAM,MAAM,GAAG,IAAI,uBAAuB,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,2BAA2B,EAAG,CAAC,kBAAkB,CAAC,CAAC,aAAa,EAAE,CAAC;YACjF,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,CAAC,GAAG,IAAI,+BAA+B,EAAE,CAAC;YAChD,MAAM,CAAC,CAAC,CAAC,2BAA2B,EAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,CAAC,GAAG,IAAI,uBAAuB,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,2BAA2B,EAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,IAAK,qCAAqG,EAAE,CAAC;QAC5H,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QAE5C,MAAM,SAAS,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,GAAG,SAAkB,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DryRunContract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/DryRunContract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the DryRun seam at the BASE contract level:
|
|
3
|
+
* - `Message.DryRun` survives the copy constructor (the engine copies the message per recipient)
|
|
4
|
+
* - `MessageResult.DryRun` is part of the result contract
|
|
5
|
+
* - `CommunicationEngineBase.StartLog` stamps `DryRun: true` into the audit MessageContent JSON
|
|
6
|
+
* for dry-run sends, and omits the marker entirely for real sends
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
9
|
+
const { mockSave, mockGetEntityObject } = vi.hoisted(() => ({
|
|
10
|
+
mockSave: vi.fn(),
|
|
11
|
+
mockGetEntityObject: vi.fn(),
|
|
12
|
+
}));
|
|
13
|
+
vi.mock('@memberjunction/core', () => {
|
|
14
|
+
class MockBaseEngine {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.ContextUser = { ID: 'user-1' };
|
|
17
|
+
}
|
|
18
|
+
get ProviderToUse() {
|
|
19
|
+
return { GetEntityObject: mockGetEntityObject };
|
|
20
|
+
}
|
|
21
|
+
async Load() { }
|
|
22
|
+
static { this._instances = new Map(); }
|
|
23
|
+
static getInstance() {
|
|
24
|
+
if (!this._instances.has(this)) {
|
|
25
|
+
this._instances.set(this, new this());
|
|
26
|
+
}
|
|
27
|
+
return this._instances.get(this);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
BaseEngine: MockBaseEngine,
|
|
32
|
+
BaseEntity: class {
|
|
33
|
+
},
|
|
34
|
+
BaseEnginePropertyConfig: class {
|
|
35
|
+
},
|
|
36
|
+
IMetadataProvider: class {
|
|
37
|
+
},
|
|
38
|
+
Metadata: vi.fn().mockImplementation(function () {
|
|
39
|
+
return { GetEntityObject: mockGetEntityObject };
|
|
40
|
+
}),
|
|
41
|
+
UserInfo: class {
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
vi.mock('@memberjunction/core-entities', () => ({
|
|
46
|
+
MJCommunicationBaseMessageTypeEntity: class {
|
|
47
|
+
},
|
|
48
|
+
MJCommunicationLogEntity: class {
|
|
49
|
+
},
|
|
50
|
+
MJCommunicationProviderEntity: class {
|
|
51
|
+
},
|
|
52
|
+
MJCommunicationProviderMessageTypeEntity: class {
|
|
53
|
+
},
|
|
54
|
+
MJCommunicationRunEntity: class {
|
|
55
|
+
},
|
|
56
|
+
MJEntityCommunicationFieldEntity: class {
|
|
57
|
+
},
|
|
58
|
+
MJEntityCommunicationMessageTypeEntity: class {
|
|
59
|
+
},
|
|
60
|
+
MJTemplateEntityExtended: class {
|
|
61
|
+
},
|
|
62
|
+
}));
|
|
63
|
+
vi.mock('@memberjunction/global', () => ({
|
|
64
|
+
RegisterClass: () => () => { },
|
|
65
|
+
UUIDsEqual: (a, b) => a?.toLowerCase() === b?.toLowerCase(),
|
|
66
|
+
}));
|
|
67
|
+
import { CommunicationEngineBase } from '../BaseEngine.js';
|
|
68
|
+
import { Message, MessageResult } from '../BaseProvider.js';
|
|
69
|
+
function makeLogMock() {
|
|
70
|
+
return {
|
|
71
|
+
CommunicationRunID: undefined,
|
|
72
|
+
Status: '',
|
|
73
|
+
CommunicationProviderID: '',
|
|
74
|
+
CommunicationProviderMessageTypeID: '',
|
|
75
|
+
MessageDate: null,
|
|
76
|
+
Direction: '',
|
|
77
|
+
MessageContent: '',
|
|
78
|
+
Save: mockSave.mockResolvedValue(true),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function makeProcessedMessage(dryRun) {
|
|
82
|
+
return {
|
|
83
|
+
MessageType: { CommunicationProviderID: 'prov-1', ID: 'pmt-1' },
|
|
84
|
+
To: 'user@test.com',
|
|
85
|
+
From: 'sender@test.com',
|
|
86
|
+
ProcessedSubject: 'Subject',
|
|
87
|
+
ProcessedHTMLBody: '<p>Hello</p>',
|
|
88
|
+
ProcessedBody: 'Hello',
|
|
89
|
+
DryRun: dryRun,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
describe('DryRun base contract', () => {
|
|
93
|
+
beforeEach(() => {
|
|
94
|
+
vi.clearAllMocks();
|
|
95
|
+
});
|
|
96
|
+
describe('Message.DryRun', () => {
|
|
97
|
+
it('should default to undefined (real send)', () => {
|
|
98
|
+
const msg = new Message();
|
|
99
|
+
expect(msg.DryRun).toBeUndefined();
|
|
100
|
+
});
|
|
101
|
+
it('should survive the copy constructor (per-recipient copies keep the flag)', () => {
|
|
102
|
+
const original = new Message();
|
|
103
|
+
original.To = 'a@test.com';
|
|
104
|
+
original.DryRun = true;
|
|
105
|
+
const copy = new Message(original);
|
|
106
|
+
expect(copy.DryRun).toBe(true);
|
|
107
|
+
expect(copy.To).toBe('a@test.com');
|
|
108
|
+
});
|
|
109
|
+
it('should keep an explicit false through the copy constructor', () => {
|
|
110
|
+
const original = new Message();
|
|
111
|
+
original.DryRun = false;
|
|
112
|
+
const copy = new Message(original);
|
|
113
|
+
expect(copy.DryRun).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('MessageResult.DryRun', () => {
|
|
117
|
+
it('should be assignable and default to undefined', () => {
|
|
118
|
+
const result = new MessageResult();
|
|
119
|
+
expect(result.DryRun).toBeUndefined();
|
|
120
|
+
result.DryRun = true;
|
|
121
|
+
expect(result.DryRun).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('CommunicationEngineBase.StartLog dry-run audit marker', () => {
|
|
125
|
+
it('should stamp DryRun: true into MessageContent for a dry-run send', async () => {
|
|
126
|
+
const engine = CommunicationEngineBase.Instance;
|
|
127
|
+
const mockLog = makeLogMock();
|
|
128
|
+
mockGetEntityObject.mockResolvedValue(mockLog);
|
|
129
|
+
const result = await engine['StartLog'](makeProcessedMessage(true));
|
|
130
|
+
expect(result).toBe(mockLog);
|
|
131
|
+
const content = JSON.parse(mockLog.MessageContent);
|
|
132
|
+
expect(content.DryRun).toBe(true);
|
|
133
|
+
expect(content.To).toBe('user@test.com');
|
|
134
|
+
expect(content.Subject).toBe('Subject');
|
|
135
|
+
});
|
|
136
|
+
it('should OMIT the DryRun key entirely for a real send', async () => {
|
|
137
|
+
const engine = CommunicationEngineBase.Instance;
|
|
138
|
+
const mockLog = makeLogMock();
|
|
139
|
+
mockGetEntityObject.mockResolvedValue(mockLog);
|
|
140
|
+
await engine['StartLog'](makeProcessedMessage(undefined));
|
|
141
|
+
const content = JSON.parse(mockLog.MessageContent);
|
|
142
|
+
expect('DryRun' in content).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
it('should OMIT the DryRun key when DryRun is explicitly false', async () => {
|
|
145
|
+
const engine = CommunicationEngineBase.Instance;
|
|
146
|
+
const mockLog = makeLogMock();
|
|
147
|
+
mockGetEntityObject.mockResolvedValue(mockLog);
|
|
148
|
+
await engine['StartLog'](makeProcessedMessage(false));
|
|
149
|
+
const content = JSON.parse(mockLog.MessageContent);
|
|
150
|
+
expect('DryRun' in content).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=DryRunContract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DryRunContract.test.js","sourceRoot":"","sources":["../../src/__tests__/DryRunContract.test.ts"],"names":[],"mappings":"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"}
|