diff --git a/example/lib/app_provisioning.dart b/example/lib/app_provisioning.dart new file mode 100644 index 000000000..87f035128 --- /dev/null +++ b/example/lib/app_provisioning.dart @@ -0,0 +1,133 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:ably_flutter/ably_flutter.dart'; +import 'package:http/http.dart' as http; +import 'package:http/retry.dart'; + +/// Used to provision the app with Ably sandbox environment +/// A copy of this class is also present in test_integration package, to avoid +/// putting it in the base ably_flutter package +class AppProvisioning { + /// Prefix of REST environment used to provision the app. For example, + /// with prefix `sandbox-` URL `sandbox-rest.ably.io` will be used + /// + /// Defaults to [defaultEnvironmentPrefix] + String environmentPrefix; + + /// List of capabilities for the provisioned key + /// + /// Defaults to [defaultKeyCapabilities] + Map> keyCapabilities; + + /// Determines whether the provisioned key will have push capabilities + /// + /// Defaults to true + bool pushEnabled; + + /// Creates instance of [AppProvisioning] + AppProvisioning({ + this.environmentPrefix = defaultEnvironmentPrefix, + this.keyCapabilities = defaultKeyCapabilities, + this.pushEnabled = true, + }); + + /// Default prefix for REST provisioning url + static const String defaultEnvironmentPrefix = 'sandbox-'; + + /// Default list of key capabilities + /// Enables all capabilities on all channels + static const Map> defaultKeyCapabilities = { + '*': [ + 'publish', + 'subscribe', + 'history', + 'presence', + 'push-subscribe', + 'push-admin', + ], + }; + + /// Internal HTTP client used to make provisioning API requests + final http.Client _httpRetryClient = RetryClient( + http.Client(), + retries: 5, + delay: (retryCount) => const Duration(seconds: 2), + ); + + /// URL used for app provisioning requests + String get _provisioningUrl => + 'https://${environmentPrefix}rest.ably.io/apps'; + + /// URL used for getting token request + String get _tokenRequestAuthUrl => + 'https://www.ably.io/ably-auth/token-request/demos'; + + /// A set of base headers for HTTP requests + Map get _requestHeaders => { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }; + + /// App spec used to provision the app + /// + /// See: https://docs.ably.com/client-lib-development-guide/test-api + Map> get _appSpec => { + 'namespaces': [ + { + 'id': 'pushenabled', + 'pushEnabled': pushEnabled, + } + ], + 'keys': [ + { + // The need to use jsonEncode here is a requirement of the + // Sandbox Test API. The capability map has to be JSON encoded + // as a string and then appropriately escaped in order for + // presentation within a string value. + 'capability': jsonEncode(keyCapabilities), + }, + ], + }; + + /// Makes request to configured Ably provisioning URL and returns a + /// new key for test application instance + Future provisionApp() async { + final response = await _httpRetryClient.post( + Uri.parse(_provisioningUrl), + body: jsonEncode(_appSpec), + headers: _requestHeaders, + ); + + if (response.statusCode != HttpStatus.created) { + log("Server didn't return success. ${response.body}"); + throw HttpException("Server didn't return success." + ' Status: ${response.statusCode} : ${response.body}'); + } + + final responseBody = jsonDecode(response.body) as Map; + + return responseBody['keys'][0]['keyStr'] as String; + } + + /// Returns a demo token request that can be used to retrieve token + /// Result of this method can be used directly to create [TokenRequest] + /// with [TokenRequest.fromMap(map)] method + /// + Future> getTokenRequest() async { + final response = await _httpRetryClient.get( + Uri.parse(_tokenRequestAuthUrl), + ); + + if (response.statusCode != HttpStatus.ok) { + log("Server didn't return success. ${response.body}"); + throw HttpException("Server didn't return success." + ' Status: ${response.statusCode} : ${response.body}'); + } + + return Map.castFrom( + jsonDecode(response.body) as Map, + ); + } +} diff --git a/example/lib/ui/api_key_service.dart b/example/lib/ui/api_key_service.dart index 60652a97f..02e6edcba 100644 --- a/example/lib/ui/api_key_service.dart +++ b/example/lib/ui/api_key_service.dart @@ -1,4 +1,4 @@ -import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_example/app_provisioning.dart'; import 'package:ably_flutter_example/constants.dart'; class ApiKeyService { diff --git a/example/pubspec.yaml b/example/pubspec.yaml index ff1365d42..675cc99b7 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -9,7 +9,7 @@ dependencies: flutter: sdk: flutter - http: ^0.13.3 + http: ^0.13.4 retry: ^3.1.0 rxdart: ^0.27.1 async: ^2.6.1 diff --git a/lib/src/authentication/authentication.dart b/lib/src/authentication/authentication.dart index bf64b58e6..9ac17fd98 100644 --- a/lib/src/authentication/authentication.dart +++ b/lib/src/authentication/authentication.dart @@ -1,4 +1,3 @@ -export 'src/app_provisioning.dart'; export 'src/auth.dart'; export 'src/auth_options.dart'; export 'src/client_options.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index b6cc503a0..fe42b09e1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,6 @@ dependencies: collection: ^1.15.0 flutter: sdk: flutter - http: ^0.13.4 meta: ^1.3.0 dev_dependencies: diff --git a/lib/src/authentication/src/app_provisioning.dart b/test_integration/lib/app_provisioning.dart similarity index 97% rename from lib/src/authentication/src/app_provisioning.dart rename to test_integration/lib/app_provisioning.dart index 1cdd6a48e..638e0311b 100644 --- a/lib/src/authentication/src/app_provisioning.dart +++ b/test_integration/lib/app_provisioning.dart @@ -7,6 +7,8 @@ import 'package:http/http.dart' as http; import 'package:http/retry.dart'; /// Used to provision the app with Ably sandbox environment +/// A copy of this class is also present in example app, to avoid putting +/// it in the base ably_flutter package class AppProvisioning { /// Prefix of REST environment used to provision the app. For example, /// with prefix `sandbox-` URL `sandbox-rest.ably.io` will be used diff --git a/test_integration/lib/test/basic_test.dart b/test_integration/lib/test/basic_test.dart index 2185fbe46..e34593744 100644 --- a/test_integration/lib/test/basic_test.dart +++ b/test_integration/lib/test/basic_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; Future> testAppKeyProvision({ diff --git a/test_integration/lib/test/realtime/realtime_encrypted_publish_test.dart b/test_integration/lib/test/realtime/realtime_encrypted_publish_test.dart index 61be7d0f8..48595dad3 100644 --- a/test_integration/lib/test/realtime/realtime_encrypted_publish_test.dart +++ b/test_integration/lib/test/realtime/realtime_encrypted_publish_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/realtime.dart'; diff --git a/test_integration/lib/test/realtime/realtime_events_test.dart b/test_integration/lib/test/realtime/realtime_events_test.dart index aa54f8bfa..70df590af 100644 --- a/test_integration/lib/test/realtime/realtime_events_test.dart +++ b/test_integration/lib/test/realtime/realtime_events_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/encoders.dart'; diff --git a/test_integration/lib/test/realtime/realtime_history_test.dart b/test_integration/lib/test/realtime/realtime_history_test.dart index 9cfabe53c..380077182 100644 --- a/test_integration/lib/test/realtime/realtime_history_test.dart +++ b/test_integration/lib/test/realtime/realtime_history_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/encoders.dart'; diff --git a/test_integration/lib/test/realtime/realtime_presence_enter_update_leave.dart b/test_integration/lib/test/realtime/realtime_presence_enter_update_leave.dart index dcff39470..e042ae695 100644 --- a/test_integration/lib/test/realtime/realtime_presence_enter_update_leave.dart +++ b/test_integration/lib/test/realtime/realtime_presence_enter_update_leave.dart @@ -1,5 +1,6 @@ // ignore_for_file: avoid_catching_errors import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/realtime/realtime_presence_get.dart b/test_integration/lib/test/realtime/realtime_presence_get.dart index 5fd32a5b6..e9c0888be 100644 --- a/test_integration/lib/test/realtime/realtime_presence_get.dart +++ b/test_integration/lib/test/realtime/realtime_presence_get.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/realtime/realtime_presence_history_test.dart b/test_integration/lib/test/realtime/realtime_presence_history_test.dart index e3f3bb2c2..9e5c2cbf2 100644 --- a/test_integration/lib/test/realtime/realtime_presence_history_test.dart +++ b/test_integration/lib/test/realtime/realtime_presence_history_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/realtime/realtime_presence_subscribe.dart b/test_integration/lib/test/realtime/realtime_presence_subscribe.dart index 4c85355f0..36b28264a 100644 --- a/test_integration/lib/test/realtime/realtime_presence_subscribe.dart +++ b/test_integration/lib/test/realtime/realtime_presence_subscribe.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/realtime/realtime_publish_test.dart b/test_integration/lib/test/realtime/realtime_publish_test.dart index 0fe436822..dbbb2b9de 100644 --- a/test_integration/lib/test/realtime/realtime_publish_test.dart +++ b/test_integration/lib/test/realtime/realtime_publish_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/realtime.dart'; diff --git a/test_integration/lib/test/realtime/realtime_publish_with_auth_callback_test.dart b/test_integration/lib/test/realtime/realtime_publish_with_auth_callback_test.dart index 1db9d5095..73992e47b 100644 --- a/test_integration/lib/test/realtime/realtime_publish_with_auth_callback_test.dart +++ b/test_integration/lib/test/realtime/realtime_publish_with_auth_callback_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/realtime.dart'; diff --git a/test_integration/lib/test/realtime/realtime_subscribe.dart b/test_integration/lib/test/realtime/realtime_subscribe.dart index f4638f255..9cb53d61e 100644 --- a/test_integration/lib/test/realtime/realtime_subscribe.dart +++ b/test_integration/lib/test/realtime/realtime_subscribe.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; import 'package:ably_flutter_integration_test/utils/encoders.dart'; diff --git a/test_integration/lib/test/realtime/realtime_time_test.dart b/test_integration/lib/test/realtime/realtime_time_test.dart index fa55bafae..f1889c6f1 100644 --- a/test_integration/lib/test/realtime/realtime_time_test.dart +++ b/test_integration/lib/test/realtime/realtime_time_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; Future> testRealtimeTime({ diff --git a/test_integration/lib/test/rest/rest_capability_test.dart b/test_integration/lib/test/rest/rest_capability_test.dart index bef9d44dc..caaea86bf 100644 --- a/test_integration/lib/test/rest/rest_capability_test.dart +++ b/test_integration/lib/test/rest/rest_capability_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; import 'package:ably_flutter_integration_test/utils/encoders.dart'; diff --git a/test_integration/lib/test/rest/rest_encrypted_publish_test.dart b/test_integration/lib/test/rest/rest_encrypted_publish_test.dart index 685574c7c..c5e93dffb 100644 --- a/test_integration/lib/test/rest/rest_encrypted_publish_test.dart +++ b/test_integration/lib/test/rest/rest_encrypted_publish_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/rest/rest_history_test.dart b/test_integration/lib/test/rest/rest_history_test.dart index 1ff2a286c..c2bdf29b2 100644 --- a/test_integration/lib/test/rest/rest_history_test.dart +++ b/test_integration/lib/test/rest/rest_history_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/encoders.dart'; diff --git a/test_integration/lib/test/rest/rest_presence_get_test.dart b/test_integration/lib/test/rest/rest_presence_get_test.dart index 0c378458e..801a00df0 100644 --- a/test_integration/lib/test/rest/rest_presence_get_test.dart +++ b/test_integration/lib/test/rest/rest_presence_get_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/rest/rest_presence_history_test.dart b/test_integration/lib/test/rest/rest_presence_history_test.dart index 6de404ac6..1538009ec 100644 --- a/test_integration/lib/test/rest/rest_presence_history_test.dart +++ b/test_integration/lib/test/rest/rest_presence_history_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/rest/rest_publish_test.dart b/test_integration/lib/test/rest/rest_publish_test.dart index ac47b33a4..28f585e5f 100644 --- a/test_integration/lib/test/rest/rest_publish_test.dart +++ b/test_integration/lib/test/rest/rest_publish_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/config/test_constants.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/data.dart'; diff --git a/test_integration/lib/test/rest/rest_publish_with_auth_callback_test.dart b/test_integration/lib/test/rest/rest_publish_with_auth_callback_test.dart index 673de7e12..0bd65dcae 100644 --- a/test_integration/lib/test/rest/rest_publish_with_auth_callback_test.dart +++ b/test_integration/lib/test/rest/rest_publish_with_auth_callback_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; import 'package:ably_flutter_integration_test/utils/rest.dart'; diff --git a/test_integration/lib/test/rest/rest_time_test.dart b/test_integration/lib/test/rest/rest_time_test.dart index 77e64d893..6c939c0bf 100644 --- a/test_integration/lib/test/rest/rest_time_test.dart +++ b/test_integration/lib/test/rest/rest_time_test.dart @@ -1,4 +1,5 @@ import 'package:ably_flutter/ably_flutter.dart'; +import 'package:ably_flutter_integration_test/app_provisioning.dart'; import 'package:ably_flutter_integration_test/factory/reporter.dart'; Future> testRestTime({ diff --git a/test_integration/pubspec.yaml b/test_integration/pubspec.yaml index 3ddad5012..6f6d75509 100644 --- a/test_integration/pubspec.yaml +++ b/test_integration/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: args: ^2.0.0 enum_to_string: ^2.0.1 + http: ^0.13.4 dev_dependencies: flutter_driver: