// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. // CI util unit tests: run with `node --test detox/utils/maestro_report.test.js`. const assert = require('node:assert/strict'); const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); const {afterEach, beforeEach, describe, it} = require('node:test'); const {writeMaestroJestJsonForTsio} = require('./maestro_report'); describe('writeMaestroJestJsonForTsio', () => { let tmpDir; beforeEach(() => { tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'maestro-jest-tsio-')); }); afterEach(() => { fs.rmSync(tmpDir, {recursive: true, force: true}); }); function writeXml(contents) { const xmlPath = path.join(tmpDir, 'maestro-report.xml'); fs.writeFileSync(xmlPath, contents); return xmlPath; } it('returns false without writing when input is missing or empty', () => { const missingOut = path.join(tmpDir, 'missing.json'); assert.equal(writeMaestroJestJsonForTsio(path.join(tmpDir, 'nope.xml'), missingOut), false); assert.equal(fs.existsSync(missingOut), false); const emptyXml = writeXml(` `); const emptyOut = path.join(tmpDir, 'empty.json'); assert.equal(writeMaestroJestJsonForTsio(emptyXml, emptyOut), false); assert.equal(fs.existsSync(emptyOut), false); }); it('maps Maestro passed/skipped/failed to Jest passed/pending/failed', () => { const xmlPath = writeXml(` boom `); const outPath = path.join(tmpDir, 'out.json'); assert.equal(writeMaestroJestJsonForTsio(xmlPath, outPath), true); const payload = JSON.parse(fs.readFileSync(outPath, 'utf8')); const byTitle = Object.fromEntries( payload.testResults.flatMap((suite) => suite.assertionResults.map((ar) => [ar.title, ar.status])), ); assert.deepEqual(byTitle, { login: 'passed', skip_me: 'pending', broken: 'failed', }); assert.equal(payload.numPassedTests, 1); assert.equal(payload.numPendingTests, 1); assert.equal(payload.numFailedTests, 1); assert.equal(payload.numTotalTests, 3); assert.equal(payload.success, false); assert.ok(payload.snapshot); assert.equal(payload.snapshot.total, 0); assert.equal(payload.wasInterrupted, false); }); it('groups assertions by file/classname key', () => { const xmlPath = writeXml(` `); const outPath = path.join(tmpDir, 'grouped.json'); assert.equal(writeMaestroJestJsonForTsio(xmlPath, outPath), true); const payload = JSON.parse(fs.readFileSync(outPath, 'utf8')); assert.equal(payload.numTotalTestSuites, 1); assert.equal(payload.testResults.length, 1); assert.equal(payload.testResults[0].name, 'detox/maestro/flows/account/login.yml'); assert.deepEqual( payload.testResults[0].assertionResults.map((ar) => ar.title), ['one', 'two'], ); assert.equal(payload.success, true); assert.equal(payload.numPassedTests, 2); assert.equal(payload.numFailedTests, 0); }); });