writeApiCallsLogFile function

Future<String> writeApiCallsLogFile({
  1. required TestLogger logger,
  2. required String filePrefix,
  3. required List<APICallRecord> calls,
})

Implementation

Future<String> writeApiCallsLogFile({
  required TestLogger logger,
  required String filePrefix,
  required List<APICallRecord> calls,
}) {
  final callsByName = <String, List<DateTime>>{};
  for (final call in calls) {
    callsByName.putIfAbsent(call.name, () => <DateTime>[]).add(call.timestamp);
  }
  final content = const JsonEncoder.withIndent('  ').convert(
    _toSerializable({
      'total': calls.length,
      'calls': callsByName.entries
          .map(
            (entry) => {
              'name': entry.key,
              'count': entry.value.length,
              'timestamps': [
                for (final timestamp in entry.value)
                  timestamp.toIso8601String(),
              ],
            },
          )
          .toList(),
      'events': [
        for (var i = 0; i < calls.length; i++)
          {
            'index': i + 1,
            'name': calls[i].name,
            'timestamp': calls[i].timestamp.toIso8601String(),
            if (calls[i].stepIndex != null) 'stepIndex': calls[i].stepIndex,
            if (calls[i].mocked != null) 'mocked': calls[i].mocked,
            if (calls[i].statusCode != null) 'statusCode': calls[i].statusCode,
            if (calls[i].error != null) 'error': calls[i].error,
            if (calls[i].responseBody != null)
              'responseBody': _loggableResponseBody(calls[i].responseBody),
            if (calls[i].type != null) 'type': calls[i].type,
            'request': {
              'url': (calls[i].resolvedUrl?.isNotEmpty == true)
                  ? calls[i].resolvedUrl!
                  : (calls[i].type == 'firestore'
                      ? ((calls[i].apiDefinition['path'] ??
                                  calls[i].apiDefinition['firestore']?['path'])
                              ?.toString() ??
                          '')
                      : (calls[i].type == 'functions'
                          ? ((calls[i].apiDefinition['name'] ??
                                      calls[i].apiDefinition['function']
                                          ?['name'])
                                  ?.toString() ??
                              '')
                          : (calls[i].apiDefinition['url'] ??
                                      calls[i].apiDefinition['uri'])
                                  ?.toString() ??
                              '')),
              'method': calls[i].type == 'firestore'
                  ? ((calls[i].apiDefinition['operation'] ??
                              calls[i].apiDefinition['firestore']?['operation'])
                          ?.toString()
                          .toUpperCase() ??
                      'GET')
                  : (calls[i].type == 'functions'
                      ? 'CALL'
                      : (calls[i].apiDefinition['method']?.toString() ??
                          'GET')),
              if (calls[i].resolvedHeaders != null ||
                  calls[i].apiDefinition['headers'] != null ||
                  calls[i].apiDefinition['firestore']?['headers'] != null ||
                  calls[i].apiDefinition['function']?['headers'] != null)
                'headers': calls[i].resolvedHeaders ??
                    calls[i].apiDefinition['headers'] ??
                    calls[i].apiDefinition['firestore']?['headers'] ??
                    calls[i].apiDefinition['function']?['headers'],
              if (calls[i].resolvedBody != null ||
                  calls[i].apiDefinition['body'] != null ||
                  calls[i].apiDefinition['data'] != null ||
                  calls[i].apiDefinition['firestore']?['body'] != null ||
                  calls[i].apiDefinition['firestore']?['data'] != null ||
                  calls[i].apiDefinition['function']?['body'] != null ||
                  calls[i].apiDefinition['function']?['data'] != null)
                'body': calls[i].resolvedBody ??
                    calls[i].apiDefinition['body'] ??
                    calls[i].apiDefinition['data'] ??
                    calls[i].apiDefinition['firestore']?['body'] ??
                    calls[i].apiDefinition['firestore']?['data'] ??
                    calls[i].apiDefinition['function']?['body'] ??
                    calls[i].apiDefinition['function']?['data'],
              if (calls[i].resolvedParameters != null ||
                  calls[i].apiDefinition['parameters'] != null ||
                  calls[i].apiDefinition['query'] != null ||
                  calls[i].apiDefinition['firestore']?['parameters'] != null ||
                  calls[i].apiDefinition['firestore']?['query'] != null ||
                  calls[i].apiDefinition['function']?['parameters'] != null ||
                  calls[i].apiDefinition['function']?['query'] != null)
                'parameters': calls[i].resolvedParameters ??
                    calls[i].apiDefinition['parameters'] ??
                    calls[i].apiDefinition['query'] ??
                    calls[i].apiDefinition['firestore']?['parameters'] ??
                    calls[i].apiDefinition['firestore']?['query'] ??
                    calls[i].apiDefinition['function']?['parameters'] ??
                    calls[i].apiDefinition['function']?['query'],
            },
          },
      ],
    }),
  );

  return logger.writeLogFile(
    testId: filePrefix,
    name: 'api_calls',
    content: content,
    extension: 'json',
  );
}