@@ -10,6 +10,9 @@ const mockEnrichDescription = vi.hoisted(() =>
1010const mockGenerateTitle = vi . hoisted ( ( ) => vi . fn ( ) ) ;
1111const mockGetQueriesData = vi . hoisted ( ( ) => vi . fn ( ( ) => [ ] as unknown [ ] ) ) ;
1212const mockIsAuthenticated = vi . hoisted ( ( ) => ( { value : true } ) ) ;
13+ const mockCurrentUser = vi . hoisted ( ( ) => ( {
14+ value : { id : 1 } as { id : number } | undefined ,
15+ } ) ) ;
1316const mockUpdateTask = vi . hoisted ( ( ) => vi . fn ( ) . mockResolvedValue ( undefined ) ) ;
1417const mockSetQueriesData = vi . hoisted ( ( ) => vi . fn ( ) ) ;
1518const mockSetQueryData = vi . hoisted ( ( ) => vi . fn ( ) ) ;
@@ -48,6 +51,10 @@ vi.mock("@posthog/ui/features/auth/store", () => ({
4851 ) ,
4952} ) ) ;
5053
54+ vi . mock ( "@posthog/ui/features/auth/useCurrentUser" , ( ) => ( {
55+ useCurrentUser : ( ) => ( { data : mockCurrentUser . value } ) ,
56+ } ) ) ;
57+
5158vi . mock ( "@posthog/core/sessions/sessionEvents" , ( ) => ( {
5259 extractUserPromptsFromEvents : ( ) => mockPrompts . value ,
5360} ) ) ;
@@ -116,6 +123,11 @@ function createTask(overrides: Partial<Task> = {}): Task {
116123 created_at : "2026-05-28T00:00:00.000Z" ,
117124 updated_at : "2026-05-28T00:00:00.000Z" ,
118125 origin_product : "user_created" ,
126+ created_by : {
127+ id : 1 ,
128+ uuid : "user-1" ,
129+ email : "user@example.com" ,
130+ } ,
119131 ...overrides ,
120132 } as Task ;
121133}
@@ -136,6 +148,7 @@ describe("useChatTitleGenerator", () => {
136148 vi . clearAllMocks ( ) ;
137149 useTitleGenerationStore . setState ( { byTaskId : { } } ) ;
138150 mockIsAuthenticated . value = true ;
151+ mockCurrentUser . value = { id : 1 } ;
139152 mockPrompts . value = [ ] ;
140153 mockSessionSummary . value = undefined ;
141154 mockTitleAttachmentPaths . value = [ ] ;
@@ -152,6 +165,14 @@ describe("useChatTitleGenerator", () => {
152165 expect ( mockGenerateTitle ) . not . toHaveBeenCalled ( ) ;
153166 } ) ;
154167
168+ it ( "waits for task creator identity before generating" , ( ) => {
169+ mockCurrentUser . value = undefined ;
170+
171+ renderHook ( ( ) => useChatTitleGenerator ( createTask ( ) ) ) ;
172+
173+ expect ( mockGenerateTitle ) . not . toHaveBeenCalled ( ) ;
174+ } ) ;
175+
155176 it ( "generates title from the saved task description before prompt events arrive" , async ( ) => {
156177 mockGenerateTitle . mockResolvedValue ( {
157178 title : "Fix login bug" ,
@@ -171,6 +192,34 @@ describe("useChatTitleGenerator", () => {
171192 title : "Fix login bug" ,
172193 } ) ;
173194 } ) ;
195+ expect ( mockGenerateTitle ) . toHaveBeenCalledWith ( "Fix the login bug" , {
196+ resolveGithubPrTitles : true ,
197+ } ) ;
198+ } ) ;
199+
200+ it ( "does not resolve GitHub metadata from a teammate's description" , async ( ) => {
201+ mockGenerateTitle . mockResolvedValue ( {
202+ title : "Review PR #123" ,
203+ summary : "Reviewing a pull request" ,
204+ } ) ;
205+
206+ renderHook ( ( ) =>
207+ useChatTitleGenerator (
208+ createTask ( {
209+ created_by : {
210+ id : 2 ,
211+ uuid : "user-2" ,
212+ email : "teammate@example.com" ,
213+ } ,
214+ } ) ,
215+ ) ,
216+ ) ;
217+
218+ await waitFor ( ( ) => {
219+ expect ( mockGenerateTitle ) . toHaveBeenCalledWith ( "Fix the login bug" , {
220+ resolveGithubPrTitles : false ,
221+ } ) ;
222+ } ) ;
174223 } ) ;
175224
176225 it ( "generates title when the task has no title yet" , async ( ) => {
0 commit comments