@idealyst/cli 1.0.89 → 1.0.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/dist/generators/index.js +3 -40
  2. package/dist/generators/index.js.map +1 -1
  3. package/dist/generators/init.js +273 -0
  4. package/dist/generators/init.js.map +1 -0
  5. package/dist/generators/utils.js +5 -0
  6. package/dist/generators/utils.js.map +1 -1
  7. package/dist/index.js +20 -202
  8. package/dist/index.js.map +1 -1
  9. package/dist/scripts/configure-react-native-monorepo.js +144 -0
  10. package/dist/scripts/configure-react-native-monorepo.js.map +1 -0
  11. package/dist/{templates/workspace → template}/README.md +66 -12
  12. package/dist/template/package.json +45 -0
  13. package/{templates → dist/template/packages}/api/package.json +3 -1
  14. package/{templates → dist/template/packages}/database/package.json +1 -1
  15. package/dist/{templates/native → template/packages/mobile}/babel.config.js +1 -0
  16. package/{templates/native → dist/template/packages/mobile}/metro.config.js +4 -4
  17. package/{templates/native → dist/template/packages/mobile}/package.json +5 -2
  18. package/{templates → dist/template/packages}/shared/package.json +2 -2
  19. package/{templates → dist/template/packages}/web/package.json +4 -1
  20. package/dist/types/generators/index.d.ts +1 -7
  21. package/dist/types/generators/init.d.ts +5 -0
  22. package/dist/types/scripts/configure-react-native-monorepo.d.ts +23 -0
  23. package/dist/types/types.d.ts +0 -4
  24. package/package.json +1 -1
  25. package/dist/generators/api.js +0 -31
  26. package/dist/generators/api.js.map +0 -1
  27. package/dist/generators/database.js +0 -31
  28. package/dist/generators/database.js.map +0 -1
  29. package/dist/generators/fullstack.js +0 -418
  30. package/dist/generators/fullstack.js.map +0 -1
  31. package/dist/generators/native.js +0 -112
  32. package/dist/generators/native.js.map +0 -1
  33. package/dist/generators/shared.js +0 -29
  34. package/dist/generators/shared.js.map +0 -1
  35. package/dist/generators/web.js +0 -45
  36. package/dist/generators/web.js.map +0 -1
  37. package/dist/generators/workspace.js +0 -83
  38. package/dist/generators/workspace.js.map +0 -1
  39. package/dist/templates/api/package.json +0 -54
  40. package/dist/templates/database/package.json +0 -49
  41. package/dist/templates/native/metro.config.js +0 -27
  42. package/dist/templates/native/package.json +0 -49
  43. package/dist/templates/native/src/App.tsx +0 -8
  44. package/dist/templates/shared/package.json +0 -62
  45. package/dist/templates/shared/src/components/App.tsx +0 -47
  46. package/dist/templates/shared/src/components/HelloWorld.tsx +0 -307
  47. package/dist/templates/shared/src/navigation/AppRouter.tsx +0 -98
  48. package/dist/templates/web/package.json +0 -66
  49. package/dist/templates/web/src/App.tsx +0 -14
  50. package/dist/templates/workspace/package.json +0 -35
  51. package/dist/types/generators/api.d.ts +0 -2
  52. package/dist/types/generators/database.d.ts +0 -2
  53. package/dist/types/generators/fullstack.d.ts +0 -2
  54. package/dist/types/generators/native.d.ts +0 -2
  55. package/dist/types/generators/shared.d.ts +0 -2
  56. package/dist/types/generators/web.d.ts +0 -2
  57. package/dist/types/generators/workspace.d.ts +0 -2
  58. package/templates/api/.env.example +0 -6
  59. package/templates/api/README.md +0 -274
  60. package/templates/api/__tests__/api.test.ts +0 -26
  61. package/templates/api/jest.config.js +0 -23
  62. package/templates/api/jest.setup.js +0 -9
  63. package/templates/api/src/context.ts +0 -19
  64. package/templates/api/src/controllers/TestController.ts +0 -0
  65. package/templates/api/src/index.ts +0 -9
  66. package/templates/api/src/lib/crud.ts +0 -150
  67. package/templates/api/src/lib/database.ts +0 -23
  68. package/templates/api/src/router/index.ts +0 -163
  69. package/templates/api/src/routers/test.ts +0 -59
  70. package/templates/api/src/routers/user.example.ts +0 -83
  71. package/templates/api/src/server.ts +0 -50
  72. package/templates/api/src/trpc.ts +0 -28
  73. package/templates/api/tsconfig.json +0 -43
  74. package/templates/database/README.md +0 -162
  75. package/templates/database/prisma/seed.ts +0 -64
  76. package/templates/database/schema.prisma +0 -107
  77. package/templates/database/src/index.ts +0 -15
  78. package/templates/database/src/validators.ts +0 -10
  79. package/templates/database/tsconfig.json +0 -18
  80. package/templates/native/README.md +0 -86
  81. package/templates/native/__tests__/App.test.tsx +0 -156
  82. package/templates/native/__tests__/components.test.tsx +0 -300
  83. package/templates/native/app.json +0 -5
  84. package/templates/native/babel.config.js +0 -10
  85. package/templates/native/index.js +0 -6
  86. package/templates/native/jest.config.js +0 -21
  87. package/templates/native/jest.setup.js +0 -12
  88. package/templates/native/src/App-with-trpc.tsx +0 -30
  89. package/templates/native/src/App.tsx +0 -8
  90. package/templates/native/src/utils/trpc.ts +0 -7
  91. package/templates/native/tsconfig.json +0 -28
  92. package/templates/shared/README.md +0 -135
  93. package/templates/shared/__tests__/shared.test.ts +0 -51
  94. package/templates/shared/jest.config.js +0 -22
  95. package/templates/shared/src/components/index.ts +0 -1
  96. package/templates/shared/src/index.ts +0 -14
  97. package/templates/shared/src/trpc/client.ts +0 -44
  98. package/templates/shared/tsconfig.json +0 -22
  99. package/templates/web/README.md +0 -131
  100. package/templates/web/__tests__/App.test.tsx +0 -342
  101. package/templates/web/__tests__/components.test.tsx +0 -564
  102. package/templates/web/index.html +0 -13
  103. package/templates/web/jest.config.js +0 -27
  104. package/templates/web/jest.setup.js +0 -24
  105. package/templates/web/src/App-with-trpc.tsx +0 -32
  106. package/templates/web/src/App.tsx +0 -14
  107. package/templates/web/src/components/TestDemo.tsx +0 -164
  108. package/templates/web/src/main.tsx +0 -25
  109. package/templates/web/src/utils/trpc.ts +0 -7
  110. package/templates/web/tsconfig.json +0 -26
  111. package/templates/web/vite.config.ts +0 -98
  112. package/templates/workspace/.devcontainer/Dockerfile +0 -26
  113. package/templates/workspace/.devcontainer/devcontainer.json +0 -113
  114. package/templates/workspace/.devcontainer/docker-compose.yml +0 -59
  115. package/templates/workspace/.devcontainer/figma-mcp.sh +0 -32
  116. package/templates/workspace/.devcontainer/setup.sh +0 -45
  117. package/templates/workspace/.dockerignore +0 -151
  118. package/templates/workspace/.env.example +0 -36
  119. package/templates/workspace/.env.production +0 -56
  120. package/templates/workspace/DOCKER.md +0 -0
  121. package/templates/workspace/Dockerfile +0 -111
  122. package/templates/workspace/README.md +0 -179
  123. package/templates/workspace/docker/nginx/prod.conf +0 -238
  124. package/templates/workspace/docker/nginx.conf +0 -131
  125. package/templates/workspace/docker/postgres/init.sql +0 -41
  126. package/templates/workspace/docker/prometheus/prometheus.yml +0 -52
  127. package/templates/workspace/docker-compose.prod.yml +0 -146
  128. package/templates/workspace/docker-compose.yml +0 -143
  129. package/templates/workspace/jest.config.js +0 -20
  130. package/templates/workspace/package.json +0 -38
  131. package/templates/workspace/setup.sh +0 -30
  132. package/templates/workspace/tsconfig.json +0 -31
  133. /package/dist/{templates/workspace → template}/.devcontainer/Dockerfile +0 -0
  134. /package/dist/{templates/workspace → template}/.devcontainer/devcontainer.json +0 -0
  135. /package/dist/{templates/workspace → template}/.devcontainer/docker-compose.yml +0 -0
  136. /package/dist/{templates/workspace → template}/.devcontainer/figma-mcp.sh +0 -0
  137. /package/dist/{templates/workspace → template}/.devcontainer/setup.sh +0 -0
  138. /package/dist/{templates/workspace → template}/.dockerignore +0 -0
  139. /package/dist/{templates/workspace → template}/.env.example +0 -0
  140. /package/dist/{templates/workspace → template}/DOCKER.md +0 -0
  141. /package/dist/{templates/workspace → template}/Dockerfile +0 -0
  142. /package/dist/{templates/workspace → template}/docker/nginx/prod.conf +0 -0
  143. /package/dist/{templates/workspace → template}/docker/nginx.conf +0 -0
  144. /package/dist/{templates/workspace → template}/docker/postgres/init.sql +0 -0
  145. /package/dist/{templates/workspace → template}/docker/prometheus/prometheus.yml +0 -0
  146. /package/dist/{templates/workspace → template}/docker-compose.prod.yml +0 -0
  147. /package/dist/{templates/workspace → template}/docker-compose.yml +0 -0
  148. /package/dist/{templates/workspace → template}/jest.config.js +0 -0
  149. /package/dist/{templates → template/packages}/api/.env.example +0 -0
  150. /package/dist/{templates → template/packages}/api/README.md +0 -0
  151. /package/dist/{templates → template/packages}/api/__tests__/api.test.ts +0 -0
  152. /package/dist/{templates → template/packages}/api/jest.config.js +0 -0
  153. /package/dist/{templates → template/packages}/api/jest.setup.js +0 -0
  154. /package/dist/{templates → template/packages}/api/src/context.ts +0 -0
  155. /package/dist/{templates → template/packages}/api/src/controllers/TestController.ts +0 -0
  156. /package/dist/{templates → template/packages}/api/src/index.ts +0 -0
  157. /package/dist/{templates → template/packages}/api/src/lib/crud.ts +0 -0
  158. /package/dist/{templates → template/packages}/api/src/lib/database.ts +0 -0
  159. /package/dist/{templates → template/packages}/api/src/router/index.ts +0 -0
  160. /package/dist/{templates → template/packages}/api/src/routers/test.ts +0 -0
  161. /package/dist/{templates → template/packages}/api/src/routers/user.example.ts +0 -0
  162. /package/dist/{templates → template/packages}/api/src/server.ts +0 -0
  163. /package/dist/{templates → template/packages}/api/src/trpc.ts +0 -0
  164. /package/dist/{templates → template/packages}/api/tsconfig.json +0 -0
  165. /package/dist/{templates → template/packages}/database/README.md +0 -0
  166. /package/dist/{templates → template/packages}/database/prisma/seed.ts +0 -0
  167. /package/dist/{templates → template/packages}/database/schema.prisma +0 -0
  168. /package/dist/{templates → template/packages}/database/src/index.ts +0 -0
  169. /package/dist/{templates → template/packages}/database/src/validators.ts +0 -0
  170. /package/dist/{templates → template/packages}/database/tsconfig.json +0 -0
  171. /package/dist/{templates/native → template/packages/mobile}/README.md +0 -0
  172. /package/dist/{templates/native → template/packages/mobile}/__tests__/App.test.tsx +0 -0
  173. /package/dist/{templates/native → template/packages/mobile}/__tests__/components.test.tsx +0 -0
  174. /package/dist/{templates/native → template/packages/mobile}/app.json +0 -0
  175. /package/dist/{templates/native → template/packages/mobile}/index.js +0 -0
  176. /package/dist/{templates/native → template/packages/mobile}/jest.config.js +0 -0
  177. /package/dist/{templates/native → template/packages/mobile}/jest.setup.js +0 -0
  178. /package/dist/{templates/native → template/packages/mobile}/src/App-with-trpc-and-shared.tsx +0 -0
  179. /package/dist/{templates/native → template/packages/mobile}/src/App-with-trpc.tsx +0 -0
  180. /package/{templates/native/src/App-with-trpc-and-shared.tsx → dist/template/packages/mobile/src/App.tsx} +0 -0
  181. /package/dist/{templates/native → template/packages/mobile}/src/utils/trpc.ts +0 -0
  182. /package/dist/{templates/native → template/packages/mobile}/tsconfig.json +0 -0
  183. /package/dist/{templates → template/packages}/shared/README.md +0 -0
  184. /package/dist/{templates → template/packages}/shared/__tests__/shared.test.ts +0 -0
  185. /package/dist/{templates → template/packages}/shared/jest.config.js +0 -0
  186. /package/{templates → dist/template/packages}/shared/src/components/App.tsx +0 -0
  187. /package/{templates → dist/template/packages}/shared/src/components/HelloWorld.tsx +0 -0
  188. /package/dist/{templates → template/packages}/shared/src/components/index.ts +0 -0
  189. /package/dist/{templates → template/packages}/shared/src/index.ts +0 -0
  190. /package/{templates → dist/template/packages}/shared/src/navigation/AppRouter.tsx +0 -0
  191. /package/dist/{templates → template/packages}/shared/src/trpc/client.ts +0 -0
  192. /package/dist/{templates → template/packages}/shared/tsconfig.json +0 -0
  193. /package/dist/{templates → template/packages}/web/README.md +0 -0
  194. /package/dist/{templates → template/packages}/web/__tests__/App.test.tsx +0 -0
  195. /package/dist/{templates → template/packages}/web/__tests__/components.test.tsx +0 -0
  196. /package/dist/{templates → template/packages}/web/index.html +0 -0
  197. /package/dist/{templates → template/packages}/web/jest.config.js +0 -0
  198. /package/dist/{templates → template/packages}/web/jest.setup.js +0 -0
  199. /package/dist/{templates → template/packages}/web/src/App-with-trpc-and-shared.tsx +0 -0
  200. /package/dist/{templates → template/packages}/web/src/App-with-trpc.tsx +0 -0
  201. /package/{templates/web/src/App-with-trpc-and-shared.tsx → dist/template/packages/web/src/App.tsx} +0 -0
  202. /package/dist/{templates → template/packages}/web/src/components/TestDemo.tsx +0 -0
  203. /package/dist/{templates → template/packages}/web/src/main.tsx +0 -0
  204. /package/dist/{templates → template/packages}/web/src/utils/trpc.ts +0 -0
  205. /package/dist/{templates → template/packages}/web/tsconfig.json +0 -0
  206. /package/dist/{templates → template/packages}/web/vite.config.ts +0 -0
  207. /package/dist/{templates/workspace → template}/setup.sh +0 -0
  208. /package/dist/{templates/workspace → template}/tsconfig.json +0 -0
