mangayomi/packages/background_downloader/test/json_test.dart
kodjomoustapha 9b770027db some fix
2023-11-13 18:23:14 +01:00

259 lines
16 KiB
Dart

// ignore_for_file: avoid_print
import 'dart:convert';
import 'package:background_downloader/background_downloader.dart';
import 'package:flutter_test/flutter_test.dart';
const urlWithContentLength = 'https://storage.googleapis'
'.com/approachcharts/test/5MB-test.ZIP';
const urlWithLongContentLength = 'https://storage.googleapis'
'.com/approachcharts/test/57MB-test.ZIP';
final task = DownloadTask(
taskId: 'taskId',
url: 'url',
urlQueryParameters: {'a': 'b'},
filename: 'filename',
headers: {'c': 'd'},
httpRequestMethod: 'GET',
baseDirectory: BaseDirectory.temporary,
directory: 'dir',
group: 'group',
updates: Updates.statusAndProgress,
requiresWiFi: true,
retries: 5,
allowPause: true,
metaData: 'metaData',
creationTime: DateTime.fromMillisecondsSinceEpoch(1000));
const downloadTaskJsonString =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5,"retriesRemaining":5,"creationTime":1000,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask"}';
const downloadTaskJsonStringDoubles =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5.0,"retriesRemaining":5.0,"creationTime":1000.0,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1.0,"group":"group","updates":3.0,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask"}';
final uploadTask = UploadTask(
taskId: 'taskId',
url: 'url',
urlQueryParameters: {'a': 'b'},
filename: 'filename',
headers: {'c': 'd'},
httpRequestMethod: 'PUT',
fileField: 'fileField',
fields: {'e': 'f'},
baseDirectory: BaseDirectory.temporary,
directory: 'dir',
group: 'group',
updates: Updates.statusAndProgress,
requiresWiFi: true,
retries: 5,
metaData: 'metaData',
creationTime: DateTime.fromMillisecondsSinceEpoch(1000));
const uploadTaskJsonString =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"PUT","post":null,"retries":5,"retriesRemaining":5,"creationTime":1000,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":false,"metaData":"metaData","taskType":"UploadTask","fileField":"fileField","mimeType":"application/octet-stream","fields":{"e":"f"}}';
const uploadTaskJsonStringDoubles =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"PUT","post":null,"retries":5.0,"retriesRemaining":5.0,"creationTime":1000.0,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1.0,"group":"group","updates":3.0,"requiresWiFi":true,"allowPause":false,"metaData":"metaData","fileField":"fileField","mimeType":"application/octet-stream","fields":{"e":"f"},"taskType":"UploadTask"}';
void main() {
group('JSON conversion', () {
test('DownloadTask', () {
final task2 = Task.createFromJsonMap(jsonDecode(downloadTaskJsonString));
expect(task2, equals(task));
expect(jsonEncode(task2.toJsonMap()), equals(downloadTaskJsonString));
final task3 =
Task.createFromJsonMap(jsonDecode(downloadTaskJsonStringDoubles));
expect(jsonEncode(task3.toJsonMap()), equals(downloadTaskJsonString));
});
test('UploadTask', () {
final task2 = Task.createFromJsonMap(jsonDecode(uploadTaskJsonString));
expect(jsonEncode(task2.toJsonMap()), equals(uploadTaskJsonString));
final task3 =
Task.createFromJsonMap(jsonDecode(uploadTaskJsonStringDoubles));
expect(jsonEncode(task3.toJsonMap()), equals(uploadTaskJsonString));
});
test('MultiUploadTask', () async {
// try with list of Strings
var muTask = MultiUploadTask(
taskId: 'task1',
url: urlWithContentLength,
files: ['f1.txt', 'f2.txt']);
expect(muTask.fileFields, equals(['f1', 'f2']));
expect(muTask.filenames, equals(['f1.txt', 'f2.txt']));
expect(muTask.mimeTypes, equals(['text/plain', 'text/plain']));
expect(muTask.fileField, equals('["f1","f2"]')); // json string
expect(muTask.filename, equals('["f1.txt","f2.txt"]')); // json string
expect(muTask.mimeType,
equals('["text/plain","text/plain"]')); // json string
var muTask2 = MultiUploadTask.fromJsonMap(muTask.toJsonMap());
expect(muTask2.taskId, equals(muTask.taskId));
expect(muTask2.fileFields, equals(muTask.fileFields));
expect(muTask2.filenames, equals(muTask.filenames));
expect(muTask2.mimeTypes, equals(muTask.mimeTypes));
expect(muTask2.fileField, equals(muTask.fileField));
expect(muTask2.filename, equals(muTask.filename));
expect(muTask2.mimeType, equals(muTask.mimeType));
// try with list of (String, String)
muTask = MultiUploadTask(
taskId: 'task2',
url: urlWithContentLength,
files: [('file1', 'f1.txt'), ('file2', 'f2.txt')]);
expect(muTask.fileFields, equals(['file1', 'file2']));
expect(muTask.filenames, equals(['f1.txt', 'f2.txt']));
expect(muTask.mimeTypes, equals(['text/plain', 'text/plain']));
expect(muTask.fileField, equals('["file1","file2"]'));
expect(muTask.filename, equals('["f1.txt","f2.txt"]'));
expect(muTask.mimeType, equals('["text/plain","text/plain"]'));
muTask2 = MultiUploadTask.fromJsonMap(muTask.toJsonMap());
expect(muTask2.taskId, equals(muTask.taskId));
expect(muTask2.fileFields, equals(muTask.fileFields));
expect(muTask2.filenames, equals(muTask.filenames));
expect(muTask2.mimeTypes, equals(muTask.mimeTypes));
expect(muTask2.fileField, equals(muTask.fileField));
expect(muTask2.filename, equals(muTask.filename));
expect(muTask2.mimeType, equals(muTask.mimeType));
//try with list of (String, String, String)
muTask = MultiUploadTask(
taskId: 'task3',
url: urlWithContentLength,
files: [('file1', 'f1.txt', 'text/plain'), ('file2', 'f2')]);
expect(muTask.fileFields, equals(['file1', 'file2']));
expect(muTask.filenames, equals(['f1.txt', 'f2']));
expect(
muTask.mimeTypes, equals(['text/plain', 'application/octet-stream']));
expect(muTask.fileField, equals('["file1","file2"]'));
expect(muTask.filename, equals('["f1.txt","f2"]'));
expect(
muTask.mimeType, equals('["text/plain","application/octet-stream"]'));
muTask2 = MultiUploadTask.fromJsonMap(muTask.toJsonMap());
expect(muTask2.taskId, equals(muTask.taskId));
expect(muTask2.fileFields, equals(muTask.fileFields));
expect(muTask2.filenames, equals(muTask.filenames));
expect(muTask2.mimeTypes, equals(muTask.mimeTypes));
expect(muTask2.fileField, equals(muTask.fileField));
expect(muTask2.filename, equals(muTask.filename));
expect(muTask2.mimeType, equals(muTask.mimeType));
// check taskType
expect(muTask.toJsonMap()['taskType'], equals('MultiUploadTask'));
});
test('ParallelDownloadTask', () async {
// single url
var pdlTask = ParallelDownloadTask(url: urlWithLongContentLength);
expect(pdlTask.urls, equals([urlWithLongContentLength]));
expect(pdlTask.chunks, equals(1));
expect(pdlTask.url, equals(urlWithLongContentLength));
var pdlTask2 = ParallelDownloadTask.fromJsonMap(pdlTask.toJsonMap());
expect(pdlTask2, equals(pdlTask));
expect(pdlTask2.urls, equals(pdlTask.urls));
expect(pdlTask2.chunks, equals(pdlTask.chunks));
expect(pdlTask2.url, equals(pdlTask.url));
// multiple url with url parameters and chunks
pdlTask = ParallelDownloadTask(
url: [urlWithLongContentLength, urlWithContentLength],
urlQueryParameters: {'a': 'b'},
chunks: 5);
expect(
pdlTask.urls,
equals(
['$urlWithLongContentLength?a=b', '$urlWithContentLength?a=b']));
expect(pdlTask.chunks, equals(5));
expect(pdlTask.url, equals('$urlWithLongContentLength?a=b'));
pdlTask2 = ParallelDownloadTask.fromJsonMap(pdlTask.toJsonMap());
expect(pdlTask2, equals(pdlTask));
expect(pdlTask2.urls, equals(pdlTask.urls));
expect(pdlTask2.chunks, equals(pdlTask.chunks));
});
test('TaskStatusUpdate', () {
final statusUpdate = TaskStatusUpdate(
task, TaskStatus.failed, TaskConnectionException('test'));
const expected =
'{"task":{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5,"retriesRemaining":5,"creationTime":1000,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask"},"taskStatus":4,"exception":{"type":"TaskConnectionException","description":"test"},"responseBody":null}';
expect(jsonEncode(statusUpdate.toJsonMap()), equals(expected));
final update2 = TaskStatusUpdate.fromJsonMap(jsonDecode(expected));
expect(update2.task, equals(statusUpdate.task));
expect(update2.status, equals(TaskStatus.failed));
expect(update2.exception?.description, equals('test'));
expect(update2.exception is TaskConnectionException, isTrue);
const withDoubles =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5.0,"retriesRemaining":5.0,"creationTime":1000.0,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1.0,"group":"group","updates":3.0,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask","taskStatus":4.0,"exception":{"type":"TaskConnectionException","description":"test"}}';
expect(
jsonEncode(TaskStatusUpdate.fromJsonMap(jsonDecode(withDoubles))
.toJsonMap()),
equals(expected));
});
test('TaskProgressUpdate', () {
final progressUpdate = TaskProgressUpdate(task, 1, 123);
const expected =
'{"task":{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5,"retriesRemaining":5,"creationTime":1000,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask"},"progress":1.0,"expectedFileSize":123,"networkSpeed":-1.0,"timeRemaining":-1}';
expect(jsonEncode(progressUpdate.toJsonMap()), equals(expected));
final update2 = TaskProgressUpdate.fromJsonMap(jsonDecode(expected));
expect(update2.task, equals(progressUpdate.task));
expect(update2.progress, equals(1));
expect(update2.expectedFileSize, equals(123));
const withDoubles =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5.0,"retriesRemaining":5.0,"creationTime":1000.0,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1.0,"group":"group","updates":3.0,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask","progress":1,"expectedFileSize":123.0}';
expect(
jsonEncode(TaskProgressUpdate.fromJsonMap(jsonDecode(withDoubles))
.toJsonMap()),
equals(expected));
});
test('TaskRecord', () {
final taskRecord =
TaskRecord(task, TaskStatus.failed, 1, 123, TaskUrlException('test'));
const expected =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5,"retriesRemaining":5,"creationTime":1000,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask","status":4,"progress":1.0,"expectedFileSize":123,"exception":{"type":"TaskUrlException","description":"test"}}';
expect(jsonEncode(taskRecord.toJsonMap()), equals(expected));
final update2 = TaskRecord.fromJsonMap(jsonDecode(expected));
expect(update2.task, equals(taskRecord.task));
expect(update2.status, equals(TaskStatus.failed));
expect(update2.exception?.description, equals('test'));
expect(update2.exception is TaskUrlException, isTrue);
expect(update2.progress, equals(1));
expect(update2.expectedFileSize, equals(123));
const withDoubles =
'{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5.0,"retriesRemaining":5.0,"creationTime":1000.0,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask","status":4.0,"progress":1,"expectedFileSize":123.0,"exception":{"type":"TaskUrlException","description":"test"}}';
expect(
jsonEncode(
TaskRecord.fromJsonMap(jsonDecode(withDoubles)).toJsonMap()),
equals(expected));
});
test('ResumeData', () {
final resumeData = ResumeData(task, 'data', 123, 'tag');
const expected =
'{"task":{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5,"retriesRemaining":5,"creationTime":1000,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask"},"data":"data","requiredStartByte":123,"eTag":"tag"}';
expect(jsonEncode(resumeData.toJsonMap()), equals(expected));
final update2 = ResumeData.fromJsonMap(jsonDecode(expected));
expect(update2.task, equals(resumeData.task));
expect(update2.data, equals('data'));
expect(update2.requiredStartByte, equals(123));
expect(update2.eTag, equals('tag'));
const withDoubles =
'{"task":{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5.0,"retriesRemaining":5.0,"creationTime":1000.0,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1.0,"group":"group","updates":3.0,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask"},"data":"data","requiredStartByte":123.0,"eTag":"tag"}';
expect(
jsonEncode(
ResumeData.fromJsonMap(jsonDecode(withDoubles)).toJsonMap()),
equals(expected));
final resumeData2 = ResumeData(task, 'data', 123, null);
const expected2 =
'{"task":{"url":"url?a=b","headers":{"c":"d"},"httpRequestMethod":"GET","post":null,"retries":5,"retriesRemaining":5,"creationTime":1000,"taskId":"taskId","filename":"filename","directory":"dir","baseDirectory":1,"group":"group","updates":3,"requiresWiFi":true,"allowPause":true,"metaData":"metaData","taskType":"DownloadTask"},"data":"data","requiredStartByte":123,"eTag":null}';
expect(jsonEncode(resumeData2.toJsonMap()), equals(expected2));
final update3 = ResumeData.fromJsonMap(jsonDecode(expected2));
expect(update3.task, equals(resumeData.task));
expect(update3.data, equals('data'));
expect(update3.requiredStartByte, equals(123));
expect(update3.eTag, isNull);
});
test('DownloadTask incoming from Android', () {
const incoming =
'{"allowPause":false,"baseDirectory": 1,"chunks":1,"creationTime":1694879914883,"directory":"","fields":{},"fileField":"","filename":"com.bbflight.background_downloader.1186323287","group":"chunk","headers":{"Range":"bytes\u003d0-29836749"},"httpRequestMethod":"GET","metaData":"{\\"parentTaskId\\":\\"3069222547\\",\\"from\\":0,\\"to\\":29836749}","mimeType":"","requiresWiFi":false,"retries":0,"retriesRemaining":0,"taskId":"1702658487","taskType":"DownloadTask","updates":2,"url":"https://storage.googleapis.com/approachcharts/test/57MB-test.ZIP","urls":[]}';
final task = Task.createFromJsonMap(jsonDecode(incoming));
print(task);
});
});
}