From 38bafba4495c945c88cc266aa6f4fdac80354afa Mon Sep 17 00:00:00 2001 From: Caleb Kniffen Date: Tue, 19 Sep 2023 14:57:34 -0500 Subject: [PATCH] test: run address-codec tests in the browser (#2466) Update tests to use jasmine compatible functions. This means changing `test` to `it`, `toStrictEqual` to `toEqual` (which is still strict), `toThrowError` to `toError`, and updating the param for toError to pass an `Error` object. Remove the need to specify --single-run. --- karma.config.js | 28 +++++++ packages/ripple-address-codec/HISTORY.md | 3 + packages/ripple-address-codec/karma.config.js | 15 ++++ packages/ripple-address-codec/package.json | 1 + .../ripple-address-codec/test/index.test.ts | 32 ++++---- .../ripple-address-codec/test/utils.test.ts | 26 +++---- .../test/webpack.config.js | 9 +++ .../test/xrp-codec.test.ts | 78 +++++++++++-------- packages/secret-numbers/karma.config.js | 31 +------- packages/secret-numbers/package.json | 2 +- .../secret-numbers/test/webpack.config.js | 64 ++------------- packages/xrpl/karma.config.js | 33 +------- packages/xrpl/package.json | 2 +- packages/xrpl/test/webpack.config.js | 64 ++------------- weback.test.config.js | 60 ++++++++++++++ 15 files changed, 213 insertions(+), 235 deletions(-) create mode 100644 karma.config.js create mode 100644 packages/ripple-address-codec/karma.config.js create mode 100644 packages/ripple-address-codec/test/webpack.config.js create mode 100644 weback.test.config.js diff --git a/karma.config.js b/karma.config.js new file mode 100644 index 0000000000..60ce9a5500 --- /dev/null +++ b/karma.config.js @@ -0,0 +1,28 @@ +module.exports = function (config) { + config.set({ + plugins: ["karma-webpack", "karma-jasmine", "karma-chrome-launcher"], + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ["jasmine"], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + // Use webpack to bundle our test files + "test/**/*.test.ts": ["webpack"], + }, + + browsers: ["ChromeHeadless"], + // runs only one browser at a time + concurrency: 1, + // CI mode + singleRun: true, + client: { + jasmine: { + // ensures that tests are run in order instead of a random order + random: false, + }, + }, + }); +}; diff --git a/packages/ripple-address-codec/HISTORY.md b/packages/ripple-address-codec/HISTORY.md index 5301df1303..0716b46f3d 100644 --- a/packages/ripple-address-codec/HISTORY.md +++ b/packages/ripple-address-codec/HISTORY.md @@ -6,6 +6,9 @@ * Remove Node 14 support * Remove `assert` dependency. If you were catching `AssertionError` you need to change to `Error`. +### Changes +* Execute test in a browser in addition to node + ## 4.3.1 (2023-09-27) ### Fixed * Fix source-maps not finding their designated source diff --git a/packages/ripple-address-codec/karma.config.js b/packages/ripple-address-codec/karma.config.js new file mode 100644 index 0000000000..4ad4b5df2d --- /dev/null +++ b/packages/ripple-address-codec/karma.config.js @@ -0,0 +1,15 @@ +const baseKarmaConfig = require('../../karma.config') +const webpackConfig = require('./test/webpack.config') +delete webpackConfig.entry + +module.exports = function (config) { + baseKarmaConfig(config) + + config.set({ + base: '', + webpack: webpackConfig, + + // list of files / patterns to load in the browser + files: ['test/**/*.test.ts'], + }) +} diff --git a/packages/ripple-address-codec/package.json b/packages/ripple-address-codec/package.json index 4593ce2bbb..4b0f032655 100644 --- a/packages/ripple-address-codec/package.json +++ b/packages/ripple-address-codec/package.json @@ -28,6 +28,7 @@ "scripts": { "build": "tsc --build tsconfig.build.json", "test": "jest --verbose false --silent=false ./test/*.test.ts", + "test:browser": "npm run build && karma start ./karma.config.js", "lint": "eslint . --ext .ts", "clean": "rm -rf ./dist ./coverage ./test/testCompiledForWeb tsconfig.build.tsbuildinfo" }, diff --git a/packages/ripple-address-codec/test/index.test.ts b/packages/ripple-address-codec/test/index.test.ts index 57d5c50657..49f470dff7 100644 --- a/packages/ripple-address-codec/test/index.test.ts +++ b/packages/ripple-address-codec/test/index.test.ts @@ -159,7 +159,7 @@ const testCases: AddressTestCase[] = [ const classicAddress = testCase[0] const tag = testCase[1] === false ? false : testCase[1] const xAddress = isTestAddress ? testCase[3] : testCase[2] - test(`Converts ${classicAddress}${ + it(`Converts ${classicAddress}${ tag ? `:${tag}` : '' } to ${xAddress}${network}`, () => { expect(classicAddressToXAddress(classicAddress, tag, isTestAddress)).toBe( @@ -179,19 +179,19 @@ const testCases: AddressTestCase[] = [ const classicAddress = 'rGWrZyQqhTp9Xu7G5Pkayo7bXjH4k4QYpf' const tag = MAX_32_BIT_UNSIGNED_INT + 1 - test(`Converting ${classicAddress}:${tag}${network} throws`, () => { + it(`Converting ${classicAddress}:${tag}${network} throws`, () => { expect(() => { classicAddressToXAddress(classicAddress, tag, isTestAddress) - }).toThrowError(new Error('Invalid tag')) + }).toThrow(new Error('Invalid tag')) }) } { const classicAddress = 'r' - test(`Invalid classic address: Converting ${classicAddress}${network} throws`, () => { + it(`Invalid classic address: Converting ${classicAddress}${network} throws`, () => { expect(() => { classicAddressToXAddress(classicAddress, false, isTestAddress) - }).toThrowError( + }).toThrow( new Error('invalid_input_size: decoded data must have length >= 5'), ) }) @@ -215,7 +215,7 @@ const testCases: AddressTestCase[] = [ tagTestCases.forEach((testCase) => { const tag = testCase || false const xAddress = encodeXAddress(accountId, tag, isTestAddress) - test(`Encoding ${accountId.toString('hex')}${ + it(`Encoding ${accountId.toString('hex')}${ tag ? `:${tag}` : '' } to ${xAddress} has expected length`, () => { expect(xAddress.length).toBe(47) @@ -227,23 +227,23 @@ const testCases: AddressTestCase[] = [ { const xAddress = 'XVLhHMPHU98es4dbozjVtdWzVrDjtV5fdx1mHp98tDMoQXa' - test(`Invalid X-address (bad checksum): Converting ${xAddress} throws`, () => { + it(`Invalid X-address (bad checksum): Converting ${xAddress} throws`, () => { expect(() => { xAddressToClassicAddress(xAddress) - }).toThrowError(new Error('checksum_invalid')) + }).toThrow(new Error('checksum_invalid')) }) } { const xAddress = 'dGzKGt8CVpWoa8aWL1k18tAdy9Won3PxynvbbpkAqp3V47g' - test(`Invalid X-address (bad prefix): Converting ${xAddress} throws`, () => { + it(`Invalid X-address (bad prefix): Converting ${xAddress} throws`, () => { expect(() => { xAddressToClassicAddress(xAddress) - }).toThrowError(new Error('Invalid X-address: bad prefix')) + }).toThrow(new Error('Invalid X-address: bad prefix')) }) } -test(`Invalid X-address (64-bit tag) throws`, () => { +it(`Invalid X-address (64-bit tag) throws`, () => { expect(() => { // Encoded from: // { @@ -251,22 +251,22 @@ test(`Invalid X-address (64-bit tag) throws`, () => { // tag: MAX_32_BIT_UNSIGNED_INT + 1 // } xAddressToClassicAddress('XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8zeUygYrCgrPh') - }).toThrowError('Unsupported X-address') + }).toThrow(new Error('Unsupported X-address')) }) -test(`Invalid Account ID throws`, () => { +it(`Invalid Account ID throws`, () => { expect(() => { encodeXAddress(Buffer.from('00'.repeat(19), 'hex'), false, false) - }).toThrowError('Account ID must be 20 bytes') + }).toThrow(new Error('Account ID must be 20 bytes')) }) -test(`isValidXAddress returns false for invalid X-address`, () => { +it(`isValidXAddress returns false for invalid X-address`, () => { expect( isValidXAddress('XVLhHMPHU98es4dbozjVtdWzVrDjtV18pX8zeUygYrCgrPh'), ).toBe(false) }) -test(`Converts X7AcgcsBL6XDcUb... to r9cZA1mLK5R5A... and tag: false`, () => { +it(`Converts X7AcgcsBL6XDcUb... to r9cZA1mLK5R5A... and tag: false`, () => { const classicAddress = 'r9cZA1mLK5R5Am25ArfXFmqgNwjZgnfk59' // eslint-disable-next-line @typescript-eslint/naming-convention -- tag can be false or a number const tag = false diff --git a/packages/ripple-address-codec/test/utils.test.ts b/packages/ripple-address-codec/test/utils.test.ts index dfac224fc7..7ef002bbd6 100644 --- a/packages/ripple-address-codec/test/utils.test.ts +++ b/packages/ripple-address-codec/test/utils.test.ts @@ -1,42 +1,42 @@ import { seqEqual, concatArgs } from '../src/utils' -test('two sequences are equal', () => { +it('two sequences are equal', () => { expect(seqEqual([1, 2, 3], [1, 2, 3])).toBe(true) }) -test('elements must be in the same order', () => { +it('elements must be in the same order', () => { expect(seqEqual([3, 2, 1], [1, 2, 3])).toBe(false) }) -test('sequences do not need to be the same type', () => { +it('sequences do not need to be the same type', () => { expect(seqEqual(Buffer.from([1, 2, 3]), [1, 2, 3])).toBe(true) expect(seqEqual(Buffer.from([1, 2, 3]), new Uint8Array([1, 2, 3]))).toBe(true) }) -test('sequences with a single element', () => { +it('sequences with a single element', () => { expect(seqEqual(Buffer.from([1]), [1])).toBe(true) expect(seqEqual(Buffer.from([1]), new Uint8Array([1]))).toBe(true) }) -test('empty sequences', () => { +it('empty sequences', () => { expect(seqEqual(Buffer.from([]), [])).toBe(true) expect(seqEqual(Buffer.from([]), new Uint8Array([]))).toBe(true) }) -test('plain numbers are concatenated', () => { - expect(concatArgs(10, 20, 30, 40)).toStrictEqual([10, 20, 30, 40]) +it('plain numbers are concatenated', () => { + expect(concatArgs(10, 20, 30, 40)).toEqual([10, 20, 30, 40]) }) -test('a variety of values are concatenated', () => { +it('a variety of values are concatenated', () => { expect( concatArgs(1, [2, 3], Buffer.from([4, 5]), new Uint8Array([6, 7])), - ).toStrictEqual([1, 2, 3, 4, 5, 6, 7]) + ).toEqual([1, 2, 3, 4, 5, 6, 7]) }) -test('a single value is returned as an array', () => { - expect(concatArgs(Buffer.from([7]))).toStrictEqual([7]) +it('a single value is returned as an array', () => { + expect(concatArgs(Buffer.from([7]))).toEqual([7]) }) -test('no arguments returns an empty array', () => { - expect(concatArgs()).toStrictEqual([]) +it('no arguments returns an empty array', () => { + expect(concatArgs()).toEqual([]) }) diff --git a/packages/ripple-address-codec/test/webpack.config.js b/packages/ripple-address-codec/test/webpack.config.js new file mode 100644 index 0000000000..db2ec8642d --- /dev/null +++ b/packages/ripple-address-codec/test/webpack.config.js @@ -0,0 +1,9 @@ +'use strict' +const { merge } = require('webpack-merge') +const { webpackForTest } = require('../../../weback.test.config') +const { getDefaultConfiguration } = require('../../../webpack.config') + +module.exports = merge( + getDefaultConfiguration(), + webpackForTest('./test/index.ts', __dirname), +) diff --git a/packages/ripple-address-codec/test/xrp-codec.test.ts b/packages/ripple-address-codec/test/xrp-codec.test.ts index c70123e75b..6c1ee428ce 100644 --- a/packages/ripple-address-codec/test/xrp-codec.test.ts +++ b/packages/ripple-address-codec/test/xrp-codec.test.ts @@ -34,11 +34,11 @@ function makeEncodeDecodeTest( base58: string, hex: string, ): void { - test(`can translate between ${hex} and ${base58}`, function () { + it(`can translate between ${hex} and ${base58}`, function () { const actual = encoder(toBytes(hex)) expect(actual).toBe(base58) }) - test(`can translate between ${base58} and ${hex})`, function () { + it(`can translate between ${base58} and ${hex})`, function () { const buf = decoder(base58) expect(toHex(buf)).toBe(hex) }) @@ -65,7 +65,7 @@ makeEncodeDecodeTest( '023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6', ) -test('can decode arbitrary seeds', function () { +it('can decode arbitrary seeds', function () { const decoded = decodeSeed('sEdTM1uX8pu2do5XvTnutH6HsouMaM2') expect(toHex(decoded.bytes)).toBe('4C3A1D213FBDFB14C7C28D609469B341') expect(decoded.type).toBe('ed25519') @@ -75,7 +75,7 @@ test('can decode arbitrary seeds', function () { expect(decoded2.type).toBe('secp256k1') }) -test('can pass a type as second arg to encodeSeed', function () { +it('can pass a type as second arg to encodeSeed', function () { const edSeed = 'sEdTM1uX8pu2do5XvTnutH6HsouMaM2' const decoded = decodeSeed(edSeed) const type = 'ed25519' @@ -84,21 +84,21 @@ test('can pass a type as second arg to encodeSeed', function () { expect(encodeSeed(decoded.bytes, type)).toBe(edSeed) }) -test('isValidClassicAddress - secp256k1 address valid', function () { +it('isValidClassicAddress - secp256k1 address valid', function () { expect(isValidClassicAddress('rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw1')).toBe(true) }) -test('isValidClassicAddress - ed25519 address valid', function () { +it('isValidClassicAddress - ed25519 address valid', function () { expect(isValidClassicAddress('rLUEXYuLiQptky37CqLcm9USQpPiz5rkpD')).toBe(true) }) -test('isValidClassicAddress - invalid', function () { +it('isValidClassicAddress - invalid', function () { expect(isValidClassicAddress('rU6K7V3Po4snVhBBaU29sesqs2qTQJWDw2')).toBe( false, ) }) -test('isValidClassicAddress - empty', function () { +it('isValidClassicAddress - empty', function () { expect(isValidClassicAddress('')).toBe(false) }) @@ -151,22 +151,22 @@ describe('encodeSeed', function () { expect(result).toBe('sEdV19BLfeQeKdEXyYA4NhjPJe6XBfG') }) - test('attempting to encode a seed with less than 16 bytes of entropy throws', function () { + it('attempting to encode a seed with less than 16 bytes of entropy throws', function () { expect(() => { encodeSeed( Buffer.from('CF2DE378FBDD7E2EE87D486DFB5A7B', 'hex'), 'secp256k1', ) - }).toThrow('entropy must have length 16') + }).toThrow(new Error('entropy must have length 16')) }) - test('attempting to encode a seed with more than 16 bytes of entropy throws', function () { + it('attempting to encode a seed with more than 16 bytes of entropy throws', function () { expect(() => { encodeSeed( Buffer.from('CF2DE378FBDD7E2EE87D486DFB5A7BFFFF', 'hex'), 'secp256k1', ) - }).toThrow('entropy must have length 16') + }).toThrow(new Error('entropy must have length 16')) }) }) @@ -192,11 +192,13 @@ describe('encodeAccountID', function () { expect(encoded).toBe('rJrRMgiRgrU6hDF4pgu5DXQdWyPbY35ErN') }) - test('unexpected length should throw', function () { + it('unexpected length should throw', function () { expect(() => { encodeAccountID(Buffer.from('ABCDEF', 'hex')) }).toThrow( - 'unexpected_payload_length: bytes.length does not match expectedLength', + new Error( + 'unexpected_payload_length: bytes.length does not match expectedLength. Ensure that the bytes are a Buffer.', + ), ) }) }) @@ -212,7 +214,7 @@ describe('decodeNodePublic', function () { }) }) -test('encodes 123456789 with version byte of 0', () => { +it('encodes 123456789 with version byte of 0', () => { expect( codec.encode(Buffer.from('123456789'), { versions: [0], @@ -221,83 +223,93 @@ test('encodes 123456789 with version byte of 0', () => { ).toBe('rnaC7gW34M77Kneb78s') }) -test('multiple versions with no expected length should throw', () => { +it('multiple versions with no expected length should throw', () => { expect(() => { codec.decode('rnaC7gW34M77Kneb78s', { versions: [0, 1], }) }).toThrow( - 'expectedLength is required because there are >= 2 possible versions', + new Error( + 'expectedLength is required because there are >= 2 possible versions', + ), ) }) -test('attempting to decode data with length < 5 should throw', () => { +it('attempting to decode data with length < 5 should throw', () => { expect(() => { codec.decode('1234', { versions: [0], }) - }).toThrow('invalid_input_size: decoded data must have length >= 5') + }).toThrow( + new Error('invalid_input_size: decoded data must have length >= 5'), + ) }) -test('attempting to decode data with unexpected version should throw', () => { +it('attempting to decode data with unexpected version should throw', () => { expect(() => { codec.decode('rnaC7gW34M77Kneb78s', { versions: [2], }) }).toThrow( - 'version_invalid: version bytes do not match any of the provided version(s)', + new Error( + 'version_invalid: version bytes do not match any of the provided version(s)', + ), ) }) -test('invalid checksum should throw', () => { +it('invalid checksum should throw', () => { expect(() => { codec.decode('123456789', { versions: [0, 1], }) - }).toThrow('checksum_invalid') + }).toThrow(new Error('checksum_invalid')) }) -test('empty payload should throw', () => { +it('empty payload should throw', () => { expect(() => { codec.decode('', { versions: [0, 1], }) - }).toThrow('invalid_input_size: decoded data must have length >= 5') + }).toThrow( + new Error('invalid_input_size: decoded data must have length >= 5'), + ) }) -test('decode data', () => { +it('decode data', () => { expect( codec.decode('rnaC7gW34M77Kneb78s', { versions: [0], }), - ).toStrictEqual({ + ).toEqual({ version: [0], bytes: Buffer.from('123456789'), type: null, }) }) -test('decode data with expected length', function () { +it('decode data with expected length', function () { expect( codec.decode('rnaC7gW34M77Kneb78s', { versions: [0], expectedLength: 9, }), - ).toStrictEqual({ + ).toEqual({ version: [0], bytes: Buffer.from('123456789'), type: null, }) }) -test('decode data with wrong expected length should throw', function () { +it('decode data with wrong expected length should throw', function () { expect(() => { codec.decode('rnaC7gW34M77Kneb78s', { versions: [0], expectedLength: 8, }) }).toThrow( - 'version_invalid: version bytes do not match any of the provided version(s)', + new Error( + 'version_invalid: version bytes do not match any of the provided version(s)', + ), ) expect(() => { codec.decode('rnaC7gW34M77Kneb78s', { @@ -305,6 +317,8 @@ test('decode data with wrong expected length should throw', function () { expectedLength: 10, }) }).toThrow( - 'version_invalid: version bytes do not match any of the provided version(s)', + new Error( + 'version_invalid: version bytes do not match any of the provided version(s)', + ), ) }) diff --git a/packages/secret-numbers/karma.config.js b/packages/secret-numbers/karma.config.js index 5f623a5db6..ccafdf0463 100644 --- a/packages/secret-numbers/karma.config.js +++ b/packages/secret-numbers/karma.config.js @@ -1,39 +1,14 @@ const webpackConfig = require("./test/webpack.config"); +const baseKarmaConfig = require("../../karma.config"); delete webpackConfig.entry; module.exports = function (config) { config.set({ - plugins: ["karma-webpack", "karma-jasmine", "karma-chrome-launcher"], - - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: "", - webpack: webpackConfig, - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ["jasmine"], - // list of files / patterns to load in the browser files: ["build/xrplf-secret-numbers-latest.js", "test/*.test.ts"], - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - // Use webpack to bundle our test files - "test/*.test.ts": ["webpack"], - }, - - browsers: ["ChromeHeadless"], - // runs only one browser at a time - concurrency: 1, - // CI mode - singleRun: true, - client: { - jasmine: { - // ensures that tests are run in order instead of a random order - random: false, - }, - }, }); + + baseKarmaConfig(config); }; diff --git a/packages/secret-numbers/package.json b/packages/secret-numbers/package.json index 7759280a2a..213cc9afb5 100644 --- a/packages/secret-numbers/package.json +++ b/packages/secret-numbers/package.json @@ -10,7 +10,7 @@ "prepublish": "npm run clean && npm run lint && npm run test && npm run test:browser && npm run build", "clean": "rm -rf ./dist ./coverage ./test/testCompiledForWeb tsconfig.build.tsbuildinfo", "test": "jest --verbose", - "test:browser": "npm run build && npm run build:browserTests && karma start ./karma.config.js --single-run", + "test:browser": "npm run build && npm run build:browserTests && karma start ./karma.config.js", "build": "run-s build:lib build:web", "build:lib": "tsc --build tsconfig.build.json", "build:web": "webpack", diff --git a/packages/secret-numbers/test/webpack.config.js b/packages/secret-numbers/test/webpack.config.js index 90456787fc..a99403f1a6 100644 --- a/packages/secret-numbers/test/webpack.config.js +++ b/packages/secret-numbers/test/webpack.config.js @@ -1,61 +1,9 @@ "use strict"; -const assert = require("assert"); -const path = require("path"); -const webpack = require("webpack"); const { merge } = require("webpack-merge"); +const { webpackForTest } = require("../../../weback.test.config"); +const baseConfig = require("../webpack.base.config"); -function webpackForTest(testFileName) { - const match = testFileName.match(/\/?([^\/]*)\.ts$/); - if (!match) { - assert(false, "wrong filename:" + testFileName); - } - - const test = merge(require("../webpack.base.config"), { - mode: "production", - cache: true, - entry: testFileName, - output: { - library: match[1].replace(/-/g, "_"), - path: path.join(__dirname, "./testCompiledForWeb/"), - filename: match[1] + ".js", - }, - plugins: [ - new webpack.DefinePlugin({ - "process.stdout": {}, - }), - ], - module: { - rules: [ - // Compile the tests - { - test: /\.ts$/, - use: [ - { - loader: "ts-loader", - options: { - compilerOptions: { - lib: ["esnext", "dom"], - composite: false, - declaration: false, - declarationMap: false, - }, - }, - }, - ], - }, - ], - }, - node: { - global: true, - __filename: false, - __dirname: true, - }, - resolve: { - extensions: [".ts", ".js", ".json"], - }, - }); - - return test; -} - -module.exports = webpackForTest("./test/index.ts"); +module.exports = merge( + baseConfig, + webpackForTest("./test/index.ts", __dirname) +); diff --git a/packages/xrpl/karma.config.js b/packages/xrpl/karma.config.js index 7885d69430..41db67a3d4 100644 --- a/packages/xrpl/karma.config.js +++ b/packages/xrpl/karma.config.js @@ -1,39 +1,14 @@ -const webpackConfig = require('./test/webpack.config')[0]() +const baseKarmaConfig = require('../../karma.config') +const webpackConfig = require('./test/webpack.config') delete webpackConfig.entry module.exports = function (config) { config.set({ - plugins: ['karma-webpack', 'karma-jasmine', 'karma-chrome-launcher'], - - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: '', - webpack: webpackConfig, - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['jasmine'], - // list of files / patterns to load in the browser files: ['build/xrpl-latest.js', 'test/integration/**/*.test.ts'], - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - // Use webpack to bundle our test files - 'test/integration/**/*.test.ts': ['webpack'], - }, - - browsers: ['ChromeHeadless'], - // runs only one browser at a time - concurrency: 1, - // CI mode - singleRun: true, - client: { - jasmine: { - // ensures that tests are run in order instead of a random order - random: false, - }, - }, }) + + baseKarmaConfig(config) } diff --git a/packages/xrpl/package.json b/packages/xrpl/package.json index 2639869b73..2797708792 100644 --- a/packages/xrpl/package.json +++ b/packages/xrpl/package.json @@ -61,7 +61,7 @@ "prepublish": "run-s clean build", "test": "jest --config=jest.config.unit.js --verbose false --silent=false", "test:integration": "TS_NODE_PROJECT=tsconfig.build.json jest --config=jest.config.integration.js --verbose false --silent=false --runInBand", - "test:browser": "npm run build && npm run build:browserTests && karma start ./karma.config.js --single-run", + "test:browser": "npm run build && npm run build:browserTests && karma start ./karma.config.js", "test:watch": "jest --watch --verbose false --silent=false --runInBand ./test/**/*.test.ts --testPathIgnorePatterns=./test/integration --testPathIgnorePatterns=./test/fixtures", "format": "prettier --write '{src,test}/**/*.ts'", "lint": "eslint . --ext .ts --max-warnings 0", diff --git a/packages/xrpl/test/webpack.config.js b/packages/xrpl/test/webpack.config.js index d7017f1f98..624550acd0 100644 --- a/packages/xrpl/test/webpack.config.js +++ b/packages/xrpl/test/webpack.config.js @@ -1,64 +1,14 @@ -'use strict' -const assert = require('assert') -const path = require('path') -const webpack = require('webpack') const { merge } = require('webpack-merge') +const { webpackForTest } = require('../../../weback.test.config') -function webpackForTest(testFileName) { - const match = testFileName.match(/\/?([^\/]*)\.ts$/) - if (!match) { - assert(false, 'wrong filename:' + testFileName) - } - - return merge(require('../webpack.base.config'), { - mode: 'production', - cache: true, +module.exports = merge( + require('../webpack.base.config'), + webpackForTest('./test/integration/index.ts', __dirname), + { externals: [ { net: 'null', // net is used in tests to setup mock server }, ], - entry: testFileName, - output: { - library: match[1].replace(/-/g, '_'), - path: path.join(__dirname, './testCompiledForWeb/'), - filename: match[1] + '.js', - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.stdout': {}, - }), - ], - module: { - rules: [ - // Compile the tests - { - test: /\.ts$/, - use: [ - { - loader: 'ts-loader', - options: { - compilerOptions: { - lib: ['esnext', 'dom'], - composite: false, - declaration: false, - declarationMap: false, - }, - }, - }, - ], - }, - ], - }, - node: { - global: true, - __filename: false, - __dirname: true, - }, - resolve: { - extensions: ['.ts', '.js', '.json'], - }, - }) -} - -module.exports = [(env, argv) => webpackForTest('./test/integration/index.ts')] + }, +) diff --git a/weback.test.config.js b/weback.test.config.js new file mode 100644 index 0000000000..3bd9df5ad3 --- /dev/null +++ b/weback.test.config.js @@ -0,0 +1,60 @@ +"use strict"; +const assert = require("assert"); +const path = require("path"); +const webpack = require("webpack"); + +function webpackForTest(testFileName, basePath) { + const match = testFileName.match(/\/?([^\/]*)\.ts$/); + if (!match) { + assert(false, "wrong filename:" + testFileName); + } + + return { + mode: "production", + cache: true, + entry: testFileName, + output: { + library: match[1].replace(/-/g, "_"), + path: path.join(basePath, "./testCompiledForWeb/"), + filename: match[1] + ".js", + }, + plugins: [ + new webpack.DefinePlugin({ + "process.stdout": {}, + }), + ], + module: { + rules: [ + // Compile compile the tests + { + test: /\.ts$/, + use: [ + { + loader: "ts-loader", + options: { + compilerOptions: { + lib: ["esnext", "dom"], + composite: false, + declaration: false, + declarationMap: false, + }, + }, + }, + ], + }, + ], + }, + node: { + global: true, + __filename: false, + __dirname: true, + }, + resolve: { + extensions: [".ts", ".js", ".json"], + }, + }; +} + +module.exports = { + webpackForTest, +};