async update()

in src/pr/TestReportRenderer.js [200:297]


  async update() {
    // Download the test report
    let buf = await fetch(this.props.testReportZip).then((r) =>
      r.arrayBuffer()
    );
    let reports = {};

    const file = new Uint8Array(buf);
    let inner = unzipSync(file);
    for (const innerFilename in inner) {
      let key = innerFilename
        .replace("test/test-reports/", "")
        .replace(".xml", "");
      reports[key] = parseXml(strFromU8(inner[innerFilename]));
    }

    let suites = [];
    for (const filename in reports) {
      let data = reports[filename];
      if (data.testsuite) {
        suites.push(data.testsuite);
      } else if (data.testsuites) {
        if (Array.isArray(data.testsuites.testsuite)) {
          for (const suite of data.testsuites.testsuite) {
            suites.push(suite);
          }
        } else if (data.testsuites.testsuite) {
          suites.push(data.testsuites.testsuite);
        }
      } else {
        console.error("Unknown report type", data);
      }
    }

    let failures = [];
    let testInfo = {};
    const totals = {
      classes: 0,
      cases: 0,
      files: 0,
      time: 0,
    };
    for (const suite of suites) {
      let numErrors = +suite.errors;
      let numFailures = +suite.failures;
      let cases = suite.testcase;
      if (!Array.isArray(cases)) {
        cases = [cases];
      }
      if (numErrors + numFailures > 0) {
        for (const testcase of cases) {
          if (testcase.failure || testcase.error) {
            failures.push(testcase);
          }
        }
      }

      const getStatus = (testcase) => {
        if (testcase.skipped) {
          return "skipped";
        }
        if (testcase.error || testcase.failure) {
          return "error";
        }
        return "passed";
      };
      for (const testcase of cases) {
        totals.cases += 1;
        if (!testInfo[testcase.file]) {
          testInfo[testcase.file] = {};
          totals.files += 1;
        }
        if (!testInfo[testcase.file][testcase.classname]) {
          totals.classes += 1;
          testInfo[testcase.file][testcase.classname] = {
            passed: 0,
            error: 0,
            skipped: 0,
            time: 0,
            cases: 0,
          };
        }
        totals.time += +testcase.time;
        testInfo[testcase.file][testcase.classname][getStatus(testcase)] += 1;
        testInfo[testcase.file][testcase.classname].cases += 1;
        testInfo[testcase.file][testcase.classname].time += +testcase.time;
      }
    }
    if (this.props.onLoaded) {
      this.props.onLoaded(failures, totals, testInfo);
    }

    this.setState({
      failures: failures,
      totals: totals,
      testInfo: testInfo,
    });
  }