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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions commet/integration_test/matrix/create_space_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import 'package:commet/client/room.dart';
import 'package:commet/generated/l10n.dart';
import 'package:commet/ui/molecules/space_selector.dart';
import 'package:commet/ui/pages/login/login_page.dart';
import 'package:commet/utils/rng.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:commet/main.dart';
import 'package:hive/hive.dart';
import 'package:integration_test/integration_test.dart';

import '../extensions/wait_for.dart';
import '../extensions/common_flows.dart';
import 'package:tiamat/tiamat.dart' as tiamat;

void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();

testWidgets('Create Private Space', (WidgetTester tester) async {
await tester.clearUserData();

var app = App();
await _openMenu(tester, app);
await _setPrivate(tester);

String spaceName = "Private Space ${RandomUtils.getRandomString(8)}";
await _setSpaceName(tester, spaceName);
await _confirmCreateSpace(tester);

var client = app.clientManager.getClients().first;

expect(client.spaces.any((element) => element.displayName == spaceName),
isTrue);
expect(
client.spaces
.firstWhere((element) => element.displayName == spaceName)
.visibility,
equals(RoomVisibility.invite));

await app.clientManager.close();
await tester.clean();
});

testWidgets('Create Public Space', (WidgetTester tester) async {
await tester.clearUserData();

var app = App();
await _openMenu(tester, app);
await _setPublic(tester);

String spaceName = "Public Space ${RandomUtils.getRandomString(8)}";
await _setSpaceName(tester, spaceName);
await _confirmCreateSpace(tester);

var client = app.clientManager.getClients().first;

expect(client.spaces.any((element) => element.displayName == spaceName),
isTrue);
expect(
client.spaces
.firstWhere((element) => element.displayName == spaceName)
.visibility,
equals(RoomVisibility.public));

await app.clientManager.close();
await tester.clean();
});
}

Future<void> _confirmCreateSpace(WidgetTester tester) async {
await tester.tap(find
.widgetWithText(tiamat.Button, T.current.addSpaceViewCreateSpaceButton)
.first);

await tester.pumpAndSettle();
}

Future<void> _setSpaceName(WidgetTester tester, String spaceName) async {
await tester.enterText(
find.widgetWithText(
tiamat.TextInput,
T.current.spaceNamePrompt,
),
spaceName);
}

Future<void> _setPrivate(WidgetTester tester) async {
await tester.tap(find.byType(tiamat.DropdownSelector<RoomVisibility>));

await tester.pumpAndSettle();

await tester.tap(find
.widgetWithText(tiamat.Text, T.current.roomVisibilityPrivateExplanation)
.last);

await tester.pumpAndSettle();
}

Future<void> _setPublic(WidgetTester tester) async {
await tester.tap(find.byType(tiamat.DropdownSelector<RoomVisibility>));

await tester.pumpAndSettle();

await tester.tap(find
.widgetWithText(tiamat.Text, T.current.roomVisibilityPublicExplanation)
.last);

await tester.pumpAndSettle();
}

Future<void> _openMenu(WidgetTester tester, App app) async {
await tester.pumpWidget(app);

await tester.login(app);

await tester.pumpAndSettle();

await tester.dragUntilVisible(
find.widgetWithIcon(tiamat.ImageButton, Icons.add),
find.byType(SpaceSelector),
Offset(0, 50));

await tester.tap(find.widgetWithIcon(tiamat.ImageButton, Icons.add));

await tester.pumpAndSettle();

await tester.tap(find.widgetWithText(InkWell, T.current.createNewSpace));

await tester.pumpAndSettle();
}
2 changes: 2 additions & 0 deletions commet/integration_test/runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
import 'package:integration_test/integration_test.dart';
import 'matrix/login_test.dart' as login_test;
import 'matrix/key_verification_test.dart' as key_verification_test;
import 'matrix/create_space_test.dart' as create_space_test;

void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();

