Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: add initializeCamera and onCameraInitialized tests
  • Loading branch information
bselwe committed Jul 23, 2021
commit a1f200d52b2491b1797fe515e0688ba4d177866e
134 changes: 112 additions & 22 deletions packages/camera/camera_web/example/integration_test/camera_web_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import 'dart:html';
import 'dart:ui';

import 'package:async/async.dart';
import 'package:camera_platform_interface/camera_platform_interface.dart';
import 'package:camera_web/camera_web.dart';
import 'package:camera_web/src/camera.dart';
Expand Down Expand Up @@ -327,21 +328,18 @@ void main() {
const ultraHighResolutionSize = Size(3840, 2160);
const maxResolutionSize = Size(3840, 2160);

late CameraDescription cameraDescription;
late CameraMetadata cameraMetadata;

setUp(() {
cameraDescription = CameraDescription(
name: 'name',
lensDirection: CameraLensDirection.front,
sensorOrientation: 0,
);
final cameraDescription = CameraDescription(
name: 'name',
lensDirection: CameraLensDirection.front,
sensorOrientation: 0,
);

cameraMetadata = CameraMetadata(
deviceId: 'deviceId',
facingMode: 'user',
);
final cameraMetadata = CameraMetadata(
deviceId: 'deviceId',
facingMode: 'user',
);

setUp(() {
// Add metadata for the camera description.
(CameraPlatform.instance as CameraPlugin)
.camerasMetadata[cameraDescription] = cameraMetadata;
Expand Down Expand Up @@ -434,11 +432,38 @@ void main() {
});
});

testWidgets('initializeCamera throws UnimplementedError', (tester) async {
expect(
() => CameraPlatform.instance.initializeCamera(cameraId),
throwsUnimplementedError,
);
group('initializeCamera', () {
testWidgets(
'throws CameraException '
'with notFound error '
'if the camera does not exist', (tester) async {
expect(
() => CameraPlatform.instance.initializeCamera(cameraId),
throwsA(
isA<CameraException>().having(
(e) => e.code,
'code',
CameraErrorCodes.notFound,
),
),
);
});

testWidgets('initializes and plays the camera', (tester) async {
final camera = MockCamera();

when(camera.getVideoSize).thenAnswer((_) => Future.value(Size(10, 10)));
when(camera.initialize).thenAnswer((_) => Future.value());
when(camera.play).thenAnswer((_) => Future.value());

// Save the camera in the camera plugin.
(CameraPlatform.instance as CameraPlugin).cameras[cameraId] = camera;

await CameraPlatform.instance.initializeCamera(cameraId);

verify(camera.initialize).called(1);
verify(camera.play).called(1);
});
});

testWidgets('lockCaptureOrientation throws UnimplementedError',
Expand Down Expand Up @@ -628,13 +653,78 @@ void main() {
);
});

group('getCamera', () {
testWidgets('returns the correct camera', (tester) async {
final camera = Camera(textureId: cameraId, window: window);

// Save the camera in the camera plugin.
(CameraPlatform.instance as CameraPlugin).cameras[cameraId] = camera;

expect(
(CameraPlatform.instance as CameraPlugin).getCamera(cameraId),
equals(camera),
);
});

testWidgets(
'throws CameraException '
'with notFound error '
'if the camera does not exist', (tester) async {
expect(
() => (CameraPlatform.instance as CameraPlugin).getCamera(cameraId),
throwsA(
isA<CameraException>().having(
(e) => e.code,
'code',
CameraErrorCodes.notFound,
),
),
);
});
});

group('events', () {
testWidgets('onCameraInitialized throws UnimplementedError',
(tester) async {
testWidgets(
'onCameraInitialized emits a CameraInitializedEvent '
'on initializeCamera', (tester) async {
// Mock the camera to use a blank video stream of size 1280x720.
const videoSize = Size(1280, 720);

videoElement = getVideoElementWithBlankStream(videoSize);

when(
() => mediaDevices.getUserMedia(any()),
).thenAnswer((_) async => videoElement.captureStream());

final camera = Camera(
textureId: cameraId,
window: window,
);

// Save the camera in the camera plugin.
(CameraPlatform.instance as CameraPlugin).cameras[cameraId] = camera;

final Stream<CameraInitializedEvent> eventStream =
CameraPlatform.instance.onCameraInitialized(cameraId);

final streamQueue = StreamQueue(eventStream);

await CameraPlatform.instance.initializeCamera(cameraId);

expect(
() => CameraPlatform.instance.onCameraInitialized(cameraId),
throwsUnimplementedError,
await streamQueue.next,
CameraInitializedEvent(
cameraId,
videoSize.width,
videoSize.height,
ExposureMode.auto,
false,
FocusMode.auto,
false,
),
);

await streamQueue.cancel();
});

testWidgets('onCameraResolutionChanged throws UnimplementedError',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import 'dart:html';

import 'package:camera_web/src/camera.dart';
import 'package:camera_web/src/camera_settings.dart';
import 'package:mocktail/mocktail.dart';

Expand All @@ -17,6 +18,8 @@ class MockCameraSettings extends Mock implements CameraSettings {}

class MockMediaStreamTrack extends Mock implements MediaStreamTrack {}

class MockCamera extends Mock implements Camera {}

/// A fake [MediaStream] that returns the provided [_videoTracks].
class FakeMediaStream extends Fake implements MediaStream {
FakeMediaStream(this._videoTracks);
Expand Down