Skip to content

Commit f2d38f2

Browse files
update tests for project-scoped storage and new features
1 parent b684a05 commit f2d38f2

2 files changed

Lines changed: 93 additions & 6 deletions

File tree

packages/memory/test/hooks.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ const mockLogger: Logger = {
1313
}
1414

1515
const mockSessionStateService = {
16-
getPlanningState: () => null,
17-
getCompactionSnapshot: () => null,
16+
getPlanningState: (_sessionId: string, _projectId: string) => null,
17+
getCompactionSnapshot: (_sessionId: string, _projectId: string) => null,
1818
setCompactionSnapshot: () => {},
1919
} as unknown as SessionStateService
2020

2121
const createMockSessionStateServiceWithPlanning = (planningState: PlanningState | null): SessionStateService => ({
22-
getPlanningState: () => planningState,
23-
getCompactionSnapshot: () => null,
22+
getPlanningState: (_sessionId: string, _projectId: string) => planningState,
23+
getCompactionSnapshot: (_sessionId: string, _projectId: string) => null,
2424
setCompactionSnapshot: () => {},
2525
} as unknown as SessionStateService)
2626

packages/memory/test/session-state.test.ts

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

166253
describe('createSessionStateQueries', () => {

0 commit comments

Comments
 (0)