processFile static method

Future<void> processFile(
  1. File file, {
  2. String? workingDirectoryPath,
  3. int? limitMessageCharsPerLine,
  4. DangerDartTestReporter? reporter,
})

Reporter could be DefaultTestReporter, DefaultInlineTestReporter, BitbucketCloudTestReporter, or any class extends DangerDartTestReporter

Implementation

static Future<void> processFile(File file,
    {String? workingDirectoryPath,
    int? limitMessageCharsPerLine,
    DangerDartTestReporter? reporter}) async {
  if (!file.existsSync()) {
    fail('Test report not found, path [${file.path}]');
    return;
  }

  final workingPath = workingDirectoryPath ?? current;

  final line = file.readAsLinesSync();
  final results = line
      .map((e) => DartTestEvent.fromJsonString(e))
      .whereType<DartTestEvent>();

  final testSuiteMetaDataByID = <int, DartTestEntitySuite>{};
  final testMetaDataByID = <int, DartTestEntityTest>{};
  final printMessageByID = <int, List<String>>{};

  void addMessageToPrintMessage(String message, int testId) {
    if (message.isEmpty) {
      return;
    }

    String msg;
    if (limitMessageCharsPerLine == null) {
      msg = message;
    } else if (message.length > limitMessageCharsPerLine) {
      msg = message.substring(0, limitMessageCharsPerLine) + '...';
    } else {
      msg = message;
    }

    if (printMessageByID[testId] == null) {
      printMessageByID[testId] = [msg];
    } else {
      printMessageByID[testId]!.add(msg);
    }
  }

  for (var result in results) {
    if (result is DartTestTestStartEvent) {
      testMetaDataByID[result.test.id] = result.test;
    } else if (result is DartTestSuiteEvent) {
      testSuiteMetaDataByID[result.suite.id] = result.suite;
    } else if (result is DartTestMessageEvent) {
      if (result.messageType == 'print') {
        addMessageToPrintMessage(result.message, result.testID);
      }
    } else if (result is DartTestErrorEvent) {
      addMessageToPrintMessage(result.error, result.testID);
      addMessageToPrintMessage(result.stackTrace, result.testID);
    }
  }

  // EnumValues({"error": Result.ERROR, "failure": Result.FAILURE, "success": Result.SUCCESS});

  final failureList = results
      .whereType<DartTestTestDoneEvent>()
      .where((result) => (result.result != 'success'))
      .map((result) {
        final testMetaData = testMetaDataByID[result.testID];
        final printMessage = printMessageByID[result.testID] ?? [];

        String? fileName;
        int? lineNo;
        String? testName;

        if (testMetaData != null) {
          final url = testMetaData.url;
          if (url != null && !url.startsWith('package:')) {
            fileName = url;
            lineNo = testMetaData.line ?? 0;
          } else if (testMetaData.rootUrl != null) {
            fileName = testMetaData.rootUrl!;
            lineNo = testMetaData.rootLine ?? 0;
          } else {
            final suiteMetaData = testSuiteMetaDataByID[testMetaData.suiteID];
            if (suiteMetaData != null && suiteMetaData.path != null) {
              fileName = suiteMetaData.path!;
              lineNo = 0;
            }
          }

          if (fileName != null) {
            fileName = fileName.replaceFirst('file://', '');

            if (fileName.startsWith(workingPath)) {
              fileName = fileName.substring(workingPath.length + 1);
            }
          }

          testName = testMetaData.name;
        }

        if (fileName == null || lineNo == null || testName == null) {
          return null;
        }

        return DangerDartErrorCase(
          fileName: fileName,
          lineNo: lineNo,
          message: printMessage.join('\n\n'),
          testName: testName,
        );
      })
      .whereType<DangerDartErrorCase>()
      .toList();

  if (failureList.isNotEmpty) {
    (reporter ?? DefaultTestReporter()).reportToDanger(failureList);
  }
}