execute static method

Future<void> execute(
  1. Map<String, dynamic> args
)

Implementation

static Future<void> execute(Map<String, dynamic> args) async {
  final rawUrl = args['url']?.toString();
  if (rawUrl == null || rawUrl.isEmpty) {
    throw EnsembleTestFailure('httpRequest requires "url"');
  }
  final uri = Uri.tryParse(rawUrl);
  if (uri == null || !uri.hasScheme || !uri.hasAuthority) {
    throw EnsembleTestFailure('httpRequest has an invalid URL: $rawUrl');
  }

  final method = args['method']?.toString().toUpperCase() ?? 'GET';
  final headers = _headers(args['headers']);
  final request = http.Request(method, uri)..headers.addAll(headers);
  if (args.containsKey('body')) {
    final body = args['body'];
    if (body is String) {
      request.body = body;
    } else {
      if (!_hasContentType(request.headers)) {
        request.headers['content-type'] = 'application/json';
      }
      request.body = jsonEncode(body);
    }
  }

  final timeoutMs = _positiveInt(args['timeoutMs'], fallback: 10000);
  final client = http.Client();
  try {
    final response = await LiveAsyncCallSupport.run<http.Response>(() async {
      final streamed = await client
          .send(request)
          .timeout(Duration(milliseconds: timeoutMs));
      return http.Response.fromStream(streamed);
    });
    if (response == null) {
      throw EnsembleTestFailure('httpRequest did not return a response');
    }

    final expectedStatus = args['expectStatus'];
    if (expectedStatus != null) {
      final expected = _positiveInt(expectedStatus);
      if (response.statusCode != expected) {
        throw EnsembleTestFailure(
          'httpRequest $method $rawUrl expected status $expected, got '
          '${response.statusCode}: ${response.body}',
        );
      }
    } else if (response.statusCode < 200 || response.statusCode >= 300) {
      throw EnsembleTestFailure(
        'httpRequest $method $rawUrl failed with status '
        '${response.statusCode}: ${response.body}',
      );
    }

    final expectedBody = args['expectBodyContains']?.toString();
    if (expectedBody != null && !response.body.contains(expectedBody)) {
      throw EnsembleTestFailure(
        'httpRequest $method $rawUrl response did not contain '
        '"$expectedBody": ${response.body}',
      );
    }
  } on EnsembleTestFailure {
    rethrow;
  } catch (error) {
    throw EnsembleTestFailure('httpRequest $method $rawUrl failed: $error');
  } finally {
    client.close();
  }
}