Commit 966aa35

NobodyForNothing <82763757+NobodyForNothing@users.noreply.github.com>
2023-05-12 19:13:24
Add Github CI builds (#3)
* remove settings_ui dependency * remove settings_ui dependency * always run CI
1 parent 60f9fe0
Changed files (5)
.github/workflows/CI.yml
@@ -2,7 +2,7 @@ name: CI
 
 on:
   push:
-    branches: [ "main" ]
+    branches: '**'
 
 jobs:
   test:
lib/model/blood_pressure.dart
@@ -17,9 +17,11 @@ class BloodPressureModel extends ChangeNotifier {
   late final Database _database;
 
   BloodPressureModel._create();
-  Future<void> _asyncInit() async {
+  Future<void> _asyncInit(String? dbPath) async {
+    dbPath ??= await getDatabasesPath();
+
     _database = await openDatabase(
-      join(await getDatabasesPath(), 'blood_pressure.db'),
+      join(dbPath, 'blood_pressure.db'),
       // runs when the database is first created
       onCreate: (db, version) {
         return db.execute('CREATE TABLE bloodPressureModel(timestamp INTEGER(14) PRIMARY KEY, systolic INTEGER, diastolic INTEGER, pulse INTEGER, notes STRING)');
@@ -28,7 +30,7 @@ class BloodPressureModel extends ChangeNotifier {
     );
   }
   // factory method, to allow for async contructor
-  static Future<BloodPressureModel> create() async {
+  static Future<BloodPressureModel> create({String? dbPath}) async {
     if (Platform.isWindows || Platform.isLinux) {
       // Initialize FFI
       sqfliteFfiInit();
@@ -37,7 +39,7 @@ class BloodPressureModel extends ChangeNotifier {
     }
 
     final component = BloodPressureModel._create();
-    await component._asyncInit();
+    await component._asyncInit(dbPath);
     return component;
   }
 
@@ -176,6 +178,10 @@ class BloodPressureModel extends ChangeNotifier {
       return callback(false, 'no file opened');
     }
   }
+
+  void close() {
+    _database.close();
+  }
 }
 
 @immutable
lib/screens/enter_timeformat.dart
@@ -1,9 +1,6 @@
-import 'package:blood_pressure_app/model/blood_pressure.dart';
 import 'package:blood_pressure_app/model/settings.dart';
 import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:intl/intl.dart';
 import 'package:provider/provider.dart';
 import 'package:url_launcher/url_launcher.dart' show launch;
 
@@ -69,7 +66,7 @@ class _EnterTimeFormatScreenState extends State<EnterTimeFormatScreen> {
                       );
                     }
                 ),
-                SizedBox(height: 25,),
+                const SizedBox(height: 25,),
                 Row(
                   children: [
                     ElevatedButton(
test/model/bood_pressure_test.dart
@@ -1,7 +1,6 @@
 import 'package:blood_pressure_app/model/blood_pressure.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:sqflite_common_ffi/sqflite_ffi.dart';
-import 'dart:io';
 
 void main() {
   group('BloodPressureRecord', () {
@@ -36,12 +35,11 @@ void main() {
     databaseFactory = databaseFactoryFfi;
 
     test('should initialize', () async {
-      await clearDbDir();
-      expect(() async { await BloodPressureModel.create(); }, returnsNormally);
+      expect(() async { await BloodPressureModel.create(dbPath: '/tmp/bp_test/should_init');
+        }, returnsNormally);
     });
     test('should start empty', () async {
-      await clearDbDir();
-      var m = await BloodPressureModel.create();
+      var m = await BloodPressureModel.create(dbPath: '/tmp/bp_test/should_start_empty');
 
       expect((await m.getLastX(100)).length, 0);
       expect((await m.getInTimeRange(DateTime.fromMillisecondsSinceEpoch(0), DateTime.now())).length, 0);
@@ -49,28 +47,23 @@ void main() {
     });
 
     test('should notify when adding entries', () async {
-      await clearDbDir();
-      var m = await BloodPressureModel.create();
+      var m = await BloodPressureModel.create(dbPath: '/tmp/bp_test/should_notify_when_add');
 
       int listenerCalls = 0;
-      int added = 0;
       m.addListener(() {
         listenerCalls++;
-        expect(listenerCalls, added);
       });
 
-      m.add(BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(0), 0, 0, 0, ''));
-      added++;
-      m.add(BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(1), 0, 0, 0, ''));
-      added++;
-      m.add(BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(2), 0, 0, 0, ''));
-      added++;
+      await m.add(BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(0), 0, 0, 0, ''));
+      await m.add(BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(1), 0, 0, 0, ''));
+      await m.add(BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(2), 0, 0, 0, ''));
 
+      print(listenerCalls);
+      expect(listenerCalls, 3); // TODO: FAILS
     });
 
     test('should return entries as added', () async {
-      await clearDbDir();
-      var m = await BloodPressureModel.create();
+      var m = await BloodPressureModel.create(dbPath: '/tmp/bp_test/should_return_as_added');
 
       var r = BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(31415926), -172, 10000, 0, "((V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈๏ แผ่นดินฮั่นเABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ–—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвг, \n \t д∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა");
       m.addListener(() async {
@@ -81,19 +74,18 @@ void main() {
         expect(res.diastolic, r.diastolic);
         expect(res.pulse, r.pulse);
         expect(res.notes, r.notes);
+        return;
       });
 
       m.add(r);
     });
 
     test('should save and load between objects/sessions', () async {
-      await clearDbDir();
-
-      var m = await BloodPressureModel.create();
+      var m = await BloodPressureModel.create(dbPath: '/tmp/bp_test/should_store_between_sessions');
       var r = BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(31415926), -172, 10000, 0, "((V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈๏ แผ่นดินฮั่นเABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ–—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвг, \n \t д∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა");
       await m.add(r);
 
-      var m2 = await BloodPressureModel.create();
+      var m2 = await BloodPressureModel.create(dbPath: '/tmp/bp_test/should_store_between_sessions');
       var res = (await m2.getLastX(1)).first;
 
       expect(res.creationTime, r.creationTime);
@@ -104,8 +96,7 @@ void main() {
     });
 
     test('should import exported values', () async {
-      await clearDbDir();
-      var m = await BloodPressureModel.create();
+      var m = await BloodPressureModel.create(dbPath: '/tmp/bp_test/should_import_exported');
       var r = BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(31415926), -172, 10000, 0, "((V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈๏ แผ่นดินฮั่นเABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ–—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвг, \n \t д∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა");
       await m.add(r);
 
@@ -115,14 +106,4 @@ void main() {
       });
     });
   });
-}
-
-Future<void> clearDbDir() async {
-  databaseFactory.setDatabasesPath((await getDatabasesPath()).replaceAll('databases', 'test_databases'));
-  try {
-    Directory(await getDatabasesPath()).deleteSync(recursive: true);
-  } catch (e) {
-    print('no directory to delete!');
-  }
-  Directory(await getDatabasesPath()).create(recursive: true);
 }
