file download actor

This commit is contained in:
randogoth 2026-06-08 12:33:37 +03:00
parent 0cdf3d7dbf
commit 0596fdec27
4 changed files with 179 additions and 0 deletions

View file

@ -0,0 +1,84 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';
import 'package:swarm/swarm.dart';
import 'package:test/test.dart';
void main() {
late Directory tmpDir;
setUp(() async {
tmpDir = await Directory.systemTemp.createTemp('file_download_test_');
});
tearDown(() async {
await tmpDir.delete(recursive: true);
});
FileDownloadActor makeActor(http.Client client) => FileDownloadActor(
fileActor: FileActor(),
httpClient: client,
);
test('returns FileDownloaded with correct savePath', () async {
final client = MockClient(
(_) async => http.Response.bytes([1, 2, 3], 200),
);
final path = '${tmpDir.path}/output.bin';
final result = await makeActor(client).handle(
DownloadFile(url: 'https://example.com/file', savePath: path),
);
expect(result, isA<FileDownloaded>());
expect((result as FileDownloaded).savePath, equals(path));
});
test('saves correct bytes to disk', () async {
final bytes = Uint8List.fromList([0xDE, 0xAD, 0xBE, 0xEF]);
final client = MockClient(
(_) async => http.Response.bytes(bytes, 200),
);
final path = '${tmpDir.path}/data.bin';
await makeActor(client).handle(
DownloadFile(url: 'https://example.com/file', savePath: path),
);
expect(await File(path).readAsBytes(), equals(bytes));
});
test('sends GET request to the correct URL', () async {
http.Request? captured;
final client = MockClient((request) async {
captured = request;
return http.Response.bytes([0], 200);
});
await makeActor(client).handle(
DownloadFile(
url: 'https://example.com/assets/image.png',
savePath: '${tmpDir.path}/image.png',
),
);
expect(captured!.method, equals('GET'));
expect(
captured!.url.toString(),
equals('https://example.com/assets/image.png'),
);
});
test('non-2xx response throws', () async {
for (final status in [400, 403, 404, 500]) {
final client = MockClient(
(_) async => http.Response.bytes([], status),
);
await expectLater(
makeActor(client).handle(
DownloadFile(
url: 'https://example.com/file',
savePath: '${tmpDir.path}/out.bin',
),
),
throwsA(isA<Exception>()),
);
}
});
}