diff --git a/packages/nextcloud/pubspec.yaml b/packages/nextcloud/pubspec.yaml index e196e101..95ff44d4 100644 --- a/packages/nextcloud/pubspec.yaml +++ b/packages/nextcloud/pubspec.yaml @@ -37,6 +37,10 @@ dev_dependencies: git: url: https://github.com/nextcloud/neon path: packages/neon_lints + nextcloud_test: + git: + url: https://github.com/nextcloud/neon + path: packages/nextcloud_test path: ^1.8.3 process_run: ^0.13.3 test: ^1.24.9 diff --git a/packages/nextcloud/pubspec_overrides.yaml b/packages/nextcloud/pubspec_overrides.yaml index b3ed199c..ac5350aa 100644 --- a/packages/nextcloud/pubspec_overrides.yaml +++ b/packages/nextcloud/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: dynamite,dynamite_runtime,neon_lints +# melos_managed_dependency_overrides: dynamite,dynamite_runtime,neon_lints,nextcloud_test dependency_overrides: dynamite: path: ../dynamite/dynamite @@ -6,3 +6,5 @@ dependency_overrides: path: ../dynamite/dynamite_runtime neon_lints: path: ../neon_lints + nextcloud_test: + path: ../nextcloud_test diff --git a/packages/nextcloud/test/core_test.dart b/packages/nextcloud/test/core_test.dart index 9a688e7e..30de182c 100644 --- a/packages/nextcloud/test/core_test.dart +++ b/packages/nextcloud/test/core_test.dart @@ -1,9 +1,8 @@ import 'package:nextcloud/core.dart' as core; import 'package:nextcloud/nextcloud.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'core', @@ -11,8 +10,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient(container); + container = await DockerContainer.create(); + client = await TestNextcloudClient.create(container); }); tearDown(() => container.destroy()); diff --git a/packages/nextcloud/test/dashboard_test.dart b/packages/nextcloud/test/dashboard_test.dart index d6e15de9..fec46ecc 100644 --- a/packages/nextcloud/test/dashboard_test.dart +++ b/packages/nextcloud/test/dashboard_test.dart @@ -1,9 +1,8 @@ import 'package:nextcloud/dashboard.dart'; import 'package:nextcloud/nextcloud.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'dashboard', @@ -11,8 +10,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient(container); + container = await DockerContainer.create(); + client = await TestNextcloudClient.create(container); }); tearDown(() => container.destroy()); diff --git a/packages/nextcloud/test/helper.dart b/packages/nextcloud/test/helper.dart deleted file mode 100644 index 5b6dfce4..00000000 --- a/packages/nextcloud/test/helper.dart +++ /dev/null @@ -1,196 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:math'; - -import 'package:nextcloud/core.dart' as core; -import 'package:nextcloud/nextcloud.dart'; -import 'package:process_run/cmd_run.dart'; -import 'package:test/test.dart'; -import 'package:universal_io/io.dart'; - -const retryCount = 3; -const timeout = Timeout(Duration(seconds: 30)); - -class DockerContainer { - DockerContainer({ - required this.id, - required this.port, - }); - - final String id; - - final int port; - - Future runOccCommand(final List args) async { - final result = await runExecutableArguments( - 'docker', - [ - 'exec', - id, - 'php', - '-f', - 'occ', - ...args, - ], - stdout: stdout, - stderr: stderr, - ); - if (result.exitCode != 0) { - throw Exception('Failed to run occ command'); - } - } - - void destroy() => unawaited( - runExecutableArguments( - 'docker', - [ - 'kill', - id, - ], - ), - ); - - Future serverLogs() async => (await runExecutableArguments( - 'docker', - [ - 'logs', - id, - ], - stdoutEncoding: utf8, - )) - .stdout as String; - - Future nextcloudLogs() async => (await runExecutableArguments( - 'docker', - [ - 'exec', - id, - 'cat', - 'data/nextcloud.log', - ], - stdoutEncoding: utf8, - )) - .stdout as String; - - Future allLogs() async => '${await serverLogs()}\n\n${await nextcloudLogs()}'; -} - -Future getTestClient( - final DockerContainer container, { - final String? username = 'user1', - final AppType appType = AppType.unknown, - final String? userAgentOverride, -}) async { - String? appPassword; - if (username != null) { - final inputStream = StreamController>(); - final process = runExecutableArguments( - 'docker', - [ - 'exec', - '-i', - container.id, - 'php', - '-f', - 'occ', - 'user:add-app-password', - username, - ], - stdin: inputStream.stream, - ); - inputStream.add(utf8.encode(username)); - await inputStream.close(); - - final result = await process; - if (result.exitCode != 0) { - throw Exception('Failed to run generate app password command\n${result.stderr}\n${result.stdout}'); - } - appPassword = (result.stdout as String).split('\n')[1]; - } - - final client = NextcloudClient( - Uri( - scheme: 'http', - host: 'localhost', - port: container.port, - ), - loginName: username, - password: username, - appPassword: appPassword, - appType: appType, - userAgentOverride: userAgentOverride, - cookieJar: CookieJar(), - ); - - var i = 0; - while (true) { - try { - await client.core.getStatus(); - break; - } catch (error) { - if (error is HttpException || error is DynamiteApiException) { - i++; - await Future.delayed(const Duration(milliseconds: 100)); - if (i >= 300) { - throw TimeoutException('Failed to get the status of the Server. $error'); - } - } else { - rethrow; - } - } - } - - return client; -} - -Future getDockerContainer() async { - const dockerImageName = 'ghcr.io/nextcloud/neon/dev'; - - var result = await runExecutableArguments( - 'docker', - [ - 'images', - '-q', - dockerImageName, - ], - ); - if (result.exitCode != 0) { - throw Exception('Querying docker image failed: ${result.stderr}'); - } - if (result.stdout.toString().isEmpty) { - throw Exception('Missing docker image $dockerImageName. Please build it using ./tool/build-dev-container.sh'); - } - - late int port; - while (true) { - port = randomPort(); - result = await runExecutableArguments( - 'docker', - [ - 'run', - '--rm', - '-d', - '--add-host', - 'host.docker.internal:host-gateway', - '-p', - '$port:80', - dockerImageName, - ], - ); - // 125 means the docker run command itself has failed which indicated the port is already used - if (result.exitCode != 125) { - break; - } - } - - if (result.exitCode != 0) { - throw Exception('Failed to run docker container: ${result.stderr}'); - } - - return DockerContainer( - id: result.stdout.toString().replaceAll('\n', ''), - port: port, - ); -} - -int randomPort() => 1024 + Random().nextInt(65535 - 1024); diff --git a/packages/nextcloud/test/news_test.dart b/packages/nextcloud/test/news_test.dart index da054d6a..15a3755b 100644 --- a/packages/nextcloud/test/news_test.dart +++ b/packages/nextcloud/test/news_test.dart @@ -2,10 +2,9 @@ import 'dart:async'; import 'package:nextcloud/news.dart' as news; import 'package:nextcloud/nextcloud.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'news', @@ -13,8 +12,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient(container); + container = await DockerContainer.create(); + client = await TestNextcloudClient.create(container); }); tearDown(() => container.destroy()); diff --git a/packages/nextcloud/test/notes_test.dart b/packages/nextcloud/test/notes_test.dart index ad857e86..5d1488a7 100644 --- a/packages/nextcloud/test/notes_test.dart +++ b/packages/nextcloud/test/notes_test.dart @@ -1,10 +1,9 @@ import 'package:nextcloud/core.dart' as core; import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/notes.dart' as notes; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'notes', @@ -12,8 +11,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient(container); + container = await DockerContainer.create(); + client = await TestNextcloudClient.create(container); }); tearDown(() => container.destroy()); diff --git a/packages/nextcloud/test/notifications_test.dart b/packages/nextcloud/test/notifications_test.dart index 84ffb315..2fbe8740 100644 --- a/packages/nextcloud/test/notifications_test.dart +++ b/packages/nextcloud/test/notifications_test.dart @@ -2,17 +2,16 @@ import 'dart:async'; import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/notifications.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group('notifications', () { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient( + container = await DockerContainer.create(); + client = await TestNextcloudClient.create( container, username: 'admin', ); @@ -110,8 +109,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient( + container = await DockerContainer.create(); + client = await TestNextcloudClient.create( container, username: 'admin', ); diff --git a/packages/nextcloud/test/provisioning_api_test.dart b/packages/nextcloud/test/provisioning_api_test.dart index 7509957e..41d60519 100644 --- a/packages/nextcloud/test/provisioning_api_test.dart +++ b/packages/nextcloud/test/provisioning_api_test.dart @@ -1,9 +1,8 @@ import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/provisioning_api.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'provisioning_api', @@ -11,8 +10,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient( + container = await DockerContainer.create(); + client = await TestNextcloudClient.create( container, username: 'admin', ); diff --git a/packages/nextcloud/test/settings_test.dart b/packages/nextcloud/test/settings_test.dart index 473610b7..bb1fc9b0 100644 --- a/packages/nextcloud/test/settings_test.dart +++ b/packages/nextcloud/test/settings_test.dart @@ -2,10 +2,9 @@ import 'dart:convert'; import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/settings.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'settings', @@ -13,8 +12,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient( + container = await DockerContainer.create(); + client = await TestNextcloudClient.create( container, username: 'admin', ); diff --git a/packages/nextcloud/test/spreed_test.dart b/packages/nextcloud/test/spreed_test.dart index 3000ee93..f6d6e347 100644 --- a/packages/nextcloud/test/spreed_test.dart +++ b/packages/nextcloud/test/spreed_test.dart @@ -5,10 +5,9 @@ import 'package:built_value/json_object.dart'; import 'package:nextcloud/core.dart' as core; import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/spreed.dart' as spreed; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'spreed', @@ -16,8 +15,8 @@ void main() { late DockerContainer container; late NextcloudClient client1; setUp(() async { - container = await getDockerContainer(); - client1 = await getTestClient(container); + container = await DockerContainer.create(); + client1 = await TestNextcloudClient.create(container); }); tearDown(() => container.destroy()); @@ -360,7 +359,7 @@ void main() { final room1 = (await client1.spreed.room.joinRoom(token: room.token)).body.ocs.data; await client1.spreed.call.joinCall(token: room.token); - final client2 = await getTestClient( + final client2 = await TestNextcloudClient.create( container, username: 'user2', ); diff --git a/packages/nextcloud/test/uppush_test.dart b/packages/nextcloud/test/uppush_test.dart index b48dcc5c..a611cd48 100644 --- a/packages/nextcloud/test/uppush_test.dart +++ b/packages/nextcloud/test/uppush_test.dart @@ -1,9 +1,8 @@ import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/uppush.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'uppush', @@ -11,8 +10,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient( + container = await DockerContainer.create(); + client = await TestNextcloudClient.create( container, username: 'admin', ); diff --git a/packages/nextcloud/test/user_status_test.dart b/packages/nextcloud/test/user_status_test.dart index 395665e0..21cce042 100644 --- a/packages/nextcloud/test/user_status_test.dart +++ b/packages/nextcloud/test/user_status_test.dart @@ -1,9 +1,8 @@ import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/user_status.dart' as user_status; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; -import 'helper.dart'; - void main() { group( 'user_status', @@ -11,8 +10,8 @@ void main() { late DockerContainer container; late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient(container); + container = await DockerContainer.create(); + client = await TestNextcloudClient.create(container); }); tearDown(() => container.destroy()); diff --git a/packages/nextcloud/test/webdav_test.dart b/packages/nextcloud/test/webdav_test.dart index a7c9781e..fbbf1f06 100644 --- a/packages/nextcloud/test/webdav_test.dart +++ b/packages/nextcloud/test/webdav_test.dart @@ -3,11 +3,10 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:nextcloud/nextcloud.dart'; +import 'package:nextcloud_test/nextcloud_test.dart'; import 'package:test/test.dart'; import 'package:universal_io/io.dart'; -import 'helper.dart'; - void main() { group('constructUri', () { for (final values in [ @@ -142,8 +141,8 @@ void main() { late NextcloudClient client; setUp(() async { - container = await getDockerContainer(); - client = await getTestClient(container); + container = await DockerContainer.create(); + client = await TestNextcloudClient.create(container); }); tearDown(() => container.destroy());