@@ -1253,4 +1253,160 @@ describe("MediaMock", () => {
12531253 expect ( settings . width ) . toBeGreaterThan ( 0 ) ;
12541254 expect ( settings . height ) . toBeGreaterThan ( 0 ) ;
12551255 } ) ;
1256+
1257+ // ===== STREAM LABEL TESTS =====
1258+
1259+ it ( "should set stream track label to match selected device label" , async ( ) => {
1260+ const device = getDeviceForBrowser ( ) ;
1261+ MediaMock . mock ( device ) ;
1262+ await MediaMock . setMediaURL ( imageUrl ) ;
1263+
1264+ const stream = await navigator . mediaDevices . getUserMedia ( { video : true } ) ;
1265+ expect ( stream ) . toBeDefined ( ) ;
1266+ expect ( stream . getVideoTracks ( ) . length ) . toBeGreaterThan ( 0 ) ;
1267+
1268+ const videoTrack = stream . getVideoTracks ( ) [ 0 ] ;
1269+
1270+ // Get the expected label from the device's first videoinput device
1271+ const expectedLabel = device . mediaDeviceInfo . find (
1272+ ( d ) => d . kind === "videoinput" ,
1273+ ) ?. label ;
1274+
1275+ // Stream track label should match the device label
1276+ expect ( videoTrack . label ) . toBe ( expectedLabel ) ;
1277+ } ) ;
1278+
1279+ it ( "should select front camera when facingMode user constraint is specified" , async ( ) => {
1280+ const device = getDeviceForBrowser ( ) ;
1281+ MediaMock . mock ( device ) ;
1282+ await MediaMock . setMediaURL ( imageUrl ) ;
1283+
1284+ const stream = await navigator . mediaDevices . getUserMedia ( {
1285+ video : { facingMode : "user" } ,
1286+ } ) ;
1287+ expect ( stream ) . toBeDefined ( ) ;
1288+
1289+ const videoTrack = stream . getVideoTracks ( ) [ 0 ] ;
1290+
1291+ // Get the last front camera (user) from the device (should be the primary one)
1292+ const frontCameras = device . mediaDeviceInfo . filter (
1293+ ( d ) => d . kind === "videoinput" && d . getCapabilities ( ) . facingMode ?. includes ( "user" ) ,
1294+ ) ;
1295+ const primaryFrontCamera = frontCameras . length > 0 ? frontCameras [ frontCameras . length - 1 ] : undefined ;
1296+
1297+ // Stream track label should match the selected front camera label
1298+ expect ( videoTrack . label ) . toBe ( primaryFrontCamera ?. label ) ;
1299+ } ) ;
1300+
1301+ it ( "should select back camera when facingMode environment constraint is specified" , async ( ) => {
1302+ const device = getDeviceForBrowser ( ) ;
1303+ MediaMock . mock ( device ) ;
1304+ await MediaMock . setMediaURL ( imageUrl ) ;
1305+
1306+ const stream = await navigator . mediaDevices . getUserMedia ( {
1307+ video : { facingMode : "environment" } ,
1308+ } ) ;
1309+ expect ( stream ) . toBeDefined ( ) ;
1310+
1311+ const videoTrack = stream . getVideoTracks ( ) [ 0 ] ;
1312+
1313+ // Get the last back camera (environment) from the device (should be the primary one)
1314+ const backCameras = device . mediaDeviceInfo . filter (
1315+ ( d ) => d . kind === "videoinput" && d . getCapabilities ( ) . facingMode ?. includes ( "environment" ) ,
1316+ ) ;
1317+ const primaryBackCamera = backCameras . length > 0 ? backCameras [ backCameras . length - 1 ] : undefined ;
1318+
1319+ // If back camera exists, verify the label matches
1320+ if ( primaryBackCamera ) {
1321+ expect ( videoTrack . label ) . toBe ( primaryBackCamera . label ) ;
1322+ }
1323+ } ) ;
1324+
1325+ it ( "should set stream track deviceId to match selected device" , async ( ) => {
1326+ const device = getDeviceForBrowser ( ) ;
1327+ MediaMock . mock ( device ) ;
1328+ await MediaMock . setMediaURL ( imageUrl ) ;
1329+
1330+ const stream = await navigator . mediaDevices . getUserMedia ( { video : true } ) ;
1331+ expect ( stream ) . toBeDefined ( ) ;
1332+ expect ( stream . getVideoTracks ( ) . length ) . toBeGreaterThan ( 0 ) ;
1333+
1334+ const videoTrack = stream . getVideoTracks ( ) [ 0 ] ;
1335+
1336+ // Get the expected deviceId from the device's first videoinput device
1337+ const expectedDeviceId = device . mediaDeviceInfo . find (
1338+ ( d ) => d . kind === "videoinput" ,
1339+ ) ?. deviceId ;
1340+
1341+ // Stream track deviceId should match the device deviceId
1342+ expect ( videoTrack . id ) . toBe ( expectedDeviceId ) ;
1343+ } ) ;
1344+
1345+ it ( "should set stream track deviceId based on facingMode constraint" , async ( ) => {
1346+ const device = getDeviceForBrowser ( ) ;
1347+ MediaMock . mock ( device ) ;
1348+ await MediaMock . setMediaURL ( imageUrl ) ;
1349+
1350+ const stream = await navigator . mediaDevices . getUserMedia ( {
1351+ video : { facingMode : "user" } ,
1352+ } ) ;
1353+ expect ( stream ) . toBeDefined ( ) ;
1354+
1355+ const videoTrack = stream . getVideoTracks ( ) [ 0 ] ;
1356+
1357+ // Get the last front camera (user) from the device (should be the primary one)
1358+ const frontCameras = device . mediaDeviceInfo . filter (
1359+ ( d ) => d . kind === "videoinput" && d . getCapabilities ( ) . facingMode ?. includes ( "user" ) ,
1360+ ) ;
1361+ const primaryFrontCamera = frontCameras . length > 0 ? frontCameras [ frontCameras . length - 1 ] : undefined ;
1362+
1363+ // Stream track deviceId should match the selected camera's deviceId
1364+ expect ( videoTrack . id ) . toBe ( primaryFrontCamera ?. deviceId ) ;
1365+ } ) ;
1366+
1367+ it ( "should support facingMode as object with ideal constraint" , async ( ) => {
1368+ const device = getDeviceForBrowser ( ) ;
1369+ MediaMock . mock ( device ) ;
1370+ await MediaMock . setMediaURL ( imageUrl ) ;
1371+
1372+ const stream = await navigator . mediaDevices . getUserMedia ( {
1373+ video : { facingMode : { ideal : "environment" } } ,
1374+ } ) ;
1375+ expect ( stream ) . toBeDefined ( ) ;
1376+
1377+ const videoTrack = stream . getVideoTracks ( ) [ 0 ] ;
1378+
1379+ // Get the last back camera (environment) from the device
1380+ const backCameras = device . mediaDeviceInfo . filter (
1381+ ( d ) => d . kind === "videoinput" && d . getCapabilities ( ) . facingMode ?. includes ( "environment" ) ,
1382+ ) ;
1383+ const primaryBackCamera = backCameras . length > 0 ? backCameras [ backCameras . length - 1 ] : undefined ;
1384+
1385+ // Stream track label should match the selected back camera
1386+ if ( primaryBackCamera ) {
1387+ expect ( videoTrack . label ) . toBe ( primaryBackCamera . label ) ;
1388+ }
1389+ } ) ;
1390+
1391+ it ( "should support facingMode as object with exact constraint" , async ( ) => {
1392+ const device = getDeviceForBrowser ( ) ;
1393+ MediaMock . mock ( device ) ;
1394+ await MediaMock . setMediaURL ( imageUrl ) ;
1395+
1396+ const stream = await navigator . mediaDevices . getUserMedia ( {
1397+ video : { facingMode : { exact : "user" } } ,
1398+ } ) ;
1399+ expect ( stream ) . toBeDefined ( ) ;
1400+
1401+ const videoTrack = stream . getVideoTracks ( ) [ 0 ] ;
1402+
1403+ // Get the last front camera (user) from the device
1404+ const frontCameras = device . mediaDeviceInfo . filter (
1405+ ( d ) => d . kind === "videoinput" && d . getCapabilities ( ) . facingMode ?. includes ( "user" ) ,
1406+ ) ;
1407+ const primaryFrontCamera = frontCameras . length > 0 ? frontCameras [ frontCameras . length - 1 ] : undefined ;
1408+
1409+ // Stream track label should match the selected front camera
1410+ expect ( videoTrack . label ) . toBe ( primaryFrontCamera ?. label ) ;
1411+ } ) ;
12561412} ) ;
0 commit comments