onFakeRequest method

FutureOr<FakeHttpResponse> onFakeRequest(
  1. dynamic request,
  2. dynamic client
)

Implementation

FutureOr<FakeHttpResponse> onFakeRequest(request, client) async {
  final requestPath = request.uri.toString();
  final requestHeaders = _extractHeaders(request);
  final requestBody = await _parseRequestBody(request);
  final requestMethod = HttpMethod.fromString(request.method);

  debugPrint('📤 Request: ${request.method} $requestPath');

  // Store request for verification
  _requests.add(RequestVerification(
    method: requestMethod,
    path: requestPath,
    body: requestBody,
    headers: requestHeaders,
  ));

  try {
    // Check queued responses first (priority)
    final queuedKey = _findMatchingKey(requestPath, _queuedResponses, requestMethod);
    if (queuedKey.isNotEmpty && _queuedResponses[queuedKey]!.isNotEmpty) {
      final queuedResponse = _queuedResponses[queuedKey]!.removeAt(0);
      if (_queuedResponses[queuedKey]!.isEmpty) {
        _queuedResponses.remove(queuedKey);
      }

      debugPrint('📥 Response found (queued): ${queuedResponse.statusCode}');

      // Apply delay if specified
      if (queuedResponse.delay != null) {
        debugPrint('⏳ Delaying response by ${queuedResponse.delay}');
        await Future.delayed(queuedResponse.delay!);
      }

      return FakeHttpResponse(
        statusCode: queuedResponse.statusCode,
        body: jsonEncode(queuedResponse.body),
        headers: {
          'Content-Type': 'application/json',
          if (queuedResponse.headers != null)
            ...Map<String, String>.from(queuedResponse.headers!),
        },
      );
    }

    // Check permanent responses
    final permanentKey = _findMatchingKey(requestPath, _permanentResponses, requestMethod);
    if (permanentKey.isNotEmpty) {
      final permanentResponse = _permanentResponses[permanentKey]!;

      debugPrint('📥 Response found (permanent): ${permanentResponse.statusCode}');

      // Apply delay if specified
      if (permanentResponse.delay != null) {
        debugPrint('⏳ Delaying response by ${permanentResponse.delay}');
        await Future.delayed(permanentResponse.delay!);
      }

      return FakeHttpResponse(
        statusCode: permanentResponse.statusCode,
        body: jsonEncode(permanentResponse.body),
        headers: {
          'Content-Type': 'application/json',
          if (permanentResponse.headers != null)
            ...Map<String, String>.from(permanentResponse.headers!),
        },
      );
    }

    // No mock found
    debugPrint('❌ Mock not found: ${request.method} $requestPath');

    return FakeHttpResponse(
      statusCode: HttpStatus.notFound,
      body: jsonEncode({
        'message': 'Mock response not found for $requestPath',
      }),
      headers: {
        'Content-Type': 'application/json',
      },
    );
  } catch (e) {
    debugPrint('🔴 Error processing request: $e');
    rethrow;
  }
}