datagrok-tools 4.14.33 → 4.14.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/commands/test.js +1 -1
- package/bin/utils/test-utils.js +63 -66
- package/package-template/package.json +1 -1
- package/package.json +3 -2
package/bin/commands/test.js
CHANGED
|
@@ -129,7 +129,7 @@ async function runTesting(args) {
|
|
|
129
129
|
let testsLeft = [];
|
|
130
130
|
let testsToReproduce = [];
|
|
131
131
|
for (let testData of organized) {
|
|
132
|
-
if (!r.verbosePassed.includes(`${testData.params.category}: ${testData.params.test}`) && !r.verboseSkipped.includes(`${testData.params.category}: ${testData.params.test}`) && !r.verboseFailed.includes(`${testData.params.category}: ${testData.params.test}`) && !new RegExp(`${testData.params.category.trim()}[
|
|
132
|
+
if (!r.verbosePassed.includes(`${testData.params.category}: ${testData.params.test}`) && !r.verboseSkipped.includes(`${testData.params.category}: ${testData.params.test}`) && !r.verboseFailed.includes(`${testData.params.category}: ${testData.params.test}`) && !new RegExp(`${testUtils.escapeRegex(testData.params.category.trim())}[^\n]*: *?(before|after)(\\(\\))?`).test(r.verboseFailed)) testsLeft.push(testData);
|
|
133
133
|
if (r.verboseFailed.includes(`${testData.params.category}: ${testData.params.test} : Error:`)) {
|
|
134
134
|
testsToReproduce.push(testData);
|
|
135
135
|
}
|
package/bin/utils/test-utils.js
CHANGED
|
@@ -8,6 +8,7 @@ exports.TestContext = void 0;
|
|
|
8
8
|
exports.addColumnToCsv = addColumnToCsv;
|
|
9
9
|
exports.addLogsToFile = addLogsToFile;
|
|
10
10
|
exports.defaultLaunchParameters = void 0;
|
|
11
|
+
exports.escapeRegex = escapeRegex;
|
|
11
12
|
exports.exitWithCode = exitWithCode;
|
|
12
13
|
exports.getBrowserPage = getBrowserPage;
|
|
13
14
|
exports.getDevKey = getDevKey;
|
|
@@ -182,22 +183,22 @@ const recorderConfig = exports.recorderConfig = {
|
|
|
182
183
|
// aspectRatio: '16:9',
|
|
183
184
|
};
|
|
184
185
|
async function loadPackages(packagesDir, packagesToLoad, host, skipPublish, skipBuild, linkPackage, release) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (packagesToLoad !==
|
|
188
|
-
for (
|
|
186
|
+
const packagesToRun = new Map();
|
|
187
|
+
const hostString = host === undefined ? `` : `${host}`;
|
|
188
|
+
if (packagesToLoad !== 'all') {
|
|
189
|
+
for (const pacakgeName of (packagesToLoad ?? '').split(' ')) {
|
|
189
190
|
if ((pacakgeName ?? '').length !== 0) packagesToRun.set((0, _utils.spaceToCamelCase)(pacakgeName).toLocaleLowerCase(), false);
|
|
190
191
|
}
|
|
191
192
|
}
|
|
192
|
-
for (
|
|
193
|
-
|
|
193
|
+
for (const dirName of _fs.default.readdirSync(packagesDir)) {
|
|
194
|
+
const packageDir = _path.default.join(packagesDir, dirName);
|
|
194
195
|
if (!_fs.default.lstatSync(packageDir).isFile()) {
|
|
195
196
|
try {
|
|
196
197
|
const packageJsonData = JSON.parse(_fs.default.readFileSync(_path.default.join(packageDir, 'package.json'), {
|
|
197
198
|
encoding: 'utf-8'
|
|
198
199
|
}));
|
|
199
|
-
const packageFriendlyName = packagesToRun.get((0, _utils.spaceToCamelCase)(packageJsonData[
|
|
200
|
-
if (utils.isPackageDir(packageDir) && (packageFriendlyName !== undefined || packagesToLoad ===
|
|
200
|
+
const packageFriendlyName = packagesToRun.get((0, _utils.spaceToCamelCase)(packageJsonData['friendlyName'] ?? packageJsonData['name'].split('/')[1] ?? packageJsonData['name'] ?? '').toLocaleLowerCase() ?? '') ?? packagesToRun.get(dirName);
|
|
201
|
+
if (utils.isPackageDir(packageDir) && (packageFriendlyName !== undefined || packagesToLoad === 'all')) {
|
|
201
202
|
try {
|
|
202
203
|
process.stdout.write(`Building and publishing ${dirName}...`);
|
|
203
204
|
if (skipPublish != true) {
|
|
@@ -213,7 +214,7 @@ async function loadPackages(packagesDir, packagesToLoad, host, skipPublish, skip
|
|
|
213
214
|
}
|
|
214
215
|
}
|
|
215
216
|
} catch (e) {
|
|
216
|
-
if (utils.isPackageDir(packageDir) && (packagesToRun.get((0, _utils.spaceToCamelCase)(dirName).toLocaleLowerCase()) !== undefined || packagesToLoad ===
|
|
217
|
+
if (utils.isPackageDir(packageDir) && (packagesToRun.get((0, _utils.spaceToCamelCase)(dirName).toLocaleLowerCase()) !== undefined || packagesToLoad === 'all')) console.log(`Couldn't read package.json ${dirName}`);
|
|
217
218
|
}
|
|
218
219
|
}
|
|
219
220
|
}
|
|
@@ -222,7 +223,7 @@ async function loadPackages(packagesDir, packagesToLoad, host, skipPublish, skip
|
|
|
222
223
|
;
|
|
223
224
|
}
|
|
224
225
|
async function loadTestsList(packages, core = false) {
|
|
225
|
-
|
|
226
|
+
const packageTestsData = await timeout(async () => {
|
|
226
227
|
const params = Object.assign({}, defaultLaunchParameters);
|
|
227
228
|
// params['headless'] = false;
|
|
228
229
|
const out = await getBrowserPage(_puppeteer.default, params);
|
|
@@ -253,7 +254,7 @@ async function loadTestsList(packages, core = false) {
|
|
|
253
254
|
}
|
|
254
255
|
});
|
|
255
256
|
} catch (err) {
|
|
256
|
-
console.error(
|
|
257
|
+
console.error('Error during evaluation in browser context:', err);
|
|
257
258
|
reject();
|
|
258
259
|
}
|
|
259
260
|
Promise.all(promises).then(results => {
|
|
@@ -267,16 +268,14 @@ async function loadTestsList(packages, core = false) {
|
|
|
267
268
|
});
|
|
268
269
|
});
|
|
269
270
|
}, packages, core);
|
|
270
|
-
if (browser != null)
|
|
271
|
-
await browser.close();
|
|
272
|
-
}
|
|
271
|
+
if (browser != null) await browser.close();
|
|
273
272
|
return r;
|
|
274
273
|
}, testCollectionTimeout);
|
|
275
|
-
|
|
276
|
-
for (
|
|
274
|
+
const testsList = [];
|
|
275
|
+
for (const testPackage of packageTestsData) {
|
|
277
276
|
for (const key in testPackage.tests) {
|
|
278
277
|
if (testPackage.tests.hasOwnProperty(key)) {
|
|
279
|
-
for (
|
|
278
|
+
for (const testValue of testPackage.tests[key].tests) {
|
|
280
279
|
testValue.packageName = testPackage.packageName;
|
|
281
280
|
testsList.push(testValue);
|
|
282
281
|
}
|
|
@@ -291,26 +290,24 @@ function addLogsToFile(filePath, stringToSave) {
|
|
|
291
290
|
function printBrowsersResult(browserResult, verbose = false) {
|
|
292
291
|
if (verbose) {
|
|
293
292
|
if ((browserResult.passedAmount ?? 0) > 0 && (browserResult.verbosePassed ?? []).length > 0) {
|
|
294
|
-
console.log(
|
|
293
|
+
console.log('Passed: ');
|
|
295
294
|
console.log(browserResult.verbosePassed);
|
|
296
295
|
}
|
|
297
296
|
if ((browserResult.skippedAmount ?? 0) > 0 && (browserResult.verboseSkipped ?? []).length > 0) {
|
|
298
|
-
console.log(
|
|
297
|
+
console.log('Skipped: ');
|
|
299
298
|
console.log(browserResult.verboseSkipped);
|
|
300
299
|
}
|
|
301
300
|
}
|
|
302
301
|
if ((browserResult.failedAmount ?? 0) > 0 && (browserResult.verboseFailed ?? []).length > 0) {
|
|
303
|
-
console.log(
|
|
302
|
+
console.log('Failed: ');
|
|
304
303
|
console.log(browserResult.verboseFailed);
|
|
305
304
|
}
|
|
306
|
-
console.log(
|
|
307
|
-
console.log(
|
|
308
|
-
console.log(
|
|
305
|
+
console.log('Passed amount: ' + browserResult?.passedAmount);
|
|
306
|
+
console.log('Skipped amount: ' + browserResult?.skippedAmount);
|
|
307
|
+
console.log('Failed amount: ' + browserResult?.failedAmount);
|
|
309
308
|
if (browserResult.failed) {
|
|
310
309
|
if (browserResult.verboseFailed === 'Package not found') color.fail('Tests not found');else color.fail('Tests failed.');
|
|
311
|
-
} else
|
|
312
|
-
color.success('Tests passed.');
|
|
313
|
-
}
|
|
310
|
+
} else color.success('Tests passed.');
|
|
314
311
|
}
|
|
315
312
|
function saveCsvResults(stringToSave, csvReportDir) {
|
|
316
313
|
const modifiedStrings = stringToSave.map((str, index) => {
|
|
@@ -322,10 +319,10 @@ function saveCsvResults(stringToSave, csvReportDir) {
|
|
|
322
319
|
}
|
|
323
320
|
async function runTests(testsParams, stopOnFail) {
|
|
324
321
|
let failed = false;
|
|
325
|
-
let verbosePassed =
|
|
326
|
-
let verboseSkipped =
|
|
327
|
-
let verboseFailed =
|
|
328
|
-
let error =
|
|
322
|
+
let verbosePassed = '';
|
|
323
|
+
let verboseSkipped = '';
|
|
324
|
+
let verboseFailed = '';
|
|
325
|
+
let error = '';
|
|
329
326
|
let countPassed = 0;
|
|
330
327
|
let countSkipped = 0;
|
|
331
328
|
let countFailed = 0;
|
|
@@ -333,13 +330,15 @@ async function runTests(testsParams, stopOnFail) {
|
|
|
333
330
|
let lastTest = null;
|
|
334
331
|
let res = '';
|
|
335
332
|
try {
|
|
336
|
-
for (
|
|
333
|
+
for (const testParam of testsParams) {
|
|
337
334
|
lastTest = testParam;
|
|
338
|
-
|
|
339
|
-
|
|
335
|
+
const df = await window.grok.functions.call(testParam.package + ':test', testParam.params);
|
|
336
|
+
const flakingCol = window.DG.Column.fromType(window.DG.COLUMN_TYPE.BOOL, 'flaking', df.rowCount);
|
|
340
337
|
df.columns.add(flakingCol);
|
|
341
|
-
|
|
342
|
-
|
|
338
|
+
if (!df.getCol('package')) {
|
|
339
|
+
const packageNameCol = window.DG.Column.fromList(window.DG.COLUMN_TYPE.STRING, 'package', Array(df.rowCount).fill(testParam.package));
|
|
340
|
+
df.columns.add(packageNameCol);
|
|
341
|
+
}
|
|
343
342
|
if (df.rowCount === 0) {
|
|
344
343
|
verboseFailed += `Test result : Invocation Fail : ${testParam.params.category}: ${testParam.params.test}\n`;
|
|
345
344
|
countFailed += 1;
|
|
@@ -348,29 +347,30 @@ async function runTests(testsParams, stopOnFail) {
|
|
|
348
347
|
}
|
|
349
348
|
let row = df.rows.get(0);
|
|
350
349
|
if (df.rowCount > 1) {
|
|
351
|
-
|
|
352
|
-
if (!unhandledErrorRow.get(
|
|
353
|
-
unhandledErrorRow[
|
|
354
|
-
unhandledErrorRow[
|
|
350
|
+
const unhandledErrorRow = df.rows.get(1);
|
|
351
|
+
if (!unhandledErrorRow.get('success')) {
|
|
352
|
+
unhandledErrorRow['category'] = row.get('category');
|
|
353
|
+
unhandledErrorRow['name'] = row.get('name');
|
|
355
354
|
row = unhandledErrorRow;
|
|
356
355
|
}
|
|
357
356
|
}
|
|
358
|
-
const category = row.get(
|
|
359
|
-
const testName = row.get(
|
|
360
|
-
const time = row.get(
|
|
361
|
-
const result = row.get(
|
|
362
|
-
const success = row.get(
|
|
363
|
-
const skipped = row.get(
|
|
364
|
-
row[
|
|
357
|
+
const category = row.get('category');
|
|
358
|
+
const testName = row.get('name');
|
|
359
|
+
const time = row.get('ms');
|
|
360
|
+
const result = row.get('result');
|
|
361
|
+
const success = row.get('success');
|
|
362
|
+
const skipped = row.get('skipped');
|
|
363
|
+
row['flaking'] = success && window.DG.Test.isReproducing;
|
|
365
364
|
df.changeColumnType('result', window.DG.COLUMN_TYPE.STRING);
|
|
366
365
|
df.changeColumnType('logs', window.DG.COLUMN_TYPE.STRING);
|
|
366
|
+
df.changeColumnType('widgetsDifference', window.DG.COLUMN_TYPE.STRING);
|
|
367
367
|
// df.changeColumnType('memoryDelta', (<any>window).DG.COLUMN_TYPE.BIG_INT);
|
|
368
368
|
|
|
369
369
|
if (resultDF === undefined) resultDF = df;else resultDF = resultDF.append(df);
|
|
370
|
-
if (row[
|
|
370
|
+
if (row['skipped']) {
|
|
371
371
|
verboseSkipped += `Test result : Skipped : ${time} : ${category}: ${testName} : ${result}\n`;
|
|
372
372
|
countSkipped += 1;
|
|
373
|
-
} else if (row[
|
|
373
|
+
} else if (row['success']) {
|
|
374
374
|
verbosePassed += `Test result : Success : ${time} : ${category}: ${testName} : ${result}\n`;
|
|
375
375
|
countPassed += 1;
|
|
376
376
|
} else {
|
|
@@ -389,9 +389,7 @@ async function runTests(testsParams, stopOnFail) {
|
|
|
389
389
|
const bs = window.DG.BitSet.create(resultDF.rowCount);
|
|
390
390
|
bs.setAll(true);
|
|
391
391
|
for (let i = 0; i < resultDF.rowCount; i++) {
|
|
392
|
-
if (resultDF.rows.get(i).get('category') === 'Unhandled exceptions')
|
|
393
|
-
bs.set(i, false);
|
|
394
|
-
}
|
|
392
|
+
if (resultDF.rows.get(i).get('category') === 'Unhandled exceptions') bs.set(i, false);
|
|
395
393
|
}
|
|
396
394
|
resultDF = resultDF.clone(bs);
|
|
397
395
|
res = resultDF.toCsv();
|
|
@@ -414,7 +412,7 @@ async function runTests(testsParams, stopOnFail) {
|
|
|
414
412
|
};
|
|
415
413
|
}
|
|
416
414
|
async function runBrowser(testExecutionData, browserOptions, browsersId, testInvocationTimeout = 3600000) {
|
|
417
|
-
|
|
415
|
+
const testsToRun = {
|
|
418
416
|
func: runTests.toString(),
|
|
419
417
|
tests: testExecutionData
|
|
420
418
|
};
|
|
@@ -432,7 +430,7 @@ async function runBrowser(testExecutionData, browserOptions, browsersId, testInv
|
|
|
432
430
|
const recordDir = `./test-record-${currentBrowserNum}.mp4`;
|
|
433
431
|
if (browserOptions.record) {
|
|
434
432
|
await recorder.start(recordDir);
|
|
435
|
-
await page.exposeFunction(
|
|
433
|
+
await page.exposeFunction('addLogsToFile', addLogsToFile);
|
|
436
434
|
_fs.default.writeFileSync(logsDir, ``);
|
|
437
435
|
page.on('console', msg => {
|
|
438
436
|
addLogsToFile(logsDir, `CONSOLE LOG ENTRY: ${msg.text()}\n`);
|
|
@@ -444,7 +442,7 @@ async function runBrowser(testExecutionData, browserOptions, browsersId, testInv
|
|
|
444
442
|
addLogsToFile(logsDir, `CONSOLE LOG REQUEST: ${response.status()}, ${response.url()}\n`);
|
|
445
443
|
});
|
|
446
444
|
}
|
|
447
|
-
|
|
445
|
+
const testingResults = await page.evaluate((testData, options) => {
|
|
448
446
|
if (options.benchmark) window.DG.Test.isInBenchmark = true;
|
|
449
447
|
if (options.reproduce) window.DG.Test.isReproducing = true;
|
|
450
448
|
if (options.ciCd) window.DG.Test.isCiCd = true;
|
|
@@ -456,14 +454,14 @@ async function runBrowser(testExecutionData, browserOptions, browsersId, testInv
|
|
|
456
454
|
}).catch(e => {
|
|
457
455
|
resolve({
|
|
458
456
|
failed: true,
|
|
459
|
-
verbosePassed:
|
|
460
|
-
verboseSkipped:
|
|
461
|
-
verboseFailed:
|
|
457
|
+
verbosePassed: '',
|
|
458
|
+
verboseSkipped: '',
|
|
459
|
+
verboseFailed: '',
|
|
462
460
|
error: JSON.stringify(e),
|
|
463
461
|
passedAmount: 0,
|
|
464
462
|
skippedAmount: 0,
|
|
465
463
|
failedAmount: 1,
|
|
466
|
-
csv:
|
|
464
|
+
csv: '',
|
|
467
465
|
df: undefined
|
|
468
466
|
});
|
|
469
467
|
});
|
|
@@ -487,17 +485,13 @@ async function runBrowser(testExecutionData, browserOptions, browsersId, testInv
|
|
|
487
485
|
// });
|
|
488
486
|
});
|
|
489
487
|
}, testsToRun, browserOptions);
|
|
490
|
-
if (browserOptions.record)
|
|
491
|
-
|
|
492
|
-
}
|
|
493
|
-
if (browser != null) {
|
|
494
|
-
await browser.close();
|
|
495
|
-
}
|
|
488
|
+
if (browserOptions.record) await recorder.stop();
|
|
489
|
+
if (browser != null) await browser.close();
|
|
496
490
|
return testingResults;
|
|
497
491
|
}, testInvocationTimeout);
|
|
498
492
|
}
|
|
499
493
|
async function mergeBrowsersResults(browsersResults) {
|
|
500
|
-
|
|
494
|
+
const mergedResult = {
|
|
501
495
|
failed: browsersResults[0].failed,
|
|
502
496
|
verbosePassed: browsersResults[0].verbosePassed,
|
|
503
497
|
verboseSkipped: browsersResults[0].verboseSkipped,
|
|
@@ -508,7 +502,7 @@ async function mergeBrowsersResults(browsersResults) {
|
|
|
508
502
|
csv: browsersResults[0].csv,
|
|
509
503
|
error: ''
|
|
510
504
|
};
|
|
511
|
-
for (
|
|
505
|
+
for (const browsersResult of browsersResults) {
|
|
512
506
|
if (mergedResult.csv === browsersResult.csv) continue;
|
|
513
507
|
mergedResult.failed = mergedResult.failed || browsersResult.failed;
|
|
514
508
|
mergedResult.verbosePassed = `${mergedResult.verbosePassed.trim()}\n${browsersResult.verbosePassed.trim()}`;
|
|
@@ -549,4 +543,7 @@ async function addColumnToCsv(csv, columnName, defaultValue) {
|
|
|
549
543
|
}
|
|
550
544
|
});
|
|
551
545
|
return result;
|
|
546
|
+
}
|
|
547
|
+
function escapeRegex(s) {
|
|
548
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
552
549
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datagrok-tools",
|
|
3
|
-
"version": "4.14.
|
|
3
|
+
"version": "4.14.35",
|
|
4
4
|
"description": "Utility to upload and publish packages to Datagrok",
|
|
5
5
|
"homepage": "https://github.com/datagrok-ai/public/tree/master/tools#readme",
|
|
6
6
|
"dependencies": {
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
"link": "npm link",
|
|
31
31
|
"prepublishOnly": "babel bin --extensions .ts -d bin",
|
|
32
32
|
"babel": "babel bin --extensions .ts -d bin",
|
|
33
|
-
"build": "babel bin --extensions .ts -d bin"
|
|
33
|
+
"build": "babel bin --extensions .ts -d bin",
|
|
34
|
+
"debug-source-map": "babel bin --extensions .ts -d bin --source-maps true"
|
|
34
35
|
},
|
|
35
36
|
"bin": {
|
|
36
37
|
"datagrok-upload": "./bin/_deprecated/upload.js",
|