@@ -1,342 +0,0 @@
1
- import React from 'react';
2
- import { render, screen, fireEvent, waitFor } from '@testing-library/react';
3
- import userEvent from '@testing-library/user-event';
4
- import { MemoryRouter } from 'react-router-dom';
5
- import App from '../src/App';
6
-
7
- // Mock the NavigatorProvider to avoid complex setup
8
- jest.mock('@idealyst/navigation', () => ({
9
- NavigatorProvider: ({ children }: { children?: React.ReactNode }) => (
10
- <div data-testid="navigator-provider">{children || 'Navigator Content'}</div>
11
- ),
12
- }));
13
-
14
- jest.mock('@idealyst/navigation/examples', () => ({
15
- ExampleStackRouter: {},
16
- }));
17
-
18
- describe('App Component', () => {
19
- it('renders without crashing', () => {
20
- render(
21
- <MemoryRouter>
22
- <App />
23
- </MemoryRouter>
24
- );
25
-
26
- expect(screen.getByTestId('navigator-provider')).toBeInTheDocument();
27
- });
28
-
29
- it('contains the App class', () => {
30
- const { container } = render(
31
- <MemoryRouter>
32
- <App />
33
- </MemoryRouter>
34
- );
35
-
36
- expect(container.querySelector('.App')).toBeInTheDocument();
37
- });
38
-
39
- it('renders NavigatorProvider with BrowserRouter', () => {
40
- render(
41
- <MemoryRouter>
42
- <App />
43
- </MemoryRouter>
44
- );
45
-
46
- const navigatorProvider = screen.getByTestId('navigator-provider');
47
- expect(navigatorProvider).toBeInTheDocument();
48
- expect(navigatorProvider).toHaveTextContent('Navigator Content');
49
- });
50
- });
51
-
52
- describe('Sample React Component Tests', () => {
53
- // Example functional component for testing
54
- const Button = ({
55
- children,
56
- onClick,
57
- disabled = false,
58
- variant = 'primary'
59
- }: {
60
- children: React.ReactNode;
61
- onClick: () => void;
62
- disabled?: boolean;
63
- variant?: 'primary' | 'secondary';
64
- }) => (
65
- <button
66
- data-testid="custom-button"
67
- onClick={onClick}
68
- disabled={disabled}
69
- className={`btn btn-${variant}`}
70
- >
71
- {children}
72
- </button>
73
- );
74
-
75
- it('renders button with correct text', () => {
76
- const mockClick = jest.fn();
77
- render(<Button onClick={mockClick}>Click me</Button>);
78
-
79
- const button = screen.getByTestId('custom-button');
80
- expect(button).toBeInTheDocument();
81
- expect(button).toHaveTextContent('Click me');
82
- });
83
-
84
- it('calls onClick when clicked', async () => {
85
- const user = userEvent.setup();
86
- const mockClick = jest.fn();
87
-
88
- render(<Button onClick={mockClick}>Click me</Button>);
89
-
90
- const button = screen.getByTestId('custom-button');
91
- await user.click(button);
92
-
93
- expect(mockClick).toHaveBeenCalledTimes(1);
94
- });
95
-
96
- it('is disabled when disabled prop is true', () => {
97
- const mockClick = jest.fn();
98
- render(
99
- <Button onClick={mockClick} disabled>
100
- Disabled Button
101
- </Button>
102
- );
103
-
104
- const button = screen.getByTestId('custom-button');
105
- expect(button).toBeDisabled();
106
- });
107
-
108
- it('applies correct CSS classes based on variant', () => {
109
- const mockClick = jest.fn();
110
- const { rerender } = render(
111
- <Button onClick={mockClick} variant="primary">
112
- Primary Button
113
- </Button>
114
- );
115
-
116
- let button = screen.getByTestId('custom-button');
117
- expect(button).toHaveClass('btn', 'btn-primary');
118
-
119
- rerender(
120
- <Button onClick={mockClick} variant="secondary">
121
- Secondary Button
122
- </Button>
123
- );
124
-
125
- button = screen.getByTestId('custom-button');
126
- expect(button).toHaveClass('btn', 'btn-secondary');
127
- });
128
- });
129
-
130
- describe('Component with State', () => {
131
- const Counter = ({ initialCount = 0 }: { initialCount?: number }) => {
132
- const [count, setCount] = React.useState(initialCount);
133
-
134
- return (
135
- <div data-testid="counter">
136
- <span data-testid="count-display">Count: {count}</span>
137
- <button
138
- data-testid="increment-button"
139
- onClick={() => setCount(c => c + 1)}
140
- >
141
- Increment
142
- </button>
143
- <button
144
- data-testid="decrement-button"
145
- onClick={() => setCount(c => c - 1)}
146
- >
147
- Decrement
148
- </button>
149
- <button
150
- data-testid="reset-button"
151
- onClick={() => setCount(initialCount)}
152
- >
153
- Reset
154
- </button>
155
- </div>
156
- );
157
- };
158
-
159
- it('renders with initial count', () => {
160
- render(<Counter initialCount={5} />);
161
-
162
- expect(screen.getByTestId('count-display')).toHaveTextContent('Count: 5');
163
- });
164
-
165
- it('increments count when increment button is clicked', async () => {
166
- const user = userEvent.setup();
167
- render(<Counter />);
168
-
169
- const incrementButton = screen.getByTestId('increment-button');
170
- const countDisplay = screen.getByTestId('count-display');
171
-
172
- expect(countDisplay).toHaveTextContent('Count: 0');
173
-
174
- await user.click(incrementButton);
175
- expect(countDisplay).toHaveTextContent('Count: 1');
176
-
177
- await user.click(incrementButton);
178
- expect(countDisplay).toHaveTextContent('Count: 2');
179
- });
180
-
181
- it('decrements count when decrement button is clicked', async () => {
182
- const user = userEvent.setup();
183
- render(<Counter initialCount={5} />);
184
-
185
- const decrementButton = screen.getByTestId('decrement-button');
186
- const countDisplay = screen.getByTestId('count-display');
187
-
188
- expect(countDisplay).toHaveTextContent('Count: 5');
189
-
190
- await user.click(decrementButton);
191
- expect(countDisplay).toHaveTextContent('Count: 4');
192
- });
193
-
194
- it('resets count to initial value', async () => {
195
- const user = userEvent.setup();
196
- render(<Counter initialCount={10} />);
197
-
198
- const incrementButton = screen.getByTestId('increment-button');
199
- const resetButton = screen.getByTestId('reset-button');
200
- const countDisplay = screen.getByTestId('count-display');
201
-
202
- // Increment a few times
203
- await user.click(incrementButton);
204
- await user.click(incrementButton);
205
- expect(countDisplay).toHaveTextContent('Count: 12');
206
-
207
- // Reset
208
- await user.click(resetButton);
209
- expect(countDisplay).toHaveTextContent('Count: 10');
210
- });
211
- });
212
-
213
- describe('Async Component Testing', () => {
214
- const AsyncDataComponent = () => {
215
- const [data, setData] = React.useState<string | null>(null);
216
- const [loading, setLoading] = React.useState(false);
217
- const [error, setError] = React.useState<string | null>(null);
218
-
219
- const fetchData = async () => {
220
- setLoading(true);
221
- setError(null);
222
-
223
- try {
224
- // Simulate API call
225
- await new Promise(resolve => setTimeout(resolve, 100));
226
- setData('Fetched data successfully');
227
- } catch (err) {
228
- setError('Failed to fetch data');
229
- } finally {
230
- setLoading(false);
231
- }
232
- };
233
-
234
- return (
235
- <div data-testid="async-component">
236
- <button data-testid="fetch-button" onClick={fetchData}>
237
- Fetch Data
238
- </button>
239
-
240
- {loading && <div data-testid="loading">Loading...</div>}
241
- {error && <div data-testid="error">{error}</div>}
242
- {data && <div data-testid="data">{data}</div>}
243
- </div>
244
- );
245
- };
246
-
247
- it('fetches and displays data', async () => {
248
- const user = userEvent.setup();
249
- render(<AsyncDataComponent />);
250
-
251
- const fetchButton = screen.getByTestId('fetch-button');
252
-
253
- // Initially no data, loading, or error
254
- expect(screen.queryByTestId('data')).not.toBeInTheDocument();
255
- expect(screen.queryByTestId('loading')).not.toBeInTheDocument();
256
- expect(screen.queryByTestId('error')).not.toBeInTheDocument();
257
-
258
- // Click fetch button
259
- await user.click(fetchButton);
260
-
261
- // Loading should appear
262
- expect(screen.getByTestId('loading')).toBeInTheDocument();
263
-
264
- // Wait for data to load
265
- await waitFor(() => {
266
- expect(screen.getByTestId('data')).toBeInTheDocument();
267
- });
268
-
269
- expect(screen.getByTestId('data')).toHaveTextContent('Fetched data successfully');
270
- expect(screen.queryByTestId('loading')).not.toBeInTheDocument();
271
- });
272
- });
273
-
274
- describe('Form Component Testing', () => {
275
- const ContactForm = ({ onSubmit }: { onSubmit: (data: { name: string; email: string }) => void }) => {
276
- const [name, setName] = React.useState('');
277
- const [email, setEmail] = React.useState('');
278
-
279
- const handleSubmit = (e: React.FormEvent) => {
280
- e.preventDefault();
281
- onSubmit({ name, email });
282
- };
283
-
284
- return (
285
- <form data-testid="contact-form" onSubmit={handleSubmit}>
286
- <input
287
- data-testid="name-input"
288
- type="text"
289
- placeholder="Name"
290
- value={name}
291
- onChange={(e) => setName(e.target.value)}
292
- />
293
- <input
294
- data-testid="email-input"
295
- type="email"
296
- placeholder="Email"
297
- value={email}
298
- onChange={(e) => setEmail(e.target.value)}
299
- />
300
- <button data-testid="submit-button" type="submit">
301
- Submit
302
- </button>
303
- </form>
304
- );
305
- };
306
-
307
- it('submits form with correct data', async () => {
308
- const user = userEvent.setup();
309
- const mockSubmit = jest.fn();
310
-
311
- render(<ContactForm onSubmit={mockSubmit} />);
312
-
313
- const nameInput = screen.getByTestId('name-input');
314
- const emailInput = screen.getByTestId('email-input');
315
- const submitButton = screen.getByTestId('submit-button');
316
-
317
- // Fill out form
318
- await user.type(nameInput, 'John Doe');
319
- await user.type(emailInput, 'john@example.com');
320
-
321
- // Submit form
322
- await user.click(submitButton);
323
-
324
- expect(mockSubmit).toHaveBeenCalledWith({
325
- name: 'John Doe',
326
- email: 'john@example.com'
327
- });
328
- });
329
-
330
- it('updates input values as user types', async () => {
331
- const user = userEvent.setup();
332
- const mockSubmit = jest.fn();
333
-
334
- render(<ContactForm onSubmit={mockSubmit} />);
335
-
336
- const nameInput = screen.getByTestId('name-input') as HTMLInputElement;
337
-
338
- await user.type(nameInput, 'Test Name');
339
-
340
- expect(nameInput.value).toBe('Test Name');
341
- });
342
- });