Skip to content
This repository has been archived by the owner on Jun 18, 2021. It is now read-only.

Commit

Permalink
NET-176: use jest-circus as test runner (#214)
Browse files Browse the repository at this point in the history
Use `jest-circus` as test runner. Seems to resolve this issue jestjs/jest#9527 and the issue where a rejecting promise returned from `beforeAll` does not prevent test cases from being run. I had to fix tests cases that have both `done()` and `async` in use in them because circus throws an error if using both in a test. I also increased default test timeout to 10 seconds, as it seems 5 seconds is not enough in many cases.
  • Loading branch information
harbu authored Feb 3, 2021
1 parent 9720be5 commit 9f5bb14
Show file tree
Hide file tree
Showing 8 changed files with 142 additions and 253 deletions.
166 changes: 4 additions & 162 deletions jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,6 @@
// https://jestjs.io/docs/en/configuration.html

module.exports = {
// All imported modules in your tests should be mocked automatically
// automock: false,

// Stop running tests after the first failure
// bail: false,

// Respect "browser" field in package.json when resolving modules
// browser: false,

// The directory where Jest should store its cached dependency information
// cacheDirectory: "/var/folders/75/slcz0ppn06l0_4nypfdn808w0000gp/T/jest_dy",

// Automatically clear mock calls and instances between every test
clearMocks: true,

Expand All @@ -23,158 +11,12 @@ module.exports = {
// The directory where Jest should output its coverage files
coverageDirectory: 'coverage',

// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "/node_modules/"
// ],

// A list of reporter names that Jest uses when writing coverage reports
// coverageReporters: [
// "json",
// "text",
// "lcov",
// "clover"
// ],

// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: null,

// Make calling deprecated APIs throw helpful error messages
// errorOnDeprecated: false,

// Force coverage collection from ignored files usin a array of glob patterns
// forceCoverageMatch: [],

// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: null,

// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: null,

// A set of global variables that need to be available in all test environments
// globals: {},

// An array of directory names to be searched recursively up from the requiring module's location
// moduleDirectories: [
// "node_modules"
// ],

// An array of file extensions your modules use
// moduleFileExtensions: [
// "js",
// "json",
// "jsx",
// "node"
// ],

// A map from regular expressions to module names that allow to stub out resources with a single module
// moduleNameMapper: {},

// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module
// loader
// modulePathIgnorePatterns: [],

// Activates notifications for test results
// notify: false,

// An enum that specifies notification mode. Requires { notify: true }
// notifyMode: "always",

// A preset that is used as a base for Jest's configuration
// preset: null,

// Run tests from one or more projects
// projects: null,

// Use this configuration option to add custom reporters to Jest
// reporters: undefined,

// Automatically reset mock state between every test
// resetMocks: false,

// Reset the module registry before running each individual test
// resetModules: false,

// A path to a custom resolver
// resolver: null,

// Automatically restore mock state between every test
// restoreMocks: false,

// The root directory that Jest should scan for tests and modules within
// rootDir: null,

// A list of paths to directories that Jest should use to search for files in
// roots: [
// "<rootDir>"
// ],

// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",

// The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: [],

// The path to a module that runs some code to configure or set up the testing framework before each test
// setupTestFrameworkScriptFile: null,

// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],
// This option allows use of a custom test runner
testRunner: 'jest-circus/runner',

// The test environment that will be used for testing
testEnvironment: 'node',

// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},

// Adds a location field to test results
// testLocationInResults: false,

// The glob patterns Jest uses to detect test files
// testMatch: [
// "**/__tests__/**/*.js?(x)",
// "**/?(*.)+(spec|test).js?(x)"
// ],

// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
// testPathIgnorePatterns: [
// "/node_modules/"
// ],

// The regexp pattern Jest uses to detect test files
// testRegex: "",

// This option allows the use of a custom results processor
// testResultsProcessor: null,

// This option allows use of a custom test runner
// testRunner: "jasmine2",

// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "about:blank",

// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
// timers: "real",

// A map from regular expressions to paths to transformers
// transform: null,

// An array of regexp pattern strings that are matched against all source file paths, matched files will skip
// transformation
// transformIgnorePatterns: [
// "/node_modules/"
// ],

// An array of regexp pattern strings that are matched against all modules before the module loader will
// automatically return a mock for them
// unmockedModulePathPatterns: undefined,

// Indicates whether each individual test should be reported during the run
// verbose: null,

// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],

// Whether to use watchman for file crawling
// watchman: true,
// Default timeout of a test in milliseconds
testTimeout: 10000
}
35 changes: 35 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
"eslint-plugin-promise": "^4.2.1",
"into-stream": "^6.0.0",
"jest": "^26.6.3",
"jest-circus": "^26.6.3",
"sinon": "^9.2.4",
"stream-to-array": "^2.3.0",
"streamr-test-utils": "^1.2.1",
Expand Down
105 changes: 55 additions & 50 deletions test/integration/mqtt-error-handling.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,70 +52,75 @@ describe('MQTT error handling', () => {
await tracker.stop()
})

test('sending unrecognized packets causes client to be dropped without server crashing', async (done) => {
await setUpBroker(false)
socket = new net.Socket()

socket.connect(mqttPort, '127.0.0.1', () => {
for (let i = 0; i < 100; ++i) {
socket.write('nonsensepackage\r\n')
}
})

socket.on('close', (hadError) => {
// Make sure we didn't close with error
expect(hadError).toEqual(false)

// Ensure that server is indeed still up
newSocket = new net.Socket()
newSocket.on('error', (err) => {
done(err)
test('sending unrecognized packets causes client to be dropped without server crashing', (done) => {
setUpBroker(false).then(() => {
socket = new net.Socket()

socket.connect(mqttPort, '127.0.0.1', () => {
for (let i = 0; i < 100; ++i) {
socket.write('nonsensepackage\r\n')
}
})
newSocket.connect(mqttPort, '127.0.0.1', () => {
done()

socket.on('close', (hadError) => {
// Make sure we didn't close with error
expect(hadError).toEqual(false)

// Ensure that server is indeed still up
newSocket = new net.Socket()
newSocket.on('error', (err) => {
done(err)
})
newSocket.connect(mqttPort, '127.0.0.1', () => {
done()
})
})
})
})

it('test no password given', async (done) => {
await setUpBroker(false)
mqttClient = createMqttClient(mqttPort, 'localhost', null)
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Bad username or password')
mqttClient.end(true)
done()
it('test no password given', (done) => {
setUpBroker(false).then(() => {
mqttClient = createMqttClient(mqttPort, 'localhost', null)
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Bad username or password')
mqttClient.end(true)
done()
})
})
})

it('test not valid api key', async (done) => {
await setUpBroker(false)
mqttClient = createMqttClient(mqttPort, 'localhost', 'NOT_VALID_KEY')
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Bad username or password')
mqttClient.end(true)
done()
it('test not valid api key', (done) => {
setUpBroker(false).then(() => {
mqttClient = createMqttClient(mqttPort, 'localhost', 'NOT_VALID_KEY')
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Bad username or password')
mqttClient.end(true)
done()
})
})
})

it('test streamFetcher service unavailable', async (done) => {
await setUpBroker(true)
mqttClient = createMqttClient(mqttPort)
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Server unavailable')
mqttClient.end(true)
done()
it('test streamFetcher service unavailable', (done) => {
setUpBroker(true).then(() => {
mqttClient = createMqttClient(mqttPort)
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Server unavailable')
mqttClient.end(true)
done()
})
})
})

it('test valid api key without permissions to stream', async (done) => {
await setUpBroker(false)
mqttClient = createMqttClient(mqttPort)
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Not authorized')
done()
})
mqttClient.publish('NOT_VALID_STREAM', 'key: 1', {
qos: 1
it('test valid api key without permissions to stream', (done) => {
setUpBroker(false).then(() => {
mqttClient = createMqttClient(mqttPort)
mqttClient.on('error', (err) => {
expect(err.message).toEqual('Connection refused: Not authorized')
done()
})
mqttClient.publish('NOT_VALID_STREAM', 'key: 1', {
qos: 1
})
})
})
})
2 changes: 0 additions & 2 deletions test/integration/per-node-stream-metrics.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
const { startTracker } = require('streamr-network')
const fetch = require('node-fetch')
const { wait, waitForCondition } = require('streamr-test-utils')

const { startBroker, createClient } = require('../utils')

Expand Down
Loading

0 comments on commit 9f5bb14

Please sign in to comment.