Commit dbe3acc
Changed files (4)
app
test
features
bluetooth
mock
export_import
model
export_import
app/test/features/bluetooth/mock/fake_device.dart
@@ -70,7 +70,7 @@ class FakeDevice implements BluetoothDevice {
}
@override
- Future<void> disconnect({int timeout = 35, bool queue = true}) async {
+ Future<void> disconnect({int timeout = 35, bool queue = true, int androidDelay = 2000,}) async {
print('CALLED DISCONNECT:');
debugPrintStack();
_connected = false;
app/test/features/export_import/import_preview_dialoge_test.dart
@@ -19,6 +19,7 @@ void main() {
CsvConverter(
CsvExportSettings(),
ExportColumnsManager(),
+ [],
),
'timestampUnixMs,systolic,diastolic,pulse,notes,needlePin\n1703175193324'
',123,45,67,note1,"{""color"":4285132974}"\n1703147206000,114,71,56,,null',
@@ -44,6 +45,7 @@ void main() {
CsvConverter(
CsvExportSettings(),
ExportColumnsManager(),
+ [],
),
csvTxt,
),
@@ -62,6 +64,7 @@ void main() {
CsvConverter(
CsvExportSettings(),
ExportColumnsManager(),
+ [],
),
'systolic,diastolic,pulse,notes,needlePin\n123,45,67,note1,'
'"{""color"":4285132974}"\n114,71,56,,null',
@@ -81,6 +84,7 @@ void main() {
CsvConverter(
CsvExportSettings(),
ExportColumnsManager(),
+ [],
),
'line1\nline2\nline3',
),
@@ -114,6 +118,7 @@ void main() {
CsvConverter(
CsvExportSettings(),
ExportColumnsManager(),
+ [],
),
'timestampUnixMs,systolic,diastolic,pulse,notes,needlePin\n1703175193324'
',123,45,67,note1,"{""color"":4285132974}"\n1703147206000,114,71,56,,null',
@@ -142,4 +147,55 @@ void main() {
expect(res[1].time.millisecondsSinceEpoch, 1703147206000);
expect(res[1].dia?.mmHg, 71);
});
+ testWidgets('should parse intakes data', (tester) async {
+ dynamic data = 1;
+
+ await loadDialoge(tester, (context) async {
+ data = await showImportPreview(
+ context,
+ CsvRecordParsingActor(
+ CsvConverter(
+ CsvExportSettings(),
+ ExportColumnsManager(),
+ [Medicine(designation: 'testMed1'), Medicine(designation: 'testMed2')],
+ ),
+ 'timestampUnixMs,intakes\n'
+ '1703175193324,testMed1(123.5)\n'
+ '1703147206000,testMed2(12)|testMed1(15.0)\n',
+ ),
+ ExportColumnsManager(),
+ false,
+ );
+ },);
+
+ expect(find.byType(ImportPreviewDialoge), findsOneWidget);
+ expect(tester.takeException(), isNull);
+ expect(find.byType(DropdownButton), findsNWidgets(2), reason: '2 columns');
+ expect(find.textContaining('testMed1'), findsNWidgets(2));
+ expect(find.textContaining('testMed2'), findsOneWidget);
+ expect(find.byType(CustomBanner), findsNothing, reason: 'no error');
+
+ final localizations = await AppLocalizations.delegate.load(const Locale('en'));
+ expect(find.text(localizations.import), findsOneWidget);
+ await tester.tap(find.text(localizations.import));
+ await tester.pumpAndSettle();
+ expect(find.byType(ImportPreviewDialoge), findsNothing);
+
+ expect(data, isA<List<FullEntry>>());
+ final List<FullEntry> res = data;
+ expect(res, hasLength(2));
+ expect(res[0].$3, hasLength(1));
+ expect(res[0].$3[0].medicine.designation, 'testMed1');
+ expect(res[0].$3[0].dosis.mg, 123.5);
+ expect(res[1].time.millisecondsSinceEpoch, 1703147206000);
+ expect(res[1].$3, hasLength(2));
+ expect(res[1].$3, containsAll([
+ isA<MedicineIntake>()
+ .having((i) => i.medicine.designation, 'designation', 'testMed1')
+ .having((i) => i.dosis.mg, 'designation', 15.0),
+ isA<MedicineIntake>()
+ .having((i) => i.medicine.designation, 'designation', 'testMed2')
+ .having((i) => i.dosis.mg, 'designation', 12.0),
+ ]));
+ });
}
app/test/model/export_import/column_test.dart
@@ -5,6 +5,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:health_data_store/health_data_store.dart';
+import '../../features/measurement_list/measurement_list_entry_test.dart';
+import '../../util.dart';
import 'record_formatter_test.dart';
void main() {
@@ -28,7 +30,7 @@ void main() {
test('should encode into non-empty string', () {
// Use BuildInColumn for utility columns
for (final c in NativeColumn.allColumns) {
- final r = _filledRecord();
+ final r = _filledRecord(true);
expect(c.encode(r.$1, r.$2, r.$3), isNotEmpty, reason: '${c.internalIdentifier} is NativeColumn');
}
});
@@ -39,7 +41,7 @@ void main() {
}
});
test('should decode correctly', () {
- final r = _filledRecord();
+ final r = _filledRecord(true);
for (final c in NativeColumn.allColumns) {
final txt = c.encode(r.$1, r.$2, r.$3);
final decoded = c.decode(txt);
@@ -49,26 +51,26 @@ void main() {
expect(decoded.$2, isA<DateTime>().having(
(p0) => p0.millisecondsSinceEpoch, 'milliseconds', r.$1.time.millisecondsSinceEpoch,),);
break;
- case RowDataFieldType.sys:
- expect(decoded.$2, isA<int>().having(
- (p0) => p0, 'systolic', r.$1.sys?.mmHg,),);
- break;
- case RowDataFieldType.dia:
- expect(decoded.$2, isA<int>().having(
- (p0) => p0, 'diastolic', r.$1.dia?.mmHg,),);
- break;
- case RowDataFieldType.pul:
- expect(decoded.$2, isA<int>().having(
- (p0) => p0, 'pulse', r.$1.pul,),);
- break;
- case RowDataFieldType.notes:
- expect(decoded.$2, isA<String>().having(
- (p0) => p0, 'pulse', r.$2.note,),);
- break;
- case RowDataFieldType.color:
- expect(decoded.$2, isA<int>().having(
- (p0) => p0, 'color', r.$2.color,),);
- break;
+ case RowDataFieldType.sys:
+ expect(decoded.$2, isA<int>()
+ .having((p0) => p0, 'systolic', r.$1.sys?.mmHg));
+ case RowDataFieldType.dia:
+ expect(decoded.$2, isA<int>()
+ .having((p0) => p0, 'diastolic', r.$1.dia?.mmHg));
+ case RowDataFieldType.pul:
+ expect(decoded.$2, isA<int>()
+ .having((p0) => p0, 'pulse', r.$1.pul));
+ case RowDataFieldType.notes:
+ expect(decoded.$2, isA<String>()
+ .having((p0) => p0, 'note', r.$2.note));
+ case RowDataFieldType.color:
+ expect(decoded.$2, isA<int>()
+ .having((p0) => p0, 'pin', r.$2.color));
+ case RowDataFieldType.intakes:
+ expect(decoded.$2, isA<List>()
+ .having((p0) => p0.length, 'length', 1,)
+ .having((p0) => p0[0].$1, 'designation', 'mockMed',)
+ .having((p0) => p0[0].$2, 'dosis', 123.4,));
}
}
});
@@ -100,7 +102,7 @@ void main() {
}
});
test('should decode correctly', () {
- final r = _filledRecord();
+ final r = _filledRecord(true);
for (final c in BuildInColumn.allColumns) {
final txt = c.encode(r.$1, r.$2, r.$3);
final decoded = c.decode(txt);
@@ -116,29 +118,28 @@ void main() {
expect(decoded?.$2, isA<DateTime>().having(
(p0) => p0.millisecondsSinceEpoch, 'milliseconds', r.$1.time.millisecondsSinceEpoch,),);
}
- break;
case RowDataFieldType.sys:
- expect(decoded?.$2, isA<int>().having(
- (p0) => p0, 'systolic', r.$1.sys?.mmHg,),);
- break;
+ expect(decoded?.$2, isA<int>()
+ .having((p0) => p0, 'systolic', r.$1.sys?.mmHg));
case RowDataFieldType.dia:
- expect(decoded?.$2, isA<int>().having(
- (p0) => p0, 'diastolic', r.$1.dia?.mmHg,),);
- break;
+ expect(decoded?.$2, isA<int>()
+ .having((p0) => p0, 'diastolic', r.$1.dia?.mmHg));
case RowDataFieldType.pul:
- expect(decoded?.$2, isA<int>().having(
- (p0) => p0, 'pulse', r.$1.pul,),);
- break;
+ expect(decoded?.$2, isA<int>()
+ .having((p0) => p0, 'pulse', r.$1.pul));
case RowDataFieldType.notes:
- expect(decoded?.$2, isA<String>().having(
- (p0) => p0, 'note', r.$2.note,),);
- break;
+ expect(decoded?.$2, isA<String>()
+ .having((p0) => p0, 'note', r.$2.note));
case RowDataFieldType.color:
- expect(decoded?.$2, isA<int>().having(
- (p0) => p0, 'pin', r.$2.color,),);
- break;
+ expect(decoded?.$2, isA<int>()
+ .having((p0) => p0, 'pin', r.$2.color));
+ case RowDataFieldType.intakes:
+ expect(decoded?.$2, isA<List<(String, double)>>()
+ .having((p0) => p0.length, 'length', 1,)
+ .having((p0) => p0[0].$1, 'designation', 'mockMed',)
+ .having((p0) => p0[0].$2, 'dosis', 123.4,));
case null:
- break;
+ // no-op
}
}
});
@@ -195,10 +196,13 @@ void main() {
});
}
-FullEntry _filledRecord() => mockEntry(
+FullEntry _filledRecord([bool addIntakes = false]) => mockEntry(
sys: 123,
dia: 456,
pul: 789,
note: 'test',
pin: Colors.pink,
+ intake: addIntakes
+ ? mockIntake(mockMedicine(designation: 'mockMed'), dosis: 123.4,)
+ : null,
);
app/test/model/export_import/csv_converter_test.dart
@@ -15,13 +15,13 @@ import 'record_formatter_test.dart';
void main() {
test('should create csv string bigger than 0', () {
- final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager());
+ final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager(), []);
final csv = converter.create(createRecords());
expect(csv.length, isNonZero);
});
test('should create first line', () {
- final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager());
+ final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager(), []);
final csv = converter.create([]);
final columns = CsvExportSettings().exportFieldsConfiguration.getActiveColumns(ExportColumnsManager());
expect(csv, stringContainsInOrder(columns.map((e) => e.csvTitle).toList()));
@@ -29,8 +29,9 @@ void main() {
test('should not create first line when setting is off', () {
final converter = CsvConverter(
- CsvExportSettings(exportHeadline: false),
- ExportColumnsManager(),
+ CsvExportSettings(exportHeadline: false),
+ ExportColumnsManager(),
+ [],
);
final csv = converter.create([]);
final columns = CsvExportSettings().exportFieldsConfiguration.getActiveColumns(ExportColumnsManager());
@@ -38,7 +39,7 @@ void main() {
});
test('should be able to recreate records from csv in default configuration', () {
- final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager());
+ final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager(), []);
final initialRecords = createRecords();
final csv = converter.create(initialRecords);
final parsedRecords = converter.parse(csv).getOr(failParse);
@@ -57,8 +58,9 @@ void main() {
final text = File('test/model/export_import/exported_formats/incomplete_export.csv').readAsStringSync();
final converter = CsvConverter(
- CsvExportSettings(),
- ExportColumnsManager(),
+ CsvExportSettings(),
+ ExportColumnsManager(),
+ [],
);
final parsed = converter.parse(text);
final records = parsed.getOr(failParse);
@@ -95,8 +97,9 @@ void main() {
final text = File('test/model/export_import/exported_formats/v1.0.csv').readAsStringSync();
final converter = CsvConverter(
- CsvExportSettings(),
- ExportColumnsManager(),
+ CsvExportSettings(),
+ ExportColumnsManager(),
+ [],
);
final parsed = converter.parse(text);
final records = parsed.getOr(failParse);
@@ -122,8 +125,9 @@ void main() {
final text = File('test/model/export_import/exported_formats/v1.1.0').readAsStringSync();
final converter = CsvConverter(
- CsvExportSettings(),
- ExportColumnsManager(),
+ CsvExportSettings(),
+ ExportColumnsManager(),
+ [],
);
final parsed = converter.parse(text);
final records = parsed.getOr(failParse);
@@ -149,8 +153,9 @@ void main() {
final text = File('test/model/export_import/exported_formats/v1.4.0.CSV').readAsStringSync();
final converter = CsvConverter(
- CsvExportSettings(),
- ExportColumnsManager(),
+ CsvExportSettings(),
+ ExportColumnsManager(),
+ [],
);
final parsed = converter.parse(text);
final records = parsed.getOr(failParse);
@@ -183,8 +188,9 @@ void main() {
final text = File('test/model/export_import/exported_formats/v1.5.1.csv').readAsStringSync();
final converter = CsvConverter(
- CsvExportSettings(),
- ExportColumnsManager(),
+ CsvExportSettings(),
+ ExportColumnsManager(),
+ [],
);
final parsed = converter.parse(text);
final records = parsed.getOr(failParse);
@@ -220,8 +226,9 @@ void main() {
final text = File('test/model/export_import/exported_formats/v1.5.7.csv').readAsStringSync();
final converter = CsvConverter(
- CsvExportSettings(),
- ExportColumnsManager(),
+ CsvExportSettings(),
+ ExportColumnsManager(),
+ [],
);
final parsed = converter.parse(text);
final records = parsed.getOr(failParse);
@@ -260,6 +267,7 @@ void main() {
final converter = CsvConverter(
CsvExportSettings(),
ExportColumnsManager(),
+ [],
);
final parsed = converter.parse(text);
final records = parsed.getOr(failParse);
@@ -312,6 +320,7 @@ void main() {
)
),
cols,
+ [],
);
final parsed = converter.parse(text);