Skip to content

Commit

Permalink
Moved AppProvisioning from base package to subpackages
Browse files Browse the repository at this point in the history
  • Loading branch information
ikurek committed Mar 8, 2022
1 parent 1f689d6 commit 9dc9664
Show file tree
Hide file tree
Showing 27 changed files with 158 additions and 4 deletions.
133 changes: 133 additions & 0 deletions example/lib/app_provisioning.dart
Original file line number Diff line number Diff line change
@@ -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<String, List<dynamic>> 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<String, List<dynamic>> 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<String, String> 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<String, List<dynamic>> 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<String> 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<String, dynamic>;

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<Map<String, dynamic>> 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<dynamic, dynamic, String, dynamic>(
jsonDecode(response.body) as Map,
);
}
}
2 changes: 1 addition & 1 deletion example/lib/ui/api_key_service.dart
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion lib/src/authentication/authentication.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export 'src/app_provisioning.dart';
export 'src/auth.dart';
export 'src/auth_options.dart';
export 'src/client_options.dart';
Expand Down
1 change: 0 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ dependencies:
collection: ^1.15.0
flutter:
sdk: flutter
http: ^0.13.4
meta: ^1.3.0

dev_dependencies:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/basic_test.dart
Original file line number Diff line number Diff line change
@@ -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<Map<String, dynamic>> testAppKeyProvision({
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/realtime/realtime_subscribe.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/realtime/realtime_time_test.dart
Original file line number Diff line number Diff line change
@@ -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<Map<String, dynamic>> testRealtimeTime({
Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/rest/rest_capability_test.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/rest/rest_history_test.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/rest/rest_presence_get_test.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/rest/rest_publish_test.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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';

Expand Down
1 change: 1 addition & 0 deletions test_integration/lib/test/rest/rest_time_test.dart
Original file line number Diff line number Diff line change
@@ -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<Map<String, dynamic>> testRestTime({
Expand Down
1 change: 1 addition & 0 deletions test_integration/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies:

args: ^2.0.0
enum_to_string: ^2.0.1
http: ^0.13.4

dev_dependencies:
flutter_driver:
Expand Down

0 comments on commit 9dc9664

Please sign in to comment.