Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 5 additions & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
analyzer:
errors:
constant_identifier_names: ignore

include: package:flutter_lints/flutter.yaml

linter:
rules:
use_build_context_synchronously: true
unnecessary_string_escapes: false
unnecessary_string_interpolations: false
unnecessary_string_interpolations: false
avoid_redundant_argument_values: true
avoid_void_async: true
138 changes: 91 additions & 47 deletions integration_test/add_tokens_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,15 @@ void main() {
latestStartedVersion: Version.parse('999.999.999'),
),
);
when(mockSettingsRepository.saveSettings(any)).thenAnswer((_) async => true);
when(
mockSettingsRepository.saveSettings(any),
).thenAnswer((_) async => true);
mockTokenRepository = MockTokenRepository();
var tokens = <Token>[];
when(mockTokenRepository.loadTokens()).thenAnswer((_) async => tokens);
when(mockTokenRepository.saveOrReplaceToken(any)).thenAnswer((invocation) async {
when(mockTokenRepository.saveOrReplaceToken(any)).thenAnswer((
invocation,
) async {
final arguments = invocation.positionalArguments;
tokens.removeWhere((element) => element.id == (arguments[0] as Token).id);
tokens.add(arguments[0] as Token);
Expand All @@ -64,47 +68,67 @@ void main() {
return true;
});
mockTokenFolderRepository = MockTokenFolderRepository();
when(mockTokenFolderRepository.loadState()).thenAnswer((_) async => const TokenFolderState(folders: []));
when(mockTokenFolderRepository.saveState(any)).thenAnswer((_) async => true);
when(
mockTokenFolderRepository.loadState(),
).thenAnswer((_) async => const TokenFolderState(folders: []));
when(
mockTokenFolderRepository.saveState(any),
).thenAnswer((_) async => true);
mockIntroductionRepository = MockIntroductionRepository();
when(mockIntroductionRepository.loadCompletedIntroductions())
.thenAnswer((_) async => const IntroductionState(completedIntroductions: {...Introduction.values}));
when(mockIntroductionRepository.loadCompletedIntroductions()).thenAnswer(
(_) async => const IntroductionState(
completedIntroductions: {...Introduction.values},
),
);
});
testWidgets(
'Add Tokens Test',
(tester) async {
await tester.pumpWidget(TestsAppWrapper(
testWidgets('Add Tokens Test', (tester) async {
await tester.pumpWidget(
TestsAppWrapper(
overrides: [
settingsProvider.overrideWith(() => SettingsNotifier(repoOverride: mockSettingsRepository)),
tokenProvider.overrideWith(() => TokenNotifier(repoOverride: mockTokenRepository)),
tokenFolderProvider.overrideWith(() => TokenFolderNotifier(repoOverride: mockTokenFolderRepository)),
introductionNotifierProvider.overrideWith(() => IntroductionNotifier(repoOverride: mockIntroductionRepository)),
settingsProvider.overrideWith(
() => SettingsNotifier(repoOverride: mockSettingsRepository),
),
tokenProvider.overrideWith(
() => TokenNotifier(repoOverride: mockTokenRepository),
),
tokenFolderProvider.overrideWith(
() => TokenFolderNotifier(repoOverride: mockTokenFolderRepository),
),
introductionNotifierProvider.overrideWith(
() =>
IntroductionNotifier(repoOverride: mockIntroductionRepository),
),
],
child: PrivacyIDEAAuthenticator(ApplicationCustomization.defaultCustomization),
));
await expectMainViewIsEmptyAndCorrect(tester);
await _addHotpToken(tester);
expect(find.byType(HOTPTokenWidget), findsOneWidget);
await _addTotpToken(tester);
expect(find.byType(TOTPTokenWidget), findsOneWidget);
await _addDaypasswordToken(tester);
expect(find.byType(DayPasswordTokenWidget), findsOneWidget);
await _createFolder(tester);
await tester.pump(const Duration(milliseconds: 200));
expect(find.byType(TokenFolderWidget), findsOneWidget);
expect(find.text(AppLocalizationsEn().folderName), findsOneWidget);
expect(find.byType(TokenWidgetBase).hitTestable(), findsNWidgets(3));
await _moveFolderToTopPosition(tester);
await _moveHotpTokenWidgetIntoFolder(tester);
await _moveDayPasswordTokenWidgetIntoFolder(tester);
expect(find.byType(TOTPTokenWidget).hitTestable(), findsOneWidget);
expect(find.byType(TokenWidgetBase).hitTestable(), findsOneWidget);
await _openFolder(tester);
await pumpUntilFindNWidgets(tester, find.byType(TokenWidgetBase).hitTestable(), 3, const Duration(seconds: 5));
expect(find.byType(TokenWidgetBase).hitTestable(), findsNWidgets(3));
},
timeout: const Timeout(Duration(minutes: 20)),
);
child: PrivacyIDEAAuthenticator(
ApplicationCustomization.defaultCustomization,
),
),
);
await expectMainViewIsEmptyAndCorrect(tester);
await _addHotpToken(tester);
expect(find.byType(HOTPTokenWidget), findsOneWidget);
await _addTotpToken(tester);
expect(find.byType(TOTPTokenWidget), findsOneWidget);
await _addDaypasswordToken(tester);
expect(find.byType(DayPasswordTokenWidget), findsOneWidget);
await _createFolder(tester);
await tester.pump(const Duration(milliseconds: 200));
expect(find.byType(TokenFolderWidget), findsOneWidget);
expect(find.text(AppLocalizationsEn().folderName), findsOneWidget);
expect(find.byType(TokenWidgetBase).hitTestable(), findsNWidgets(3));
await _moveFolderToTopPosition(tester);
await _moveHotpTokenWidgetIntoFolder(tester);
await _moveDayPasswordTokenWidgetIntoFolder(tester);
expect(find.byType(TOTPTokenWidget).hitTestable(), findsOneWidget);
expect(find.byType(TokenWidgetBase).hitTestable(), findsOneWidget);
await _openFolder(tester);
await pumpUntilFindNWidgets(
tester,
find.byType(TokenWidgetBase).hitTestable(),
3,
);
expect(find.byType(TokenWidgetBase).hitTestable(), findsNWidgets(3));
}, timeout: const Timeout(Duration(minutes: 20)));
}

