@@ -142,17 +142,23 @@ describe('acceptSessionForTarget', () => {
142142 . rejects . toThrow ( 'Cannot accept live screen monitoring session without providing a media stream' ) ;
143143 } ) ;
144144
145- it ( 'should set outbound stream and add tracks' , async ( ) => {
145+ it ( 'should set outbound stream and add tracks with individual streams ' , async ( ) => {
146146 const mockStream = new MockStream ( { video : true } ) ;
147147 const session = new MockSession ( ) ;
148148 const addTrackSpy = jest . fn ( ) . mockResolvedValue ( null ) ;
149+ const createNewStreamSpy = jest . spyOn ( mediaUtils , 'createNewStreamWithTrack' ) . mockReturnValue ( new MockStream ( ) as any ) ;
149150 session . pc . addTrack = addTrackSpy ;
150151
151152 const params = { mediaStream : mockStream } ;
152153 await handler . acceptSessionForTarget ( session as any , params as any ) ;
153154
154155 expect ( session . _outboundStream ) . toBe ( mockStream ) ;
156+ expect ( createNewStreamSpy ) . toHaveBeenCalledTimes ( mockStream . getTracks ( ) . length ) ;
155157 expect ( addTrackSpy ) . toHaveBeenCalledTimes ( mockStream . getTracks ( ) . length ) ;
158+ // Verify addTrack is called with both track and stream
159+ mockStream . getTracks ( ) . forEach ( ( track , index ) => {
160+ expect ( addTrackSpy ) . toHaveBeenNthCalledWith ( index + 1 , track , expect . any ( MockStream ) ) ;
161+ } ) ;
156162 } ) ;
157163} ) ;
158164
@@ -167,103 +173,91 @@ describe('acceptSessionForObserver', () => {
167173 await expect ( handler . acceptSession ( session , { conversationId : session . conversationId , liveMonitoringObserver : true , audioElement : document . createElement ( 'audio' ) } ) ) . rejects . toThrowError ( / r e q u i r e s v i d e o E l e m e n t s a r r a y o r v i d e o E l e m e n t / ) ;
168174 } ) ;
169175
170- it ( 'should attach mediaStreams to video elements when provided ' , async ( ) => {
176+ it ( 'should set up ontrack event handler for incoming streams ' , async ( ) => {
171177 const video1 = document . createElement ( 'video' ) ;
172178 const video2 = document . createElement ( 'video' ) ;
173179 const videoElements = [ video1 , video2 ] ;
174180
175- const stream1 = new MockStream ( { video : true } ) as any ;
176- const stream2 = new MockStream ( { video : true } ) as any ;
177- const metadata1 = { screenId : 'screen1' , trackId : 'track1' , originX : 0 , originY : 0 , resolutionX : 1920 , resolutionY : 1080 , primary : true } ;
178- const metadata2 = { screenId : 'screen2' , trackId : 'track2' , originX : 1920 , originY : 0 , resolutionX : 1920 , resolutionY : 1080 , primary : false } ;
179-
180- const mediaStreams = [
181- { stream : stream1 , metadata : metadata1 } ,
182- { stream : stream2 , metadata : metadata2 }
183- ] ;
184-
181+ const mockStream1 = new MockStream ( { video : true } ) as any ;
182+ const mockStream2 = new MockStream ( { video : true } ) as any ;
185183 const emitSpy = jest . spyOn ( session , 'emit' ) ;
186184
187185 await handler . acceptSession ( session , {
188186 conversationId : session . conversationId ,
189187 liveMonitoringObserver : true ,
190- videoElements,
191- mediaStreams
188+ videoElements
192189 } ) ;
193190
194- expect ( video1 . srcObject ) . toBe ( stream1 ) ;
191+ // Verify ontrack handler is set
192+ expect ( session . pc . ontrack ) . toBeDefined ( ) ;
193+
194+ // Simulate track events
195+ session . pc . ontrack ( { streams : [ mockStream1 ] } as any ) ;
196+ session . pc . ontrack ( { streams : [ mockStream2 ] } as any ) ;
197+
198+ expect ( video1 . srcObject ) . toBe ( mockStream1 ) ;
195199 expect ( video1 . muted ) . toBe ( true ) ;
196200 expect ( video1 . autoplay ) . toBe ( true ) ;
197201
198- expect ( video2 . srcObject ) . toBe ( stream2 ) ;
202+ expect ( video2 . srcObject ) . toBe ( mockStream2 ) ;
199203 expect ( video2 . muted ) . toBe ( true ) ;
200204 expect ( video2 . autoplay ) . toBe ( true ) ;
201205
202206 expect ( emitSpy ) . toHaveBeenCalledWith ( 'incomingMedia' ) ;
207+ expect ( emitSpy ) . toHaveBeenCalledTimes ( 2 ) ;
203208 } ) ;
204209
205210 it ( 'should only attach streams up to the number of available video elements' , async ( ) => {
206211 const video1 = document . createElement ( 'video' ) ;
207212 const videoElements = [ video1 ] ; // Only one video element
208213
209- const stream1 = new MockStream ( { video : true } ) as any ;
210- const stream2 = new MockStream ( { video : true } ) as any ;
211- const metadata = { screenId : 'screen1' , trackId : 'track1' , originX : 0 , originY : 0 , resolutionX : 1920 , resolutionY : 1080 , primary : true } ;
212-
213- const mediaStreams = [
214- { stream : stream1 , metadata } ,
215- { stream : stream2 , metadata } // This won't be attached
216- ] ;
214+ const mockStream1 = new MockStream ( { video : true } ) as any ;
215+ const mockStream2 = new MockStream ( { video : true } ) as any ;
217216
218217 await handler . acceptSession ( session , {
219218 conversationId : session . conversationId ,
220219 liveMonitoringObserver : true ,
221- videoElements,
222- mediaStreams
220+ videoElements
223221 } ) ;
224222
225- expect ( video1 . srcObject ) . toBe ( stream1 ) ;
226- // stream2 should not be attached anywhere
223+ // Simulate track events
224+ session . pc . ontrack ( { streams : [ mockStream1 ] } as any ) ;
225+ session . pc . ontrack ( { streams : [ mockStream2 ] } as any ) ;
226+
227+ expect ( video1 . srcObject ) . toBe ( mockStream1 ) ;
228+ // Second stream should not be attached since no more video elements
227229 } ) ;
228230
229- it ( 'should use videoElement field when no videoElements provided ' , async ( ) => {
231+ it ( 'should use videoElement field when no videoElements provided' , async ( ) => {
230232 const videoElement = document . createElement ( 'video' ) ;
231-
232- const stream1 = new MockStream ( { video : true } ) as any ;
233- const stream2 = new MockStream ( { video : true } ) as any ;
234- const metadata = { screenId : 'screen1' , trackId : 'track1' , originX : 0 , originY : 0 , resolutionX : 1920 , resolutionY : 1080 , primary : true } ;
235-
236- const mediaStreams = [
237- { stream : stream1 , metadata } ,
238- { stream : stream2 , metadata } // This won't be attached
239- ] ;
233+ const mockStream = new MockStream ( { video : true } ) as any ;
240234
241235 await handler . acceptSession ( session , {
242236 conversationId : session . conversationId ,
243237 liveMonitoringObserver : true ,
244- videoElement,
245- mediaStreams
238+ videoElement
246239 } ) ;
247240
248- expect ( videoElement . srcObject ) . toBe ( stream1 ) ;
249- // stream2 should not be attached anywhere
241+ // Simulate track event
242+ session . pc . ontrack ( { streams : [ mockStream ] } as any ) ;
243+
244+ expect ( videoElement . srcObject ) . toBe ( mockStream ) ;
250245 } ) ;
251246
252247 it ( 'should use default video element when no videoElements or videoElement provided' , async ( ) => {
253248 const defaultVideo = document . createElement ( 'video' ) ;
254249 mockSdk . _config . defaults ! . videoElement = defaultVideo ;
255-
256- const stream = new MockStream ( { video : true } ) as any ;
257- const metadata = { screenId : 'screen1' , trackId : 'track1' , originX : 0 , originY : 0 , resolutionX : 1920 , resolutionY : 1080 , primary : true } ;
258- const mediaStreams = [ { stream, metadata } ] ;
250+ const mockStream = new MockStream ( { video : true } ) as any ;
259251
260252 await handler . acceptSession ( session , {
261253 conversationId : session . conversationId ,
262- liveMonitoringObserver : true ,
263- mediaStreams
254+ liveMonitoringObserver : true
264255 } ) ;
265256
266- expect ( defaultVideo . srcObject ) . toBe ( stream ) ;
257+ // Simulate track event
258+ session . pc . ontrack ( { streams : [ mockStream ] } as any ) ;
259+
260+ expect ( defaultVideo . srcObject ) . toBe ( mockStream ) ;
267261 } ) ;
268262} ) ;
269263
0 commit comments