Skip to content

[MOB-11551] create iterableEmbeddedMessageElements class #643

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions src/__tests__/IterableEmbeddedMessageDefaultAction.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { IterableEmbeddedMessageDefaultAction } from '../embedded/classes/IterableEmbeddedMessageDefaultAction';
import { Iterable } from '../core/classes/Iterable';

describe('IterableEmbeddedMessageDefaultAction', () => {
it('should create an instance with the correct properties', () => {
Iterable.logger.log(
'iterableEmbeddedMessageDefaultAction_fromDict_valid_dictionary'
);

const dict = { type: 'openUrl', data: 'https://example.com' };
const action = IterableEmbeddedMessageDefaultAction.fromDict(dict);
expect(action).toBeInstanceOf(IterableEmbeddedMessageDefaultAction);
expect(action.type).toBe('openUrl');
expect(action.data).toBe('https://example.com');
});

it('should create an instance from a dictionary with data omitted', () => {
Iterable.logger.log(
'iterableEmbeddedMessageDefaultAction_fromDict_valid_dictionary_with_data_omitted'
);

const dict = { type: 'action://join', data: '' };
const action = IterableEmbeddedMessageDefaultAction.fromDict(dict);
expect(action).toBeInstanceOf(IterableEmbeddedMessageDefaultAction);
expect(action.type).toBe('action://join');
expect(action.data).toBe('');
});

it('should throw an error if type is missing in fromDict', () => {
Iterable.logger.log(
'iterableEmbeddedMessageDefaultAction_fromDict_invalid_dictionary_missing_type'
);

const dict = { data: 'foo' };

expect(() => IterableEmbeddedMessageDefaultAction.fromDict(dict)).toThrow(
'type is required'
);
});
});
214 changes: 214 additions & 0 deletions src/__tests__/IterableEmbeddedMessageElements.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
import { IterableEmbeddedMessageElements } from '../embedded/classes/IterableEmbeddedMessageElements';
import { IterableEmbeddedMessageDefaultAction } from '../embedded/classes/IterableEmbeddedMessageDefaultAction';
import { IterableEmbeddedMessageElementsButton } from '../embedded/classes/IterableEmbeddedMessageElementsButton';
import { IterableEmbeddedMessageText } from '../embedded/classes/IterableEmbeddedMessageText';
import { Iterable } from '../core/classes/Iterable';

describe('IterableEmbeddedMessageElements', () => {
it('should create an instance with all properties', () => {
Iterable.logger.log(
'iterableEmbeddedMessageElements_fromDict_all_properties'
);

const dict = {
title: 'Awesome Title',
body: 'Radical Body Text',
mediaUrl: 'https://example.com/image.jpg',
mediaUrlCaption: 'Check out this sick image!',
defaultAction: {
type: 'openUrl',
data: 'https://example.com',
},
buttons: [
{
id: 'button-1',
title: 'Click Me!',
action: {
type: 'openUrl',
data: 'https://example.com/button1',
},
},
{
id: 'button-2',
title: 'Close',
action: {
type: 'action://dismiss',
},
},
],
text: [
{
id: 'text-1',
text: 'Some cool text',
type: 'body',
},
{
id: 'text-2',
text: 'More radical text',
type: 'subtitle',
},
],
};

const elements = IterableEmbeddedMessageElements.fromDict(dict);

expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
expect(elements.title).toBe('Awesome Title');
expect(elements.body).toBe('Radical Body Text');
expect(elements.mediaUrl).toBe('https://example.com/image.jpg');
expect(elements.mediaUrlCaption).toBe('Check out this sick image!');

// Check defaultAction
expect(elements.defaultAction).toBeInstanceOf(
IterableEmbeddedMessageDefaultAction
);
expect(elements.defaultAction?.type).toBe('openUrl');
expect(elements.defaultAction?.data).toBe('https://example.com');

// Check buttons
expect(elements.buttons).toHaveLength(2);
const firstButton = elements
.buttons![0] as IterableEmbeddedMessageElementsButton;
expect(firstButton).toBeInstanceOf(IterableEmbeddedMessageElementsButton);
expect(firstButton.id).toBe('button-1');
expect(firstButton.title).toBe('Click Me!');
expect(firstButton.action?.type).toBe('openUrl');
expect(firstButton.action?.data).toBe('https://example.com/button1');

const secondButton = elements
.buttons![1] as IterableEmbeddedMessageElementsButton;
expect(secondButton).toBeInstanceOf(IterableEmbeddedMessageElementsButton);
expect(secondButton.id).toBe('button-2');
expect(secondButton.title).toBe('Close');
expect(secondButton.action?.type).toBe('action://dismiss');
expect(secondButton.action?.data).toBeUndefined();

// Check text elements
expect(elements.text).toHaveLength(2);
const firstText = elements.text![0] as IterableEmbeddedMessageText;
expect(firstText).toBeInstanceOf(IterableEmbeddedMessageText);
expect(firstText.id).toBe('text-1');
expect(firstText.text).toBe('Some cool text');
expect(firstText.type).toBe('body');

const secondText = elements.text![1] as IterableEmbeddedMessageText;
expect(secondText).toBeInstanceOf(IterableEmbeddedMessageText);
expect(secondText.id).toBe('text-2');
expect(secondText.text).toBe('More radical text');
expect(secondText.type).toBe('subtitle');
});

it('should create an instance with title and body', () => {
Iterable.logger.log(
'iterableEmbeddedMessageElements_fromDict_title_and_body'
);

const dict = {
title: 'Simple Title',
body: 'Simple Body',
};

const elements = IterableEmbeddedMessageElements.fromDict(dict);

expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
expect(elements.title).toBe('Simple Title');
expect(elements.body).toBe('Simple Body');
expect(elements.mediaUrl).toBeUndefined();
expect(elements.mediaUrlCaption).toBeUndefined();
expect(elements.defaultAction).toBeUndefined();
expect(elements.buttons).toBeUndefined();
expect(elements.text).toBeUndefined();
});

it('should create an instance with no title or body', () => {
Iterable.logger.log(
'iterableEmbeddedMessageElements_fromDict_no_title_or_body'
);

const dict = {};

const elements = IterableEmbeddedMessageElements.fromDict(dict);

expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
expect(elements.title).toBeUndefined();
expect(elements.body).toBeUndefined();
expect(elements.mediaUrl).toBeUndefined();
expect(elements.mediaUrlCaption).toBeUndefined();
expect(elements.defaultAction).toBeUndefined();
expect(elements.buttons).toBeUndefined();
expect(elements.text).toBeUndefined();
});

it('should create an instance with media properties', () => {
Iterable.logger.log(
'iterableEmbeddedMessageElements_fromDict_media_properties'
);

const dict = {
title: 'Media Title',
body: 'Media Body',
mediaUrl: 'https://example.com/media.jpg',
mediaUrlCaption: 'Check this out!',
};

const elements = IterableEmbeddedMessageElements.fromDict(dict);

expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
expect(elements.title).toBe('Media Title');
expect(elements.body).toBe('Media Body');
expect(elements.mediaUrl).toBe('https://example.com/media.jpg');
expect(elements.mediaUrlCaption).toBe('Check this out!');
expect(elements.defaultAction).toBeUndefined();
expect(elements.buttons).toBeUndefined();
expect(elements.text).toBeUndefined();
});

it('should create an instance with defaultAction only', () => {
Iterable.logger.log(
'iterableEmbeddedMessageElements_fromDict_defaultAction_only'
);

const dict = {
title: 'Action Title',
body: 'Action Body',
defaultAction: {
type: 'openUrl',
data: 'https://example.com',
},
};

const elements = IterableEmbeddedMessageElements.fromDict(dict);

expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
expect(elements.title).toBe('Action Title');
expect(elements.body).toBe('Action Body');
expect(elements.defaultAction).toBeInstanceOf(
IterableEmbeddedMessageDefaultAction
);
expect(elements.defaultAction?.type).toBe('openUrl');
expect(elements.defaultAction?.data).toBe('https://example.com');
expect(elements.buttons).toBeUndefined();
expect(elements.text).toBeUndefined();
});

it('should create an instance with empty arrays for buttons and text', () => {
Iterable.logger.log(
'iterableEmbeddedMessageElements_fromDict_empty_arrays'
);

const dict = {
title: 'Empty Arrays Title',
body: 'Empty Arrays Body',
buttons: [],
text: [],
};

const elements = IterableEmbeddedMessageElements.fromDict(dict);

expect(elements).toBeInstanceOf(IterableEmbeddedMessageElements);
expect(elements.title).toBe('Empty Arrays Title');
expect(elements.body).toBe('Empty Arrays Body');
expect(elements.buttons).toHaveLength(0);
expect(elements.text).toHaveLength(0);
});
});
38 changes: 38 additions & 0 deletions src/__tests__/IterableEmbeddedMessageText.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { IterableEmbeddedMessageText } from '../embedded/classes/IterableEmbeddedMessageText';
import { Iterable } from '../core/classes/Iterable';

describe('IterableEmbeddedMessageText', () => {
it('should create an instance from a dictionary with all properties', () => {
Iterable.logger.log('iterableEmbeddedMessageText_fromDict_all_properties');

const dict = { id: 'text-123', text: 'Hello World!', type: 'heading' };
const text = IterableEmbeddedMessageText.fromDict(dict);

expect(text).toBeInstanceOf(IterableEmbeddedMessageText);
expect(text.id).toBe('text-123');
expect(text.text).toBe('Hello World!');
expect(text.type).toBe('heading');
});

it('should create an instance from a dictionary with only required properties', () => {
Iterable.logger.log('iterableEmbeddedMessageText_fromDict_required_only');

const dict = { id: 'text-123' };
const text = IterableEmbeddedMessageText.fromDict(dict);

expect(text).toBeInstanceOf(IterableEmbeddedMessageText);
expect(text.id).toBe('text-123');
expect(text.text).toBeUndefined();
expect(text.type).toBeUndefined();
});

it('should throw an error if id is missing in fromDict', () => {
Iterable.logger.log('iterableEmbeddedMessageText_fromDict_missing_id');

const dict = { text: 'Hello World!', type: 'heading' };

expect(() => IterableEmbeddedMessageText.fromDict(dict)).toThrow(
'id is required'
);
});
});
51 changes: 51 additions & 0 deletions src/embedded/classes/IterableEmbeddedMessageDefaultAction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/**
* IterableEmbeddedMessageDefaultAction represents the default action defined as
* a response to user events for an embedded message
*/
export class IterableEmbeddedMessageDefaultAction {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found 2 issues:

1. Error loading TSDoc config file:
Error encountered for /home/runner/work/react-native-sdk/tsdoc.json:
Unable to resolve "extends" reference to "typedoc/tsdoc.json": Cannot find module 'typedoc/tsdoc.json' from '/home/runner/work/react-native-sdk'
[eslint:tsdoc/syntax]


2. Found 39 lines of similar code in 2 locations (mass = 76) [qlty:similar-code]

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found 2 issues:

1. Error loading TSDoc config file:
Error encountered for /home/runner/work/react-native-sdk/tsdoc.json:
Unable to resolve "extends" reference to "typedoc/tsdoc.json": Cannot find module 'typedoc/tsdoc.json' from '/home/runner/work/react-native-sdk'
[eslint:tsdoc/syntax]


2. Found 39 lines of similar code in 2 locations (mass = 76) [qlty:similar-code]

/**
* The type of iterable action
* For custom actions, the type is `action://` prefix followed by a custom action name
*/
readonly type: string;

/**
* The url for the action when the type is `openUrl`
* For custom actions, data is empty
*/
readonly data?: string;

/**
* Creates an instance of `IterableEmbeddedMessageDefaultAction`.
*
* @param type - The type of iterable action
* @param data - The url for the action when the type is `openUrl`
*/
constructor(type: string, data?: string) {
this.type = type;
this.data = data;
}

/**
* Creates an instance of `IterableEmbeddedMessageDefaultAction` from a dictionary object.
*
* @param dict - The dictionary object containing the properties to initialize the `IterableEmbeddedMessageDefaultAction` instance.
* @returns A new instance of `IterableEmbeddedMessageDefaultAction` initialized with the provided dictionary properties.
*/
static fromDict(
dict: Partial<EmbeddedMessageDefaultActionDict>
): IterableEmbeddedMessageDefaultAction {
if (!dict.type) {
throw new Error('type is required');
}
return new IterableEmbeddedMessageDefaultAction(dict.type, dict.data);
}
}

/**
* An interface defining the dictionary object containing the properties for the embedded message default action.
*/
export interface EmbeddedMessageDefaultActionDict {
type: string;
data?: string;
}
Loading