byCedric/react-promiser

View on GitHub
src/library/promiser/promiser.test.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import React from 'react';
import { mount } from 'enzyme';
import Promiser from './promiser';
import { PromiserStatus } from './types';

const createStatus = (status: PromiserStatus) => ({
    status,
    isIdle: status === 'idle',
    isPending: status === 'pending',
    isRejected: status === 'rejected',
    isFulfilled: status === 'fulfilled',
});

describe('library/promiser', () => {
    it('renders the children prop', () => {
        const promise = jest.fn().mockResolvedValue('hello');
        const component = mount(
            <Promiser promise={promise}>
                {() => 'hello'}
            </Promiser>
        );

        expect(component).toIncludeText('hello');
    });

    it('resolves promise through render prop', () => {
        const promise = jest.fn().mockResolvedValue('hello');
        const component = mount(
            <Promiser promise={promise}>
                {state => <button onClick={state.resolve}>hello</button>}
            </Promiser>
        );

        component.find('button')
            .simulate('click');

        expect(promise).toHaveBeenCalled();
    });

    it('automatically resolves the promise', () => {
        const render = jest.fn().mockReturnValue(null);
        const promise = jest.fn().mockResolvedValue('hello');
        const component = mount(
            <Promiser promise={promise} auto>{render}</Promiser>
        );

        expect(promise).toHaveBeenCalled();
    });

    it('renders idle state', () => {
        const render = jest.fn().mockReturnValue(null);
        const promise = jest.fn().mockResolvedValue('hello');
        const component = mount(
            <Promiser promise={promise}>{render}</Promiser>
        );

        expect(render).toHaveBeenCalledWith(
            expect.objectContaining({
                ...createStatus('idle'),
                data: undefined,
                error: undefined,
            })
        );
    });

    it('renders pending state', () => {
        const render = jest.fn().mockReturnValue(null);
        const promise = () => new Promise((resolve, reject) => null);
        const component = mount(
            <Promiser promise={promise} auto>{render}</Promiser>
        );

        expect(render).toHaveBeenCalledWith(
            expect.objectContaining({
                ...createStatus('pending'),
                data: undefined,
                error: undefined,
            })
        );
    });

    it('renders rejected state', async () => {
        const error = new Error();
        const render = jest.fn().mockReturnValue(null);
        const promise = jest.fn().mockRejectedValue(error);
        const component = mount(
            <Promiser promise={promise} auto>{render}</Promiser>
        );

        try {
            await promise();
        } catch (error) {
            // intentional
        }

        expect(render).toHaveBeenCalledWith(
            expect.objectContaining({
                ...createStatus('rejected'),
                error, data: undefined,
            })
        );
    });

    it('renders fulfilled state', async () => {
        const render = jest.fn().mockReturnValue(null);
        const promise = jest.fn().mockResolvedValue('hello');
        const component = mount(
            <Promiser promise={promise} auto>{render}</Promiser>
        );

        await promise();

        expect(render).toHaveBeenCalledWith(
            expect.objectContaining({
                ...createStatus('fulfilled'),
                data: 'hello',
                error: undefined,
            })
        );
    });
});