UNPKG

@villedemontreal/general-utils

Version:
1,120 lines (1,119 loc) 52.2 kB
"use strict"; // ========================================== // Utils functions unit tests // // Disabling the "function length" rule is OK for the test files. // tslint:disable:max-func-body-length // tslint:disable: prefer-template // ========================================== Object.defineProperty(exports, "__esModule", { value: true }); const chai_1 = require("chai"); const fs = require("fs-extra"); const uuid_1 = require("uuid"); const constants_1 = require("./config/constants"); const utils_1 = require("./utils"); // A regular "function" is required here for the call to "this.timeout(...)" // @see https://github.com/mochajs/mocha/issues/2018 // tslint:disable-next-line:only-arrow-functions ter-prefer-arrow-callback describe("App's utilities functions", function () { this.beforeAll(() => { constants_1.constants.appRoot = constants_1.constants.libRoot; // because our lib is within a monorepo }); // ========================================== // tsc() // ========================================== describe('tsc', () => { it("Compiles a TypeScript file using the 'tsc()' utility", async function () { if (!fs.existsSync(constants_1.constants.testDataDirPath)) { fs.mkdirSync(constants_1.constants.testDataDirPath); } // May take some time to compile... this.timeout(20000); const tmpRepPath = constants_1.constants.testDataDirPath + '/test_tsc'; if (fs.existsSync(tmpRepPath)) { fs.removeSync(tmpRepPath); } fs.mkdirSync(tmpRepPath); const fileName = (0, uuid_1.v4)(); const filesPathPrefix = tmpRepPath + '/' + fileName; const tsFilePath = filesPathPrefix + '.ts'; fs.writeFileSync(tsFilePath, `import * as path from 'path';\nlet t = 'a';\nt = t + path.sep;`); const distRepPath = constants_1.constants.libRoot + '/dist'; await utils_1.utils.tsc([tsFilePath]); chai_1.assert.isTrue(fs.existsSync(distRepPath + '/test-data/test_tsc/' + fileName + '.js')); chai_1.assert.isTrue(fs.existsSync(distRepPath + '/test-data/test_tsc/' + fileName + '.js.map')); chai_1.assert.isTrue(fs.existsSync(distRepPath + '/test-data/test_tsc/' + fileName + '.d.ts')); fs.removeSync(distRepPath + '/test-data'); }); }); // ========================================== // stringToBoolean() // ========================================== describe('stringToBoolean()', () => { it('valid TRUE values', () => { let result = utils_1.utils.stringToBoolean('true'); chai_1.assert.isTrue(result); result = utils_1.utils.stringToBoolean('TRUE'); chai_1.assert.isTrue(result); result = utils_1.utils.stringToBoolean('True'); chai_1.assert.isTrue(result); result = utils_1.utils.stringToBoolean('1'); chai_1.assert.isTrue(result); result = utils_1.utils.stringToBoolean(1); chai_1.assert.isTrue(result); }); it('Everything else is FALSE', () => { let result = utils_1.utils.stringToBoolean('true '); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean(' 1 '); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean('vrai'); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean('on'); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean('false'); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean('FALSE'); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean('Stromgol'); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean(''); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean(null); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean('12.345'); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean(2); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean(0); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean(-1); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean({}); chai_1.assert.isFalse(result); result = utils_1.utils.stringToBoolean([]); chai_1.assert.isFalse(result); }); }); // ========================================== // isBlank() // ========================================== describe('isBlank()', () => { it('blank values', () => { let result = utils_1.utils.isBlank(''); chai_1.assert.isTrue(result); result = utils_1.utils.isBlank(' '); chai_1.assert.isTrue(result); result = utils_1.utils.isBlank(null); chai_1.assert.isTrue(result); result = utils_1.utils.isBlank(undefined); chai_1.assert.isTrue(result); }); it('Not blank values', () => { let result = utils_1.utils.isBlank('.'); chai_1.assert.isFalse(result); result = utils_1.utils.isBlank(' . '); chai_1.assert.isFalse(result); result = utils_1.utils.isBlank('abc'); chai_1.assert.isFalse(result); result = utils_1.utils.isBlank(0); chai_1.assert.isFalse(result); result = utils_1.utils.isBlank(1); chai_1.assert.isFalse(result); result = utils_1.utils.isBlank({}); chai_1.assert.isFalse(result); result = utils_1.utils.isBlank([]); chai_1.assert.isFalse(result); }); }); // ========================================== // isIntegerValue() // ========================================== describe('isIntegerValue()', () => { it('Integer values', () => { let result = utils_1.utils.isIntegerValue(0); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(1); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10.0); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' 10'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10 '); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10.0'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('0'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('1'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-1); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10.0); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' -10'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10 '); chai_1.assert.isTrue(result); // MAX_SAFE_INTEGER result = utils_1.utils.isIntegerValue(9007199254740991); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(9007199254740991.0); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('9007199254740991'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('9007199254740991.000'); chai_1.assert.isTrue(result); // MIN_SAFE_INTEGER result = utils_1.utils.isIntegerValue(-9007199254740991); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-9007199254740991.0); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-9007199254740991'); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-9007199254740991.000'); chai_1.assert.isTrue(result); }); it('Not integer values', () => { let result = utils_1.utils.isIntegerValue('.'); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(''); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(' . '); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('10.1'); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('0.1'); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(undefined); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(null); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(true); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(false); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('0.1'); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(['a', 'b', 'c']); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue([1, 2, 3]); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(['string', 2, false]); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue({ firstStringValue: 'a', secondStringValue: 'b', thirdStringValue: 'c', }); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue({ firstNumberValue: 1, secondNumberValue: 2, thirdNumberValue: 3, }); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue({ stringValue: 'string', numberValue: 2, booleanValue: false }); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('10abc'); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('10 abc'); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('abc10'); chai_1.assert.isFalse(result); // Busts MAX_SAFE_INTEGER result = utils_1.utils.isIntegerValue(9007199254740992); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('9007199254740992'); chai_1.assert.isFalse(result); // Busts MIN_SAFE_INTEGER result = utils_1.utils.isIntegerValue(-9007199254740992); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('-9007199254740992'); chai_1.assert.isFalse(result); }); it('Negative values are accepted', () => { let result = utils_1.utils.isIntegerValue(0, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(1, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10.0, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' 10', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10 ', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10.0', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('0', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('1', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-1, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10.0, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' -10', false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10 ', false); chai_1.assert.isTrue(result); }); it('Negative values are refused', () => { let result = utils_1.utils.isIntegerValue(0, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(1, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10.0, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10', true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' 10', true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10 ', true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10.0', true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('0', true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('1', true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-1, true); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(-10.0, true); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(-10, true); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('-10', true); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(' -10', true); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('-10 ', true); chai_1.assert.isFalse(result); }); it('Zero is included', () => { let result = utils_1.utils.isIntegerValue(0, undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(1, undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10.0, undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10, undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' 10', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10 ', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10.0', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('0', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('1', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-1, undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10.0, undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10, undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' -10', undefined, true); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10 ', undefined, true); chai_1.assert.isTrue(result); }); it('Zero is excluded', () => { let result = utils_1.utils.isIntegerValue(0, undefined, false); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue(1, undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10.0, undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(10, undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10', undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' 10', undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10 ', undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('10.0', undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('0', undefined, false); chai_1.assert.isFalse(result); result = utils_1.utils.isIntegerValue('1', undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-1, undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10.0, undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(-10, undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10', undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue(' -10', undefined, false); chai_1.assert.isTrue(result); result = utils_1.utils.isIntegerValue('-10 ', undefined, false); chai_1.assert.isTrue(result); }); }); // ========================================== // isNaNSafe() // ========================================== describe('isNaNSafe()', () => { it('Valid numbers', () => { let result = utils_1.utils.isNaNSafe(0); chai_1.assert.isFalse(result); result = utils_1.utils.isNaNSafe(-0); chai_1.assert.isFalse(result); result = utils_1.utils.isNaNSafe(-1); chai_1.assert.isFalse(result); result = utils_1.utils.isNaNSafe(-1.123); chai_1.assert.isFalse(result); result = utils_1.utils.isNaNSafe(1); chai_1.assert.isFalse(result); result = utils_1.utils.isNaNSafe(1.123); chai_1.assert.isFalse(result); }); it('Invalid numbers', () => { let result = utils_1.utils.isNaNSafe(null); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe(undefined); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe(''); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe(' '); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe('abc'); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe('123abc'); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe('12.3abc'); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe(true); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe(false); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe({}); chai_1.assert.isTrue(result); result = utils_1.utils.isNaNSafe([]); chai_1.assert.isTrue(result); }); }); // ========================================== // sleep() // ========================================== describe('sleep()', () => { it("The 'sleep()' function await correctly", async () => { const start = new Date().getTime(); await utils_1.utils.sleep(500); const end = new Date().getTime(); chai_1.assert.isTrue(end - start > 450); }); }); // ========================================== // isSafeToDelete() // ========================================== describe('isSafeToDelete()', () => { const utilsObj = new utils_1.Utils(); it('Safe paths', async () => { chai_1.assert.isTrue(utilsObj.isSafeToDelete('/toto/titi')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('/toto/titi.txt')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('/toto/.titi')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('/toto/titi/tutu')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('/toto/titi/tutu.txt')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:\\toto\\titi')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:\\toto\\titi.txt')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:\\toto\\titi\\tutu')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:\\toto\\titi\\tutu.txt')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:/toto/titi')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:/toto/titi.txt')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:/toto/.titi')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:/toto/titi/tutu')); chai_1.assert.isTrue(utilsObj.isSafeToDelete('C:/toto/titi/tutu.txt')); }); it('Unsafe paths', async () => { chai_1.assert.isFalse(utilsObj.isSafeToDelete(undefined)); chai_1.assert.isFalse(utilsObj.isSafeToDelete(null)); chai_1.assert.isFalse(utilsObj.isSafeToDelete('')); chai_1.assert.isFalse(utilsObj.isSafeToDelete(' ')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('/')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('/ ')); chai_1.assert.isFalse(utilsObj.isSafeToDelete(' / ')); chai_1.assert.isFalse(utilsObj.isSafeToDelete(' // ')); chai_1.assert.isFalse(utilsObj.isSafeToDelete(' / / ')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('//')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('///')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('//////')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('//\n')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('//\r')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('//\t')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('/titi')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('//titi')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('/////titi')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('/////titi///////')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('/titi.txt')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('\\')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('\\\\')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('\\\\ ')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C:')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C:\\')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C:\\ ')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C:\\titi')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C:\\titi.txt')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C://')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C://titi')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C://titi.txt')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('C:////titi')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('\r')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('\n')); chai_1.assert.isFalse(utilsObj.isSafeToDelete('\t')); }); }); // ========================================== // isDir() // ========================================== describe('isDir()', () => { before(async () => { if (!fs.existsSync(constants_1.constants.testDataDirPath)) { fs.mkdirSync(constants_1.constants.testDataDirPath); } }); it('Is dir', () => { const thePath = constants_1.constants.testDataDirPath + '/' + (0, uuid_1.v4)(); chai_1.assert.isFalse(utils_1.utils.isDir(thePath)); chai_1.assert.isFalse(fs.existsSync(thePath)); fs.mkdirSync(thePath); chai_1.assert.isTrue(utils_1.utils.isDir(thePath)); chai_1.assert.isTrue(fs.existsSync(thePath)); }); it('Is a file', () => { const thePath = constants_1.constants.testDataDirPath + '/' + (0, uuid_1.v4)(); chai_1.assert.isFalse(utils_1.utils.isDir(thePath)); chai_1.assert.isFalse(fs.existsSync(thePath)); fs.createFileSync(thePath); chai_1.assert.isTrue(fs.existsSync(thePath)); chai_1.assert.isFalse(utils_1.utils.isDir(thePath)); }); }); // ========================================== // isDirEmpty() // ========================================== describe('isDirEmpty()', () => { it('Is dir - empty', () => { const thePath = constants_1.constants.testDataDirPath + '/' + (0, uuid_1.v4)(); chai_1.assert.isTrue(utils_1.utils.isDirEmpty(thePath)); fs.mkdirSync(thePath); chai_1.assert.isTrue(utils_1.utils.isDirEmpty(thePath)); }); it('Is dir - not empty', () => { const thePath = constants_1.constants.testDataDirPath + '/' + (0, uuid_1.v4)(); fs.mkdirSync(thePath); fs.createFileSync(thePath + '/test'); chai_1.assert.isFalse(utils_1.utils.isDirEmpty(thePath)); }); it('Is a file', () => { const thePath = constants_1.constants.testDataDirPath + '/' + (0, uuid_1.v4)(); chai_1.assert.isTrue(utils_1.utils.isDirEmpty(thePath)); fs.createFileSync(thePath); chai_1.assert.isFalse(utils_1.utils.isDirEmpty(thePath)); }); }); // ========================================== // deleteFile() // ========================================== describe('deleteFile()', async () => { it('Safe file', async () => { const tempFilePath = constants_1.constants.testDataDirPath + '/tmp' + new Date().getTime(); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); fs.createFileSync(tempFilePath); chai_1.assert.isTrue(fs.existsSync(tempFilePath)); await utils_1.utils.deleteFile(tempFilePath); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); }); it('Unsafe file', async () => { // root file const tempFilePath = '/tmp' + new Date().getTime(); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); let error = false; try { await utils_1.utils.deleteFile(tempFilePath); } catch (err) { error = true; } chai_1.assert.isTrue(error); }); }); // ========================================== // deleteDir() // ========================================== describe('deleteDir()', async () => { it('Safe dir', async () => { const tempFilePath = constants_1.constants.testDataDirPath + '/tmp' + new Date().getTime(); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); fs.mkdirSync(tempFilePath); fs.createFileSync(tempFilePath + '/someFile'); fs.mkdirSync(tempFilePath + '/subDir'); fs.createFileSync(tempFilePath + '/subDir/.anotherFile'); chai_1.assert.isTrue(fs.existsSync(tempFilePath)); await utils_1.utils.deleteDir(tempFilePath); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); }); it('Unsafe dir', async () => { const tempFilePath = '/tmp' + new Date().getTime(); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); let error = false; try { await utils_1.utils.deleteDir(tempFilePath); } catch (err) { error = true; } chai_1.assert.isTrue(error); }); }); // ========================================== // clearDir() // ========================================== describe('clearDir()', async () => { it('Safe dir', async () => { if (!fs.existsSync(constants_1.constants.testDataDirPath)) { fs.mkdirSync(constants_1.constants.testDataDirPath); } const tempFilePath = constants_1.constants.testDataDirPath + '/tmp' + new Date().getTime(); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); fs.mkdirSync(tempFilePath); try { fs.createFileSync(tempFilePath + '/someFile'); fs.createFileSync(tempFilePath + '/.someFile2'); fs.mkdirSync(tempFilePath + '/subDir'); fs.createFileSync(tempFilePath + '/subDir/.anotherFile'); chai_1.assert.isTrue(fs.existsSync(tempFilePath)); chai_1.assert.isTrue(fs.existsSync(tempFilePath + '/someFile')); chai_1.assert.isTrue(fs.existsSync(tempFilePath + '/.someFile2')); chai_1.assert.isTrue(fs.existsSync(tempFilePath + '/subDir')); await utils_1.utils.clearDir(tempFilePath); chai_1.assert.isTrue(fs.existsSync(tempFilePath)); chai_1.assert.isFalse(fs.existsSync(tempFilePath + '/someFile')); chai_1.assert.isFalse(fs.existsSync(tempFilePath + '/.someFile2')); chai_1.assert.isFalse(fs.existsSync(tempFilePath + '/subDir')); } finally { await utils_1.utils.deleteDir(tempFilePath); } }); it('Unsafe dir', async () => { const tempFilePath = '/tmp' + new Date().getTime(); chai_1.assert.isFalse(fs.existsSync(tempFilePath)); let error = false; try { await utils_1.utils.clearDir(tempFilePath); } catch (err) { error = true; } chai_1.assert.isTrue(error); }); }); // ========================================== // getDefinedOrNull() // ========================================== describe('getDefinedOrNull()', async () => { it('Defined stays untouches', async () => { let res = utils_1.utils.getDefinedOrNull('abc'); chai_1.assert.strictEqual(res, 'abc'); res = utils_1.utils.getDefinedOrNull(''); chai_1.assert.strictEqual(res, ''); res = utils_1.utils.getDefinedOrNull(123); chai_1.assert.strictEqual(res, 123); res = utils_1.utils.getDefinedOrNull({}); chai_1.assert.deepEqual(res, {}); res = utils_1.utils.getDefinedOrNull([]); chai_1.assert.deepEqual(res, []); }); it('Null stays Null', async () => { const res = utils_1.utils.getDefinedOrNull(null); chai_1.assert.strictEqual(res, null); }); it('Undefined becomes Null', async () => { const res = utils_1.utils.getDefinedOrNull(undefined); chai_1.assert.strictEqual(res, null); }); }); describe('findFreePort', () => { it('', async () => { const port = await utils_1.utils.findFreePort(); chai_1.assert.isOk(port); chai_1.assert.isNumber(port); }); }); describe('isValidDate', () => { it('valid date - Date', async () => { chai_1.assert.isTrue(utils_1.utils.isValidDate(new Date())); }); it('valid date - Date from valid string', async () => { const date = new Date('2011-04-11T10:20:30Z'); chai_1.assert.isTrue(utils_1.utils.isValidDate(date)); }); it('invalid date - Date from invalid string', async () => { const date = new Date('toto'); chai_1.assert.isFalse(utils_1.utils.isValidDate(date)); }); it('invalid date - various', async () => { for (const date of [[], 123, `toto`, {}, ``, ` `, null, undefined]) { chai_1.assert.isFalse(utils_1.utils.isValidDate(date)); } }); }); describe('dateTransformer', () => { it('valid date as Date', async () => { const date = utils_1.utils.dateTransformer(new Date()); chai_1.assert.isOk(date); chai_1.assert.isTrue(utils_1.utils.isValidDate(date)); }); it('valid date as string', async () => { let date = utils_1.utils.dateTransformer('2011-04-11T10:20:30Z'); chai_1.assert.isOk(date); chai_1.assert.isTrue(utils_1.utils.isValidDate(date)); date = utils_1.utils.dateTransformer('2011-04-11'); chai_1.assert.isOk(date); chai_1.assert.isTrue(utils_1.utils.isValidDate(date)); }); it('empty date', async () => { for (const dateLike of [null, undefined]) { const date = utils_1.utils.dateTransformer(dateLike); chai_1.assert.isNull(date); } }); it('invalid date', async () => { for (const dateLike of [``, ` `, 123, true, [], {}, 'toto']) { const date = utils_1.utils.dateTransformer(dateLike); chai_1.assert.isOk(date); chai_1.assert.isFalse(utils_1.utils.isValidDate(date)); } }); }); describe('throwNotManaged', () => { const tmpRepPath = constants_1.constants.testDataDirPath + '/test_throwNotManaged'; before(async () => { if (!fs.existsSync(constants_1.constants.testDataDirPath)) { fs.mkdirSync(constants_1.constants.testDataDirPath); } if (fs.existsSync(tmpRepPath)) { fs.removeSync(tmpRepPath); } fs.mkdirSync(tmpRepPath); }); after(async () => { fs.removeSync(constants_1.constants.testDataDirPath); }); it('compile', async function () { // May take some time to compile... this.timeout(7000); const fileName = (0, uuid_1.v4)(); const filesPathPrefix = tmpRepPath + '/' + fileName; const tsFilePath = filesPathPrefix + '.ts'; const content = fs.readFileSync(constants_1.constants.libRoot + '/tests-resources/throwNotManagedSuccess.txt', { encoding: 'utf-8', }); fs.writeFileSync(tsFilePath, content); await utils_1.utils.tsc([tsFilePath]); const distRepPath = constants_1.constants.libRoot + '/dist/test-data/test_throwNotManaged'; chai_1.assert.isTrue(fs.existsSync(distRepPath + '/' + fileName + '.js')); fs.removeSync(distRepPath); }); it("doesn't compile", async function () { // May take some time to compile... this.timeout(7000); if (fs.existsSync(tmpRepPath)) { fs.removeSync(tmpRepPath); } fs.mkdirSync(tmpRepPath); const fileName = (0, uuid_1.v4)(); const filesPathPrefix = tmpRepPath + '/' + fileName; const tsFilePath = filesPathPrefix + '.ts'; const content = fs.readFileSync(constants_1.constants.libRoot + '/tests-resources/throwNotManagedFail.txt', { encoding: 'utf-8', }); fs.writeFileSync(tsFilePath, content); try { await utils_1.utils.tsc([tsFilePath]); chai_1.assert.fail(); } catch (err) { // ok } }); it('throws error', async () => { try { utils_1.utils.throwNotManaged('my message', 'oups'); chai_1.assert.fail(); } catch (err) { /* ok */ } }); }); // ========================================== // isObjectStrict() // ========================================== describe('isObjectStrict()', () => { it('is object', () => { for (const value of [{}, new Object()]) { chai_1.assert.isTrue(utils_1.utils.isObjectStrict(value)); } }); it('is not object', () => { for (const value of [ [], [123], // tslint:disable-next-line:prefer-array-literal [], null, undefined, '', ' ', 123, , new Date(), () => { /* ok */ }, ]) { chai_1.assert.isFalse(utils_1.utils.isObjectStrict(value)); } }); }); // ========================================== // arrayContainsObjectWithKeyEqualsTo() // ========================================== describe('arrayContainsObjectWithKeyEqualsTo()', () => { it('contains string', () => { const array = [ { aaa: 123, myKey: 'myValue', }, ]; chai_1.assert.isTrue(utils_1.utils.arrayContainsObjectWithKeyEqualsTo(array, 'myKey', 'myValue')); }); it('contains number', () => { const array = [ { aaa: 123, myKey: 12345, }, ]; chai_1.assert.isTrue(utils_1.utils.arrayContainsObjectWithKeyEqualsTo(array, 'myKey', 12345)); }); it('contains date', () => { const someDate = new Date(); const array = [ { aaa: 123, myKey: someDate, }, ]; chai_1.assert.isTrue(utils_1.utils.arrayContainsObjectWithKeyEqualsTo(array, 'myKey', someDate)); }); it('contains complex object', () => { const someDate = new Date(); const obj = { titi: 123, tutu: someDate, toto: [ 123, '', null, { juju: 123.45, }, ], tata: undefined, }; const array = [ { aaa: 123, myKey: obj, }, ]; chai_1.assert.isTrue(utils_1.utils.arrayContainsObjectWithKeyEqualsTo(array, 'myKey', obj)); }); it(`doesn't contains - no key match`, () => { const someDate = new Date(); const obj = { titi: 123, tutu: someDate, toto: [ 123, '', null, { juju: 123.45, }, ], tata: undefined, }; const array = [ { aaa: 123, nope: obj, }, ]; chai_1.assert.isFalse(utils_1.utils.arrayContainsObjectWithKeyEqualsTo(array, 'myKey', obj)); }); it(`doesn't contains - strict equality`, () => { const someDate = new Date(); const obj = { titi: 123, tutu: someDate, toto: [ 123, '', null, { juju: 123.45, }, ], tata: undefined, }; const array = [ { aaa: 123, myKey: obj, }, ]; chai_1.assert.isFalse(utils_1.utils.arrayContainsObjectWithKeyEqualsTo(array, 'myKey', { titi: '123', // as string! tutu: someDate, toto: [ 123, '', null, { juju: 123.45, }, ], tata: undefined, })); }); // ========================================== // range() // ========================================== describe('range()', () => { it('two positive', () => { const range = utils_1.utils.range(3, 6); chai_1.assert.deepEqual(range, [3, 4, 5, 6]); }); it('first negative', () => { const range = utils_1.utils.range(-1, 2); chai_1.assert.deepEqual(range, [-1, 0, 1, 2]); }); it('two negative', () => { const range = utils_1.utils.range(-3, -1); chai_1.assert.deepEqual(range, [-3, -2, -1]); }); it('first greater than second', () => { let error; try { utils_1.utils.range(3, 1); } catch (err) { error = err; } if (!error) { chai_1.assert.fail(); } }); it('float numbers', () => { let error; try { utils_1.utils.range(1.0, 3.5); } catch (err) { error = err; } if (!error) { chai_1.assert.fail(); } }); }); }); // ========================================== // exec() // ========================================== describe('exec()', () => { const dummyJs = `dist/tests-resources/exec/execTest`; it('default', async () => { const exitCode = await utils_1.utils.exec(`node`, [dummyJs]); chai_1.assert.deepEqual(exitCode, 0); }); it('bin missing', async () => { for (const bin of [undefined, null, '']) { try { await utils_1.utils.exec(bin); } catch (err) { chai_1.assert.isTrue(err instanceof utils_1.ExecError); chai_1.assert.isNumber(err.exitCode); chai_1.assert.notDeepEqual(err.exitCode, 0); } } }); it('invalid bin', async () => { try { await utils_1.utils.exec(`_NOPE`); } catch (err) { chai_1.assert.isTrue(err instanceof utils_1.ExecError); chai_1.assert.isNumber(err.exitCode); chai_1.assert.notDeepEqual(err.exitCode, 0); } }); it('file arg error', async () => { try { await utils_1.utils.exec(`node`, [`dist/_NOPE`]); } catch (err) { chai_1.assert.isTrue(err instanceof utils_1.ExecError); chai_1.assert.isNumber(err.exitCode); chai_1.assert.notDeepEqual(err.exitCode, 0); } }); it('error', async () => { let error; try { await utils_1.utils.exec(`node`, [dummyJs, `error`]); } catch (err) { error = err; } if (!error) { chai_1.assert.fail(); } chai_1.assert.isTrue(error instanceof utils_1.ExecError); chai_1.assert.isNumber(error.exitCode); chai_1.assert.notDeepEqual(error.exitCode, 0); }); it('exit code explicitly 0', async () => { const exitCode = await utils_1.utils.exec(`node`, [dummyJs, `customExitCode`, `0`]); chai_1.assert.deepEqual(exitCode, 0); }); it('custom exit code - error', async () => { let error; try { await utils_1.utils.exec(`node`, [dummyJs, `customExitCode`, `123`]); } catch (err) { error = err; } if (!error) { chai_1.assert.fail(); } chai_1.assert.isTrue(error instanceof utils_1.ExecError); chai_1.assert.isNumber(error.exitCode); chai_1.assert.deepEqual(error.exitCode, 123); }); it('custom exit code - success', async () => { const exitCode = await utils_1.utils.exec(`node`, [dummyJs, `customExitCode`, `123`], { successExitCodes: 123, }); chai_1.assert.deepEqual(exitCode, 123); }); it('custom exit code - multiple', async () => { let exitCode = await utils_1.utils.exec(`node`, [dummyJs, `customExitCode`, `123`], { successExitCodes: [0, 123], }); chai_1.assert.deepEqual(exitCode, 123); exitCode = await utils_1.utils.exec(`node`, [dummyJs, `success`], { successExitCodes: [0, 123], }); chai_1.assert.deepEqual(exitCode, 0); let error; try { await utils_1.utils.exec(`node`, [dummyJs, `customExitCode`, `1`], { successExitCodes: [0, 123], }); } catch (err) { error = err; } if (!error) { chai_1.assert.fail(); } chai_1.assert.isTrue(error instanceof utils_1.ExecError); chai_1.assert.isNumber(error.exitCode); chai_1.assert.deepEqual(error.exitCode, 1); }); it('output handler', async () => { let currentOut = ''; let currentErr = ''; let execOut = ''; let execErr = ''; const stdOutOriginal = process.stdout.write; const stdErrOriginal = process.stderr.write; try { process.stdout.write = (chunk) => { currentOut += chunk.toString(); return true; }; process.stderr.write = (chunk) => { currentErr += chunk.toString(); return true; }; await utils_1.utils.exec(`node`, [dummyJs], { outputHandler: (stdoutOutput, stderrOutput) => { execOut += stdoutOutput ? stdoutOutput : ''; execErr += stderrOutput ? stderrOutput : ''; }, }); chai_1.assert.isTrue(execOut.includes(`in dummy - info`)); chai_1.assert.isFalse(execOut.includes(`in dummy - error`)); chai_1.assert.isFalse(execErr.includes(`in dummy - info`)); chai_1.assert.isTrue(execErr.includes(`in dummy - error`)); chai_1.assert.isTrue(currentOut.includes(`in dummy - info`)); chai_1.assert.isFalse(currentOut.includes(`in dummy - error`)); chai_1.assert.isFalse(currentErr.includes(`in dummy - info`)); chai_1.assert.isTrue(currentErr.includes(`in dummy - error`)); } finally { process.stdout.write = stdOutOriginal; process.stderr.write = stdErrOriginal; } }); it('output handler + disableConsoleOutputs', async () => { let currentOut = ''; let currentErr = ''; let execOut = ''; let execErr = ''; const stdOutOriginal = process.stdout.write; const stdErrOriginal = process.stderr.write; try { process.stdout.write = (chunk) => { currentOut += chunk.toString(); return true; }; process.stderr.write = (chunk) => { currentErr += chunk.toString();