import React from 'react';
import { useResponsiveQuery } from '../useResponsiveQuery.web';
import { render } from '@testing-library/react-native';
//@ts-ignore
import createStyleResolver from 'react-native-web/dist/exports/StyleSheet/createStyleResolver';
import { StyleSheet, View } from 'react-native';
import { ResponsiveQueryProvider } from '../ResponsiveQueryProvider';
const renderWithoutMediaQueries = (element: React.ReactNode) => {
return render(
{element}
);
};
let styleResolver: any;
describe('test responsive styles', () => {
beforeEach(() => {
styleResolver = createStyleResolver();
require('react-native-web/dist/exports/StyleSheet/styleResolver').default =
styleResolver;
});
it('verifies min width query', () => {
const query = {
initial: {
backgroundColor: 'yellow',
},
query: [
{
minWidth: 500,
style: {
backgroundColor: 'black',
},
},
],
};
const App = () => {
const { styles } = useResponsiveQuery(query);
return ;
};
const { getByTestId } = render();
const view = getByTestId('test');
expect(view.props.style).toEqual([{ backgroundColor: 'yellow' }]);
expect(styleResolver.sheet.getTextContent()).toMatchSnapshot();
});
it('verifies min width and max width query', () => {
const query = {
initial: {
backgroundColor: 'yellow',
},
query: [
{
maxWidth: 400,
style: {
backgroundColor: 'black',
},
},
{
minWidth: 400,
style: {
backgroundColor: 'pink',
},
},
],
};
const App = () => {
const { styles } = useResponsiveQuery(query);
return ;
};
const { getByTestId } = render();
const view = getByTestId('test');
expect(view.props.style).toEqual([{ backgroundColor: 'yellow' }]);
expect(styleResolver.sheet.getTextContent()).toMatchSnapshot();
});
it('verifies min width and max width array queries', () => {
const query = {
initial: [
{
backgroundColor: 'yellow',
},
{ height: 100 },
],
query: [
{
maxWidth: 400,
style: [
{
backgroundColor: 'black',
},
{ maxHeight: 200 },
],
},
{
minWidth: 400,
style: {
backgroundColor: 'pink',
},
},
],
};
const App = () => {
const { styles } = useResponsiveQuery(query);
return ;
};
const { getByTestId } = render();
const view = getByTestId('test');
expect(view.props.style).toEqual([
{ backgroundColor: 'yellow', height: 100 },
]);
// console.log('text content', styleResolver.sheet.getTextContent());
expect(styleResolver.sheet.getTextContent()).toMatchSnapshot();
});
it('verifies min width query (without media queries)', () => {
const App = () => {
const { styles } = useResponsiveQuery({
initial: {
backgroundColor: 'yellow',
},
query: [
{
minWidth: 500,
style: {
backgroundColor: 'black',
},
},
],
});
return ;
};
const { getByTestId } = renderWithoutMediaQueries();
const view = getByTestId('test');
expect(view.props.style).toEqual([
{ backgroundColor: 'yellow' },
{ backgroundColor: 'black' },
]);
});
it('verifies min width and max width array queries (without media queries)', () => {
const App = () => {
const { styles } = useResponsiveQuery({
initial: [
{
backgroundColor: 'yellow',
},
{ height: 100 },
],
query: [
{
minWidth: 650,
style: [
StyleSheet.create({
wrapper: {
backgroundColor: 'black',
},
}).wrapper,
{
width: 100,
},
],
},
],
disableCSSMediaQueries: true,
});
return ;
};
const { getByTestId } = render();
const view = getByTestId('test');
expect(view.props.style).toEqual([
{ backgroundColor: 'yellow', height: 100 },
{ backgroundColor: 'black', width: 100 },
]);
});
it("gives higher precedence to hook's disableCSSMediaQueries flag", () => {
const App = () => {
const { styles } = useResponsiveQuery({
initial: {
backgroundColor: 'yellow',
},
query: [
{
minWidth: 500,
style: {
backgroundColor: 'black',
},
},
],
disableCSSMediaQueries: false,
});
return ;
};
const { getByTestId } = renderWithoutMediaQueries();
const view = getByTestId('test');
expect(view.props.style).toEqual([{ backgroundColor: 'yellow' }]);
expect(styleResolver.sheet.getTextContent()).toMatchSnapshot();
});
});