diff --git a/package-lock.json b/package-lock.json index 7e46e9ee5a..c551cb6164 100644 --- a/package-lock.json +++ b/package-lock.json @@ -518,6 +518,12 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -707,6 +713,12 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -1173,6 +1185,12 @@ } } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -3082,6 +3100,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "marky": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz", @@ -4455,6 +4479,16 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "spawn-wrap": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", @@ -4791,6 +4825,28 @@ "punycode": "^2.1.1" } }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -4829,6 +4885,12 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + }, "ua-parser-js": { "version": "0.7.22", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", @@ -5122,6 +5184,12 @@ "fd-slicer": "~1.1.0" } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "zip-stream": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.2.tgz", diff --git a/package.json b/package.json index d57a0b3bd8..005a47ead5 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,8 @@ "nock": "^10.0.6", "nyc": "^14.1.1", "selenium-webdriver": "^4.0.0-beta.2", + "ts-node": "^9.1.1", + "typescript": "^4.2.3", "webdriverio": "^6.6.6" }, "peerDependencies": { diff --git a/test/sampletests/typescript/sample.ts b/test/sampletests/typescript/sample.ts new file mode 100644 index 0000000000..1e96556a77 --- /dev/null +++ b/test/sampletests/typescript/sample.ts @@ -0,0 +1,10 @@ +module.exports = { + demoTest: function(client: any) { + client.url('http://localhost') + .assert.elementPresent('#weblogin'); + }, + + after: function(client: any) { + client.end(); + } +}; diff --git a/test/src/runner/cli/testParallelExecution.js b/test/src/runner/cli/testParallelExecution.js index 909d1ef08c..bbcfd710d4 100644 --- a/test/src/runner/cli/testParallelExecution.js +++ b/test/src/runner/cli/testParallelExecution.js @@ -94,7 +94,7 @@ describe('test Parallel Execution', function() { assert.ok(runner.test_settings.test_workers); return runner.runTests().then(_ => { - assert.strictEqual(allArgs.length, 48); + assert.strictEqual(allArgs.length, 49); assert.strictEqual(runner.concurrency.globalExitCode, 0); }); }); @@ -136,7 +136,7 @@ describe('test Parallel Execution', function() { }); return runner.runTests().then(_ => { - assert.strictEqual(allArgs.length, 48); + assert.strictEqual(allArgs.length, 49); }); }); @@ -165,7 +165,7 @@ describe('test Parallel Execution', function() { }); return runner.runTests().then(_ => { - assert.strictEqual(allArgs.length, 48); + assert.strictEqual(allArgs.length, 49); }); }); diff --git a/test/src/runner/testRunnerTypeScript.js b/test/src/runner/testRunnerTypeScript.js new file mode 100644 index 0000000000..ec026f67d2 --- /dev/null +++ b/test/src/runner/testRunnerTypeScript.js @@ -0,0 +1,60 @@ +const path = require('path'); +const assert = require('assert'); +const common = require('../../common.js'); +const MockServer = require('../../lib/mockserver.js'); +const NightwatchClient = common.require('index.js'); + +describe('testRunnerTypeScript', function() { + /** @type {import("ts-node").Service} */ + let tsNode; + + before(function(done) { + tsNode = require('ts-node').register(); + + this.server = MockServer.init(); + this.server.on('listening', () => { + done(); + }); + }); + + after(function(done) { + tsNode.enabled(false); + + this.server.close(function() { + done(); + }); + }); + + beforeEach(function() { + process.removeAllListeners('exit'); + process.removeAllListeners('uncaughtException'); + process.removeAllListeners('unhandledRejection'); + }); + + it('testRunSimple', function() { + let testsPath = path.join(__dirname, '../../sampletests/typescript'); + let globals = { + reporter(results) { + assert.ok('sample' in results.modules); + assert.ok('demoTest' in results.modules['sample'].completed); + assert.strictEqual(results.modules['sample'].modulePath, path.join(__dirname, '../../sampletests/typescript/sample.ts')); + + if (results.lastError) { + throw results.lastError; + } + } + }; + + return NightwatchClient.runTests(testsPath, { + selenium: { + port: 10195, + version2: true, + start_process: true + }, + output: false, + persist_globals: true, + globals: globals, + output_folder: false + }); + }); +});