From c2cbad7ffa3e082ca2ad0492c6e24111cb9e223f Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Mon, 12 Apr 2021 18:33:43 +0200 Subject: [PATCH] refactor: MVC archive --- lib/config/routes.dart | 2 +- lib/controllers/archive_controller.dart | 23 +++++++++++++ lib/utils/fluffy_client.dart | 13 ++++--- lib/views/{archive.dart => archive_view.dart} | 34 +++++++++---------- lib/views/widgets/matrix.dart | 4 +-- test/archive_test.dart | 15 ++++++++ test/utils/test_client.dart | 20 +++++++++++ test/widget_test.dart | 4 +-- 8 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 lib/controllers/archive_controller.dart rename lib/views/{archive.dart => archive_view.dart} (52%) create mode 100644 test/archive_test.dart create mode 100644 test/utils/test_client.dart diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 7e9ca382..d3455742 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,10 +1,10 @@ import 'package:adaptive_page_layout/adaptive_page_layout.dart'; import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/controllers/archive_controller.dart'; import 'package:fluffychat/controllers/homeserver_picker_controller.dart'; import 'package:fluffychat/controllers/sign_up_controller.dart'; import 'package:fluffychat/controllers/sign_up_password_controller.dart'; import 'package:fluffychat/views/widgets/matrix.dart'; -import 'package:fluffychat/views/archive.dart'; import 'package:fluffychat/views/chat.dart'; import 'package:fluffychat/views/chat_details.dart'; import 'package:fluffychat/views/chat_encryption_settings.dart'; diff --git a/lib/controllers/archive_controller.dart b/lib/controllers/archive_controller.dart new file mode 100644 index 00000000..becf30c4 --- /dev/null +++ b/lib/controllers/archive_controller.dart @@ -0,0 +1,23 @@ +import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/views/archive_view.dart'; +import 'package:fluffychat/views/widgets/matrix.dart'; +import 'package:flutter/material.dart'; + +class Archive extends StatefulWidget { + @override + ArchiveController createState() => ArchiveController(); +} + +class ArchiveController extends State { + List archive; + + Future> getArchive(BuildContext context) async { + if (archive != null) return archive; + return await Matrix.of(context).client.archive; + } + + void forgetAction(int i) => setState(() => archive.removeAt(i)); + + @override + Widget build(BuildContext context) => ArchiveView(this); +} diff --git a/lib/utils/fluffy_client.dart b/lib/utils/fluffy_client.dart index 69c7e0e8..82f3ab61 100644 --- a/lib/utils/fluffy_client.dart +++ b/lib/utils/fluffy_client.dart @@ -1,21 +1,24 @@ import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/encryption.dart'; +import 'package:matrix_api_lite/fake_matrix_api.dart'; import 'platform_infos.dart'; import 'famedlysdk_store.dart'; class FluffyClient extends Client { - static final FluffyClient _instance = FluffyClient._internal(); + static FluffyClient _instance; /// The ID of the currently active room, if there is one. May be null or emtpy String activeRoomId; - factory FluffyClient() { + factory FluffyClient({testMode = false}) { + _instance ??= FluffyClient._internal(testMode: testMode); return _instance; } - FluffyClient._internal() + FluffyClient._internal({testMode = false}) : super( - PlatformInfos.clientName, + testMode ? 'FluffyChat Widget Tests' : PlatformInfos.clientName, + httpClient: testMode ? FakeMatrixApi() : null, enableE2eeRecovery: true, verificationMethods: { KeyVerificationMethod.numbers, @@ -25,7 +28,7 @@ class FluffyClient extends Client { importantStateEvents: { 'im.ponies.room_emotes', // we want emotes to work properly }, - databaseBuilder: getDatabase, + databaseBuilder: testMode ? null : getDatabase, supportedLoginTypes: { AuthenticationTypes.password, if (PlatformInfos.isMobile || PlatformInfos.isWeb) diff --git a/lib/views/archive.dart b/lib/views/archive_view.dart similarity index 52% rename from lib/views/archive.dart rename to lib/views/archive_view.dart index b51d6a9e..fafff851 100644 --- a/lib/views/archive.dart +++ b/lib/views/archive_view.dart @@ -1,21 +1,13 @@ import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/controllers/archive_controller.dart'; import 'package:fluffychat/views/widgets/list_items/chat_list_item.dart'; -import 'package:fluffychat/views/widgets/matrix.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -class Archive extends StatefulWidget { - @override - _ArchiveState createState() => _ArchiveState(); -} +class ArchiveView extends StatelessWidget { + final ArchiveController controller; -class _ArchiveState extends State { - List archive; - - Future> getArchive(BuildContext context) async { - if (archive != null) return archive; - return await Matrix.of(context).client.archive; - } + const ArchiveView(this.controller, {Key key}) : super(key: key); @override Widget build(BuildContext context) { @@ -25,17 +17,25 @@ class _ArchiveState extends State { title: Text(L10n.of(context).archive), ), body: FutureBuilder>( - future: getArchive(context), + future: controller.getArchive(context), builder: (BuildContext context, snapshot) { + if (snapshot.hasError) { + return Center( + child: Text( + L10n.of(context).oopsSomethingWentWrong, + textAlign: TextAlign.center, + )); + } if (!snapshot.hasData) { return Center(child: CircularProgressIndicator()); } else { - archive = snapshot.data; + controller.archive = snapshot.data; return ListView.builder( - itemCount: archive.length, + itemCount: controller.archive.length, itemBuilder: (BuildContext context, int i) => ChatListItem( - archive[i], - onForget: () => setState(() => archive.removeAt(i))), + controller.archive[i], + onForget: controller.forgetAction, + ), ); } }, diff --git a/lib/views/widgets/matrix.dart b/lib/views/widgets/matrix.dart index ece07682..da0a342e 100644 --- a/lib/views/widgets/matrix.dart +++ b/lib/views/widgets/matrix.dart @@ -86,7 +86,7 @@ class MatrixState extends State with WidgetsBindingObserver { void _initWithStore() async { try { - await client.init(); + if (!testMode) await client.init(); if (client.isLogged()) { final statusMsg = await store.getItem(SettingKeys.ownStatusMessage); if (statusMsg?.isNotEmpty ?? false) { @@ -261,7 +261,7 @@ class MatrixState extends State with WidgetsBindingObserver { }); }); } - client = widget.testClient ?? FluffyClient(); + client = FluffyClient(); LoadingDialog.defaultTitle = L10n.of(context).loadingPleaseWait; LoadingDialog.defaultBackLabel = L10n.of(context).close; LoadingDialog.defaultOnError = (Object e) => e.toLocalizedString(context); diff --git a/test/archive_test.dart b/test/archive_test.dart new file mode 100644 index 00000000..51b4d354 --- /dev/null +++ b/test/archive_test.dart @@ -0,0 +1,15 @@ +/*import 'package:fluffychat/controllers/archive_controller.dart'; +import 'package:fluffychat/main.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'utils/test_client.dart'; + +void main() { + testWidgets('Test if the widget can be created', (WidgetTester tester) async { + await tester.pumpWidget(FluffyChatApp( + testWidget: Archive(), + testClient: await testClient(loggedIn: true), + )); + }); +} +*/ diff --git a/test/utils/test_client.dart b/test/utils/test_client.dart new file mode 100644 index 00000000..49d6e8ec --- /dev/null +++ b/test/utils/test_client.dart @@ -0,0 +1,20 @@ +import 'package:famedlysdk/famedlysdk.dart'; +import 'package:fluffychat/utils/fluffy_client.dart'; + +Future testClient({ + bool loggedIn = false, + String homeserver = 'https://fakeserver.notexisting', + String id = 'FluffyChat Widget Test', +}) async { + final client = FluffyClient(testMode: true); + if (homeserver != null) { + await client.checkHomeserver(homeserver); + } + if (loggedIn) { + await client.login( + identifier: AuthenticationUserIdentifier(user: '@alice:example.invalid'), + password: '1234', + ); + } + return client; +} diff --git a/test/widget_test.dart b/test/widget_test.dart index 3685e300..ec8eddae 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -5,11 +5,11 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:fluffychat/main.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('Test if the app starts', (WidgetTester tester) async { - // Build our app and trigger a frame. - //await tester.pumpWidget(App()); + await tester.pumpWidget(FluffyChatApp()); }); }