twonly-app-dependencies/no_screenshot/test/secure_widget_test.dart
2026-03-14 00:16:48 +01:00

236 lines
6.4 KiB
Dart

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:no_screenshot/no_screenshot_platform_interface.dart';
import 'package:no_screenshot/overlay_mode.dart';
import 'package:no_screenshot/screenshot_snapshot.dart';
import 'package:no_screenshot/secure_widget.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
class _RecordingPlatform extends NoScreenshotPlatform
with MockPlatformInterfaceMixin {
final List<String> calls = [];
@override
Future<bool> screenshotOff() async {
calls.add('screenshotOff');
return true;
}
@override
Future<bool> screenshotOn() async {
calls.add('screenshotOn');
return true;
}
@override
Future<bool> screenshotWithImage() async {
calls.add('screenshotWithImage');
return true;
}
@override
Future<bool> screenshotWithBlur({double blurRadius = 30.0}) async {
calls.add('screenshotWithBlur($blurRadius)');
return true;
}
@override
Future<bool> screenshotWithColor({int color = 0xFF000000}) async {
calls.add('screenshotWithColor($color)');
return true;
}
@override
Future<bool> toggleScreenshot() async => true;
@override
Future<bool> toggleScreenshotWithImage() async => true;
@override
Future<bool> toggleScreenshotWithBlur({double blurRadius = 30.0}) async =>
true;
@override
Future<bool> toggleScreenshotWithColor({int color = 0xFF000000}) async =>
true;
@override
Stream<ScreenshotSnapshot> get screenshotStream => const Stream.empty();
@override
Future<void> startScreenshotListening() async {}
@override
Future<void> stopScreenshotListening() async {}
@override
Future<void> startScreenRecordingListening() async {}
@override
Future<void> stopScreenRecordingListening() async {}
}
void main() {
late _RecordingPlatform fakePlatform;
late NoScreenshotPlatform originalPlatform;
setUp(() {
originalPlatform = NoScreenshotPlatform.instance;
fakePlatform = _RecordingPlatform();
NoScreenshotPlatform.instance = fakePlatform;
});
tearDown(() {
NoScreenshotPlatform.instance = originalPlatform;
});
testWidgets('default mode is OverlayMode.secure', (tester) async {
await tester.pumpWidget(const SecureWidget(child: SizedBox()));
await tester.pump();
expect(fakePlatform.calls, contains('screenshotOff'));
});
testWidgets('initState calls screenshotOff for OverlayMode.secure', (
tester,
) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.secure, child: SizedBox()),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotOff'));
});
testWidgets('initState calls screenshotWithBlur for OverlayMode.blur', (
tester,
) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.blur, child: SizedBox()),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotWithBlur(30.0)'));
});
testWidgets('initState calls screenshotWithColor for OverlayMode.color', (
tester,
) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.color, child: SizedBox()),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotWithColor(4278190080)'));
});
testWidgets('initState calls screenshotWithImage for OverlayMode.image', (
tester,
) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.image, child: SizedBox()),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotWithImage'));
});
testWidgets('initState calls screenshotOn for OverlayMode.none', (
tester,
) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.none, child: SizedBox()),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotOn'));
});
testWidgets('dispose calls screenshotOn', (tester) async {
await tester.pumpWidget(const SecureWidget(child: SizedBox()));
await tester.pump();
fakePlatform.calls.clear();
// Remove the widget to trigger dispose
await tester.pumpWidget(const SizedBox());
await tester.pump();
expect(fakePlatform.calls, contains('screenshotOn'));
});
testWidgets('didUpdateWidget re-applies when mode changes', (tester) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.secure, child: SizedBox()),
);
await tester.pump();
fakePlatform.calls.clear();
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.blur, child: SizedBox()),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotWithBlur(30.0)'));
});
testWidgets('didUpdateWidget re-applies when blurRadius changes', (
tester,
) async {
await tester.pumpWidget(
const SecureWidget(
mode: OverlayMode.blur,
blurRadius: 30.0,
child: SizedBox(),
),
);
await tester.pump();
fakePlatform.calls.clear();
await tester.pumpWidget(
const SecureWidget(
mode: OverlayMode.blur,
blurRadius: 50.0,
child: SizedBox(),
),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotWithBlur(50.0)'));
});
testWidgets('didUpdateWidget re-applies when color changes', (tester) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.color, child: SizedBox()),
);
await tester.pump();
fakePlatform.calls.clear();
await tester.pumpWidget(
const SecureWidget(
mode: OverlayMode.color,
color: 0xFFFF0000,
child: SizedBox(),
),
);
await tester.pump();
expect(fakePlatform.calls, contains('screenshotWithColor(4294901760)'));
});
testWidgets('didUpdateWidget does not re-apply when nothing changes', (
tester,
) async {
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.secure, child: SizedBox()),
);
await tester.pump();
fakePlatform.calls.clear();
// Rebuild with same params
await tester.pumpWidget(
const SecureWidget(mode: OverlayMode.secure, child: SizedBox()),
);
await tester.pump();
expect(fakePlatform.calls, isEmpty);
});
testWidgets('child is rendered correctly', (tester) async {
await tester.pumpWidget(
const Directionality(
textDirection: TextDirection.ltr,
child: SecureWidget(child: Text('Hello')),
),
);
expect(find.text('Hello'), findsOneWidget);
});
}