mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-10 14:07:59 -06:00
feat: Add login integration test (WIP), update notes feature
This commit is contained in:
@@ -1,224 +1,130 @@
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:flutter_test/flutter_test.dart';
|
||||
// import 'package:mockito/mockito.dart';
|
||||
// import 'package:paperless_api/paperless_api.dart';
|
||||
// import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
|
||||
// import 'package:paperless_mobile/core/service/connectivity_status.service.dart';
|
||||
// import 'package:paperless_mobile/core/store/local_vault.dart';
|
||||
// import 'package:paperless_mobile/di_test_mocks.mocks.dart';
|
||||
// import 'package:paperless_mobile/features/settings/bloc/application_settings_cubit.dart';
|
||||
// import 'package:paperless_mobile/features/settings/model/application_settings_state.dart';
|
||||
// import 'package:paperless_mobile/features/settings/model/view_type.dart';
|
||||
import 'dart:io';
|
||||
|
||||
// import 'src/framework.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:paperless_mobile/core/database/hive/hive_config.dart';
|
||||
import 'package:paperless_mobile/core/database/hive/hive_extensions.dart';
|
||||
import 'package:paperless_mobile/core/database/hive/hive_initialization.dart';
|
||||
import 'package:paperless_mobile/core/database/tables/global_settings.dart';
|
||||
import 'package:paperless_mobile/core/security/session_manager.dart';
|
||||
import 'package:paperless_mobile/core/service/connectivity_status_service.dart';
|
||||
import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart';
|
||||
import 'package:paperless_mobile/features/login/services/authentication_service.dart';
|
||||
import 'package:paperless_mobile/features/notifications/services/local_notification_service.dart';
|
||||
import 'package:paperless_mobile/keys.dart';
|
||||
import 'package:paperless_mobile/main.dart'
|
||||
show initializeDefaultParameters, AppEntrypoint;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
// void main() async {
|
||||
// final t = await initializeTestingFramework(languageCode: 'de');
|
||||
import 'src/mocks/mock_paperless_api.dart';
|
||||
|
||||
// const testServerUrl = 'https://example.com';
|
||||
// const testUsername = 'user';
|
||||
// const testPassword = 'pass';
|
||||
class MockConnectivityStatusService extends Mock
|
||||
implements ConnectivityStatusService {}
|
||||
|
||||
// final serverAddressField = find.byKey(const ValueKey('login-server-address'));
|
||||
// final usernameField = find.byKey(const ValueKey('login-username'));
|
||||
// final passwordField = find.byKey(const ValueKey('login-password'));
|
||||
// final loginBtn = find.byKey(const ValueKey('login-login-button'));
|
||||
class MockLocalAuthService extends Mock implements LocalAuthenticationService {}
|
||||
|
||||
// testWidgets('Test successful login flow', (WidgetTester tester) async {
|
||||
// await initAndLaunchTestApp(tester, () async {
|
||||
// // Initialize dat for mocked classes
|
||||
// when((getIt<ConnectivityStatusService>()).connectivityChanges())
|
||||
// .thenAnswer((i) => Stream.value(true));
|
||||
// when((getIt<LocalVault>() as MockLocalVault)
|
||||
// .loadAuthenticationInformation())
|
||||
// .thenAnswer((realInvocation) async => null);
|
||||
// when((getIt<LocalVault>() as MockLocalVault).loadApplicationSettings())
|
||||
// .thenAnswer((realInvocation) async => ApplicationSettingsState(
|
||||
// preferredLocaleSubtag: 'en',
|
||||
// preferredThemeMode: ThemeMode.light,
|
||||
// isLocalAuthenticationEnabled: false,
|
||||
// preferredViewType: ViewType.list,
|
||||
// showInboxOnStartup: false,
|
||||
// ));
|
||||
// when(getIt<PaperlessAuthenticationApi>().login(
|
||||
// username: testUsername,
|
||||
// password: testPassword,
|
||||
// )).thenAnswer((i) => Future.value("eyTestToken"));
|
||||
class MockSessionManager extends Mock implements SessionManager {}
|
||||
|
||||
// await getIt<ConnectivityCubit>().initialize();
|
||||
// await getIt<ApplicationSettingsCubit>().initialize();
|
||||
// });
|
||||
class MockLocalNotificationService extends Mock
|
||||
implements LocalNotificationService {}
|
||||
|
||||
// // Mocked classes
|
||||
void main() async {
|
||||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
const locale = Locale("en", "US");
|
||||
const testServerUrl = 'https://example.com';
|
||||
const testUsername = 'user';
|
||||
const testPassword = 'pass';
|
||||
|
||||
// await t.binding.waitUntilFirstFrameRasterized;
|
||||
// await tester.pumpAndSettle();
|
||||
final hiveDirectory = await getTemporaryDirectory();
|
||||
|
||||
// await tester.enterText(serverAddressField, testServerUrl);
|
||||
// await tester.pumpAndSettle();
|
||||
late ConnectivityStatusService connectivityStatusService;
|
||||
late MockPaperlessApiFactory paperlessApiFactory;
|
||||
late AuthenticationCubit authenticationCubit;
|
||||
late LocalNotificationService localNotificationService;
|
||||
late SessionManager sessionManager;
|
||||
final localAuthService = MockLocalAuthService();
|
||||
|
||||
// await tester.enterText(usernameField, testUsername);
|
||||
// await tester.pumpAndSettle();
|
||||
setUp(() async {
|
||||
connectivityStatusService = MockConnectivityStatusService();
|
||||
paperlessApiFactory = MockPaperlessApiFactory();
|
||||
sessionManager = MockSessionManager();
|
||||
localNotificationService = MockLocalNotificationService();
|
||||
|
||||
// await tester.enterText(passwordField, testPassword);
|
||||
authenticationCubit = AuthenticationCubit(
|
||||
localAuthService,
|
||||
paperlessApiFactory,
|
||||
sessionManager,
|
||||
connectivityStatusService,
|
||||
localNotificationService,
|
||||
);
|
||||
await initHive(
|
||||
hiveDirectory,
|
||||
locale.toString(),
|
||||
);
|
||||
});
|
||||
testWidgets(
|
||||
'A user shall be successfully logged in when providing correct credentials.',
|
||||
(tester) async {
|
||||
// Reset data to initial state with given [locale].
|
||||
await Hive.globalSettingsBox.setValue(
|
||||
GlobalSettings(
|
||||
preferredLocaleSubtag: locale.toString(),
|
||||
loggedInUserId: null,
|
||||
),
|
||||
);
|
||||
when(paperlessApiFactory.authenticationApi.login(
|
||||
username: testUsername,
|
||||
password: testPassword,
|
||||
)).thenAnswer((_) async => "token");
|
||||
|
||||
// FocusManager.instance.primaryFocus?.unfocus();
|
||||
// await tester.pumpAndSettle();
|
||||
await initializeDefaultParameters();
|
||||
|
||||
// await tester.tap(loginBtn);
|
||||
await tester.pumpWidget(
|
||||
AppEntrypoint(
|
||||
apiFactory: paperlessApiFactory,
|
||||
authenticationCubit: authenticationCubit,
|
||||
connectivityStatusService: connectivityStatusService,
|
||||
localNotificationService: localNotificationService,
|
||||
localAuthService: localAuthService,
|
||||
sessionManager: sessionManager,
|
||||
),
|
||||
);
|
||||
await tester.binding.waitUntilFirstFrameRasterized;
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// verify(getIt<PaperlessAuthenticationApi>().login(
|
||||
// username: testUsername,
|
||||
// password: testPassword,
|
||||
// )).called(1);
|
||||
// });
|
||||
await tester.enterText(
|
||||
find.byKey(TestKeys.login.serverAddressFormField),
|
||||
testServerUrl,
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// testWidgets('Test login validation missing password',
|
||||
// (WidgetTester tester) async {
|
||||
// await initAndLaunchTestApp(tester, () async {
|
||||
// when((getIt<ConnectivityStatusService>() as MockConnectivityStatusService)
|
||||
// .connectivityChanges())
|
||||
// .thenAnswer((i) => Stream.value(true));
|
||||
// when((getIt<LocalVault>() as MockLocalVault)
|
||||
// .loadAuthenticationInformation())
|
||||
// .thenAnswer((realInvocation) async => null);
|
||||
await tester.press(find.byKey(TestKeys.login.continueButton));
|
||||
|
||||
// when((getIt<LocalVault>() as MockLocalVault).loadApplicationSettings())
|
||||
// .thenAnswer((realInvocation) async => ApplicationSettingsState(
|
||||
// preferredLocaleSubtag: 'en',
|
||||
// preferredThemeMode: ThemeMode.light,
|
||||
// isLocalAuthenticationEnabled: false,
|
||||
// preferredViewType: ViewType.list,
|
||||
// showInboxOnStartup: false,
|
||||
// ));
|
||||
await tester.pumpAndSettle();
|
||||
expect(
|
||||
find.byKey(TestKeys.login.usernameFormField),
|
||||
findsOneWidget,
|
||||
);
|
||||
|
||||
// await getIt<ConnectivityCubit>().initialize();
|
||||
// await getIt<ApplicationSettingsCubit>().initialize();
|
||||
// });
|
||||
// // Mocked classes
|
||||
await tester.enterText(
|
||||
find.byKey(TestKeys.login.usernameFormField),
|
||||
testUsername,
|
||||
);
|
||||
await tester.enterText(
|
||||
find.byKey(TestKeys.login.passwordFormField),
|
||||
testUsername,
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// // Initialize dat for mocked classes
|
||||
await tester.press(find.byKey(TestKeys.login.loginButton));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
// await t.binding.waitUntilFirstFrameRasterized;
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.enterText(serverAddressField, testServerUrl);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.enterText(usernameField, testUsername);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// FocusManager.instance.primaryFocus?.unfocus();
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.tap(loginBtn);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// verifyNever(
|
||||
// (getIt<PaperlessAuthenticationApi>() as MockPaperlessAuthenticationApi)
|
||||
// .login(
|
||||
// username: testUsername,
|
||||
// password: testPassword,
|
||||
// ));
|
||||
// expect(
|
||||
// find.textContaining(t.translations.passwordMustNotBeEmpty),
|
||||
// findsOneWidget,
|
||||
// );
|
||||
// });
|
||||
|
||||
// testWidgets('Test login validation missing username',
|
||||
// (WidgetTester tester) async {
|
||||
// await initAndLaunchTestApp(tester, () async {
|
||||
// when((getIt<ConnectivityStatusService>() as MockConnectivityStatusService)
|
||||
// .connectivityChanges())
|
||||
// .thenAnswer((i) => Stream.value(true));
|
||||
// when((getIt<LocalVault>() as MockLocalVault)
|
||||
// .loadAuthenticationInformation())
|
||||
// .thenAnswer((realInvocation) async => null);
|
||||
// when((getIt<LocalVault>() as MockLocalVault).loadApplicationSettings())
|
||||
// .thenAnswer((realInvocation) async => ApplicationSettingsState(
|
||||
// preferredLocaleSubtag: 'en',
|
||||
// preferredThemeMode: ThemeMode.light,
|
||||
// isLocalAuthenticationEnabled: false,
|
||||
// preferredViewType: ViewType.list,
|
||||
// showInboxOnStartup: false,
|
||||
// ));
|
||||
// await getIt<ConnectivityCubit>().initialize();
|
||||
// await getIt<ApplicationSettingsCubit>().initialize();
|
||||
// });
|
||||
|
||||
// await t.binding.waitUntilFirstFrameRasterized;
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.enterText(serverAddressField, testServerUrl);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.enterText(passwordField, testPassword);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// FocusManager.instance.primaryFocus?.unfocus();
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.tap(loginBtn);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// verifyNever(
|
||||
// (getIt<PaperlessAuthenticationApi>() as MockPaperlessAuthenticationApi)
|
||||
// .login(
|
||||
// username: testUsername,
|
||||
// password: testPassword,
|
||||
// ));
|
||||
// expect(
|
||||
// find.textContaining(t.translations.usernameMustNotBeEmpty),
|
||||
// findsOneWidget,
|
||||
// );
|
||||
// });
|
||||
|
||||
// testWidgets('Test login validation missing server address',
|
||||
// (WidgetTester tester) async {
|
||||
// initAndLaunchTestApp(tester, () async {
|
||||
// when((getIt<ConnectivityStatusService>()).connectivityChanges())
|
||||
// .thenAnswer((i) => Stream.value(true));
|
||||
|
||||
// when((getIt<LocalVault>()).loadAuthenticationInformation())
|
||||
// .thenAnswer((realInvocation) async => null);
|
||||
|
||||
// when((getIt<LocalVault>()).loadApplicationSettings())
|
||||
// .thenAnswer((realInvocation) async => ApplicationSettingsState(
|
||||
// preferredLocaleSubtag: 'en',
|
||||
// preferredThemeMode: ThemeMode.light,
|
||||
// isLocalAuthenticationEnabled: false,
|
||||
// preferredViewType: ViewType.list,
|
||||
// showInboxOnStartup: false,
|
||||
// ));
|
||||
|
||||
// await getIt<ConnectivityCubit>().initialize();
|
||||
// await getIt<ApplicationSettingsCubit>().initialize();
|
||||
// });
|
||||
|
||||
// await t.binding.waitUntilFirstFrameRasterized;
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.enterText(usernameField, testUsername);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.enterText(passwordField, testPassword);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// FocusManager.instance.primaryFocus?.unfocus();
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// await tester.tap(loginBtn);
|
||||
// await tester.pumpAndSettle();
|
||||
|
||||
// verifyNever(getIt<PaperlessAuthenticationApi>().login(
|
||||
// username: testUsername,
|
||||
// password: testPassword,
|
||||
// ));
|
||||
// expect(
|
||||
// find.textContaining(
|
||||
// t.translations.loginPageServerUrlValidatorMessageText),
|
||||
// findsOneWidget,
|
||||
// );
|
||||
// });
|
||||
// }
|
||||
expect(
|
||||
find.byKey(TestKeys.login.loggingInScreen),
|
||||
findsOneWidget,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
import 'package:paperless_mobile/core/factory/paperless_api_factory.dart';
|
||||
import 'package:paperless_mobile/core/security/session_manager.dart';
|
||||
import 'package:paperless_mobile/core/service/connectivity_status_service.dart';
|
||||
import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart';
|
||||
import 'package:paperless_mobile/features/login/services/authentication_service.dart';
|
||||
import 'package:paperless_mobile/features/notifications/services/local_notification_service.dart';
|
||||
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
|
||||
import 'package:paperless_mobile/main.dart'
|
||||
show initializeDefaultParameters, AppEntrypoint;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
Future<TestingFrameworkVariables> initializeTestingFramework(
|
||||
{String languageCode = 'en'}) async {
|
||||
@@ -26,11 +35,3 @@ class TestingFrameworkVariables {
|
||||
required this.translations,
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> initAndLaunchTestApp(
|
||||
WidgetTester tester,
|
||||
Future<void> Function() initializationCallback,
|
||||
) async {
|
||||
await initializationCallback();
|
||||
//runApp(const PaperlessMobileEntrypoint(authenticationCubit: ),));
|
||||
}
|
||||
|
||||
65
integration_test/src/mocks/mock_paperless_api.dart
Normal file
65
integration_test/src/mocks/mock_paperless_api.dart
Normal file
@@ -0,0 +1,65 @@
|
||||
import 'package:dio/src/dio.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/factory/paperless_api_factory.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
|
||||
@GenerateNiceMocks([
|
||||
MockSpec<PaperlessAuthenticationApi>(),
|
||||
MockSpec<PaperlessDocumentsApi>(),
|
||||
MockSpec<PaperlessLabelsApi>(),
|
||||
MockSpec<PaperlessUserApi>(),
|
||||
MockSpec<PaperlessServerStatsApi>(),
|
||||
MockSpec<PaperlessSavedViewsApi>(),
|
||||
MockSpec<PaperlessTasksApi>(),
|
||||
])
|
||||
import 'mock_paperless_api.mocks.dart';
|
||||
|
||||
class MockPaperlessApiFactory implements PaperlessApiFactory {
|
||||
final PaperlessAuthenticationApi authenticationApi =
|
||||
MockPaperlessAuthenticationApi();
|
||||
final PaperlessDocumentsApi documentApi = MockPaperlessDocumentsApi();
|
||||
final PaperlessLabelsApi labelsApi = MockPaperlessLabelsApi();
|
||||
final PaperlessUserApi userApi = MockPaperlessUserApi();
|
||||
final PaperlessSavedViewsApi savedViewsApi = MockPaperlessSavedViewsApi();
|
||||
final PaperlessServerStatsApi serverStatsApi = MockPaperlessServerStatsApi();
|
||||
final PaperlessTasksApi tasksApi = MockPaperlessTasksApi();
|
||||
|
||||
@override
|
||||
PaperlessAuthenticationApi createAuthenticationApi(Dio dio) {
|
||||
return authenticationApi;
|
||||
}
|
||||
|
||||
@override
|
||||
PaperlessDocumentsApi createDocumentsApi(Dio dio, {required int apiVersion}) {
|
||||
return documentApi;
|
||||
}
|
||||
|
||||
@override
|
||||
PaperlessLabelsApi createLabelsApi(Dio dio, {required int apiVersion}) {
|
||||
return labelsApi;
|
||||
}
|
||||
|
||||
@override
|
||||
PaperlessSavedViewsApi createSavedViewsApi(
|
||||
Dio dio, {
|
||||
required int apiVersion,
|
||||
}) {
|
||||
return savedViewsApi;
|
||||
}
|
||||
|
||||
@override
|
||||
PaperlessServerStatsApi createServerStatsApi(Dio dio,
|
||||
{required int apiVersion}) {
|
||||
return serverStatsApi;
|
||||
}
|
||||
|
||||
@override
|
||||
PaperlessTasksApi createTasksApi(Dio dio, {required int apiVersion}) {
|
||||
return tasksApi;
|
||||
}
|
||||
|
||||
@override
|
||||
PaperlessUserApi createUserApi(Dio dio, {required int apiVersion}) {
|
||||
return userApi;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user