Future<void> _addHotpToken(WidgetTester tester) async {
Expand Down Expand Up @@ -174,7 +198,10 @@ Future<void> _createFolder(WidgetTester tester) async {
await tester.pump();
await tester.tap(find.byIcon(Icons.create_new_folder));
await tester.pump(const Duration(milliseconds: 1000));
await tester.enterText(find.byType(TextField).first, AppLocalizationsEn().folderName);
await tester.enterText(
find.byType(TextField).first,
AppLocalizationsEn().folderName,
);
await tester.pump();
await tester.tap(find.text(AppLocalizationsEn().create));
await tester.pump();
Expand All @@ -185,7 +212,9 @@ Future<void> _moveFolderToTopPosition(WidgetTester tester) async {
final tokenFolderPosition = tester.getCenter(find.byType(TokenFolderWidget));
final gestrue = await tester.startGesture(tokenFolderPosition);
await tester.pump(const Duration(milliseconds: 1000));
final dragTargetDividerPosition = tester.getCenter(find.byType(DragTargetDivider).first);
final dragTargetDividerPosition = tester.getCenter(
find.byType(DragTargetDivider).first,
);
await gestrue.moveTo(dragTargetDividerPosition);
await tester.pump();
await gestrue.up();
Expand All @@ -194,7 +223,9 @@ Future<void> _moveFolderToTopPosition(WidgetTester tester) async {

Future<void> _moveHotpTokenWidgetIntoFolder(WidgetTester tester) async {
await tester.pump();
final tokenWidgetPosition = tester.getCenter(find.byType(HOTPTokenWidget).first);
final tokenWidgetPosition = tester.getCenter(
find.byType(HOTPTokenWidget).first,
);
final gestrue = await tester.startGesture(tokenWidgetPosition);
await tester.pump(const Duration(milliseconds: 1000));
final tokenFolderPosition = tester.getCenter(find.byType(TokenFolderWidget));
Expand All @@ -206,7 +237,9 @@ Future<void> _moveHotpTokenWidgetIntoFolder(WidgetTester tester) async {

Future<void> _moveDayPasswordTokenWidgetIntoFolder(WidgetTester tester) async {
await tester.pump();
final tokenWidgetPosition = tester.getCenter(find.byType(DayPasswordTokenWidget).last);
final tokenWidgetPosition = tester.getCenter(
find.byType(DayPasswordTokenWidget).last,
);
final gestrue = await tester.startGesture(tokenWidgetPosition);
await tester.pump(const Duration(milliseconds: 1000));
final tokenFolderPosition = tester.getCenter(find.byType(TokenFolderWidget));
Expand All @@ -217,17 +250,28 @@ Future<void> _moveDayPasswordTokenWidgetIntoFolder(WidgetTester tester) async {
}

Future<void> _openFolder(WidgetTester tester) async {
await pumpUntilFindNWidgets(tester, find.byType(TokenFolderWidget), 1, const Duration(seconds: 5));
await pumpUntilFindNWidgets(tester, find.byType(TokenFolderWidget), 1);
await tester.tap(find.byType(TokenFolderWidget));
await tester.pump();
}

Future<void> expectMainViewIsEmptyAndCorrect(WidgetTester tester) async {
await pumpUntilFindNWidgets(tester, find.byType(FloatingActionButton), 1, const Duration(seconds: 10));
await pumpUntilFindNWidgets(
tester,
find.byType(FloatingActionButton),
1,
timeout: const Duration(seconds: 10),
);
expect(find.byType(FloatingActionButton), findsOneWidget);
expect(find.byType(AppBarItem), findsNWidgets(5)); // 4 at BottomNavigationBar and 1 at AppBar
expect(
find.byType(AppBarItem),
findsNWidgets(5),
); // 4 at BottomNavigationBar and 1 at AppBar
expect(find.byType(TokenWidgetBase), findsNothing);
expect(find.byType(TokenFolderWidget), findsNothing);
expect(find.text(ApplicationCustomization.defaultCustomization.appName), findsOneWidget);
expect(
find.text(ApplicationCustomization.defaultCustomization.appName),
findsOneWidget,
);
expect(find.byType(Image), findsOneWidget);
}
88 changes: 66 additions & 22 deletions integration_test/copy_to_clipboard_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import 'package:privacyidea_authenticator/model/riverpod_states/introduction_sta
import 'package:privacyidea_authenticator/model/riverpod_states/settings_state.dart';
import 'package:privacyidea_authenticator/model/riverpod_states/token_folder_state.dart';
import 'package:privacyidea_authenticator/model/tokens/hotp_token.dart';
import 'package:privacyidea_authenticator/utils/customization/application_customization.dart';
import 'package:privacyidea_authenticator/model/version.dart';
import 'package:privacyidea_authenticator/utils/customization/application_customization.dart';
import 'package:privacyidea_authenticator/utils/riverpod/riverpod_providers/generated_providers/introduction_provider.dart';
import 'package:privacyidea_authenticator/utils/riverpod/riverpod_providers/generated_providers/settings_notifier.dart';
import 'package:privacyidea_authenticator/utils/riverpod/riverpod_providers/generated_providers/token_folder_notifier.dart';
Expand All @@ -28,34 +28,78 @@ void main() {
late final MockIntroductionRepository mockIntroductionRepository;
setUp(() {
mockSettingsRepository = MockSettingsRepository();
when(mockSettingsRepository.loadSettings()).thenAnswer((_) async =>
SettingsState(isFirstRun: false, useSystemLocale: false, localePreference: const Locale('en'), latestStartedVersion: Version.parse('999.999.999')));
when(mockSettingsRepository.saveSettings(any)).thenAnswer((_) async => true);
when(mockSettingsRepository.loadSettings()).thenAnswer(
(_) async => SettingsState(
isFirstRun: false,
useSystemLocale: false,
localePreference: const Locale('en'),
latestStartedVersion: Version.parse('999.999.999'),
),
);
when(
mockSettingsRepository.saveSettings(any),
).thenAnswer((_) async => true);
mockTokenRepository = MockTokenRepository();
when(mockTokenRepository.loadTokens()).thenAnswer((_) async => [
HOTPToken(label: 'test', issuer: 'test', id: 'id', algorithm: Algorithms.SHA256, digits: 6, secret: 'secret', counter: 0),
]);
when(mockTokenRepository.saveOrReplaceTokens(any)).thenAnswer((_) async => []);
when(mockTokenRepository.loadTokens()).thenAnswer(
(_) async => [
HOTPToken(
label: 'test',
issuer: 'test',
id: 'id',
algorithm: Algorithms.SHA256,
digits: 6,
secret: 'secret',
),
],
);
when(
mockTokenRepository.saveOrReplaceTokens(any),
).thenAnswer((_) async => []);
when(mockTokenRepository.deleteTokens(any)).thenAnswer((_) async => []);
mockTokenFolderRepository = MockTokenFolderRepository();
when(mockTokenFolderRepository.loadState()).thenAnswer((_) async => const TokenFolderState(folders: []));
when(mockTokenFolderRepository.saveState(any)).thenAnswer((_) async => true);
when(
mockTokenFolderRepository.loadState(),
).thenAnswer((_) async => const TokenFolderState(folders: []));
when(
mockTokenFolderRepository.saveState(any),
).thenAnswer((_) async => true);
mockIntroductionRepository = MockIntroductionRepository();
when(mockIntroductionRepository.loadCompletedIntroductions())
.thenAnswer((_) async => const IntroductionState(completedIntroductions: {...Introduction.values}));
when(mockIntroductionRepository.loadCompletedIntroductions()).thenAnswer(
(_) async => const IntroductionState(
completedIntroductions: {...Introduction.values},
),
);
});
testWidgets('Copy to Clipboard Test', (tester) async {
await tester.pumpWidget(TestsAppWrapper(
overrides: [
settingsProvider.overrideWith(() => SettingsNotifier(repoOverride: mockSettingsRepository)),
tokenProvider.overrideWith(() => TokenNotifier(repoOverride: mockTokenRepository)),
tokenFolderProvider.overrideWith(() => TokenFolderNotifier(repoOverride: mockTokenFolderRepository)),
introductionNotifierProvider.overrideWith(() => IntroductionNotifier(repoOverride: mockIntroductionRepository)),
],
child: PrivacyIDEAAuthenticator(ApplicationCustomization.defaultCustomization),
));
await tester.pumpWidget(
TestsAppWrapper(
overrides: [
settingsProvider.overrideWith(
() => SettingsNotifier(repoOverride: mockSettingsRepository),
),
tokenProvider.overrideWith(
() => TokenNotifier(repoOverride: mockTokenRepository),
),
tokenFolderProvider.overrideWith(
() => TokenFolderNotifier(repoOverride: mockTokenFolderRepository),
),
introductionNotifierProvider.overrideWith(
() =>
IntroductionNotifier(repoOverride: mockIntroductionRepository),
),
],
child: PrivacyIDEAAuthenticator(
ApplicationCustomization.defaultCustomization,
),
),
);
await tester.pumpAndSettle();
await pumpUntilFindNWidgets(tester, find.text('356 306'), 1, const Duration(seconds: 10));
await pumpUntilFindNWidgets(
tester,
find.text('356 306'),
1,
timeout: const Duration(seconds: 10),
);
expect(find.text('356 306'), findsOneWidget);
await tester.tap(find.text('356 306'));
await tester.pumpAndSettle();
Expand Down
Loading
Loading