UNPKG

@ply-ct/ply

Version:

REST API Automated Testing

163 lines 6.64 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Runs = void 0; const fs = __importStar(require("fs")); const path = __importStar(require("path")); const glob_1 = __importDefault(require("glob")); const storage_1 = require("../storage"); const util_1 = require("../util"); class Runs { constructor(path) { this.path = path; } readRun(name, runNumber, test) { var _a; const run = this.readRuns(name, runNumber).find((run) => run.test === test); if (((_a = run === null || run === void 0 ? void 0 : run.request) === null || _a === void 0 ? void 0 : _a.submitted) && run.response) { // for vscode-ply request editor run.response.submitted = run.request.submitted; } return run; } readRuns(name, runNumber) { const storage = new storage_1.Storage(`${this.path}/${name}.${runNumber + 1}.json`); const content = storage.read(); if (content) { return JSON.parse(content); } return []; } writeRun(name, test, outcome, message, values, runNumber = 0) { const testRun = { name: test.stepName || test.name, test: test.name, type: test.type, ...(outcome.start && { start: new Date(outcome.start).toISOString() }), ...(outcome.end && { end: new Date(outcome.end).toISOString() }), result: { status: outcome.status, ...(message && { message }) }, values }; if (outcome.request) { testRun.request = outcome.request; if (outcome.response) testRun.response = outcome.response; } else if (outcome.data && !outcome.data.request) { testRun.data = outcome.data; } const storage = new storage_1.Storage(`${this.path}/${name}.${runNumber + 1}.json`); const content = storage.read(); const testRuns = content ? JSON.parse(content) : []; testRuns.push(testRun); storage.write(JSON.stringify(testRuns, null, 2)); } async findRunFiles(runsLocation, pattern) { return new Promise((resolve, reject) => { (0, glob_1.default)(pattern, { cwd: runsLocation }, (err, matches) => { if (err) { reject(err); } else { resolve(matches.map((m) => `${runsLocation}/${m}`)); } }); }); } async loadSuiteRuns(pattern = '**/*.json', filter) { const runFiles = await this.findRunFiles(this.path, pattern); const suiteRuns = []; for (const runFile of runFiles) { const base = path.basename(runFile, '.json'); const lastDot = base.lastIndexOf('.'); const suiteName = base.substring(0, lastDot); const runNumber = parseInt(base.substring(lastDot + 1)); const contents = await fs.promises.readFile(runFile, { encoding: 'utf-8' }); let testRuns = JSON.parse(contents); if (filter) testRuns = testRuns.filter(filter); testRuns.forEach((tr) => { if (tr.start) tr.start = new Date(tr.start); if (tr.end) tr.end = new Date(tr.end); }); const consolidateResults = (testRuns) => { let anySubmitted = false; for (const testRun of testRuns) { if (testRun.result.status === 'Failed' || testRun.result.status === 'Errored') { return testRun.result; } else if (testRun.result.status === 'Submitted') { anySubmitted = true; } } return { status: anySubmitted ? 'Submitted' : 'Passed' }; }; let suitePath = `${(0, util_1.fwdSlashes)(path.relative(this.path, path.dirname(runFile)))}/${suiteName}`; // undo file path double-dipping const segs = suitePath.split('/'); if (segs.length % 2 === 0) { suitePath = segs.slice(segs.length / 2).join('/'); } suiteRuns.push({ suite: suitePath, run: runNumber, result: consolidateResults(testRuns), ...(testRuns.length > 0 && testRuns[0].start && { start: testRuns[0].start }), ...(testRuns.length > 0 && testRuns[testRuns.length - 1].end && { end: testRuns[testRuns.length - 1].end }), testRuns }); } suiteRuns.sort((r1, r2) => { if (r1.suite === r2.suite) { return r1.run - r2.run; } else { return r1.suite.localeCompare(r2.suite); } }); return suiteRuns; } async loadPlyResults(pattern = '**/*.json', filter) { const suiteRuns = await this.loadSuiteRuns(pattern, filter); const overall = { Passed: 0, Failed: 0, Errored: 0, Pending: 0, Submitted: 0, Waiting: 0 }; suiteRuns.forEach((sr) => { overall[sr.result.status]++; }); return { overall, runs: suiteRuns }; } } exports.Runs = Runs; //# sourceMappingURL=runs.js.map