main
1import 'dart:convert';
2import 'dart:io';
3
4import 'package:blood_pressure_app/model/export_import/column.dart';
5import 'package:blood_pressure_app/model/storage/db/file_settings_loader.dart';
6import 'package:blood_pressure_app/model/storage/export_settings_store.dart';
7import 'package:blood_pressure_app/model/storage/interval_store.dart';
8import 'package:flutter/material.dart';
9import 'package:flutter_test/flutter_test.dart';
10
11void main() {
12 test('constructs new objects', () async {
13 await _loader((loader) async {
14 await expectLater(loader.loadSettings, returnsNormally);
15 await expectLater(loader.loadExportSettings, returnsNormally);
16 await expectLater(loader.loadCsvExportSettings, returnsNormally);
17 await expectLater(loader.loadPdfExportSettings, returnsNormally);
18 await expectLater(loader.loadIntervalStorageManager, returnsNormally);
19 await expectLater(loader.loadExportColumnsManager, returnsNormally);
20 });
21
22 });
23
24 test('persists changes', () async {
25 await _loader((loader1) async {
26 final loader2 = await FileSettingsLoader.load('tmp');
27
28 final settings1 = await loader1.loadSettings();
29 settings1.sysColor = Colors.blueGrey;
30 final settings2 = await loader2.loadSettings();
31 expect(settings2.sysColor.toARGB32(), settings1.sysColor.toARGB32());
32
33 final exportSettings1 = await loader1.loadExportSettings();
34 exportSettings1.exportFormat = ExportFormat.db;
35 final exportSettings2 = await loader2.loadExportSettings();
36 expect(exportSettings2.exportFormat, exportSettings1.exportFormat);
37
38 final csvExportSettings1 = await loader1.loadCsvExportSettings();
39 csvExportSettings1.fieldDelimiter = 'asdsf.",';
40 final csvExportSettings2 = await loader2.loadCsvExportSettings();
41 expect(csvExportSettings2.fieldDelimiter, csvExportSettings1.fieldDelimiter);
42
43 final pdfExportSettings1 = await loader1.loadPdfExportSettings();
44 pdfExportSettings1.cellHeight = 3.1415926;
45 final pdfExportSettings2 = await loader2.loadPdfExportSettings();
46 expect(pdfExportSettings2.cellHeight, pdfExportSettings1.cellHeight);
47
48 final intervalStorageManager1 = await loader1.loadIntervalStorageManager();
49 intervalStorageManager1.mainPage.changeStepSize(TimeStep.lifetime);
50 final intervalStorageManager2 = await loader2.loadIntervalStorageManager();
51 expect(intervalStorageManager2.mainPage.stepSize, intervalStorageManager1.mainPage.stepSize);
52
53 final exportColumnsManager1 = await loader1.loadExportColumnsManager();
54 exportColumnsManager1.addOrUpdate(TimeColumn('tsttime', 'tst-YYYY'));
55 final exportColumnsManager2 = await loader2.loadExportColumnsManager();
56 expect(exportColumnsManager2.userColumns.keys, exportColumnsManager1.userColumns.keys);
57 });
58 });
59}
60
61Future<void> _loader(void Function(FileSettingsLoader) body) async {
62 final files = {};
63 return IOOverrides.runZoned(
64 () async => body(await FileSettingsLoader.load('tmp')),
65 createDirectory: (path) => _MockDir(),
66 createFile: (path) {
67 if (files[path] == null) files[path] = _MockFile();
68 return files[path];
69 },
70 );
71}
72
73class _MockDir implements Directory {
74 bool _exists = false;
75
76 @override
77 void createSync({bool recursive = false}) => _exists = true;
78
79 @override
80 Future<bool> exists() async => _exists;
81
82 @override
83 dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
84}
85
86class _MockFile implements File {
87 String? _content;
88
89 @override
90 String readAsStringSync({Encoding encoding = utf8}) {
91 if (_content == null) throw FileSystemException();
92 return _content!;
93 }
94
95 @override
96 void writeAsStringSync(String contents, {
97 FileMode mode = FileMode.write,
98 Encoding encoding = utf8,
99 bool flush = false,
100 }) {
101 _content = contents;
102 }
103
104 @override
105 dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
106}