Skip to content

Commit

Permalink
feat: make node-notifier an optional dependency
Browse files Browse the repository at this point in the history
  • Loading branch information
Caleb ツ Everett committed Sep 9, 2019
1 parent c588c18 commit 033aed3
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 2 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
- `[jest-snapshot]` Remove only the added newlines in multiline snapshots ([#8859](https://github.com/facebook/jest/pull/8859))
- `[jest-snapshot]` Distinguish empty string from external snapshot not written ([#8880](https://github.com/facebook/jest/pull/8880))
- `[jest-snapshot]` [**BREAKING**] Distinguish empty string from internal snapshot not written ([#8898](https://github.com/facebook/jest/pull/8898))
- `[jest-reporters]` Make node-notifer an optional dependency ([#8918](https://github.com/facebook/jest/pull/8918))

### Chore & Maintenance

Expand Down
4 changes: 3 additions & 1 deletion packages/jest-reporters/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
"jest-runtime": "^24.9.0",
"jest-util": "^24.9.0",
"jest-worker": "^24.6.0",
"node-notifier": "^5.4.3",
"slash": "^3.0.0",
"source-map": "^0.6.0",
"string-length": "^3.1.0"
Expand All @@ -39,6 +38,9 @@
"@types/node-notifier": "^5.4.0",
"strip-ansi": "^5.0.0"
},
"optionalDependencies": {
"node-notifier": "^5.4.3"
},
"engines": {
"node": ">= 8"
},
Expand Down
43 changes: 43 additions & 0 deletions packages/jest-reporters/src/__tests__/notify_impl.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import notify from '../notify_impl';
beforeEach(() => {
jest.resetModules();
});

const notification: any = jest.fn();
const callback: any = jest.fn();

test('without node-notifier notify_impl uses mock function that throws an error', () => {
jest.doMock('node-notifier', () => {
const error: any = new Error("Cannot find module 'node-notifier'");
error.code = 'MODULE_NOT_FOUND';
throw error;
});
expect(() => notify(notification)).toThrow(
'notify reporter requires optional dependeny node-notifier but it was not found',
);
});

test('notify_impl throws the error when require throws an unexpected error', () => {
const error = new Error('unexpected require error');
jest.doMock('node-notifier', () => {
throw error;
});
expect(() => notify(notification)).toThrow(error);
});

test('notify_impl uses node-notifier when it is available', () => {
const mockNodeNotifier = {notify: jest.fn()};
jest.doMock('node-notifier', () => mockNodeNotifier);
const notify = require('../notify_impl').default;
const result = notify(notification, callback);
expect(mockNodeNotifier.notify).toBeCalledTimes(1);
expect(mockNodeNotifier.notify).toBeCalledWith(notification, callback);
expect(mockNodeNotifier.notify).toReturnWith(result);
expect(mockNodeNotifier.notify.mock.instances[0]).toEqual(mockNodeNotifier);
});
44 changes: 44 additions & 0 deletions packages/jest-reporters/src/notify_impl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
export default function notify(
notification: Notification,
callback?: NotificationCallback,
) {
try {
return require('node-notifier').notify(notification, callback);
} catch (ex) {
if (ex.code !== 'MODULE_NOT_FOUND') {
throw ex;
} else {
throw Error(
'notify reporter requires optional dependeny node-notifier but it was not found',
);
}
}
}

export type Notify = (
notification?: Notification,
callback?: NotificationCallback,
) => unknown;

interface Notification {
title?: string;
message?: string;
icon?: string;
closeLabel?: string;
actions?: string | Array<string>;
timeout?: number;
}

interface NotificationCallback {
(err: Error | null, response: string, metadata?: NotificationMetadata): void;
}

interface NotificationMetadata {
activationValue?: string;
}
2 changes: 1 addition & 1 deletion packages/jest-reporters/src/notify_reporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import * as util from 'util';
import exit = require('exit');
import {Config} from '@jest/types';
import {AggregatedResult} from '@jest/test-result';
import {notify} from 'node-notifier';
import {Context, TestSchedulerContext} from './types';
import BaseReporter from './base_reporter';
import notify from './notify_impl';

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

Expand Down

0 comments on commit 033aed3

Please sign in to comment.