import { renderHook } from '@testing-library/react-hooks';
import React from 'react';
import ReactNative, { TextStyle } from 'react-native';
import createThemedStyles from '../../createThemedStyles';
import ThemeProvider from '../useThemeContext';
import useThemeStyle from '../useThemeStyle';
import { mockedTheme } from './fixtures';
describe('useThemeStyle', () => {
describe('user has light system theme', () => {
test('should return styles with light colors', () => {
jest.spyOn(ReactNative, 'useColorScheme').mockReturnValue('light');
const styleFactory = createThemedStyles((palette) => ({
container: { backgroundColor: palette.primary },
label: { color: palette.secondary },
}));
const { result: style } = renderHook(() => useThemeStyle(styleFactory), {
wrapper: ({ children }) => (
{children}
),
});
expect(style.current.container.backgroundColor).toBe(mockedTheme.light.primary);
expect((style.current.label as TextStyle).color).toBe(mockedTheme.light.secondary);
});
});
describe('user has dark system theme', () => {
test('should return styles with dark colors', () => {
jest.spyOn(ReactNative, 'useColorScheme').mockReturnValue('dark');
const styleFactory = createThemedStyles((palette) => ({
container: { backgroundColor: palette.primary },
label: { color: palette.secondary },
}));
const { result: style } = renderHook(() => useThemeStyle(styleFactory), {
wrapper: ({ children }) => (
{children}
),
});
expect(style.current.container.backgroundColor).toBe(mockedTheme.dark.primary);
expect((style.current.label as TextStyle).color).toBe(mockedTheme.dark.secondary);
});
});
describe('user has custom theme name', () => {
test('should return styles based on custom theme resolver', () => {
// Override useColorScheme return type to check if we are using getThemeName from package
jest.spyOn(ReactNative, 'useColorScheme').mockReturnValue('light');
const mockedGetThemeName = jest.fn().mockReturnValue('default');
const styleFactory = createThemedStyles((palette) => ({
container: { backgroundColor: palette.primary },
label: { color: palette.secondary },
}));
const { result: style } = renderHook(() => useThemeStyle(styleFactory), {
wrapper: ({ children }) => (
{children}
),
});
expect(style.current.container.backgroundColor).toBe(mockedTheme.default.primary);
expect((style.current.label as TextStyle).color).toBe(mockedTheme.default.secondary);
});
});
test('should throw an error for unsupported theme usage', () => {
const customTheme = 'custom';
const mockedGetThemeName = jest.fn().mockReturnValue(customTheme);
const styleFactory = createThemedStyles((palette) => ({
container: { backgroundColor: palette.primary },
label: { color: palette.secondary },
}));
const { result } = renderHook(() => useThemeStyle(styleFactory), {
wrapper: ({ children }) => (
{children}
),
});
expect(result.error?.message).toBe(`Theme not defined: ${customTheme}`);
});
});