1+ import { describe , it , expect , beforeEach } from 'bun:test'
2+ import { useFeedbackStore } from '../feedback-store'
3+
4+ describe ( 'FeedbackStore' , ( ) => {
5+ beforeEach ( ( ) => {
6+ useFeedbackStore . getState ( ) . reset ( )
7+ } )
8+
9+ describe ( 'openFeedbackForMessage' , ( ) => {
10+ it ( 'should open feedback mode for a specific message' , ( ) => {
11+ const store = useFeedbackStore . getState ( )
12+
13+ store . openFeedbackForMessage ( 'message-123' )
14+
15+ const state = useFeedbackStore . getState ( )
16+ expect ( state . feedbackMode ) . toBe ( true )
17+ expect ( state . feedbackMessageId ) . toBe ( 'message-123' )
18+ expect ( state . feedbackText ) . toBe ( '' )
19+ expect ( state . feedbackCategory ) . toBe ( 'other' )
20+ } )
21+
22+ it ( 'should open general feedback mode when messageId is null' , ( ) => {
23+ const store = useFeedbackStore . getState ( )
24+
25+ store . openFeedbackForMessage ( null )
26+
27+ const state = useFeedbackStore . getState ( )
28+ expect ( state . feedbackMode ) . toBe ( true )
29+ expect ( state . feedbackMessageId ) . toBeNull ( )
30+ } )
31+ } )
32+
33+ describe ( 'closeFeedback' , ( ) => {
34+ it ( 'should close feedback mode' , ( ) => {
35+ const store = useFeedbackStore . getState ( )
36+ store . openFeedbackForMessage ( 'message-123' )
37+
38+ store . closeFeedback ( )
39+
40+ const state = useFeedbackStore . getState ( )
41+ expect ( state . feedbackMode ) . toBe ( false )
42+ expect ( state . feedbackMessageId ) . toBeNull ( )
43+ } )
44+ } )
45+
46+ describe ( 'feedback text management' , ( ) => {
47+ it ( 'should update feedback text and cursor' , ( ) => {
48+ const store = useFeedbackStore . getState ( )
49+
50+ store . setFeedbackText ( 'This is my feedback' )
51+ store . setFeedbackCursor ( 10 )
52+
53+ const state = useFeedbackStore . getState ( )
54+ expect ( state . feedbackText ) . toBe ( 'This is my feedback' )
55+ expect ( state . feedbackCursor ) . toBe ( 10 )
56+ } )
57+
58+ it ( 'should update feedback category' , ( ) => {
59+ const store = useFeedbackStore . getState ( )
60+
61+ store . setFeedbackCategory ( 'good_result' )
62+
63+ expect ( useFeedbackStore . getState ( ) . feedbackCategory ) . toBe ( 'good_result' )
64+ } )
65+ } )
66+
67+ describe ( 'input save and restore' , ( ) => {
68+ it ( 'should save and restore input state' , ( ) => {
69+ const store = useFeedbackStore . getState ( )
70+
71+ store . saveCurrentInput ( 'My current input' , 15 )
72+
73+ const restored = store . restoreSavedInput ( )
74+ expect ( restored . value ) . toBe ( 'My current input' )
75+ expect ( restored . cursor ) . toBe ( 15 )
76+ } )
77+ } )
78+
79+ describe ( 'feedback submission tracking' , ( ) => {
80+ it ( 'should mark a message as having feedback submitted' , ( ) => {
81+ const store = useFeedbackStore . getState ( )
82+
83+ store . markMessageFeedbackSubmitted ( 'message-123' , 'good_result' )
84+
85+ const state = useFeedbackStore . getState ( )
86+ expect ( state . messagesWithFeedback . has ( 'message-123' ) ) . toBe ( true )
87+ expect ( state . messageFeedbackCategories . get ( 'message-123' ) ) . toBe ( 'good_result' )
88+ } )
89+
90+ it ( 'should track multiple message feedbacks' , ( ) => {
91+ const store = useFeedbackStore . getState ( )
92+
93+ store . markMessageFeedbackSubmitted ( 'message-1' , 'good_result' )
94+ store . markMessageFeedbackSubmitted ( 'message-2' , 'bad_result' )
95+ store . markMessageFeedbackSubmitted ( 'message-3' , 'app_bug' )
96+
97+ const state = useFeedbackStore . getState ( )
98+ expect ( state . messagesWithFeedback . size ) . toBe ( 3 )
99+ expect ( state . messageFeedbackCategories . size ) . toBe ( 3 )
100+ expect ( state . messageFeedbackCategories . get ( 'message-2' ) ) . toBe ( 'bad_result' )
101+ } )
102+ } )
103+
104+ describe ( 'resetFeedbackForm' , ( ) => {
105+ it ( 'should reset form fields but keep metadata' , ( ) => {
106+ const store = useFeedbackStore . getState ( )
107+
108+ store . setFeedbackText ( 'Some text' )
109+ store . setFeedbackCursor ( 5 )
110+ store . setFeedbackCategory ( 'bad_result' )
111+ store . openFeedbackForMessage ( 'message-123' )
112+ store . markMessageFeedbackSubmitted ( 'message-456' , 'good_result' )
113+
114+ store . resetFeedbackForm ( )
115+
116+ const state = useFeedbackStore . getState ( )
117+ expect ( state . feedbackText ) . toBe ( '' )
118+ expect ( state . feedbackCursor ) . toBe ( 0 )
119+ expect ( state . feedbackCategory ) . toBe ( 'other' )
120+ expect ( state . feedbackMessageId ) . toBeNull ( )
121+ expect ( state . messagesWithFeedback . has ( 'message-456' ) ) . toBe ( true )
122+ } )
123+ } )
124+
125+ describe ( 'reset' , ( ) => {
126+ it ( 'should reset entire store to initial state' , ( ) => {
127+ const store = useFeedbackStore . getState ( )
128+
129+ store . openFeedbackForMessage ( 'message-123' )
130+ store . setFeedbackText ( 'Some text' )
131+ store . markMessageFeedbackSubmitted ( 'message-456' , 'good_result' )
132+ store . saveCurrentInput ( 'Saved input' , 10 )
133+
134+ store . reset ( )
135+
136+ const state = useFeedbackStore . getState ( )
137+ expect ( state . feedbackMode ) . toBe ( false )
138+ expect ( state . feedbackMessageId ) . toBeNull ( )
139+ expect ( state . feedbackText ) . toBe ( '' )
140+ expect ( state . feedbackCursor ) . toBe ( 0 )
141+ expect ( state . feedbackCategory ) . toBe ( 'other' )
142+ expect ( state . savedInputValue ) . toBe ( '' )
143+ expect ( state . savedCursorPosition ) . toBe ( 0 )
144+ expect ( state . messagesWithFeedback . size ) . toBe ( 0 )
145+ expect ( state . messageFeedbackCategories . size ) . toBe ( 0 )
146+ } )
147+ } )
148+
149+ describe ( 'selectors' , ( ) => {
150+ it ( 'should correctly select feedback open state for specific message' , ( ) => {
151+ const { selectIsFeedbackOpenForMessage } = require ( '../feedback-store' )
152+ const store = useFeedbackStore . getState ( )
153+
154+ store . openFeedbackForMessage ( 'message-123' )
155+
156+ const state = useFeedbackStore . getState ( )
157+ expect ( selectIsFeedbackOpenForMessage ( 'message-123' ) ( state ) ) . toBe ( true )
158+ expect ( selectIsFeedbackOpenForMessage ( 'message-456' ) ( state ) ) . toBe ( false )
159+ } )
160+
161+ it ( 'should correctly select if message has submitted feedback' , ( ) => {
162+ const { selectHasSubmittedFeedback } = require ( '../feedback-store' )
163+ const store = useFeedbackStore . getState ( )
164+
165+ store . markMessageFeedbackSubmitted ( 'message-123' , 'good_result' )
166+
167+ const state = useFeedbackStore . getState ( )
168+ expect ( selectHasSubmittedFeedback ( 'message-123' ) ( state ) ) . toBe ( true )
169+ expect ( selectHasSubmittedFeedback ( 'message-456' ) ( state ) ) . toBe ( false )
170+ } )
171+
172+ it ( 'should correctly select message feedback category' , ( ) => {
173+ const { selectMessageFeedbackCategory } = require ( '../feedback-store' )
174+ const store = useFeedbackStore . getState ( )
175+
176+ store . markMessageFeedbackSubmitted ( 'message-123' , 'bad_result' )
177+
178+ const state = useFeedbackStore . getState ( )
179+ expect ( selectMessageFeedbackCategory ( 'message-123' ) ( state ) ) . toBe ( 'bad_result' )
180+ expect ( selectMessageFeedbackCategory ( 'message-456' ) ( state ) ) . toBeUndefined ( )
181+ } )
182+ } )
183+ } )
0 commit comments