Skip to content

Commit 2b2899c

Browse files
authored
Merge pull request #656 from Iterable/evan/MOB-11551-iterable-embedded-message-elements-class
[MOB-11551] creates IterableEmbeddedMessageElements class
2 parents d6b0a0a + 58fe64e commit 2b2899c

8 files changed

+509
-2
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { IterableEmbeddedMessageDefaultAction } from '../embedded/classes/IterableEmbeddedMessageDefaultAction';
2+
import { Iterable } from '../core/classes/Iterable';
3+
4+
describe('IterableEmbeddedMessageDefaultAction', () => {
5+
it('should create an instance with the correct properties', () => {
6+
Iterable.logger.log(
7+
'iterableEmbeddedMessageDefaultAction_fromDict_valid_dictionary'
8+
);
9+
10+
const dict = { type: 'openUrl', data: 'https://example.com' };
11+
const action = IterableEmbeddedMessageDefaultAction.fromDict(dict);
12+
expect(action).toBeInstanceOf(IterableEmbeddedMessageDefaultAction);
13+
expect(action.type).toBe('openUrl');
14+
expect(action.data).toBe('https://example.com');
15+
});
16+
17+
it('should create an instance from a dictionary with data omitted', () => {
18+
Iterable.logger.log(
19+
'iterableEmbeddedMessageDefaultAction_fromDict_valid_dictionary_with_data_omitted'
20+
);
21+
22+
const dict = { type: 'action://join', data: '' };
23+
const action = IterableEmbeddedMessageDefaultAction.fromDict(dict);
24+
expect(action).toBeInstanceOf(IterableEmbeddedMessageDefaultAction);
25+
expect(action.type).toBe('action://join');
26+
expect(action.data).toBe('');
27+
});
28+
29+
it('should throw an error if type is missing in fromDict', () => {
30+
Iterable.logger.log(
31+
'iterableEmbeddedMessageDefaultAction_fromDict_invalid_dictionary_missing_type'
32+
);
33+
34+
const dict = { data: 'foo' };
35+
36+
expect(() => IterableEmbeddedMessageDefaultAction.fromDict(dict)).toThrow(
37+
'type is required'
38+
);
39+
});
40+
});
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
import { IterableEmbeddedMessageElements } from '../embedded/classes/IterableEmbeddedMessageElements';
2+
import { IterableEmbeddedMessageDefaultAction } from '../embedded/classes/IterableEmbeddedMessageDefaultAction';
3+
import { IterableEmbeddedMessageElementsButton } from '../embedded/classes/IterableEmbeddedMessageElementsButton';
4+
import { IterableEmbeddedMessageText } from '../embedded/classes/IterableEmbeddedMessageText';
5+
import { Iterable } from '../core/classes/Iterable';
6+
7+
describe('IterableEmbeddedMessageElements', () => {
8+
it('should create an instance with all properties', () => {
9+
Iterable.logger.log(
10+
'iterableEmbeddedMessageElements_fromDict_all_properties'
11+
);
12+
13+
const dict = {
14+
title: 'Awesome Title',
15+
body: 'Radical Body Text',
16+
mediaUrl: 'https://example.com/image.jpg',
17+
mediaUrlCaption: 'Check out this sick image!',
18+
defaultAction: {
19+
type: 'openUrl',
20+
data: 'https://example.com',
21+
},
22+
buttons: [
23+
{
24+
id: 'button-1',
25+
title: 'Click Me!',
26+
action: {
27+
type: 'openUrl',
28+
data: 'https://example.com/button1',
29+
},
30+
},
31+
{
32+
id: 'button-2',
33+
title: 'Close',
34+
action: {
35+
type: 'action://dismiss',
36+
},
37+
},
38+
],
39+
text: [
40+
{
41+
id: 'text-1',
42+
text: 'Some cool text',
43+
type: 'body',
44+
},
45+
{
46+
id: 'text-2',
47+
text: 'More radical text',
48+
type: 'subtitle',
49+
},
50+
],
51+
};
52+
53+
const elements = IterableEmbeddedMessageElements.fromDict(dict);
54+
55+
expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
56+
expect(elements.title).toBe('Awesome Title');
57+
expect(elements.body).toBe('Radical Body Text');
58+
expect(elements.mediaUrl).toBe('https://example.com/image.jpg');
59+
expect(elements.mediaUrlCaption).toBe('Check out this sick image!');
60+
61+
// Check defaultAction
62+
expect(elements.defaultAction).toBeInstanceOf(
63+
IterableEmbeddedMessageDefaultAction
64+
);
65+
expect(elements.defaultAction?.type).toBe('openUrl');
66+
expect(elements.defaultAction?.data).toBe('https://example.com');
67+
68+
// Check buttons
69+
expect(elements.buttons).toHaveLength(2);
70+
const firstButton = elements
71+
.buttons![0] as IterableEmbeddedMessageElementsButton;
72+
expect(firstButton).toBeInstanceOf(IterableEmbeddedMessageElementsButton);
73+
expect(firstButton.id).toBe('button-1');
74+
expect(firstButton.title).toBe('Click Me!');
75+
expect(firstButton.action?.type).toBe('openUrl');
76+
expect(firstButton.action?.data).toBe('https://example.com/button1');
77+
78+
const secondButton = elements
79+
.buttons![1] as IterableEmbeddedMessageElementsButton;
80+
expect(secondButton).toBeInstanceOf(IterableEmbeddedMessageElementsButton);
81+
expect(secondButton.id).toBe('button-2');
82+
expect(secondButton.title).toBe('Close');
83+
expect(secondButton.action?.type).toBe('action://dismiss');
84+
expect(secondButton.action?.data).toBeUndefined();
85+
86+
// Check text elements
87+
expect(elements.text).toHaveLength(2);
88+
const firstText = elements.text![0] as IterableEmbeddedMessageText;
89+
expect(firstText).toBeInstanceOf(IterableEmbeddedMessageText);
90+
expect(firstText.id).toBe('text-1');
91+
expect(firstText.text).toBe('Some cool text');
92+
expect(firstText.type).toBe('body');
93+
94+
const secondText = elements.text![1] as IterableEmbeddedMessageText;
95+
expect(secondText).toBeInstanceOf(IterableEmbeddedMessageText);
96+
expect(secondText.id).toBe('text-2');
97+
expect(secondText.text).toBe('More radical text');
98+
expect(secondText.type).toBe('subtitle');
99+
});
100+
101+
it('should create an instance with title and body', () => {
102+
Iterable.logger.log(
103+
'iterableEmbeddedMessageElements_fromDict_title_and_body'
104+
);
105+
106+
const dict = {
107+
title: 'Simple Title',
108+
body: 'Simple Body',
109+
};
110+
111+
const elements = IterableEmbeddedMessageElements.fromDict(dict);
112+
113+
expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
114+
expect(elements.title).toBe('Simple Title');
115+
expect(elements.body).toBe('Simple Body');
116+
expect(elements.mediaUrl).toBeUndefined();
117+
expect(elements.mediaUrlCaption).toBeUndefined();
118+
expect(elements.defaultAction).toBeUndefined();
119+
expect(elements.buttons).toBeUndefined();
120+
expect(elements.text).toBeUndefined();
121+
});
122+
123+
it('should create an instance with no title or body', () => {
124+
Iterable.logger.log(
125+
'iterableEmbeddedMessageElements_fromDict_no_title_or_body'
126+
);
127+
128+
const dict = {};
129+
130+
const elements = IterableEmbeddedMessageElements.fromDict(dict);
131+
132+
expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
133+
expect(elements.title).toBeUndefined();
134+
expect(elements.body).toBeUndefined();
135+
expect(elements.mediaUrl).toBeUndefined();
136+
expect(elements.mediaUrlCaption).toBeUndefined();
137+
expect(elements.defaultAction).toBeUndefined();
138+
expect(elements.buttons).toBeUndefined();
139+
expect(elements.text).toBeUndefined();
140+
});
141+
142+
it('should create an instance with media properties', () => {
143+
Iterable.logger.log(
144+
'iterableEmbeddedMessageElements_fromDict_media_properties'
145+
);
146+
147+
const dict = {
148+
title: 'Media Title',
149+
body: 'Media Body',
150+
mediaUrl: 'https://example.com/media.jpg',
151+
mediaUrlCaption: 'Check this out!',
152+
};
153+
154+
const elements = IterableEmbeddedMessageElements.fromDict(dict);
155+
156+
expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
157+
expect(elements.title).toBe('Media Title');
158+
expect(elements.body).toBe('Media Body');
159+
expect(elements.mediaUrl).toBe('https://example.com/media.jpg');
160+
expect(elements.mediaUrlCaption).toBe('Check this out!');
161+
expect(elements.defaultAction).toBeUndefined();
162+
expect(elements.buttons).toBeUndefined();
163+
expect(elements.text).toBeUndefined();
164+
});
165+
166+
it('should create an instance with defaultAction only', () => {
167+
Iterable.logger.log(
168+
'iterableEmbeddedMessageElements_fromDict_defaultAction_only'
169+
);
170+
171+
const dict = {
172+
title: 'Action Title',
173+
body: 'Action Body',
174+
defaultAction: {
175+
type: 'openUrl',
176+
data: 'https://example.com',
177+
},
178+
};
179+
180+
const elements = IterableEmbeddedMessageElements.fromDict(dict);
181+
182+
expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
183+
expect(elements.title).toBe('Action Title');
184+
expect(elements.body).toBe('Action Body');
185+
expect(elements.defaultAction).toBeInstanceOf(
186+
IterableEmbeddedMessageDefaultAction
187+
);
188+
expect(elements.defaultAction?.type).toBe('openUrl');
189+
expect(elements.defaultAction?.data).toBe('https://example.com');
190+
expect(elements.buttons).toBeUndefined();
191+
expect(elements.text).toBeUndefined();
192+
});
193+
194+
it('should create an instance with empty arrays for buttons and text', () => {
195+
Iterable.logger.log(
196+
'iterableEmbeddedMessageElements_fromDict_empty_arrays'
197+
);
198+
199+
const dict = {
200+
title: 'Empty Arrays Title',
201+
body: 'Empty Arrays Body',
202+
buttons: [],
203+
text: [],
204+
};
205+
206+
const elements = IterableEmbeddedMessageElements.fromDict(dict);
207+
208+
expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
209+
expect(elements.title).toBe('Empty Arrays Title');
210+
expect(elements.body).toBe('Empty Arrays Body');
211+
expect(elements.buttons).toHaveLength(0);
212+
expect(elements.text).toHaveLength(0);
213+
});
214+
});
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { IterableEmbeddedMessageText } from '../embedded/classes/IterableEmbeddedMessageText';
2+
import { Iterable } from '../core/classes/Iterable';
3+
4+
describe('IterableEmbeddedMessageText', () => {
5+
it('should create an instance from a dictionary with all properties', () => {
6+
Iterable.logger.log('iterableEmbeddedMessageText_fromDict_all_properties');
7+
8+
const dict = { id: 'text-123', text: 'Hello World!', type: 'heading' };
9+
const text = IterableEmbeddedMessageText.fromDict(dict);
10+
11+
expect(text).toBeInstanceOf(IterableEmbeddedMessageText);
12+
expect(text.id).toBe('text-123');
13+
expect(text.text).toBe('Hello World!');
14+
expect(text.type).toBe('heading');
15+
});
16+
17+
it('should create an instance from a dictionary with only required properties', () => {
18+
Iterable.logger.log('iterableEmbeddedMessageText_fromDict_required_only');
19+
20+
const dict = { id: 'text-123' };
21+
const text = IterableEmbeddedMessageText.fromDict(dict);
22+
23+
expect(text).toBeInstanceOf(IterableEmbeddedMessageText);
24+
expect(text.id).toBe('text-123');
25+
expect(text.text).toBeUndefined();
26+
expect(text.type).toBeUndefined();
27+
});
28+
29+
it('should throw an error if id is missing in fromDict', () => {
30+
Iterable.logger.log('iterableEmbeddedMessageText_fromDict_missing_id');
31+
32+
const dict = { text: 'Hello World!', type: 'heading' };
33+
34+
expect(() => IterableEmbeddedMessageText.fromDict(dict)).toThrow(
35+
'id is required'
36+
);
37+
});
38+
});
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* IterableEmbeddedMessageDefaultAction represents the default action defined as
3+
* a response to user events for an embedded message
4+
*/
5+
export class IterableEmbeddedMessageDefaultAction {
6+
/**
7+
* The type of iterable action
8+
* For custom actions, the type is `action://` prefix followed by a custom action name
9+
*/
10+
readonly type: string;
11+
12+
/**
13+
* The url for the action when the type is `openUrl`
14+
* For custom actions, data is empty
15+
*/
16+
readonly data?: string;
17+
18+
/**
19+
* Creates an instance of `IterableEmbeddedMessageDefaultAction`.
20+
*
21+
* @param type - The type of iterable action
22+
* @param data - The url for the action when the type is `openUrl`
23+
*/
24+
constructor(type: string, data?: string) {
25+
this.type = type;
26+
this.data = data;
27+
}
28+
29+
/**
30+
* Creates an instance of `IterableEmbeddedMessageDefaultAction` from a dictionary object.
31+
*
32+
* @param dict - The dictionary object containing the properties to initialize the `IterableEmbeddedMessageDefaultAction` instance.
33+
* @returns A new instance of `IterableEmbeddedMessageDefaultAction` initialized with the provided dictionary properties.
34+
*/
35+
static fromDict(
36+
dict: Partial<EmbeddedMessageDefaultActionDict>
37+
): IterableEmbeddedMessageDefaultAction {
38+
if (!dict.type) {
39+
throw new Error('type is required');
40+
}
41+
return new IterableEmbeddedMessageDefaultAction(dict.type, dict.data);
42+
}
43+
}
44+
45+
/**
46+
* An interface defining the dictionary object containing the properties for the embedded message default action.
47+
*/
48+
export interface EmbeddedMessageDefaultActionDict {
49+
/** The type of the action */
50+
type: string;
51+
/** The url for the action when the type is `openUrl` */
52+
data?: string;
53+
}

0 commit comments

Comments
 (0)