create-form.test.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import { describe, expect, it } from 'vitest';
  6. import { FieldModel } from '@/core/field-model';
  7. import { FieldArrayModel } from '@/core/field-array-model';
  8. import { createForm } from '@/core/create-form';
  9. describe('createForm', () => {
  10. it('should create form with auto initialization by default', () => {
  11. const { form, control } = createForm();
  12. expect(form).toBeDefined();
  13. expect(control).toBeDefined();
  14. expect(control._formModel.initialized).toBe(true);
  15. });
  16. it('should disableAutoInit work', async () => {
  17. const { control } = createForm({ disableAutoInit: true });
  18. expect(control._formModel.initialized).toBe(false);
  19. control.init();
  20. expect(control._formModel.initialized).toBe(true);
  21. });
  22. it('should create form with initial values', () => {
  23. const initialValues = {
  24. username: 'John',
  25. email: 'john@example.com',
  26. age: 30,
  27. };
  28. const { form } = createForm({ initialValues });
  29. expect(form.initialValues).toEqual(initialValues);
  30. expect(form.values).toEqual(initialValues);
  31. });
  32. it('should create form with validation', async () => {
  33. const { form } = createForm({
  34. initialValues: { username: '' },
  35. });
  36. // Validation should be callable
  37. const errors = await form.validate();
  38. // Without explicit validators, errors should be empty or undefined
  39. expect(errors === undefined || Object.keys(errors).length === 0).toBe(true);
  40. });
  41. it('should create form with empty options', () => {
  42. const { form, control } = createForm({});
  43. expect(form).toBeDefined();
  44. expect(control).toBeDefined();
  45. expect(control._formModel.initialized).toBe(true);
  46. });
  47. it('should create form without options', () => {
  48. const { form, control } = createForm();
  49. expect(form).toBeDefined();
  50. expect(control).toBeDefined();
  51. expect(control._formModel.initialized).toBe(true);
  52. });
  53. describe('control.getField', () => {
  54. it('should get field by name', () => {
  55. const { form, control } = createForm({
  56. initialValues: {
  57. username: 'John',
  58. },
  59. });
  60. // Create field first
  61. control._formModel.createField('username');
  62. const field = control.getField('username');
  63. expect(field).toBeDefined();
  64. expect(field!.name).toBe('username');
  65. expect(field!.value).toBe('John');
  66. });
  67. it('should return undefined for non-existent field', () => {
  68. const { control } = createForm();
  69. const field = control.getField('nonexistent');
  70. expect(field).toBeUndefined();
  71. });
  72. it('should get FieldArray when field is array', () => {
  73. const { control } = createForm({
  74. initialValues: {
  75. users: [{ name: 'Alice' }, { name: 'Bob' }],
  76. },
  77. });
  78. // Create field array
  79. control._formModel.createFieldArray('users');
  80. const fieldArray = control.getField('users');
  81. expect(fieldArray).toBeDefined();
  82. expect(fieldArray!.name).toBe('users');
  83. expect(Array.isArray(fieldArray!.value)).toBe(true);
  84. });
  85. it('should return Field for regular field', () => {
  86. const { control } = createForm({
  87. initialValues: {
  88. username: 'John',
  89. },
  90. });
  91. control._formModel.createField('username');
  92. const field = control.getField('username');
  93. expect(field).toBeDefined();
  94. expect(field!.name).toBe('username');
  95. expect((field as any).onChange).toBeDefined();
  96. });
  97. it('should return FieldArray for array field with array methods', () => {
  98. const { control } = createForm({
  99. initialValues: {
  100. users: [{ name: 'Alice' }],
  101. },
  102. });
  103. control._formModel.createFieldArray('users');
  104. const fieldArrayModel = control._formModel.getField('users');
  105. expect(fieldArrayModel).toBeInstanceOf(FieldArrayModel);
  106. const fieldArray = control.getField('users');
  107. expect(fieldArray).toBeDefined();
  108. expect((fieldArray as any).append).toBeDefined();
  109. expect((fieldArray as any).remove).toBeDefined();
  110. expect((fieldArray as any).swap).toBeDefined();
  111. expect((fieldArray as any).move).toBeDefined();
  112. });
  113. it('should handle nested field names', () => {
  114. const { control } = createForm({
  115. initialValues: {
  116. user: {
  117. profile: {
  118. name: 'Alice',
  119. },
  120. },
  121. },
  122. });
  123. control._formModel.createField('user.profile.name');
  124. const field = control.getField('user.profile.name');
  125. expect(field).toBeDefined();
  126. expect(field!.name).toBe('user.profile.name');
  127. expect(field!.value).toBe('Alice');
  128. });
  129. it('should handle array index in field names', () => {
  130. const { control } = createForm({
  131. initialValues: {
  132. users: [{ name: 'Alice' }, { name: 'Bob' }],
  133. },
  134. });
  135. control._formModel.createField('users.0.name');
  136. const field = control.getField('users.0.name');
  137. expect(field).toBeDefined();
  138. expect(field!.name).toBe('users.0.name');
  139. expect(field!.value).toBe('Alice');
  140. });
  141. });
  142. describe('control.init', () => {
  143. it('should initialize form with new options', () => {
  144. const { control } = createForm({ disableAutoInit: true });
  145. expect(control._formModel.initialized).toBe(false);
  146. control.init();
  147. expect(control._formModel.initialized).toBe(true);
  148. });
  149. it('should reinitialize form', () => {
  150. const { control } = createForm({
  151. initialValues: { username: 'John' },
  152. });
  153. expect(control._formModel.initialized).toBe(true);
  154. expect(control._formModel.initialValues).toEqual({ username: 'John' });
  155. control._formModel.dispose();
  156. control.init();
  157. expect(control._formModel.initialized).toBe(true);
  158. });
  159. });
  160. it('should expose _formModel on control', () => {
  161. const { control } = createForm();
  162. expect(control._formModel).toBeDefined();
  163. expect(control._formModel.init).toBeDefined();
  164. expect(control._formModel.createField).toBeDefined();
  165. });
  166. });