mirror of
https://github.com/dorny/test-reporter.git
synced 2025-12-15 13:57:09 +01:00
Force generating summary if there is single results file and onlySummary is enabled
This commit is contained in:
parent
17e793242c
commit
2ac8b4498f
6 changed files with 128 additions and 167 deletions
|
|
@ -128,6 +128,11 @@ jobs:
|
|||
# mocha-json
|
||||
reporter: ''
|
||||
|
||||
# Allows you to generate only the summary.
|
||||
# If enabled, the report will contain a table listing each test results file and the number of passed, failed, and skipped tests.
|
||||
# Detailed listing of test suites and test cases will be skipped.
|
||||
only-summary: 'false'
|
||||
|
||||
# Limits which test suites are listed:
|
||||
# all
|
||||
# failed
|
||||
|
|
|
|||
|
|
@ -54,7 +54,10 @@ inputs:
|
|||
description: Relative path under $GITHUB_WORKSPACE where the repository was checked out
|
||||
required: false
|
||||
only-summary:
|
||||
description: allows you to generate the summary only.
|
||||
description: |
|
||||
Allows you to generate only the summary.
|
||||
If enabled, the report will contain a table listing each test results file and the number of passed, failed, and skipped tests.
|
||||
Detailed listing of test suites and test cases will be skipped.
|
||||
default: 'false'
|
||||
required: false
|
||||
token:
|
||||
|
|
|
|||
245
dist/index.js
generated
vendored
245
dist/index.js
generated
vendored
|
|
@ -1450,7 +1450,7 @@ function getBadge(passed, failed, skipped) {
|
|||
}
|
||||
function getTestRunsReport(testRuns, options) {
|
||||
const sections = [];
|
||||
if (testRuns.length > 1) {
|
||||
if (testRuns.length > 1 || options.onlySummary) {
|
||||
const tableData = testRuns.map((tr, runIndex) => {
|
||||
const time = markdown_utils_1.formatTime(tr.time);
|
||||
const name = tr.path;
|
||||
|
|
@ -8350,12 +8350,13 @@ module.exports = function (/**String*/input) {
|
|||
}
|
||||
|
||||
function fixPath(zipPath){
|
||||
// convert windows file separators and normalize
|
||||
zipPath = pth.posix.normalize(zipPath.split("\\").join("/"));
|
||||
// cleanup, remove invalid folder names
|
||||
var names = zipPath.split("/").filter((c) => c !== "" && c !== "." && c !== "..");
|
||||
// if we have name we return it
|
||||
return names.length ? names.join("/") + "/" : "";
|
||||
// convert windows file separators
|
||||
zipPath = zipPath.split("\\").join("/");
|
||||
// add separator if it wasnt given
|
||||
if (zipPath.charAt(zipPath.length - 1) !== "/") {
|
||||
zipPath += "/";
|
||||
}
|
||||
return zipPath;
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
@ -8521,7 +8522,7 @@ module.exports = function (/**String*/input) {
|
|||
// add file name into zippath
|
||||
zipPath += (zipName) ? zipName : p;
|
||||
|
||||
// read file attributes
|
||||
// read file attributes
|
||||
const _attr = fs.statSync(localPath);
|
||||
|
||||
// add file into zip file
|
||||
|
|
@ -8541,7 +8542,7 @@ module.exports = function (/**String*/input) {
|
|||
*/
|
||||
addLocalFolder: function (/**String*/localPath, /**String=*/zipPath, /**=RegExp|Function*/filter) {
|
||||
// Prepare filter
|
||||
if (filter instanceof RegExp) { // if filter is RegExp wrap it
|
||||
if (filter instanceof RegExp) { // if filter is RegExp wrap it
|
||||
filter = (function (rx){
|
||||
return function (filename) {
|
||||
return rx.test(filename);
|
||||
|
|
@ -8568,11 +8569,10 @@ module.exports = function (/**String*/input) {
|
|||
items.forEach(function (filepath) {
|
||||
var p = pth.relative(localPath, filepath).split("\\").join("/"); //windows fix
|
||||
if (filter(p)) {
|
||||
var stats = fs.statSync(filepath);
|
||||
if (stats.isFile()) {
|
||||
self.addFile(zipPath + p, fs.readFileSync(filepath), "", stats);
|
||||
if (filepath.charAt(filepath.length - 1) !== pth.sep) {
|
||||
self.addFile(zipPath + p, fs.readFileSync(filepath), "", fs.statSync(filepath));
|
||||
} else {
|
||||
self.addFile(zipPath + p + '/', Buffer.alloc(0), "", stats);
|
||||
self.addFile(zipPath + p + '/', Buffer.alloc(0), "", 0);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -8590,83 +8590,75 @@ module.exports = function (/**String*/input) {
|
|||
* @param filter optional RegExp or Function if files match will
|
||||
* be included.
|
||||
*/
|
||||
addLocalFolderAsync: function (/*String*/localPath, /*Function*/callback, /*String*/zipPath, /*RegExp|Function*/filter) {
|
||||
if (filter instanceof RegExp) {
|
||||
filter = (function (rx) {
|
||||
return function (filename) {
|
||||
return rx.test(filename);
|
||||
};
|
||||
})(filter);
|
||||
} else if ("function" !== typeof filter) {
|
||||
filter = function () {
|
||||
return true;
|
||||
};
|
||||
}
|
||||
addLocalFolderAsync: function (/*String*/localPath, /*Function*/callback, /*String*/zipPath, /*RegExp|Function*/filter) {
|
||||
if (filter === undefined) {
|
||||
filter = function () {
|
||||
return true;
|
||||
};
|
||||
} else if (filter instanceof RegExp) {
|
||||
filter = function (filter) {
|
||||
return function (filename) {
|
||||
return filter.test(filename);
|
||||
}
|
||||
}(filter);
|
||||
}
|
||||
|
||||
// fix ZipPath
|
||||
zipPath = zipPath ? fixPath(zipPath) : "";
|
||||
if (zipPath) {
|
||||
zipPath = zipPath.split("\\").join("/");
|
||||
if (zipPath.charAt(zipPath.length - 1) !== "/") {
|
||||
zipPath += "/";
|
||||
}
|
||||
} else {
|
||||
zipPath = "";
|
||||
}
|
||||
// normalize the path first
|
||||
localPath = pth.normalize(localPath);
|
||||
localPath = localPath.split("\\").join("/"); //windows fix
|
||||
if (localPath.charAt(localPath.length - 1) !== "/")
|
||||
localPath += "/";
|
||||
|
||||
// normalize the path first
|
||||
localPath = pth.normalize(localPath);
|
||||
var self = this;
|
||||
fs.open(localPath, 'r', function (err, fd) {
|
||||
if (err && err.code === 'ENOENT') {
|
||||
callback(undefined, Utils.Errors.FILE_NOT_FOUND.replace("%s", localPath));
|
||||
} else if (err) {
|
||||
callback(undefined, err);
|
||||
} else {
|
||||
var items = Utils.findFiles(localPath);
|
||||
var i = -1;
|
||||
|
||||
var self = this;
|
||||
fs.open(localPath, 'r', function (err) {
|
||||
if (err && err.code === 'ENOENT') {
|
||||
callback(undefined, Utils.Errors.FILE_NOT_FOUND.replace("%s", localPath));
|
||||
} else if (err) {
|
||||
callback(undefined, err);
|
||||
} else {
|
||||
var items = Utils.findFiles(localPath);
|
||||
var i = -1;
|
||||
var next = function () {
|
||||
i += 1;
|
||||
if (i < items.length) {
|
||||
var p = items[i].split("\\").join("/").replace(new RegExp(localPath.replace(/(\(|\))/g, '\\$1'), 'i'), ""); //windows fix
|
||||
p = p.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^\x20-\x7E]/g, '') // accent fix
|
||||
if (filter(p)) {
|
||||
if (p.charAt(p.length - 1) !== "/") {
|
||||
fs.readFile(items[i], function (err, data) {
|
||||
if (err) {
|
||||
callback(undefined, err);
|
||||
} else {
|
||||
self.addFile(zipPath + p, data, '', 0);
|
||||
next();
|
||||
}
|
||||
})
|
||||
} else {
|
||||
self.addFile(zipPath + p, Buffer.alloc(0), "", 0);
|
||||
next();
|
||||
}
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
|
||||
var next = function () {
|
||||
i += 1;
|
||||
if (i < items.length) {
|
||||
var filepath = items[i];
|
||||
var p = pth.relative(localPath, filepath).split("\\").join("/"); //windows fix
|
||||
p = p.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^\x20-\x7E]/g, '') // accent fix
|
||||
if (filter(p)) {
|
||||
fs.stat(filepath, function (er0, stats) {
|
||||
if (er0) callback(undefined, er0);
|
||||
if (stats.isFile()) {
|
||||
fs.readFile(filepath, function (er1, data) {
|
||||
if (er1) {
|
||||
callback(undefined, er1);
|
||||
} else {
|
||||
self.addFile(zipPath + p, data, "", stats);
|
||||
next();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
self.addFile(zipPath + p + "/", Buffer.alloc(0), "", stats);
|
||||
next();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
} else {
|
||||
callback(true, undefined);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
callback(true, undefined);
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
addLocalFolderPromise: function (/*String*/ localPath, /* object */ options) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { filter, zipPath } = Object.assign({}, options);
|
||||
this.addLocalFolderAsync(localPath,
|
||||
(done, err) => {
|
||||
if (err) reject(err);
|
||||
if (done) resolve(this);
|
||||
}, zipPath, filter
|
||||
);
|
||||
});
|
||||
},
|
||||
next();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Allows you to create a entry (file or directory) in the zip file.
|
||||
|
|
@ -8700,10 +8692,10 @@ module.exports = function (/**String*/input) {
|
|||
var unix = (entry.isDirectory) ? 0x4000 : 0x8000;
|
||||
|
||||
if (isStat) { // File attributes from file stats
|
||||
unix |= (0xfff & attr.mode);
|
||||
unix |= (0xfff & attr.mode)
|
||||
}else if ('number' === typeof attr){ // attr from given attr values
|
||||
unix |= (0xfff & attr);
|
||||
}else{ // Default values:
|
||||
}else{ // Default values:
|
||||
unix |= (entry.isDirectory) ? 0o755 : 0o644; // permissions (drwxr-xr-x) or (-r-wr--r--)
|
||||
}
|
||||
|
||||
|
|
@ -8785,9 +8777,8 @@ module.exports = function (/**String*/input) {
|
|||
}
|
||||
var name = canonical(child.entryName)
|
||||
var childName = sanitize(targetPath, maintainEntryPath ? name : pth.basename(name));
|
||||
// The reverse operation for attr depend on method addFile()
|
||||
var fileAttr = child.attr ? (((child.attr >>> 0) | 0) >> 16) & 0xfff : 0;
|
||||
Utils.writeFileTo(childName, content, overwrite, fileAttr);
|
||||
|
||||
Utils.writeFileTo(childName, content, overwrite);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
|
@ -8798,9 +8789,7 @@ module.exports = function (/**String*/input) {
|
|||
if (fs.existsSync(target) && !overwrite) {
|
||||
throw new Error(Utils.Errors.CANT_OVERRIDE);
|
||||
}
|
||||
// The reverse operation for attr depend on method addFile()
|
||||
var fileAttr = item.attr ? (((item.attr >>> 0) | 0) >> 16) & 0xfff : 0;
|
||||
Utils.writeFileTo(target, content, overwrite, fileAttr);
|
||||
Utils.writeFileTo(target, content, overwrite);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
|
@ -8852,9 +8841,7 @@ module.exports = function (/**String*/input) {
|
|||
if (!content) {
|
||||
throw new Error(Utils.Errors.CANT_EXTRACT_FILE);
|
||||
}
|
||||
// The reverse operation for attr depend on method addFile()
|
||||
var fileAttr = entry.attr ? (((entry.attr >>> 0) | 0) >> 16) & 0xfff : 0;
|
||||
Utils.writeFileTo(entryName, content, overwrite, fileAttr);
|
||||
Utils.writeFileTo(entryName, content, overwrite);
|
||||
try {
|
||||
fs.utimesSync(entryName, entry.header.time, entry.header.time)
|
||||
} catch (err) {
|
||||
|
|
@ -8906,9 +8893,7 @@ module.exports = function (/**String*/input) {
|
|||
return;
|
||||
}
|
||||
|
||||
// The reverse operation for attr depend on method addFile()
|
||||
var fileAttr = entry.attr ? (((entry.attr >>> 0) | 0) >> 16) & 0xfff : 0;
|
||||
Utils.writeFileToAsync(sanitize(targetPath, entryName), content, overwrite, fileAttr, function (succ) {
|
||||
Utils.writeFileToAsync(sanitize(targetPath, entryName), content, overwrite, function (succ) {
|
||||
try {
|
||||
fs.utimesSync(pth.resolve(targetPath, entryName), entry.header.time, entry.header.time);
|
||||
} catch (err) {
|
||||
|
|
@ -8953,27 +8938,6 @@ module.exports = function (/**String*/input) {
|
|||
}
|
||||
},
|
||||
|
||||
writeZipPromise: function (/**String*/ targetFileName, /* object */ options) {
|
||||
const { overwrite, perm } = Object.assign({ overwrite: true }, options);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
// find file name
|
||||
if (!targetFileName && _filename) targetFileName = _filename;
|
||||
if (!targetFileName) reject("ADM-ZIP: ZIP File Name Missing");
|
||||
|
||||
this.toBufferPromise().then((zipData) => {
|
||||
const ret = (done) => (done ? resolve(done) : reject("ADM-ZIP: Wasn't able to write zip file"));
|
||||
Utils.writeFileToAsync(targetFileName, zipData, overwrite, perm, ret);
|
||||
}, reject);
|
||||
});
|
||||
},
|
||||
|
||||
toBufferPromise: function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
_zip.toAsyncBuffer(resolve, reject);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the content of the entire zip file as a Buffer object
|
||||
*
|
||||
|
|
@ -10338,17 +10302,17 @@ module.exports = function (/*Buffer*/input) {
|
|||
|
||||
getData : function(pass) {
|
||||
if (_entryHeader.changed) {
|
||||
return uncompressedData;
|
||||
} else {
|
||||
return decompress(false, null, pass);
|
||||
return uncompressedData;
|
||||
} else {
|
||||
return decompress(false, null, pass);
|
||||
}
|
||||
},
|
||||
|
||||
getDataAsync : function(/*Function*/callback, pass) {
|
||||
if (_entryHeader.changed) {
|
||||
callback(uncompressedData);
|
||||
} else {
|
||||
decompress(true, callback, pass);
|
||||
if (_entryHeader.changed) {
|
||||
callback(uncompressedData)
|
||||
} else {
|
||||
decompress(true, callback, pass)
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -10364,20 +10328,14 @@ module.exports = function (/*Buffer*/input) {
|
|||
},
|
||||
|
||||
packHeader : function() {
|
||||
// 1. create header (buffer)
|
||||
var header = _entryHeader.entryHeaderToBinary();
|
||||
var addpos = Utils.Constants.CENHDR;
|
||||
// 2. add file name
|
||||
_entryName.copy(header, addpos);
|
||||
addpos += _entryName.length;
|
||||
// 3. add extra data
|
||||
// add
|
||||
_entryName.copy(header, Utils.Constants.CENHDR);
|
||||
if (_entryHeader.extraLength) {
|
||||
_extra.copy(header, addpos);
|
||||
addpos += _entryHeader.extraLength;
|
||||
_extra.copy(header, Utils.Constants.CENHDR + _entryName.length)
|
||||
}
|
||||
// 4. add file comment
|
||||
if (_entryHeader.commentLength) {
|
||||
_comment.copy(header, addpos);
|
||||
_comment.copy(header, Utils.Constants.CENHDR + _entryName.length + _entryHeader.extraLength, _comment.length);
|
||||
}
|
||||
return header;
|
||||
},
|
||||
|
|
@ -11998,14 +11956,12 @@ module.exports = (fromStream, toStream) => {
|
|||
/***/ }),
|
||||
|
||||
/***/ 6214:
|
||||
/***/ ((module, exports) => {
|
||||
/***/ ((module, exports, __nccwpck_require__) => {
|
||||
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||
function isTLSSocket(socket) {
|
||||
return socket.encrypted;
|
||||
}
|
||||
const tls_1 = __nccwpck_require__(4016);
|
||||
const deferToConnect = (socket, fn) => {
|
||||
let listeners;
|
||||
if (typeof fn === 'function') {
|
||||
|
|
@ -12022,7 +11978,7 @@ const deferToConnect = (socket, fn) => {
|
|||
if (hasConnectListener) {
|
||||
listeners.connect();
|
||||
}
|
||||
if (isTLSSocket(socket) && hasSecureConnectListener) {
|
||||
if (socket instanceof tls_1.TLSSocket && hasSecureConnectListener) {
|
||||
if (socket.authorized) {
|
||||
listeners.secureConnect();
|
||||
}
|
||||
|
|
@ -16032,7 +15988,7 @@ const is_response_ok_1 = __nccwpck_require__(9298);
|
|||
const deprecation_warning_1 = __nccwpck_require__(397);
|
||||
const normalize_arguments_1 = __nccwpck_require__(1048);
|
||||
const calculate_retry_delay_1 = __nccwpck_require__(3462);
|
||||
let globalDnsCache;
|
||||
const globalDnsCache = new cacheable_lookup_1.default();
|
||||
const kRequest = Symbol('request');
|
||||
const kResponse = Symbol('response');
|
||||
const kResponseSize = Symbol('responseSize');
|
||||
|
|
@ -16589,9 +16545,6 @@ class Request extends stream_1.Duplex {
|
|||
options.cacheOptions = { ...options.cacheOptions };
|
||||
// `options.dnsCache`
|
||||
if (options.dnsCache === true) {
|
||||
if (!globalDnsCache) {
|
||||
globalDnsCache = new cacheable_lookup_1.default();
|
||||
}
|
||||
options.dnsCache = globalDnsCache;
|
||||
}
|
||||
else if (!is_1.default.undefined(options.dnsCache) && !options.dnsCache.lookup) {
|
||||
|
|
|
|||
2
dist/index.js.map
generated
vendored
2
dist/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
36
dist/licenses.txt
generated
vendored
36
dist/licenses.txt
generated
vendored
|
|
@ -341,27 +341,27 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||
|
||||
adm-zip
|
||||
MIT
|
||||
MIT License
|
||||
Copyright (c) 2012 Another-D-Mention Software and other contributors,
|
||||
http://www.another-d-mention.ro/
|
||||
|
||||
Copyright (c) 2012 Another-D-Mention Software and other contributors
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
before-after-hook
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ function getBadge(passed: number, failed: number, skipped: number): string {
|
|||
function getTestRunsReport(testRuns: TestRunResult[], options: ReportOptions): string[] {
|
||||
const sections: string[] = []
|
||||
|
||||
if (testRuns.length > 1) {
|
||||
if (testRuns.length > 1 || options.onlySummary) {
|
||||
const tableData = testRuns.map((tr, runIndex) => {
|
||||
const time = formatTime(tr.time)
|
||||
const name = tr.path
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue