* Add the channel options to get into playbooks (#8750) * Add the channel options to get into playbooks * Use playbook run id instead of playbook id * i18n * Fix issues and move playbooks to the products folder * Address some tests * Fix test * Address design issues * Add requested comment --------- Co-authored-by: Elias Nahum <nahumhbl@gmail.com> * Playbooks database (#8802) * Add lastPlaybookFetchAt to channel table (#8916) * Add lastPlaybookFetchAt to channel table * Add missing commit * Use my_channel table instead * Fix test * Address feedback * First implementation of playbooks API (#8897) * First implementation of playbooks API * Add version check * Address feedback * Fix test * Add last fetch at usage and other improvements * Simplify test * Add sort_order, update_at and previousReminder columns (#8927) * Add sort_order, update_at and previousReminder columns * Remove order from the schema * Fix tests * Add tests * Add websockets for playbooks (#8947) * Add websocket events for playbooks * Fix typo * Add playbook run list (#8761) * Add the channel options to get into playbooks * Use playbook run id instead of playbook id * i18n * Fix issues and move playbooks to the products folder * Address some tests * Fix test * Add playbook run list * Add missing texts * Add back button support and item size to flash list * Address design issues * Add requested comment * Standardize tag and use it in the card * Fix merge * Add API related functionality --------- Co-authored-by: Elias Nahum <nahumhbl@gmail.com> * Add playbooks run details (#8872) * Add the channel options to get into playbooks * Use playbook run id instead of playbook id * i18n * Fix issues and move playbooks to the products folder * Address some tests * Fix test * Add playbook run list * Add missing texts * Add back button support and item size to flash list * Address design issues * Add requested comment * Standardize tag and use it in the card * Add playbooks run details * Fix merge * Add API related functionality * Add API related changes * Order fixes * Several fixes * Add error state on playbook run * i18n-extract * Fix tests * Fix test * Several fixes * Fixes and add missing UI elements * i18n-extract * Fix tests * Remove files from bad merge --------- Co-authored-by: Elias Nahum <nahumhbl@gmail.com> * Add missing tests for playbooks (#8976) * Add the channel options to get into playbooks * Use playbook run id instead of playbook id * i18n * Fix issues and move playbooks to the products folder * Address some tests * Fix test * Add playbook run list * Add missing texts * Add back button support and item size to flash list * Address design issues * Add requested comment * Standardize tag and use it in the card * Add playbooks run details * Fix merge * Add API related functionality * Add API related changes * Order fixes * Several fixes * Add error state on playbook run * i18n-extract * Fix tests * Fix test * Several fixes * Fixes and add missing UI elements * i18n-extract * Fix tests * Remove files from bad merge * Add tests * Fix typo * Add missing strings * Fix tests and skip some * Fix test * Fix typo --------- Co-authored-by: Elias Nahum <nahumhbl@gmail.com> * Address feedback * Address feedback and fix tests * Address comments and fix tests * Address feedback * Address plugin changes and fix bugs --------- Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
123 lines
3.8 KiB
TypeScript
123 lines
3.8 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import {cloneElement} from 'react';
|
|
import {Text, StyleSheet} from 'react-native';
|
|
|
|
import setFontFamily from './font_family';
|
|
|
|
// Type for style object
|
|
type StyleObject = { [key: string]: any };
|
|
|
|
// Custom function to flatten styles
|
|
const flattenStyles = (styles: StyleObject | Array<StyleObject | StyleObject[]>): StyleObject|undefined => {
|
|
if (styles === null || typeof styles !== 'object') {
|
|
return undefined;
|
|
}
|
|
|
|
if (!Array.isArray(styles)) {
|
|
return styles;
|
|
}
|
|
|
|
return styles.reduce((acc, style) => {
|
|
if (!style) {
|
|
return acc;
|
|
} // Skip if style is null or undefined
|
|
|
|
if (Array.isArray(style)) {
|
|
// Merge arrays of styles
|
|
return style.reduce((prev, curr) => ({
|
|
...prev,
|
|
...flattenStyles(curr),
|
|
}), acc);
|
|
} else if (typeof style === 'object') {
|
|
// Merge objects of styles
|
|
return {...acc, ...style};
|
|
}
|
|
|
|
// Skip if style is not an object or array
|
|
return acc;
|
|
}, {});
|
|
};
|
|
|
|
// Mock cloneElement
|
|
jest.mock('react', () => ({
|
|
...jest.requireActual('react'),
|
|
cloneElement: jest.fn((element, props) => {
|
|
// Merge the existing style with the new style
|
|
const mergedStyle = flattenStyles([props.style, ...(element.props.style ? [element.props.style] : [])]);
|
|
|
|
// Return a new object with merged styles
|
|
return {
|
|
...element,
|
|
props: {
|
|
...element.props,
|
|
style: mergedStyle,
|
|
},
|
|
};
|
|
}),
|
|
}));
|
|
|
|
describe('setFontFamily', () => {
|
|
// @ts-expect-error renderer is not exposed to TS definition
|
|
const renderTextSpy = jest.spyOn(Text, 'render');
|
|
let originalTextRender: any;
|
|
|
|
beforeEach(() => {
|
|
// Capture the original Text.render before modification
|
|
// @ts-expect-error renderer is not exposed to TS definition
|
|
originalTextRender = Text.render;
|
|
});
|
|
|
|
// Restore the original implementations after each test
|
|
afterEach(() => {
|
|
jest.restoreAllMocks();
|
|
});
|
|
|
|
test('overrides Text.render and applies custom styles', () => {
|
|
const createSpy = jest.spyOn(StyleSheet, 'create');
|
|
|
|
// Call the function to set the font family
|
|
setFontFamily();
|
|
|
|
// Check if the StyleSheet.create was called with the correct styles
|
|
expect(createSpy).toHaveBeenCalledWith({
|
|
defaultText: {
|
|
fontFamily: 'OpenSans',
|
|
fontSize: 16,
|
|
},
|
|
});
|
|
|
|
// Check if Text.render was overridden
|
|
// @ts-expect-error renderer is not exposed to TS definition
|
|
expect(Text.render).not.toBe(originalTextRender);
|
|
|
|
// Create a mock origin render output
|
|
const mockOriginRenderOutput = {
|
|
props: {
|
|
style: [{color: 'red'}],
|
|
},
|
|
};
|
|
|
|
// Set the old render function to return the mock output
|
|
renderTextSpy.mockReturnValue(mockOriginRenderOutput as any);
|
|
|
|
// Call the new render function
|
|
// @ts-expect-error renderer is not exposed to TS definition
|
|
const newRenderOutput = Text.render();
|
|
|
|
// Check if cloneElement was called with the correct arguments
|
|
expect(cloneElement).toHaveBeenCalledWith(mockOriginRenderOutput, {
|
|
style: [
|
|
{
|
|
fontFamily: 'OpenSans',
|
|
fontSize: 16,
|
|
},
|
|
[{color: 'red'}],
|
|
],
|
|
});
|
|
|
|
// Verify the new render output has the expected styles
|
|
expect(newRenderOutput.props.style).toEqual({fontFamily: 'OpenSans', fontSize: 16, color: 'red'});
|
|
});
|
|
});
|