@ply-ct/ply
Version:
REST API Automated Testing
163 lines • 6.64 kB
JavaScript
;
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