| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:html'; |
| |
| import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; |
| import 'package:file_selector_web/src/dom_helper.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:integration_test/integration_test.dart'; |
| |
| void main() { |
| group('dom_helper', () { |
| IntegrationTestWidgetsFlutterBinding.ensureInitialized(); |
| late DomHelper domHelper; |
| late FileUploadInputElement input; |
| |
| FileList? createFileList(List<File> files) { |
| final DataTransfer dataTransfer = DataTransfer(); |
| files.forEach(dataTransfer.items!.add); |
| return dataTransfer.files as FileList?; |
| } |
| |
| void setFilesAndTriggerChange(List<File> files) { |
| input.files = createFileList(files); |
| input.dispatchEvent(Event('change')); |
| } |
| |
| setUp(() { |
| domHelper = DomHelper(); |
| input = FileUploadInputElement(); |
| }); |
| |
| group('getFiles', () { |
| final File mockFile1 = File(<Object>['123456'], 'file1.txt'); |
| final File mockFile2 = File(<Object>[], 'file2.txt'); |
| |
| testWidgets('works', (_) async { |
| final Future<List<XFile>> futureFiles = domHelper.getFiles( |
| input: input, |
| ); |
| |
| setFilesAndTriggerChange(<File>[mockFile1, mockFile2]); |
| |
| final List<XFile> files = await futureFiles; |
| |
| expect(files.length, 2); |
| |
| expect(files[0].name, 'file1.txt'); |
| expect(await files[0].length(), 6); |
| expect(await files[0].readAsString(), '123456'); |
| expect(await files[0].lastModified(), isNotNull); |
| |
| expect(files[1].name, 'file2.txt'); |
| expect(await files[1].length(), 0); |
| expect(await files[1].readAsString(), ''); |
| expect(await files[1].lastModified(), isNotNull); |
| }); |
| |
| testWidgets('works multiple times', (_) async { |
| Future<List<XFile>> futureFiles; |
| List<XFile> files; |
| |
| // It should work the first time |
| futureFiles = domHelper.getFiles(input: input); |
| setFilesAndTriggerChange(<File>[mockFile1]); |
| |
| files = await futureFiles; |
| |
| expect(files.length, 1); |
| expect(files.first.name, mockFile1.name); |
| |
| // The same input should work more than once |
| futureFiles = domHelper.getFiles(input: input); |
| setFilesAndTriggerChange(<File>[mockFile2]); |
| |
| files = await futureFiles; |
| |
| expect(files.length, 1); |
| expect(files.first.name, mockFile2.name); |
| }); |
| |
| testWidgets('sets the <input /> attributes and clicks it', (_) async { |
| const String accept = '.jpg,.png'; |
| const bool multiple = true; |
| bool wasClicked = false; |
| |
| //ignore: unawaited_futures |
| input.onClick.first.then((_) => wasClicked = true); |
| |
| final Future<List<XFile>> futureFile = domHelper.getFiles( |
| accept: accept, |
| multiple: multiple, |
| input: input, |
| ); |
| |
| expect(input.matchesWithAncestors('body'), true); |
| expect(input.accept, accept); |
| expect(input.multiple, multiple); |
| expect( |
| wasClicked, |
| true, |
| reason: |
| 'The <input /> should be clicked otherwise no dialog will be shown', |
| ); |
| |
| setFilesAndTriggerChange(<File>[]); |
| await futureFile; |
| |
| // It should be already removed from the DOM after the file is resolved. |
| expect(input.parent, isNull); |
| }); |
| }); |
| }); |
| } |