/** * @vitest-environment jsdom */ import create from 'zustand'; import { describe, it, expect, vitest } from 'vitest'; import { createElement, FC } from 'react'; import { createFormsApi } from './create'; const StubComponent: FC = (props) => createElement('div', props); StubComponent.displayName = 'StubComponent'; function createMockContainer() { const state = create(() => ({})); return { context: { on: vitest.fn(), off: vitest.fn(), emit: vitest.fn(), defineActions() {}, state, dispatch(update: any) { state.setState(update(state.getState())); }, } as any, api: {} as any, }; } describe('Create Forms API Extensions', () => { it('createCoreApi allows using the created form creator as a HOC', () => { const container = createMockContainer(); container.context.updateFormState = vitest.fn(); const api = createFormsApi()(container.context) as any; const create = api.createForm({ emptyData: {}, onSubmit() { return Promise.resolve(); }, }); const NewComponent = create(StubComponent); expect(NewComponent.displayName).toBe('withForm(StubComponent)'); }); it('createCoreApi can also avoid wrapping in a form', () => { const container = createMockContainer(); container.context.updateFormState = vitest.fn(); const api = createFormsApi()(container.context) as any; const create = api.createForm({ emptyData: {}, onSubmit() { return Promise.resolve(); }, }); const NewComponent = create(StubComponent, { skipForm: true }); expect(NewComponent.displayName).toBe('withFormHandler(StubComponent)'); }); });