From 00355c532be248ff5929db0975a4e38d62a49e16 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Sat, 16 Feb 2019 00:16:32 +0100 Subject: [PATCH] Add a trivial integration test which just takes a screenshot This required refactoring the code. With this we can now write an integration test to test the main parts of the app, but more importantly we can automate the process of generating the screenshots. --- lib/app.dart | 49 +++++++++++++++++++++++++++++++++++ lib/main.dart | 52 +------------------------------------- test_driver/main.dart | 7 +++++ test_driver/main_test.dart | 37 +++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 51 deletions(-) create mode 100644 test_driver/main.dart create mode 100644 test_driver/main_test.dart diff --git a/lib/app.dart b/lib/app.dart index d585dff4..401a138d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,8 +1,10 @@ import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_analytics/observer.dart'; import 'package:flutter/material.dart'; +import 'package:journal/apis/git.dart'; import 'package:journal/screens/home_screen.dart'; import 'package:journal/screens/settings_screen.dart'; +import 'package:journal/settings.dart'; import 'package:journal/state_container.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -10,6 +12,53 @@ import 'screens/githostsetup_screens.dart'; import 'screens/onboarding_screens.dart'; class JournalApp extends StatelessWidget { + static Future main() async { + var pref = await SharedPreferences.getInstance(); + JournalApp.preferences = pref; + + var localGitRepoConfigured = + pref.getBool("localGitRepoConfigured") ?? false; + var remoteGitRepoConfigured = + pref.getBool("remoteGitRepoConfigured") ?? false; + var localGitRepoPath = pref.getString("localGitRepoPath") ?? ""; + var remoteGitRepoFolderName = pref.getString("remoteGitRepoPath") ?? ""; + var remoteGitRepoSubFolder = pref.getString("remoteGitRepoSubFolder") ?? ""; + var onBoardingCompleted = + true; //pref.getBool("onBoardingCompleted") ?? false; + + if (JournalApp.isInDebugMode) { + if (JournalApp.analytics.android != null) { + JournalApp.analytics.android.setAnalyticsCollectionEnabled(false); + } + } + + if (localGitRepoConfigured == false) { + // FIXME: What about exceptions! + localGitRepoPath = "journal_local"; + await gitInit(localGitRepoPath); + + localGitRepoConfigured = true; + + await pref.setBool("localGitRepoConfigured", localGitRepoConfigured); + await pref.setString("localGitRepoPath", localGitRepoPath); + } + + var dir = await getGitBaseDirectory(); + + await Settings.instance.load(); + + runApp(StateContainer( + localGitRepoConfigured: localGitRepoConfigured, + remoteGitRepoConfigured: remoteGitRepoConfigured, + localGitRepoPath: localGitRepoPath, + remoteGitRepoFolderName: remoteGitRepoFolderName, + remoteGitRepoSubFolder: remoteGitRepoSubFolder, + gitBaseDirectory: dir.path, + onBoardingCompleted: onBoardingCompleted, + child: JournalApp(), + )); + } + static FirebaseAnalytics analytics = FirebaseAnalytics(); static FirebaseAnalyticsObserver observer = FirebaseAnalyticsObserver(analytics: analytics); diff --git a/lib/main.dart b/lib/main.dart index d6d57412..3d59ba74 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,11 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_crashlytics/flutter_crashlytics.dart'; -import 'package:journal/apis/git.dart'; import 'package:journal/app.dart'; -import 'package:journal/settings.dart'; -import 'package:journal/state_container.dart'; -import 'package:shared_preferences/shared_preferences.dart'; void main() async { FlutterError.onError = (FlutterErrorDetails details) { @@ -22,55 +18,9 @@ void main() async { } runZoned>(() async { - await runJournalApp(); + await JournalApp.main(); }, onError: (Object error, StackTrace stackTrace) async { await FlutterCrashlytics() .reportCrash(error, stackTrace, forceCrash: false); }); } - -Future runJournalApp() async { - var pref = await SharedPreferences.getInstance(); - JournalApp.preferences = pref; - - var localGitRepoConfigured = pref.getBool("localGitRepoConfigured") ?? false; - var remoteGitRepoConfigured = - pref.getBool("remoteGitRepoConfigured") ?? false; - var localGitRepoPath = pref.getString("localGitRepoPath") ?? ""; - var remoteGitRepoFolderName = pref.getString("remoteGitRepoPath") ?? ""; - var remoteGitRepoSubFolder = pref.getString("remoteGitRepoSubFolder") ?? ""; - var onBoardingCompleted = - true; //pref.getBool("onBoardingCompleted") ?? false; - - if (JournalApp.isInDebugMode) { - if (JournalApp.analytics.android != null) { - JournalApp.analytics.android.setAnalyticsCollectionEnabled(false); - } - } - - if (localGitRepoConfigured == false) { - // FIXME: What about exceptions! - localGitRepoPath = "journal_local"; - await gitInit(localGitRepoPath); - - localGitRepoConfigured = true; - - await pref.setBool("localGitRepoConfigured", localGitRepoConfigured); - await pref.setString("localGitRepoPath", localGitRepoPath); - } - - var dir = await getGitBaseDirectory(); - - await Settings.instance.load(); - - runApp(StateContainer( - localGitRepoConfigured: localGitRepoConfigured, - remoteGitRepoConfigured: remoteGitRepoConfigured, - localGitRepoPath: localGitRepoPath, - remoteGitRepoFolderName: remoteGitRepoFolderName, - remoteGitRepoSubFolder: remoteGitRepoSubFolder, - gitBaseDirectory: dir.path, - onBoardingCompleted: onBoardingCompleted, - child: JournalApp(), - )); -} diff --git a/test_driver/main.dart b/test_driver/main.dart new file mode 100644 index 00000000..a458ef52 --- /dev/null +++ b/test_driver/main.dart @@ -0,0 +1,7 @@ +import 'package:flutter_driver/driver_extension.dart'; +import 'package:journal/app.dart'; + +void main() async { + enableFlutterDriverExtension(); + await JournalApp.main(); +} diff --git a/test_driver/main_test.dart b/test_driver/main_test.dart new file mode 100644 index 00000000..f0b81a68 --- /dev/null +++ b/test_driver/main_test.dart @@ -0,0 +1,37 @@ +import 'dart:io'; + +import 'package:flutter_driver/flutter_driver.dart'; +import 'package:test/test.dart'; + +void main() { + group('Test', () { + final loadedFinder = find.text('Why not add your first\n Journal Entry?'); + + FlutterDriver driver; + int screenshotNum = 0; + + // Connect to the Flutter driver before running any tests + setUpAll(() async { + driver = await FlutterDriver.connect(); + }); + + // Close the connection to the driver after the tests have completed + tearDownAll(() async { + if (driver != null) { + driver.close(); + } + }); + + Future _takeScreenshot() async { + var filePath = screenshotNum.toString() + ".png"; + final file = await File(filePath).create(recursive: true); + final pixels = await driver.screenshot(); + await file.writeAsBytes(pixels); + } + + test('Anonymous GitClone works', () async { + await driver.waitFor(loadedFinder, timeout: Duration(seconds: 5)); + await _takeScreenshot(); + }); + }); +}