refactor: Avoid redundant async
This commit is contained in:
parent
9d007815df
commit
d08364688e
15 changed files with 169 additions and 182 deletions
|
|
@ -22,4 +22,5 @@ analyzer:
|
||||||
|
|
||||||
dart_code_linter:
|
dart_code_linter:
|
||||||
rules:
|
rules:
|
||||||
- avoid-dynamic
|
- avoid-dynamic
|
||||||
|
- avoid-redundant-async
|
||||||
|
|
@ -17,171 +17,157 @@ import 'users.dart';
|
||||||
void main() {
|
void main() {
|
||||||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
group(
|
group('Integration Test', () {
|
||||||
'Integration Test',
|
setUpAll(() {
|
||||||
() {
|
// this random dialog popping up is super hard to cover in tests
|
||||||
setUpAll(
|
SharedPreferences.setMockInitialValues({
|
||||||
() async {
|
'chat.fluffy.show_no_google': false,
|
||||||
// this random dialog popping up is super hard to cover in tests
|
|
||||||
SharedPreferences.setMockInitialValues({
|
|
||||||
'chat.fluffy.show_no_google': false,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgets(
|
|
||||||
'Start app, login and logout',
|
|
||||||
(WidgetTester tester) async {
|
|
||||||
app.main();
|
|
||||||
await tester.ensureAppStartedHomescreen();
|
|
||||||
await tester.ensureLoggedOut();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgets(
|
|
||||||
'Login again',
|
|
||||||
(WidgetTester tester) async {
|
|
||||||
app.main();
|
|
||||||
await tester.ensureAppStartedHomescreen();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgets(
|
|
||||||
'Start chat and send message',
|
|
||||||
(WidgetTester tester) async {
|
|
||||||
app.main();
|
|
||||||
await tester.ensureAppStartedHomescreen();
|
|
||||||
await tester.waitFor(find.byType(TextField));
|
|
||||||
await tester.enterText(find.byType(TextField), Users.user2.name);
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.scrollUntilVisible(
|
|
||||||
find.text('Chats').first,
|
|
||||||
500,
|
|
||||||
scrollable: find
|
|
||||||
.descendant(
|
|
||||||
of: find.byType(ChatListViewBody),
|
|
||||||
matching: find.byType(Scrollable),
|
|
||||||
)
|
|
||||||
.first,
|
|
||||||
);
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
await tester.tap(find.text('Chats'));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
await tester.waitFor(find.byType(SearchTitle));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.scrollUntilVisible(
|
|
||||||
find.text(Users.user2.name).first,
|
|
||||||
500,
|
|
||||||
scrollable: find
|
|
||||||
.descendant(
|
|
||||||
of: find.byType(ChatListViewBody),
|
|
||||||
matching: find.byType(Scrollable),
|
|
||||||
)
|
|
||||||
.first,
|
|
||||||
);
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
await tester.tap(find.text(Users.user2.name).first);
|
|
||||||
|
|
||||||
try {
|
|
||||||
await tester.waitFor(
|
|
||||||
find.byType(ChatView),
|
|
||||||
timeout: const Duration(seconds: 5),
|
|
||||||
);
|
|
||||||
} catch (_) {
|
|
||||||
// in case the homeserver sends the username as search result
|
|
||||||
if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) {
|
|
||||||
await tester.tap(find.byIcon(Icons.send_outlined));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await tester.waitFor(find.byType(ChatView));
|
|
||||||
await tester.enterText(find.byType(TextField).last, 'Test');
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
try {
|
|
||||||
await tester.waitFor(find.byIcon(Icons.send_outlined));
|
|
||||||
await tester.tap(find.byIcon(Icons.send_outlined));
|
|
||||||
} catch (_) {
|
|
||||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
|
||||||
}
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
await tester.waitFor(find.text('Test'));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgets('Spaces', (tester) async {
|
|
||||||
app.main();
|
|
||||||
await tester.ensureAppStartedHomescreen();
|
|
||||||
|
|
||||||
await tester.waitFor(find.byTooltip('Show menu'));
|
|
||||||
await tester.tap(find.byTooltip('Show menu'));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.waitFor(find.byIcon(Icons.workspaces_outlined));
|
|
||||||
await tester.tap(find.byIcon(Icons.workspaces_outlined));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.waitFor(find.byType(TextField));
|
|
||||||
await tester.enterText(find.byType(TextField).last, 'Test Space');
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.waitFor(find.text('Invite contact'));
|
|
||||||
|
|
||||||
await tester.tap(find.text('Invite contact'));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.waitFor(
|
|
||||||
find.descendant(
|
|
||||||
of: find.byType(InvitationSelectionView),
|
|
||||||
matching: find.byType(TextField),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
await tester.enterText(
|
|
||||||
find.descendant(
|
|
||||||
of: find.byType(InvitationSelectionView),
|
|
||||||
matching: find.byType(TextField),
|
|
||||||
),
|
|
||||||
Users.user2.name,
|
|
||||||
);
|
|
||||||
|
|
||||||
await Future.delayed(const Duration(milliseconds: 250));
|
|
||||||
await tester.testTextInput.receiveAction(TextInputAction.done);
|
|
||||||
|
|
||||||
await Future.delayed(const Duration(milliseconds: 1000));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.tap(
|
|
||||||
find
|
|
||||||
.descendant(
|
|
||||||
of: find.descendant(
|
|
||||||
of: find.byType(InvitationSelectionView),
|
|
||||||
matching: find.byType(ListTile),
|
|
||||||
),
|
|
||||||
matching: find.text(Users.user2.name),
|
|
||||||
)
|
|
||||||
.last,
|
|
||||||
);
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.waitFor(find.maybeUppercaseText('Yes'));
|
|
||||||
await tester.tap(find.maybeUppercaseText('Yes'));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.tap(find.byTooltip('Back'));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
await tester.waitFor(find.text('Load 2 more participants'));
|
|
||||||
await tester.tap(find.text('Load 2 more participants'));
|
|
||||||
await tester.pumpAndSettle();
|
|
||||||
|
|
||||||
expect(find.text(Users.user2.name), findsOneWidget);
|
|
||||||
});
|
});
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
testWidgets('Start app, login and logout', (WidgetTester tester) async {
|
||||||
|
app.main();
|
||||||
|
await tester.ensureAppStartedHomescreen();
|
||||||
|
await tester.ensureLoggedOut();
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('Login again', (WidgetTester tester) async {
|
||||||
|
app.main();
|
||||||
|
await tester.ensureAppStartedHomescreen();
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('Start chat and send message', (WidgetTester tester) async {
|
||||||
|
app.main();
|
||||||
|
await tester.ensureAppStartedHomescreen();
|
||||||
|
await tester.waitFor(find.byType(TextField));
|
||||||
|
await tester.enterText(find.byType(TextField), Users.user2.name);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.scrollUntilVisible(
|
||||||
|
find.text('Chats').first,
|
||||||
|
500,
|
||||||
|
scrollable: find
|
||||||
|
.descendant(
|
||||||
|
of: find.byType(ChatListViewBody),
|
||||||
|
matching: find.byType(Scrollable),
|
||||||
|
)
|
||||||
|
.first,
|
||||||
|
);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
await tester.tap(find.text('Chats'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
await tester.waitFor(find.byType(SearchTitle));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.scrollUntilVisible(
|
||||||
|
find.text(Users.user2.name).first,
|
||||||
|
500,
|
||||||
|
scrollable: find
|
||||||
|
.descendant(
|
||||||
|
of: find.byType(ChatListViewBody),
|
||||||
|
matching: find.byType(Scrollable),
|
||||||
|
)
|
||||||
|
.first,
|
||||||
|
);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
await tester.tap(find.text(Users.user2.name).first);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await tester.waitFor(
|
||||||
|
find.byType(ChatView),
|
||||||
|
timeout: const Duration(seconds: 5),
|
||||||
|
);
|
||||||
|
} catch (_) {
|
||||||
|
// in case the homeserver sends the username as search result
|
||||||
|
if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) {
|
||||||
|
await tester.tap(find.byIcon(Icons.send_outlined));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await tester.waitFor(find.byType(ChatView));
|
||||||
|
await tester.enterText(find.byType(TextField).last, 'Test');
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
try {
|
||||||
|
await tester.waitFor(find.byIcon(Icons.send_outlined));
|
||||||
|
await tester.tap(find.byIcon(Icons.send_outlined));
|
||||||
|
} catch (_) {
|
||||||
|
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||||
|
}
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
await tester.waitFor(find.text('Test'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('Spaces', (tester) async {
|
||||||
|
app.main();
|
||||||
|
await tester.ensureAppStartedHomescreen();
|
||||||
|
|
||||||
|
await tester.waitFor(find.byTooltip('Show menu'));
|
||||||
|
await tester.tap(find.byTooltip('Show menu'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.waitFor(find.byIcon(Icons.workspaces_outlined));
|
||||||
|
await tester.tap(find.byIcon(Icons.workspaces_outlined));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.waitFor(find.byType(TextField));
|
||||||
|
await tester.enterText(find.byType(TextField).last, 'Test Space');
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.waitFor(find.text('Invite contact'));
|
||||||
|
|
||||||
|
await tester.tap(find.text('Invite contact'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.waitFor(
|
||||||
|
find.descendant(
|
||||||
|
of: find.byType(InvitationSelectionView),
|
||||||
|
matching: find.byType(TextField),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await tester.enterText(
|
||||||
|
find.descendant(
|
||||||
|
of: find.byType(InvitationSelectionView),
|
||||||
|
matching: find.byType(TextField),
|
||||||
|
),
|
||||||
|
Users.user2.name,
|
||||||
|
);
|
||||||
|
|
||||||
|
await Future.delayed(const Duration(milliseconds: 250));
|
||||||
|
await tester.testTextInput.receiveAction(TextInputAction.done);
|
||||||
|
|
||||||
|
await Future.delayed(const Duration(milliseconds: 1000));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.tap(
|
||||||
|
find
|
||||||
|
.descendant(
|
||||||
|
of: find.descendant(
|
||||||
|
of: find.byType(InvitationSelectionView),
|
||||||
|
matching: find.byType(ListTile),
|
||||||
|
),
|
||||||
|
matching: find.text(Users.user2.name),
|
||||||
|
)
|
||||||
|
.last,
|
||||||
|
);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.waitFor(find.maybeUppercaseText('Yes'));
|
||||||
|
await tester.tap(find.maybeUppercaseText('Yes'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.tap(find.byTooltip('Back'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.waitFor(find.text('Load 2 more participants'));
|
||||||
|
await tester.tap(find.text('Load 2 more participants'));
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
expect(find.text(Users.user2.name), findsOneWidget);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ class BootstrapDialogState extends State<BootstrapDialog> {
|
||||||
context.canPop() ? context.pop(success) : context.go('/rooms');
|
context.canPop() ? context.pop(success) : context.go('/rooms');
|
||||||
}
|
}
|
||||||
|
|
||||||
void _decryptLastEvents() async {
|
void _decryptLastEvents() {
|
||||||
for (final room in client.rooms) {
|
for (final room in client.rooms) {
|
||||||
final event = room.lastEvent;
|
final event = room.lastEvent;
|
||||||
if (event != null &&
|
if (event != null &&
|
||||||
|
|
|
||||||
|
|
@ -257,7 +257,7 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _loadDraft() async {
|
void _loadDraft() {
|
||||||
final prefs = Matrix.of(context).store;
|
final prefs = Matrix.of(context).store;
|
||||||
final draft = prefs.getString('draft_$roomId');
|
final draft = prefs.getString('draft_$roomId');
|
||||||
if (draft != null && draft.isNotEmpty) {
|
if (draft != null && draft.isNotEmpty) {
|
||||||
|
|
|
||||||
|
|
@ -27,11 +27,7 @@ class PollWidget extends StatelessWidget {
|
||||||
void _endPoll(BuildContext context) =>
|
void _endPoll(BuildContext context) =>
|
||||||
showFutureLoadingDialog(context: context, future: () => event.endPoll());
|
showFutureLoadingDialog(context: context, future: () => event.endPoll());
|
||||||
|
|
||||||
void _toggleVote(
|
void _toggleVote(BuildContext context, String answerId, int maxSelection) {
|
||||||
BuildContext context,
|
|
||||||
String answerId,
|
|
||||||
int maxSelection,
|
|
||||||
) async {
|
|
||||||
final userId = event.room.client.userID!;
|
final userId = event.room.client.userID!;
|
||||||
final answerIds = event.getPollResponses(timeline)[userId] ?? {};
|
final answerIds = event.getPollResponses(timeline)[userId] ?? {};
|
||||||
if (!answerIds.remove(answerId)) {
|
if (!answerIds.remove(answerId)) {
|
||||||
|
|
|
||||||
|
|
@ -372,7 +372,7 @@ class ChatListController extends State<ChatList>
|
||||||
scrollController.addListener(_onScroll);
|
scrollController.addListener(_onScroll);
|
||||||
_waitForFirstSync();
|
_waitForFirstSync();
|
||||||
_hackyWebRTCFixForWeb();
|
_hackyWebRTCFixForWeb();
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
searchServer = Matrix.of(
|
searchServer = Matrix.of(
|
||||||
context,
|
context,
|
||||||
|
|
|
||||||
|
|
@ -189,7 +189,7 @@ class MyCallingPage extends State<Calling> {
|
||||||
_playCallSound();
|
_playCallSound();
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialize() async {
|
void initialize() {
|
||||||
final call = this.call;
|
final call = this.call;
|
||||||
call.onCallStateChanged.stream.listen(_handleCallState);
|
call.onCallStateChanged.stream.listen(_handleCallState);
|
||||||
call.onCallEventChanged.stream.listen((event) {
|
call.onCallEventChanged.stream.listen((event) {
|
||||||
|
|
@ -282,7 +282,7 @@ class MyCallingPage extends State<Calling> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _screenSharing() async {
|
void _screenSharing() {
|
||||||
if (PlatformInfos.isAndroid) {
|
if (PlatformInfos.isAndroid) {
|
||||||
if (!call.screensharingEnabled) {
|
if (!call.screensharingEnabled) {
|
||||||
FlutterForegroundTask.init(
|
FlutterForegroundTask.init(
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ class InvitationSelectionController extends State<InvitationSelection> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void searchUserWithCoolDown(String text) async {
|
void searchUserWithCoolDown(String text) {
|
||||||
coolDown?.cancel();
|
coolDown?.cancel();
|
||||||
coolDown = Timer(
|
coolDown = Timer(
|
||||||
const Duration(milliseconds: 500),
|
const Duration(milliseconds: 500),
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ class LoginController extends State<Login> {
|
||||||
|
|
||||||
Timer? _coolDown;
|
Timer? _coolDown;
|
||||||
|
|
||||||
void checkWellKnownWithCoolDown(String userId) async {
|
void checkWellKnownWithCoolDown(String userId) {
|
||||||
_coolDown?.cancel();
|
_coolDown?.cancel();
|
||||||
_coolDown = Timer(
|
_coolDown = Timer(
|
||||||
const Duration(seconds: 1),
|
const Duration(seconds: 1),
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ class SettingsStyle extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class SettingsStyleController extends State<SettingsStyle> {
|
class SettingsStyleController extends State<SettingsStyle> {
|
||||||
void setChatColor(Color? color) async {
|
void setChatColor(Color? color) {
|
||||||
AppSettings.colorSchemeSeedInt.setItem(
|
AppSettings.colorSchemeSeedInt.setItem(
|
||||||
color?.toARGB32() ?? AppSettings.colorSchemeSeedInt.defaultValue,
|
color?.toARGB32() ?? AppSettings.colorSchemeSeedInt.defaultValue,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
Future<void> applyWorkaroundToOpenSqlCipherOnOldAndroidVersions() async {}
|
Future<void> applyWorkaroundToOpenSqlCipherOnOldAndroidVersions() =>
|
||||||
|
Future.value();
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ class QrCodeViewer extends StatelessWidget {
|
||||||
void _save(BuildContext context) async {
|
void _save(BuildContext context) async {
|
||||||
final imageResult = await showFutureLoadingDialog(
|
final imageResult = await showFutureLoadingDialog(
|
||||||
context: context,
|
context: context,
|
||||||
future: () async {
|
future: () {
|
||||||
final inviteLink = 'https://matrix.to/#/$content';
|
final inviteLink = 'https://matrix.to/#/$content';
|
||||||
final image = QRImage(inviteLink, size: 256, radius: 1).generate();
|
final image = QRImage(inviteLink, size: 256, radius: 1).generate();
|
||||||
return compute(encodePng, image);
|
return compute(encodePng, image);
|
||||||
|
|
|
||||||
|
|
@ -6,5 +6,6 @@ void main() {
|
||||||
testWidget: Archive(),
|
testWidget: Archive(),
|
||||||
testClient: await testClient(loggedIn: true),
|
testClient: await testClient(loggedIn: true),
|
||||||
));*/
|
));*/
|
||||||
|
return;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,5 +13,6 @@ void main() {
|
||||||
testWidget: HomeserverPicker(),
|
testWidget: HomeserverPicker(),
|
||||||
),
|
),
|
||||||
);*/
|
);*/
|
||||||
|
return;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,5 +16,6 @@ void main() {
|
||||||
/* await tester.pumpWidget(FluffyChatApp(
|
/* await tester.pumpWidget(FluffyChatApp(
|
||||||
client: await prepareTestClient(),
|
client: await prepareTestClient(),
|
||||||
));*/
|
));*/
|
||||||
|
return;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue