Files
mattermostest/src/main/allowProtocolDialog.test.js
Devin Binnie 4a98dce51e [MM-40330] Unit tests for main/windows (#1885)
* [MM-40330] Unit tests for main/windows

* Merge'd
2021-12-06 11:08:39 -05:00

169 lines
6.0 KiB
JavaScript

// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
'use strict';
import fs from 'fs';
import {shell, dialog} from 'electron';
import WindowManager from './windows/windowManager';
import {AllowProtocolDialog} from './allowProtocolDialog';
jest.mock('fs', () => ({
readFile: jest.fn(),
writeFile: jest.fn(),
}));
jest.mock('path', () => ({
resolve: () => 'path',
}));
jest.mock('electron', () => ({
app: {
getPath: jest.fn(),
},
dialog: {
showMessageBox: jest.fn(),
},
shell: {
openExternal: jest.fn(),
},
}));
jest.mock('electron-log', () => ({
error: jest.fn(),
}));
jest.mock('../../electron-builder.json', () => ({
protocols: [{
name: 'Mattermost',
schemes: [
'pone',
'ptwo',
],
}],
}));
jest.mock('./Validator', () => ({
validateAllowedProtocols: (protocols) => protocols,
}));
jest.mock('./windows/windowManager', () => ({
getMainWindow: jest.fn(),
}));
describe('main/allowProtocolDialog', () => {
describe('init', () => {
it('should copy data from file when no error', () => {
fs.readFile.mockImplementation((fileName, encoding, callback) => {
callback(null, '["spotify:", "steam:", "git:"]');
});
const allowProtocolDialog = new AllowProtocolDialog();
allowProtocolDialog.init();
expect(allowProtocolDialog.allowedProtocols).toContain('spotify:');
expect(allowProtocolDialog.allowedProtocols).toContain('steam:');
expect(allowProtocolDialog.allowedProtocols).toContain('git:');
});
it('should include data from electron-builder', () => {
const allowProtocolDialog = new AllowProtocolDialog();
allowProtocolDialog.init();
expect(allowProtocolDialog.allowedProtocols).toContain('pone:');
expect(allowProtocolDialog.allowedProtocols).toContain('ptwo:');
});
it('should always include http and https', () => {
const allowProtocolDialog = new AllowProtocolDialog();
allowProtocolDialog.init();
expect(allowProtocolDialog.allowedProtocols).toContain('http:');
expect(allowProtocolDialog.allowedProtocols).toContain('https:');
});
});
describe('addScheme', () => {
it('should add new scheme to the list', () => {
const allowProtocolDialog = new AllowProtocolDialog();
allowProtocolDialog.addScheme('test');
expect(allowProtocolDialog.allowedProtocols).toContain('test:');
});
it('should not add duplicates', () => {
const allowProtocolDialog = new AllowProtocolDialog();
allowProtocolDialog.addScheme('test');
allowProtocolDialog.addScheme('test2');
allowProtocolDialog.addScheme('test');
expect(allowProtocolDialog.allowedProtocols).toStrictEqual(['test:', 'test2:']);
});
});
describe('handleDialogEvent', () => {
fs.readFile.mockImplementation((fileName, encoding, callback) => {
callback(null, '["spotify:", "steam:", "git:"]');
});
let allowProtocolDialog;
beforeEach(() => {
allowProtocolDialog = new AllowProtocolDialog();
allowProtocolDialog.init();
});
it('should open protocol that is already allowed', () => {
allowProtocolDialog.handleDialogEvent('spotify:', 'spotify:album:3AQgdwMNCiN7awXch5fAaG');
expect(shell.openExternal).toBeCalledWith('spotify:album:3AQgdwMNCiN7awXch5fAaG');
});
it('should not open message box if main window is missing', () => {
WindowManager.getMainWindow.mockImplementation(() => null);
allowProtocolDialog.handleDialogEvent('mattermost:', 'mattermost://community.mattermost.com');
expect(shell.openExternal).not.toBeCalled();
expect(dialog.showMessageBox).not.toBeCalled();
});
describe('main window not null', () => {
beforeEach(() => {
WindowManager.getMainWindow.mockImplementation(() => ({}));
});
it('should open the window but not save when clicking Yes', async () => {
const promise = Promise.resolve({response: 0});
dialog.showMessageBox.mockImplementation(() => promise);
allowProtocolDialog.handleDialogEvent('mattermost:', 'mattermost://community.mattermost.com');
await promise;
expect(shell.openExternal).toBeCalledWith('mattermost://community.mattermost.com');
expect(allowProtocolDialog.allowedProtocols).not.toContain('mattermost:');
expect(fs.writeFile).not.toBeCalled();
});
it('should open the window and save when clicking Yes and Save', async () => {
const promise = Promise.resolve({response: 1});
dialog.showMessageBox.mockImplementation(() => promise);
allowProtocolDialog.handleDialogEvent('mattermost:', 'mattermost://community.mattermost.com');
await promise;
expect(shell.openExternal).toBeCalledWith('mattermost://community.mattermost.com');
expect(allowProtocolDialog.allowedProtocols).toContain('mattermost:');
expect(fs.writeFile).toBeCalled();
});
it('should do nothing when clicking No', async () => {
const promise = Promise.resolve({response: 2});
dialog.showMessageBox.mockImplementation(() => promise);
allowProtocolDialog.handleDialogEvent('mattermost:', 'mattermost://community.mattermost.com');
await promise;
expect(shell.openExternal).not.toBeCalled();
expect(allowProtocolDialog.allowedProtocols).not.toContain('mattermost:');
expect(fs.writeFile).not.toBeCalled();
});
});
});
});