Skip to content

Commit 79e7225

Browse files
author
Evan Greer
committed
feat: adds message class and unit tests
1 parent a3397a4 commit 79e7225

2 files changed

Lines changed: 221 additions & 0 deletions

File tree

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
import { IterableEmbeddedMessage } from '../embedded/classes/IterableEmbeddedMessage';
2+
import { IterableEmbeddedMessageMetadata } from '../embedded/classes/IterableEmbeddedMessageMetadata';
3+
import { IterableEmbeddedMessageElements } from '../embedded/classes/IterableEmbeddedMessageElements';
4+
import { Iterable } from '../core/classes/Iterable';
5+
6+
describe('IterableEmbeddedMessage', () => {
7+
it('should create an instance with all properties', () => {
8+
Iterable.logger.log('iterableEmbeddedMessage_fromDict_all_properties');
9+
10+
const dict = {
11+
metadata: {
12+
messageId: 'msg-123',
13+
placementId: 1,
14+
campaignId: 456,
15+
isProof: false,
16+
},
17+
elements: {
18+
title: 'Awesome Title',
19+
body: 'Radical Body Text',
20+
mediaUrl: 'https://example.com/image.jpg',
21+
mediaUrlCaption: 'Check out this sick image!',
22+
defaultAction: {
23+
type: 'openUrl',
24+
data: 'https://example.com',
25+
},
26+
buttons: [
27+
{
28+
id: 'button-1',
29+
title: 'Click Me!',
30+
action: {
31+
type: 'openUrl',
32+
data: 'https://example.com/button1',
33+
},
34+
},
35+
],
36+
text: [
37+
{
38+
id: 'text-1',
39+
text: 'Some cool text',
40+
type: 'body',
41+
},
42+
],
43+
},
44+
payload: {
45+
customKey: 'customValue',
46+
anotherKey: 123,
47+
},
48+
};
49+
50+
const message = IterableEmbeddedMessage.fromDict(dict);
51+
52+
expect(message).toBeInstanceOf(IterableEmbeddedMessage);
53+
54+
// Check metadata
55+
expect(message.metadata).toBeInstanceOf(IterableEmbeddedMessageMetadata);
56+
expect(message.metadata.messageId).toBe('msg-123');
57+
expect(message.metadata.placementId).toBe(1);
58+
expect(message.metadata.campaignId).toBe(456);
59+
expect(message.metadata.isProof).toBe(false);
60+
61+
// Check elements
62+
expect(message.elements).toBeInstanceOf(IterableEmbeddedMessageElements);
63+
expect(message.elements?.title).toBe('Awesome Title');
64+
expect(message.elements?.body).toBe('Radical Body Text');
65+
expect(message.elements?.mediaUrl).toBe('https://example.com/image.jpg');
66+
expect(message.elements?.mediaUrlCaption).toBe(
67+
'Check out this sick image!'
68+
);
69+
70+
// Check payload
71+
expect(message.payload).toEqual({
72+
customKey: 'customValue',
73+
anotherKey: 123,
74+
});
75+
});
76+
77+
it('should create an instance with only required metadata', () => {
78+
Iterable.logger.log('iterableEmbeddedMessage_fromDict_required_only');
79+
80+
const dict = {
81+
metadata: {
82+
messageId: 'msg-123',
83+
placementId: 1,
84+
isProof: false,
85+
},
86+
};
87+
88+
const message = IterableEmbeddedMessage.fromDict(dict);
89+
90+
expect(message).toBeInstanceOf(IterableEmbeddedMessage);
91+
expect(message.metadata).toBeInstanceOf(IterableEmbeddedMessageMetadata);
92+
expect(message.metadata.messageId).toBe('msg-123');
93+
expect(message.metadata.placementId).toBe(1);
94+
expect(message.metadata.campaignId).toBeUndefined();
95+
expect(message.metadata.isProof).toBe(false);
96+
expect(message.elements).toBeUndefined();
97+
expect(message.payload).toBeUndefined();
98+
});
99+
100+
it('should throw an error if metadata is missing', () => {
101+
Iterable.logger.log('iterableEmbeddedMessage_fromDict_missing_metadata');
102+
103+
const dict = {
104+
elements: {
105+
title: 'Some Title',
106+
body: 'Some Body',
107+
},
108+
};
109+
110+
expect(() => IterableEmbeddedMessage.fromDict(dict)).toThrow(
111+
'metadata is required'
112+
);
113+
});
114+
115+
it('should create an instance with elements but no payload', () => {
116+
Iterable.logger.log('iterableEmbeddedMessage_fromDict_elements_only');
117+
118+
const dict = {
119+
metadata: {
120+
messageId: 'msg-123',
121+
placementId: 1,
122+
isProof: false,
123+
},
124+
elements: {
125+
title: 'Elements Only',
126+
body: 'No payload here',
127+
},
128+
};
129+
130+
const message = IterableEmbeddedMessage.fromDict(dict);
131+
132+
expect(message).toBeInstanceOf(IterableEmbeddedMessage);
133+
expect(message.metadata).toBeInstanceOf(IterableEmbeddedMessageMetadata);
134+
expect(message.elements).toBeInstanceOf(IterableEmbeddedMessageElements);
135+
expect(message.elements?.title).toBe('Elements Only');
136+
expect(message.elements?.body).toBe('No payload here');
137+
expect(message.payload).toBeUndefined();
138+
});
139+
140+
it('should create an instance with payload but no elements', () => {
141+
Iterable.logger.log('iterableEmbeddedMessage_fromDict_payload_only');
142+
143+
const dict = {
144+
metadata: {
145+
messageId: 'msg-123',
146+
placementId: 1,
147+
isProof: false,
148+
},
149+
payload: {
150+
someData: 'someValue',
151+
},
152+
};
153+
154+
const message = IterableEmbeddedMessage.fromDict(dict);
155+
156+
expect(message).toBeInstanceOf(IterableEmbeddedMessage);
157+
expect(message.metadata).toBeInstanceOf(IterableEmbeddedMessageMetadata);
158+
expect(message.elements).toBeUndefined();
159+
expect(message.payload).toEqual({
160+
someData: 'someValue',
161+
});
162+
});
163+
});
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { IterableEmbeddedMessageMetadata } from './IterableEmbeddedMessageMetadata';
2+
import { IterableEmbeddedMessageElements } from './IterableEmbeddedMessageElements';
3+
4+
/**
5+
* IterableEmbeddedMessage represents an embedded message.
6+
*/
7+
export class IterableEmbeddedMessage {
8+
/** The metadata of the embedded message */
9+
metadata: IterableEmbeddedMessageMetadata;
10+
/** The elements of the embedded message */
11+
elements?: IterableEmbeddedMessageElements;
12+
/** The custom payload of the embedded message */
13+
payload?: Record<string, unknown>;
14+
15+
/**
16+
* Creates an instance of `IterableEmbeddedMessage`.
17+
*
18+
* @param metadata - The metadata of the embedded message.
19+
* @param elements - The elements of the embedded message.
20+
* @param payload - The custom payload of the embedded message.
21+
*/
22+
constructor(
23+
metadata: IterableEmbeddedMessageMetadata,
24+
elements?: IterableEmbeddedMessageElements,
25+
payload?: Record<string, unknown>
26+
) {
27+
this.metadata = metadata;
28+
this.elements = elements;
29+
this.payload = payload;
30+
}
31+
32+
/**
33+
* Creates an instance of `IterableEmbeddedMessage` from a dictionary object.
34+
*
35+
* @param dict - The dictionary object containing the properties to initialize the `IterableEmbeddedMessage` instance.
36+
* @returns A new instance of `IterableEmbeddedMessage` initialized with the provided dictionary properties.
37+
*/
38+
static fromDict(dict: Partial<EmbeddedMessageDict>): IterableEmbeddedMessage {
39+
if (!dict.metadata) {
40+
throw new Error('metadata is required');
41+
}
42+
const metadata = IterableEmbeddedMessageMetadata.fromDict(dict.metadata);
43+
const elements = dict.elements
44+
? IterableEmbeddedMessageElements.fromDict(dict.elements)
45+
: undefined;
46+
const payload = dict.payload;
47+
return new IterableEmbeddedMessage(metadata, elements, payload);
48+
}
49+
}
50+
51+
/**
52+
* An interface defining the dictionary object containing the properties for the embedded message.
53+
*/
54+
interface EmbeddedMessageDict {
55+
metadata: IterableEmbeddedMessageMetadata;
56+
elements: IterableEmbeddedMessageElements;
57+
payload: Record<string, unknown>;
58+
}

0 commit comments

Comments
 (0)