1- import { render , screen , fireEvent , waitFor } from '@testing-library/react' ;
1+ import { render , screen , fireEvent , waitFor , act } from '@testing-library/react' ;
22import { describe , it , expect , vi } from 'vitest' ;
33import { CreateAllButton } from '@/components/chat/CreateAllButton' ;
44
@@ -14,7 +14,9 @@ describe('CreateAllButton', () => {
1414 const mockOnCreateAll = vi . fn ( ) . mockResolvedValue ( undefined ) ;
1515 render ( < CreateAllButton onCreateAll = { mockOnCreateAll } /> ) ;
1616
17- fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
17+ await act ( async ( ) => {
18+ fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
19+ } ) ;
1820
1921 expect ( mockOnCreateAll ) . toHaveBeenCalledOnce ( ) ;
2022 } ) ;
@@ -23,7 +25,9 @@ describe('CreateAllButton', () => {
2325 const mockOnCreateAll = vi . fn ( ) . mockImplementation ( ( ) => new Promise ( resolve => setTimeout ( resolve , 100 ) ) ) ;
2426 render ( < CreateAllButton onCreateAll = { mockOnCreateAll } /> ) ;
2527
26- fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
28+ await act ( async ( ) => {
29+ fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
30+ } ) ;
2731
2832 expect ( screen . getByText ( 'Creating...' ) ) . toBeInTheDocument ( ) ;
2933 expect ( screen . getByRole ( 'button' ) ) . toBeDisabled ( ) ;
@@ -37,7 +41,9 @@ describe('CreateAllButton', () => {
3741 const mockOnCreateAll = vi . fn ( ) . mockResolvedValue ( undefined ) ;
3842 render ( < CreateAllButton onCreateAll = { mockOnCreateAll } /> ) ;
3943
40- fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
44+ await act ( async ( ) => {
45+ fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
46+ } ) ;
4147
4248 await waitFor ( ( ) => {
4349 expect ( screen . getByText ( 'Created' ) ) . toBeInTheDocument ( ) ;
@@ -50,7 +56,9 @@ describe('CreateAllButton', () => {
5056 const mockOnCreateAll = vi . fn ( ) . mockRejectedValue ( new Error ( 'Create failed' ) ) ;
5157 render ( < CreateAllButton onCreateAll = { mockOnCreateAll } /> ) ;
5258
53- fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
59+ await act ( async ( ) => {
60+ fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
61+ } ) ;
5462
5563 await waitFor ( ( ) => {
5664 expect ( screen . getByText ( 'Create All' ) ) . toBeInTheDocument ( ) ;
@@ -66,8 +74,22 @@ describe('CreateAllButton', () => {
6674 render ( < CreateAllButton onCreateAll = { mockOnCreateAll } /> ) ;
6775
6876 const button = screen . getByText ( 'Create All' ) ;
77+
78+ // First click
6979 fireEvent . click ( button ) ;
70- fireEvent . click ( button ) ; // Second click should be ignored
80+
81+ // Immediately try second click while first is processing
82+ fireEvent . click ( button ) ;
83+
84+ // Wait for the button to show "Creating..."
85+ await waitFor ( ( ) => {
86+ expect ( screen . getByText ( 'Creating...' ) ) . toBeInTheDocument ( ) ;
87+ } ) ;
88+
89+ // After processing completes, should only have been called once
90+ await waitFor ( ( ) => {
91+ expect ( screen . getByText ( 'Created' ) ) . toBeInTheDocument ( ) ;
92+ } ) ;
7193
7294 expect ( mockOnCreateAll ) . toHaveBeenCalledOnce ( ) ;
7395 } ) ;
@@ -77,14 +99,18 @@ describe('CreateAllButton', () => {
7799 render ( < CreateAllButton onCreateAll = { mockOnCreateAll } /> ) ;
78100
79101 // First click
80- fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
102+ await act ( async ( ) => {
103+ fireEvent . click ( screen . getByText ( 'Create All' ) ) ;
104+ } ) ;
81105
82106 await waitFor ( ( ) => {
83107 expect ( screen . getByText ( 'Created' ) ) . toBeInTheDocument ( ) ;
84108 } ) ;
85109
86110 // Try to click again
87- fireEvent . click ( screen . getByText ( 'Created' ) ) ;
111+ await act ( async ( ) => {
112+ fireEvent . click ( screen . getByText ( 'Created' ) ) ;
113+ } ) ;
88114
89115 expect ( mockOnCreateAll ) . toHaveBeenCalledOnce ( ) ; // Should still be only one call
90116 } ) ;
0 commit comments