import { createAction, isActionCreator } from '@reduxjs/toolkit' describe('createAction', () => { it('should create an action', () => { const actionCreator = createAction('A_TYPE') expect(actionCreator('something')).toEqual({ type: 'A_TYPE', payload: 'something', }) }) describe('when stringifying action', () => { it('should return the action type', () => { const actionCreator = createAction('A_TYPE') expect(`${actionCreator}`).toEqual('A_TYPE') }) }) describe('when passing a prepareAction method only returning a payload', () => { it('should use the payload returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, })) expect(actionCreator(5).payload).toBe(10) }) it('should not have a meta attribute on the resulting Action', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, })) expect('meta' in actionCreator(5)).toBeFalsy() }) }) describe('when passing a prepareAction method returning a payload and meta', () => { it('should use the payload returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, meta: a / 2, })) expect(actionCreator(5).payload).toBe(10) }) it('should use the meta returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, meta: a / 2, })) expect(actionCreator(10).meta).toBe(5) }) }) describe('when passing a prepareAction method returning a payload and error', () => { it('should use the payload returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, error: true, })) expect(actionCreator(5).payload).toBe(10) }) it('should use the error returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, error: true, })) expect(actionCreator(10).error).toBe(true) }) }) describe('when passing a prepareAction method returning a payload, meta and error', () => { it('should use the payload returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, meta: a / 2, error: true, })) expect(actionCreator(5).payload).toBe(10) }) it('should use the error returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, meta: a / 2, error: true, })) expect(actionCreator(10).error).toBe(true) }) it('should use the meta returned from the prepareAction method', () => { const actionCreator = createAction('A_TYPE', (a: number) => ({ payload: a * 2, meta: a / 2, error: true, })) expect(actionCreator(10).meta).toBe(5) }) }) describe('when passing a prepareAction that accepts multiple arguments', () => { it('should pass all arguments of the resulting actionCreator to prepareAction', () => { const actionCreator = createAction( 'A_TYPE', (a: string, b: string, c: string) => ({ payload: a + b + c, }), ) expect(actionCreator('1', '2', '3').payload).toBe('123') }) }) describe('actionCreator.match', () => { test('should return true for actions generated by own actionCreator', () => { const actionCreator = createAction('test') expect(actionCreator.match(actionCreator())).toBe(true) }) test('should return true for matching actions', () => { const actionCreator = createAction('test') expect(actionCreator.match({ type: 'test' })).toBe(true) }) test('should return false for other actions', () => { const actionCreator = createAction('test') expect(actionCreator.match({ type: 'test-abc' })).toBe(false) }) }) }) const actionCreator = createAction('anAction') class Action { type = 'totally an action' } describe('isActionCreator', () => { it('should only return true for action creators', () => { expect(isActionCreator(actionCreator)).toBe(true) const notActionCreators = [ { type: 'an action' }, { type: 'more props', extra: true }, actionCreator(), Promise.resolve({ type: 'an action' }), new Action(), false, 'a string', false, ] for (const notActionCreator of notActionCreators) { expect(isActionCreator(notActionCreator)).toBe(false) } }) })