11import { describe , it , expect , vi , beforeEach } from 'vitest' ;
2- import { render , screen , fireEvent , waitFor } from '@testing-library/react' ;
2+ import { render , screen , waitFor } from '@testing-library/react' ;
33import userEvent from '@testing-library/user-event' ;
44import { FeedbackModal } from './FeedbackModal' ;
55
@@ -25,25 +25,25 @@ describe('FeedbackModal', () => {
2525 expect ( screen . queryByText ( 'How satisfied are you with Rosetta?' ) ) . not . toBeInTheDocument ( ) ;
2626 } ) ;
2727
28- it ( 'shows rating emojis on step 1' , ( ) => {
28+ it ( 'shows star rating on step 1' , ( ) => {
2929 render ( < FeedbackModal isOpen = { true } onClose = { ( ) => { } } /> ) ;
3030
31- // Check for emoji buttons (5 ratings )
32- const emojiButtons = screen . getAllByRole ( 'button' ) . filter (
33- btn => btn . classList . contains ( 'feedback-emoji ' )
31+ // Check for star buttons (5 stars )
32+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
33+ btn => btn . classList . contains ( 'feedback-star ' )
3434 ) ;
35- expect ( emojiButtons ) . toHaveLength ( 5 ) ;
35+ expect ( starButtons ) . toHaveLength ( 5 ) ;
3636 } ) ;
3737
3838 it ( 'advances to step 2 when rating is selected' , async ( ) => {
3939 const user = userEvent . setup ( ) ;
4040 render ( < FeedbackModal isOpen = { true } onClose = { ( ) => { } } /> ) ;
4141
42- // Click the "Very Satisfied" emoji (last one )
43- const emojiButtons = screen . getAllByRole ( 'button' ) . filter (
44- btn => btn . classList . contains ( 'feedback-emoji ' )
42+ // Click the 5th star (5 out of 5 )
43+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
44+ btn => btn . classList . contains ( 'feedback-star ' )
4545 ) ;
46- await user . click ( emojiButtons [ 4 ] ) ;
46+ await user . click ( starButtons [ 4 ] ) ;
4747
4848 // Wait for step 2 to appear
4949 await waitFor ( ( ) => {
@@ -55,11 +55,11 @@ describe('FeedbackModal', () => {
5555 const user = userEvent . setup ( ) ;
5656 render ( < FeedbackModal isOpen = { true } onClose = { ( ) => { } } /> ) ;
5757
58- // Select a rating to advance
59- const emojiButtons = screen . getAllByRole ( 'button' ) . filter (
60- btn => btn . classList . contains ( 'feedback-emoji ' )
58+ // Select a rating to advance (3rd star)
59+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
60+ btn => btn . classList . contains ( 'feedback-star ' )
6161 ) ;
62- await user . click ( emojiButtons [ 2 ] ) ;
62+ await user . click ( starButtons [ 2 ] ) ;
6363
6464 await waitFor ( ( ) => {
6565 expect ( screen . getByText ( 'Translation quality' ) ) . toBeInTheDocument ( ) ;
@@ -72,11 +72,11 @@ describe('FeedbackModal', () => {
7272 const user = userEvent . setup ( ) ;
7373 render ( < FeedbackModal isOpen = { true } onClose = { ( ) => { } } /> ) ;
7474
75- // Select rating
76- const emojiButtons = screen . getAllByRole ( 'button' ) . filter (
77- btn => btn . classList . contains ( 'feedback-emoji ' )
75+ // Select rating (4th star)
76+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
77+ btn => btn . classList . contains ( 'feedback-star ' )
7878 ) ;
79- await user . click ( emojiButtons [ 3 ] ) ;
79+ await user . click ( starButtons [ 3 ] ) ;
8080
8181 await waitFor ( ( ) => {
8282 expect ( screen . getByText ( 'What could we improve?' ) ) . toBeInTheDocument ( ) ;
@@ -96,8 +96,9 @@ describe('FeedbackModal', () => {
9696 const user = userEvent . setup ( ) ;
9797 render ( < FeedbackModal isOpen = { true } onClose = { onClose } /> ) ;
9898
99- const closeButton = screen . getByRole ( 'button' , { name : '' } ) ; // X button has no text
100- await user . click ( closeButton ) ;
99+ const closeButton = document . querySelector ( '.feedback-close' ) ;
100+ expect ( closeButton ) . toBeInTheDocument ( ) ;
101+ await user . click ( closeButton ! ) ;
101102
102103 expect ( onClose ) . toHaveBeenCalled ( ) ;
103104 } ) ;
@@ -109,11 +110,11 @@ describe('FeedbackModal', () => {
109110
110111 render ( < FeedbackModal isOpen = { true } onClose = { onClose } /> ) ;
111112
112- // Step 1: Select rating
113- const emojiButtons = screen . getAllByRole ( 'button' ) . filter (
114- btn => btn . classList . contains ( 'feedback-emoji ' )
113+ // Step 1: Select rating (5th star)
114+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
115+ btn => btn . classList . contains ( 'feedback-star ' )
115116 ) ;
116- await user . click ( emojiButtons [ 4 ] ) ;
117+ await user . click ( starButtons [ 4 ] ) ;
117118
118119 // Step 2: Select improvements
119120 await waitFor ( ( ) => {
@@ -137,21 +138,46 @@ describe('FeedbackModal', () => {
137138 rating : 5 ,
138139 improvements : [ 'Translation quality' ] ,
139140 additionalFeedback : 'Great tool!' ,
141+ email : undefined ,
140142 } ) ;
141143 } ) ;
142144 } ) ;
143145
146+ it ( 'submits feedback with optional email when provided' , async ( ) => {
147+ const user = userEvent . setup ( ) ;
148+ vi . mocked ( submitFeedback ) . mockResolvedValueOnce ( { success : true } ) ;
149+
150+ render ( < FeedbackModal isOpen = { true } onClose = { ( ) => { } } /> ) ;
151+
152+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
153+ btn => btn . classList . contains ( 'feedback-star' )
154+ ) ;
155+ await user . click ( starButtons [ 4 ] ) ;
156+ await waitFor ( ( ) => screen . getByText ( 'What could we improve?' ) ) ;
157+ await user . click ( screen . getByText ( 'Next' ) ) ;
158+ await waitFor ( ( ) => screen . getByText ( 'Any additional feedback?' ) ) ;
159+ const emailInput = screen . getByLabelText ( / e m a i l \( o p t i o n a l \) / i) ;
160+ await user . type ( emailInput , 'user@example.com' ) ;
161+ await user . click ( screen . getByText ( 'Submit' ) ) ;
162+
163+ await waitFor ( ( ) => {
164+ expect ( submitFeedback ) . toHaveBeenCalledWith (
165+ expect . objectContaining ( { email : 'user@example.com' } )
166+ ) ;
167+ } ) ;
168+ } ) ;
169+
144170 it ( 'shows success message after submission' , async ( ) => {
145171 const user = userEvent . setup ( ) ;
146172 vi . mocked ( submitFeedback ) . mockResolvedValueOnce ( { success : true } ) ;
147173
148174 render ( < FeedbackModal isOpen = { true } onClose = { ( ) => { } } /> ) ;
149175
150176 // Complete the flow
151- const emojiButtons = screen . getAllByRole ( 'button' ) . filter (
152- btn => btn . classList . contains ( 'feedback-emoji ' )
177+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
178+ btn => btn . classList . contains ( 'feedback-star ' )
153179 ) ;
154- await user . click ( emojiButtons [ 4 ] ) ;
180+ await user . click ( starButtons [ 4 ] ) ;
155181
156182 await waitFor ( ( ) => screen . getByText ( 'What could we improve?' ) ) ;
157183 await user . click ( screen . getByText ( 'Speed/Performance' ) ) ;
@@ -169,11 +195,11 @@ describe('FeedbackModal', () => {
169195 const user = userEvent . setup ( ) ;
170196 render ( < FeedbackModal isOpen = { true } onClose = { ( ) => { } } /> ) ;
171197
172- // Go to step 2
173- const emojiButtons = screen . getAllByRole ( 'button' ) . filter (
174- btn => btn . classList . contains ( 'feedback-emoji ' )
198+ // Go to step 2 (3rd star)
199+ const starButtons = screen . getAllByRole ( 'button' ) . filter (
200+ btn => btn . classList . contains ( 'feedback-star ' )
175201 ) ;
176- await user . click ( emojiButtons [ 2 ] ) ;
202+ await user . click ( starButtons [ 2 ] ) ;
177203
178204 await waitFor ( ( ) => screen . getByText ( 'What could we improve?' ) ) ;
179205 await user . click ( screen . getByText ( 'User interface' ) ) ;
0 commit comments