@@ -24,7 +24,11 @@ vi.mock('uuid', () => ({
2424 v4 : ( ) => 'mock-uuid-1234' ,
2525} ) )
2626
27- import { updateSpeaker , getOrCreateSpeaker } from '@/lib/speaker/sanity'
27+ import {
28+ updateSpeaker ,
29+ getOrCreateSpeaker ,
30+ getSpeaker ,
31+ } from '@/lib/speaker/sanity'
2832import type { Speaker } from '@/lib/speaker/types'
2933import type { Account , User } from 'next-auth'
3034
@@ -225,3 +229,86 @@ describe('getOrCreateSpeaker', () => {
225229 expect ( createArg . image ) . toBeUndefined ( )
226230 } )
227231} )
232+
233+ describe ( 'isOrganizer computed from conference.organizers' , ( ) => {
234+ beforeEach ( ( ) => {
235+ vi . clearAllMocks ( )
236+ } )
237+
238+ it ( 'should propagate isOrganizer: true from Sanity response through getOrCreateSpeaker' , async ( ) => {
239+ const organizer = {
240+ ...baseSpeaker ,
241+ isOrganizer : true ,
242+ providers : [ 'github:12345' ] ,
243+ }
244+ mockFetch . mockResolvedValue ( organizer )
245+
246+ const { speaker, err } = await getOrCreateSpeaker (
247+ { email : organizer . email , name : organizer . name } ,
248+ { provider : 'github' , providerAccountId : '12345' , type : 'oauth' } ,
249+ )
250+
251+ expect ( err ) . toBeNull ( )
252+ expect ( speaker . isOrganizer ) . toBe ( true )
253+ } )
254+
255+ it ( 'should propagate isOrganizer: false from Sanity response through getOrCreateSpeaker' , async ( ) => {
256+ const regular = {
257+ ...baseSpeaker ,
258+ isOrganizer : false ,
259+ providers : [ 'github:67890' ] ,
260+ }
261+ mockFetch . mockResolvedValue ( regular )
262+
263+ const { speaker, err } = await getOrCreateSpeaker (
264+ { email : regular . email , name : regular . name } ,
265+ { provider : 'github' , providerAccountId : '67890' , type : 'oauth' } ,
266+ )
267+
268+ expect ( err ) . toBeNull ( )
269+ expect ( speaker . isOrganizer ) . toBe ( false )
270+ } )
271+
272+ it ( 'should propagate isOrganizer through getSpeaker' , async ( ) => {
273+ mockFetch . mockResolvedValue ( { ...baseSpeaker , isOrganizer : true } )
274+
275+ const { speaker, err } = await getSpeaker ( 'speaker-1' )
276+
277+ expect ( err ) . toBeNull ( )
278+ expect ( speaker . isOrganizer ) . toBe ( true )
279+ } )
280+
281+ it ( 'should handle undefined isOrganizer as falsy' , async ( ) => {
282+ const speakerWithoutFlag = { ...baseSpeaker }
283+ delete ( speakerWithoutFlag as Record < string , unknown > ) . isOrganizer
284+ mockFetch . mockResolvedValue ( speakerWithoutFlag )
285+
286+ const { speaker, err } = await getSpeaker ( 'speaker-1' )
287+
288+ expect ( err ) . toBeNull ( )
289+ expect ( speaker . isOrganizer ) . toBeFalsy ( )
290+ } )
291+
292+ it ( 'should include isOrganizer in GROQ query for findSpeakerByProvider' , async ( ) => {
293+ mockFetch . mockResolvedValue ( null )
294+
295+ await getOrCreateSpeaker (
296+ { email : 'test@test.com' , name : 'Test' } ,
297+ { provider : 'github' , providerAccountId : '99' , type : 'oauth' } ,
298+ )
299+
300+ const query = mockFetch . mock . calls [ 0 ] [ 0 ] as string
301+ expect ( query ) . toContain ( 'isOrganizer' )
302+ expect ( query ) . toContain ( 'conference' )
303+ } )
304+
305+ it ( 'should include isOrganizer in GROQ query for getSpeaker' , async ( ) => {
306+ mockFetch . mockResolvedValue ( baseSpeaker )
307+
308+ await getSpeaker ( 'speaker-1' )
309+
310+ const query = mockFetch . mock . calls [ 0 ] [ 0 ] as string
311+ expect ( query ) . toContain ( 'isOrganizer' )
312+ expect ( query ) . toContain ( 'conference' )
313+ } )
314+ } )
0 commit comments