\ No newline at end of file
test/model/settings_test.dart
@@ -1,6 +1,3 @@
-import 'dart:io';
-import 'dart:math';
-
 import 'package:blood_pressure_app/model/settings.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:sqflite_common_ffi/sqflite_ffi.dart';
@@ -20,13 +17,10 @@ void main() {
     databaseFactory = databaseFactoryFfi;
 
     test('should initialize', () async {
-      await clearDbDir();
-      expect(() async { await Settings.create(); }, returnsNormally);
+      expect(() async { await Settings.create(dbPath: '/tmp/setting_test/should_init'); }, returnsNormally);
     });
     test('fields defaults should be set after initialization', () async {
-      await clearDbDir();
-
-      var s = await Settings.create();
+      var s = await Settings.create(dbPath: '/tmp/setting_test/should_default');
       expect(s.graphStepSize, TimeStep.day);
       expect(s.graphStart, DateTime.fromMillisecondsSinceEpoch(-1));
       expect(s.graphEnd, DateTime.fromMillisecondsSinceEpoch(-1));
@@ -41,9 +35,8 @@ void main() {
       expect(s.useExportCompatability, false);
     });
 
-    test('setting fields should notify listeners and change values', () async {
-      await clearDbDir();
-      var s = await Settings.create();
+    test('setting fields should save changes', () async {
+      var s = await Settings.create(dbPath: '/tmp/setting_test/should_save');
 
       int i = 0;
       s.addListener(() {
@@ -80,11 +73,10 @@ void main() {
       expect(s.pulColor.value, 0xFF942DA7);
       expect(s.allowManualTimeInput, false);
       expect(s.useExportCompatability, true);
-
     });
+
     test('setting fields should notify listeners and change values', () async {
-      await clearDbDir();
-      var s = await Settings.create();
+      var s = await Settings.create(dbPath: '/tmp/setting_test/should_notify');
 
       int i = 0;
       s.addListener(() {
@@ -103,19 +95,9 @@ void main() {
       s.allowManualTimeInput = false;
       s.dateFormatString = 'yy:dd @ H:mm.ss';
       s.useExportCompatability = true;
-
+      
       expect(i, 12);
     });
 
   });
-}
-
-Future<void> clearDbDir() async {
-  databaseFactory.setDatabasesPath((await getDatabasesPath()).replaceAll('databases', 'test_databases'));
-  try {
-    Directory(await getDatabasesPath()).deleteSync(recursive: true);
-  } catch (e) {
-    print('no directory to delete!');
-  }
-  Directory(await getDatabasesPath()).create(recursive: true);
 }
\ No newline at end of file