import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:ikar/core/media/clipboard/clipboard_channel.dart'; import 'package:ikar/core/media/clipboard/pasted_attachment.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); const channel = MethodChannel('ru.ikar.app/clipboard'); final messenger = TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger; tearDown(() => messenger.setMockMethodCallHandler(channel, null)); test('native image preserves format and bytes', () async { final bytes = Uint8List.fromList([71, 73, 70, 56, 57, 97]); messenger.setMockMethodCallHandler( channel, (call) async => {'image': bytes, 'imageExtension': 'GIF'}, ); final result = await ClipboardChannel.read(); expect(result!.png, bytes); expect(result.imageExtension, '.gif'); }); test('Android cached files are passed through', () async { messenger.setMockMethodCallHandler( channel, (call) async => { 'files': ['/synthetic/cache/pasted.png'], }, ); final result = await ClipboardChannel.read(); expect(result!.paths, ['/synthetic/cache/pasted.png']); }); test('clipboard permission failure is handled as unavailable', () async { messenger.setMockMethodCallHandler(channel, (call) async { throw PlatformException(code: 'DENIED'); }); expect(await ClipboardChannel.hasMedia(), isFalse); expect(await ClipboardChannel.read(), isNull); }); test('untrusted extension cannot become a path', () async { messenger.setMockMethodCallHandler( channel, (call) async => { 'image': Uint8List.fromList([1]), 'imageExtension': '../jpg', }, ); expect((await ClipboardChannel.read())!.imageExtension, isNull); }); test('keyboard mime types map to image extensions', () { expect(pastedImageExtension('image/jpeg'), '.jpg'); expect(pastedImageExtension('image/gif'), '.gif'); expect(pastedImageExtension('image/webp'), '.webp'); expect(pastedImageExtension('image/png'), '.png'); }); }