import 'package:nextcloud/nextcloud.dart'; import 'package:test/test.dart'; import 'helper.dart'; void main() { group('user_status', () { late DockerImage image; setUpAll(() async => image = await getDockerImage()); late DockerContainer container; late TestNextcloudClient client; setUp(() async { container = await getDockerContainer(image); client = await getTestClient(container); }); tearDown(() => container.destroy()); test('Find all predefined statuses', () async { final expectedStatusIDs = ['meeting', 'commuting', 'remote-work', 'sick-leave', 'vacationing']; final response = await client.userStatus.getPredefinedStatuses(); expect(response.ocs.data, hasLength(5)); final responseIDs = response.ocs.data.map((final status) => status.id); expect(expectedStatusIDs.map(responseIDs.contains).contains(false), false); for (final status in response.ocs.data) { expect(status.icon, isNotNull); expect(status.message, isNotNull); } final meeting = response.ocs.data.singleWhere((final s) => s.id == 'meeting').clearAt!.clearAt!; expect(meeting.type, UserStatusClearAt_Type.period); expect(meeting.time.$int, 3600); final commuting = response.ocs.data.singleWhere((final s) => s.id == 'commuting').clearAt!.clearAt!; expect(commuting.type, UserStatusClearAt_Type.period); expect(commuting.time.$int, 1800); final remoteWork = response.ocs.data.singleWhere((final s) => s.id == 'remote-work').clearAt!.clearAt!; expect(remoteWork.type, UserStatusClearAt_Type.endOf); expect(remoteWork.time.clearAtTime0, UserStatusClearAt_Time0.day); final sickLeave = response.ocs.data.singleWhere((final s) => s.id == 'sick-leave').clearAt!.clearAt!; expect(sickLeave.type, UserStatusClearAt_Type.endOf); expect(sickLeave.time.clearAtTime0, UserStatusClearAt_Time0.day); final vacationing = response.ocs.data.singleWhere((final s) => s.id == 'vacationing').clearAt; expect(vacationing, null); }); test('Set status', () async { final response = await client.userStatus.setStatus(statusType: UserStatusType.online); expect(response.ocs.data.status!.publicStatus.userId, 'user1'); expect(response.ocs.data.status!.publicStatus.message, null); expect(response.ocs.data.status!.status1.messageId, null); expect(response.ocs.data.status!.status1.messageIsPredefined, false); expect(response.ocs.data.status!.publicStatus.icon, null); expect(response.ocs.data.status!.publicStatus.clearAt, null); expect(response.ocs.data.status!.publicStatus.status, UserStatusType.online); expect(response.ocs.data.status!.status1.statusIsUserDefined, true); }); test('Get status', () async { // There seems to be a bug in Nextcloud which makes getting the status fail before it has been set once. // The error message from Nextcloud is "Could not create folder" await client.userStatus.setStatus(statusType: UserStatusType.online); final response = await client.userStatus.getStatus(); expect(response.ocs.data.status!.publicStatus.userId, 'user1'); expect(response.ocs.data.status!.publicStatus.message, null); expect(response.ocs.data.status!.status1.messageId, null); expect(response.ocs.data.status!.status1.messageIsPredefined, false); expect(response.ocs.data.status!.publicStatus.icon, null); expect(response.ocs.data.status!.publicStatus.clearAt, null); expect(response.ocs.data.status!.publicStatus.status, UserStatusType.online); expect(response.ocs.data.status!.status1.statusIsUserDefined, true); }); test('Find all statuses', () async { var response = await client.userStatus.getPublicStatuses(); expect(response.ocs.data, hasLength(0)); await client.userStatus.setStatus(statusType: UserStatusType.online); response = await client.userStatus.getPublicStatuses(); expect(response.ocs.data, hasLength(1)); expect(response.ocs.data[0].userId, 'user1'); expect(response.ocs.data[0].message, null); expect(response.ocs.data[0].icon, null); expect(response.ocs.data[0].clearAt, null); expect(response.ocs.data[0].status, UserStatusType.online); }); test('Find status', () async { // Same as getting status await client.userStatus.setStatus(statusType: UserStatusType.online); final response = await client.userStatus.getPublicStatus(userId: 'user1'); expect(response.ocs.data.publicStatus!.userId, 'user1'); expect(response.ocs.data.publicStatus!.message, null); expect(response.ocs.data.publicStatus!.icon, null); expect(response.ocs.data.publicStatus!.clearAt, null); expect(response.ocs.data.publicStatus!.status, UserStatusType.online); }); test('Set predefined message', () async { final clearAt = DateTime.now().millisecondsSinceEpoch ~/ 1000 + 60; final response = await client.userStatus.setPredefinedMessage( messageId: 'meeting', clearAt: clearAt, ); expect(response.ocs.data.status!.publicStatus.userId, 'user1'); expect(response.ocs.data.status!.publicStatus.message, null); expect(response.ocs.data.status!.status1.messageId, 'meeting'); expect(response.ocs.data.status!.status1.messageIsPredefined, true); expect(response.ocs.data.status!.publicStatus.icon, null); expect(response.ocs.data.status!.publicStatus.clearAt!.$int, clearAt); expect(response.ocs.data.status!.publicStatus.status, UserStatusType.offline); expect(response.ocs.data.status!.status1.statusIsUserDefined, false); }); test('Set custom message', () async { final clearAt = DateTime.now().millisecondsSinceEpoch ~/ 1000 + 60; final response = await client.userStatus.setCustomMessage( statusIcon: '😀', message: 'bla', clearAt: clearAt, ); expect(response.ocs.data.status!.publicStatus.userId, 'user1'); expect(response.ocs.data.status!.publicStatus.message, 'bla'); expect(response.ocs.data.status!.status1.messageId, null); expect(response.ocs.data.status!.status1.messageIsPredefined, false); expect(response.ocs.data.status!.publicStatus.icon, '😀'); expect(response.ocs.data.status!.publicStatus.clearAt!.$int, clearAt); expect(response.ocs.data.status!.publicStatus.status, UserStatusType.offline); expect(response.ocs.data.status!.status1.statusIsUserDefined, false); }); test('Clear message', () async { final clearAt = DateTime.now().millisecondsSinceEpoch ~/ 1000 + 60; await client.userStatus.setCustomMessage( statusIcon: '😀', message: 'bla', clearAt: clearAt, ); await client.userStatus.clearMessage(); final response = await client.userStatus.getStatus(); expect(response.ocs.data.status!.publicStatus.userId, 'user1'); expect(response.ocs.data.status!.publicStatus.message, null); expect(response.ocs.data.status!.status1.messageId, null); expect(response.ocs.data.status!.status1.messageIsPredefined, false); expect(response.ocs.data.status!.publicStatus.icon, null); expect(response.ocs.data.status!.publicStatus.clearAt, null); expect(response.ocs.data.status!.publicStatus.status, UserStatusType.offline); expect(response.ocs.data.status!.status1.statusIsUserDefined, false); }); test('Heartbeat', () async { final response = await client.userStatus.heartbeat(status: UserStatusType.online); expect(response.ocs.data.status!.publicStatus.userId, 'user1'); expect(response.ocs.data.status!.publicStatus.message, null); expect(response.ocs.data.status!.status1.messageId, null); expect(response.ocs.data.status!.status1.messageIsPredefined, false); expect(response.ocs.data.status!.publicStatus.icon, null); expect(response.ocs.data.status!.publicStatus.clearAt, null); expect(response.ocs.data.status!.publicStatus.status, UserStatusType.online); expect(response.ocs.data.status!.status1.statusIsUserDefined, false); }); }); }