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}