@@ -138,7 +138,7 @@ describe('SessionStateService', () => {
138138 }
139139
140140 service . setPlanningState ( 'session-123' , 'project-1' , planningState )
141- const result = service . getPlanningState ( 'session-123' )
141+ const result = service . getPlanningState ( 'session-123' , 'project-1' )
142142
143143 expect ( result ) . toEqual ( planningState )
144144 } )
@@ -155,12 +155,99 @@ describe('SessionStateService', () => {
155155 }
156156
157157 service . setCompactionSnapshot ( 'session-123' , 'project-1' , snapshot )
158- const result = service . getCompactionSnapshot ( 'session-123' )
158+ const result = service . getCompactionSnapshot ( 'session-123' , 'project-1' )
159159
160160 expect ( result ) . toEqual ( snapshot )
161161 expect ( result ?. branch ) . toBe ( 'main' )
162162 expect ( result ?. activeFiles ?. length ) . toBe ( 2 )
163163 } )
164+
165+ test ( 'same sessionId with different projectIds stores separate state' , ( ) => {
166+ const state1 : PlanningState = { objective : 'Project 1 objective' }
167+ const state2 : PlanningState = { objective : 'Project 2 objective' }
168+
169+ service . setPlanningState ( 'session-abc' , 'project-1' , state1 )
170+ service . setPlanningState ( 'session-abc' , 'project-2' , state2 )
171+
172+ const result1 = service . getPlanningState ( 'session-abc' , 'project-1' )
173+ const result2 = service . getPlanningState ( 'session-abc' , 'project-2' )
174+
175+ expect ( result1 ) . toEqual ( state1 )
176+ expect ( result2 ) . toEqual ( state2 )
177+ } )
178+
179+ test ( 'listPlanningStates returns only planning entries for the given project' , ( ) => {
180+ service . setPlanningState ( 'session-1' , 'project-1' , { objective : 'Task A' } )
181+ service . setPlanningState ( 'session-2' , 'project-1' , { objective : 'Task B' } )
182+ service . setPlanningState ( 'session-3' , 'project-2' , { objective : 'Task C' } )
183+ service . setCompactionSnapshot ( 'session-1' , 'project-1' , {
184+ timestamp : new Date ( ) . toISOString ( ) ,
185+ sessionId : 'session-1' ,
186+ } )
187+
188+ const results = service . listPlanningStates ( 'project-1' )
189+
190+ expect ( results . length ) . toBe ( 2 )
191+ expect ( results . map ( r => r . sessionId ) . sort ( ) ) . toEqual ( [ 'session-1' , 'session-2' ] )
192+ expect ( results [ 0 ] ! . planningState . objective ) . toBeDefined ( )
193+ } )
194+
195+ test ( 'searchPlanningStates finds matching entries by keyword' , ( ) => {
196+ service . setPlanningState ( 'session-1' , 'project-1' , {
197+ objective : 'Refactor authentication flow' ,
198+ current : 'Writing tests' ,
199+ } )
200+ service . setPlanningState ( 'session-2' , 'project-1' , {
201+ objective : 'Add dark mode toggle' ,
202+ current : 'Implementing CSS' ,
203+ } )
204+ service . setPlanningState ( 'session-3' , 'project-1' , {
205+ objective : 'Fix authentication bug' ,
206+ findings : [ 'Token refresh was broken' ] ,
207+ } )
208+
209+ const results = service . searchPlanningStates ( 'project-1' , 'authentication' )
210+
211+ expect ( results . length ) . toBe ( 2 )
212+ const sessionIds = results . map ( r => r . sessionId ) . sort ( )
213+ expect ( sessionIds ) . toEqual ( [ 'session-1' , 'session-3' ] )
214+ } )
215+
216+ test ( 'searchPlanningStates returns empty array when no matches' , ( ) => {
217+ service . setPlanningState ( 'session-1' , 'project-1' , { objective : 'Build feature X' } )
218+
219+ const results = service . searchPlanningStates ( 'project-1' , 'nonexistent' )
220+
221+ expect ( results . length ) . toBe ( 0 )
222+ } )
223+
224+ test ( 'searchPlanningStates escapes percent wildcard in search term' , ( ) => {
225+ service . setPlanningState ( 'session-1' , 'project-1' , {
226+ objective : '100% complete migration' ,
227+ } )
228+ service . setPlanningState ( 'session-2' , 'project-1' , {
229+ objective : 'Build feature 100' ,
230+ } )
231+
232+ const results = service . searchPlanningStates ( 'project-1' , '100%' )
233+
234+ expect ( results . length ) . toBe ( 1 )
235+ expect ( results [ 0 ] ! . sessionId ) . toBe ( 'session-1' )
236+ } )
237+
238+ test ( 'searchPlanningStates escapes underscore wildcard in search term' , ( ) => {
239+ service . setPlanningState ( 'session-1' , 'project-1' , {
240+ objective : 'Fix user_name field validation' ,
241+ } )
242+ service . setPlanningState ( 'session-2' , 'project-1' , {
243+ objective : 'Fix username field validation' ,
244+ } )
245+
246+ const results = service . searchPlanningStates ( 'project-1' , 'user_name' )
247+
248+ expect ( results . length ) . toBe ( 1 )
249+ expect ( results [ 0 ] ! . sessionId ) . toBe ( 'session-1' )
250+ } )
164251} )
165252
166253describe ( 'createSessionStateQueries' , ( ) => {
0 commit comments