Skip to content

Commit

Permalink
Add notifications for test results (#1170)
Browse files Browse the repository at this point in the history
* Add growl notifications

* Move Growler to Config package

The reporters were moved from runtime to config, but the Growler class in this file did not move which broke the build.

* Move Growler to Config package

The reporters were moved from runtime to config, but the Growler class in this file did not move which broke the build.

* Fixing code according to abc-rule and fix typo in doc

* Add bigger jest logo for retina displays

* Use node-notifier for notifications and renamed class and parameter

* Replace unicode string with escaped values
  • Loading branch information
marcelerz authored and cpojer committed Jun 16, 2016
1 parent 13167dd commit 88cf095
Show file tree
Hide file tree
Showing 11 changed files with 106 additions and 1 deletion.
6 changes: 6 additions & 0 deletions docs/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ Jest uses Jasmine 2 by default. An introduction to Jasmine 2 can be found
- [`moduleNameMapper` [object<string, string>]](#modulenamemapper-object-string-string)
- [`modulePaths` [array<string>]](#modulepaths-array-string)
- [`modulePathIgnorePatterns` [array<string>]](#modulepathignorepatterns-array-string)
- [`notify` [boolean]](#notify-boolean)
- [`preprocessorIgnorePatterns` [array<string>]](#preprocessorignorepatterns-array-string)
- [`rootDir` [string]](#rootdir-string)
- [`scriptPreprocessor` [string]](#scriptpreprocessor-string)
Expand Down Expand Up @@ -544,6 +545,11 @@ Example:
}
```

### `notify` [boolean]
(default: `false`)

Activates notifications for test results.

### `rootDir` [string]
(default: The root of the directory containing the `package.json` *or* the [`pwd`](http://en.wikipedia.org/wiki/Pwd) if no `package.json` is found)

Expand Down
6 changes: 6 additions & 0 deletions packages/jest-cli/src/cli/args.js
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,12 @@ const options = {
),
type: 'boolean',
},
notify: {
description: wrap(
'Activates notifications for test results.'
),
type: 'boolean',
},
watch: {
description: wrap(
'Watch files for changes and rerun tests related to changed files. ' +
Expand Down
3 changes: 2 additions & 1 deletion packages/jest-config/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"jest-resolve": "^12.1.0",
"jest-runtime": "^12.1.0",
"jest-util": "^12.1.0",
"json-stable-stringify": "^1.0.0"
"json-stable-stringify": "^1.0.0",
"node-notifier": "^4.6.0"
},
"jest": {
"rootDir": "./build",
Expand Down
78 changes: 78 additions & 0 deletions packages/jest-config/src/Notifier.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @flow
*/
'use strict';

import type {AggregatedResult} from 'types/TestResult';

const notifier = require('node-notifier');
const path = require('path');
const util = require('util');

const isDarwin = process.platform === 'darwin';

const ICON = '/assets/jest_logo.png';
const NOTIFICATIONS = {
success: {
title: '%d%% Passed',
message: (isDarwin ? '\u2705 ' : '') + '%d tests passed',
icon: ICON,
},
failure: {
title: '%d%% Failed',
message: (isDarwin ? '\u26D4\uFE0F ' : '') + '%d of %d tests failed',
icon: ICON,
},
};

type Notification = {
title: string,
message: string,
icon: string,
};

class Notifier {

static onTestResults(result: AggregatedResult): void {
let info;
let title;
let message;

if (result.success) {
info = NOTIFICATIONS.success;
title = util.format(info.title, 100);
message = util.format(info.message, result.numPassedTests);
} else {
info = NOTIFICATIONS.failure;
title = util.format(info.title, Math.ceil(
(result.numFailedTests / result.numTotalTests) * 100,
));
message = util.format(
info.message,
result.numFailedTests,
result.numTotalTests,
);
}
const icon = path.join(__dirname, info.icon);

const notification = {
title,
message,
icon,
};

this.trigger(notification);
}

static trigger(notification: Notification): void {
notifier.notify(notification);
}
}

module.exports = Notifier;
Binary file added packages/jest-config/src/assets/jest_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions packages/jest-config/src/defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ module.exports = ({
modulePathIgnorePatterns: [],
noHighlight: false,
noStackTrace: false,
notify: false,
testEnvData: {},
testEnvironment: 'jest-environment-jsdom',
testPathDirs: ['<rootDir>'],
Expand Down
1 change: 1 addition & 0 deletions packages/jest-config/src/normalize.js
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ function normalize(config, argv) {
case 'name':
case 'noHighlight':
case 'noStackTrace':
case 'notify':
case 'persistModuleRegistryBetweenSpecs':
case 'rootDir':
case 'updateSnapshot':
Expand Down
6 changes: 6 additions & 0 deletions packages/jest-config/src/reporters/DefaultTestReporter.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import type {Process} from 'types/Process';

const chalk = require('chalk');
const formatFailureMessage = require('jest-util').formatFailureMessage;
const Notifier = require('../Notifier');
const path = require('path');
const VerboseLogger = require('./VerboseLogger');

Expand Down Expand Up @@ -183,6 +184,11 @@ class DefaultTestReporter {

this._printSummary(aggregatedResults);
this.log(results);

if (config.notify) {
Notifier.onTestResults(aggregatedResults);
}

return snapshotFailure ? false : aggregatedResults.success;
}

Expand Down
4 changes: 4 additions & 0 deletions packages/jest-config/src/setFromArgv.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ function setFromArgv(config, argv) {
config.verbose = argv.verbose;
}

if (argv.notify) {
config.notify = argv.notify;
}

if (argv.bail) {
config.bail = argv.bail;
}
Expand Down
1 change: 1 addition & 0 deletions scripts/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ runCommands('node bin/jest.js --runInBand', 'packages/jest-cli');
runCommands('node bin/jest.js --runInBand --logHeapUsage', 'packages/jest-cli');
runCommands('node bin/jest.js --json', 'packages/jest-cli');
runCommands('node bin/jest.js --verbose', 'packages/jest-cli');
runCommands('node bin/jest.js --notify', 'packages/jest-cli');

examples.forEach(runExampleTests);

Expand Down
1 change: 1 addition & 0 deletions types/Config.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ type BaseConfig = {
modulePathIgnorePatterns: Array<string>,
noHighlight: boolean,
noStackTrace: boolean,
notify: boolean,
testEnvData: {},
testEnvironment: string,
testPathDirs: Array<Path>,
Expand Down

0 comments on commit 88cf095

Please sign in to comment.