login_test.main();
key_verification_test.main();
create_space_test.main();
}
20 changes: 16 additions & 4 deletions commet/lib/client/matrix/matrix_space.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,29 @@ class MatrixSpace extends Space {
String get topic => _matrixRoom.topic;

@override
RoomVisibility get visibility =>
_matrixRoom.joinRules == matrix.JoinRules.public
? RoomVisibility.public
: RoomVisibility.private;
RoomVisibility get visibility {
switch (_matrixRoom.joinRules) {
case matrix.JoinRules.public:
return RoomVisibility.public;
case matrix.JoinRules.knock:
return RoomVisibility.knock;
case matrix.JoinRules.invite:
return RoomVisibility.invite;
case matrix.JoinRules.private:
return RoomVisibility.private;
default:
return RoomVisibility.private;
}
}

MatrixSpace(client, matrix.Room room, matrix.Client matrixClient)
: super(room.id, client) {
_matrixRoom = room;
_matrixClient = matrixClient;
displayName = room.getLocalizedDisplayname();

_matrixRoom.postLoad();

room.onUpdate.stream.listen((event) {
refresh();
onUpdate.add(null);
Expand Down
8 changes: 3 additions & 5 deletions commet/lib/client/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ import 'package:flutter/material.dart';

import 'permissions.dart';

enum RoomVisibility {
public,
private,
}
enum RoomVisibility { public, private, invite, knock }

abstract class Room {
late String identifier;
Expand All @@ -23,7 +20,8 @@ abstract class Room {

int notificationCount = 0;

Future<TimelineEvent?> sendMessage(String message, {TimelineEvent? inReplyTo});
Future<TimelineEvent?> sendMessage(String message,
{TimelineEvent? inReplyTo});

Room(this.identifier, this.client) {
identifier = identifier;
Expand Down
35 changes: 26 additions & 9 deletions commet/lib/ui/pages/add_space/add_space_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,15 @@ Widget wbAddSpacePageSingleAccount(BuildContext context) {
}

class AddSpaceView extends StatefulWidget {
const AddSpaceView({super.key, required this.clients, this.onCreateSpace, this.onJoinSpace, this.initialPhase});
const AddSpaceView(
{super.key,
required this.clients,
this.onCreateSpace,
this.onJoinSpace,
this.initialPhase});
final List<Client> clients;
final Function(Client client, String spaceName, RoomVisibility visibility)? onCreateSpace;
final Function(Client client, String spaceName, RoomVisibility visibility)?
onCreateSpace;
final Function(Client client, String address)? onJoinSpace;
final _AddSpacePhase? initialPhase;

Expand All @@ -74,10 +80,12 @@ class _AddSpaceViewState extends State<AddSpaceView> {
PreviewData? spacePreview;
bool loadingSpacePreview = false;

Debouncer spacePreviewDebounce = Debouncer(delay: Duration(milliseconds: 500));
Debouncer spacePreviewDebounce =
Debouncer(delay: Duration(milliseconds: 500));

void getSpacePreview() async {
var preview = await selectedClient.getSpacePreview(spaceAddressController.text);
var preview =
await selectedClient.getSpacePreview(spaceAddressController.text);

setState(() {
print("Got Preview");
Expand Down Expand Up @@ -185,6 +193,8 @@ class _AddSpaceViewState extends State<AddSpaceView> {
subtitle = T.current.roomVisibilityPublicExplanation;
break;
case RoomVisibility.private:
case RoomVisibility.invite:
case RoomVisibility.knock:
title = T.current.roomVisibilityPrivate;
icon = Icons.lock;
subtitle = T.current.roomVisibilityPrivateExplanation;
Expand Down Expand Up @@ -222,7 +232,8 @@ class _AddSpaceViewState extends State<AddSpaceView> {
padding: const EdgeInsets.fromLTRB(0, 4, 0, 4),
child: tiamat.Button.success(
text: T.current.addSpaceViewCreateSpaceButton,
onTap: () => widget.onCreateSpace?.call(selectedClient, nameController.text, visibility),
onTap: () => widget.onCreateSpace
?.call(selectedClient, nameController.text, visibility),
),
)
],
Expand Down Expand Up @@ -262,12 +273,15 @@ class _AddSpaceViewState extends State<AddSpaceView> {
)
: spacePreview != null
? RoomPreview(previewData: spacePreview!)
: Center(child: tiamat.Text.label(T.of(context).couldNotLoadRoomPreview)),
: Center(
child: tiamat.Text.label(
T.of(context).couldNotLoadRoomPreview)),
),
tiamat.Button.success(
text: T.of(context).joinSpacePrompt,
onTap: () {
widget.onJoinSpace?.call(selectedClient, spaceAddressController.text);
widget.onJoinSpace
?.call(selectedClient, spaceAddressController.text);
},
),
],
Expand All @@ -284,7 +298,8 @@ class _AddSpaceViewState extends State<AddSpaceView> {
child: InkWell(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(child: tiamat.Text.labelEmphasised(T.current.createNewSpace)),
child: Center(
child: tiamat.Text.labelEmphasised(T.current.createNewSpace)),
),
onTap: () {
setState(() {
Expand All @@ -303,7 +318,9 @@ class _AddSpaceViewState extends State<AddSpaceView> {
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(child: tiamat.Text.labelEmphasised(T.current.joinExistingSpace)),
child: Center(
child:
tiamat.Text.labelEmphasised(T.current.joinExistingSpace)),
),
),
)
Expand Down