MM-60782 - use default download directory on windows (#3161)
* MM-60782 - use default download directory on windows * fix unit tests
This commit is contained in:
@@ -15,6 +15,9 @@ import MainWindow from 'main/windows/mainWindow';
|
|||||||
import {ServerViewState} from './serverViewState';
|
import {ServerViewState} from './serverViewState';
|
||||||
|
|
||||||
jest.mock('electron', () => ({
|
jest.mock('electron', () => ({
|
||||||
|
app: {
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
|
},
|
||||||
ipcMain: {
|
ipcMain: {
|
||||||
on: jest.fn(),
|
on: jest.fn(),
|
||||||
handle: jest.fn(),
|
handle: jest.fn(),
|
||||||
|
@@ -5,6 +5,8 @@
|
|||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
|
import {app} from 'electron';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default user preferences. End-users can change these parameters by editing config.json
|
* Default user preferences. End-users can change these parameters by editing config.json
|
||||||
* @param {number} version - Scheme version. (Not application version)
|
* @param {number} version - Scheme version. (Not application version)
|
||||||
@@ -24,7 +26,7 @@ export const getDefaultDownloadLocation = (): string | undefined => {
|
|||||||
return process.env.XDG_DOWNLOAD_DIR;
|
return process.env.XDG_DOWNLOAD_DIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return path.join(os.homedir(), 'Downloads');
|
return app.getPath('downloads') || path.join(os.homedir(), 'Downloads');
|
||||||
};
|
};
|
||||||
|
|
||||||
const defaultPreferences: ConfigV3 = {
|
const defaultPreferences: ConfigV3 = {
|
||||||
|
@@ -94,6 +94,12 @@ jest.mock('common/config/RegistryConfig', () => {
|
|||||||
return jest.fn();
|
return jest.fn();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jest.mock('electron', () => ({
|
||||||
|
app: {
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
describe('common/config', () => {
|
describe('common/config', () => {
|
||||||
it('should load buildConfig', () => {
|
it('should load buildConfig', () => {
|
||||||
const config = new Config();
|
const config = new Config();
|
||||||
|
@@ -18,6 +18,12 @@ jest.mock('common/views/View', () => ({
|
|||||||
}),
|
}),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
jest.mock('electron', () => ({
|
||||||
|
app: {
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
describe('common/config/upgradePreferences', () => {
|
describe('common/config/upgradePreferences', () => {
|
||||||
describe('upgradeV0toV1', () => {
|
describe('upgradeV0toV1', () => {
|
||||||
it('should upgrade from v0', () => {
|
it('should upgrade from v0', () => {
|
||||||
|
@@ -1,10 +1,14 @@
|
|||||||
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
|
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
|
||||||
// See LICENSE.txt for license information.
|
// See LICENSE.txt for license information.
|
||||||
|
|
||||||
|
import os from 'os';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
import {app} from 'electron';
|
import {app} from 'electron';
|
||||||
|
|
||||||
import {RELOAD_CONFIGURATION} from 'common/communication';
|
import {RELOAD_CONFIGURATION} from 'common/communication';
|
||||||
import Config from 'common/config';
|
import Config from 'common/config';
|
||||||
|
import {getDefaultDownloadLocation} from 'common/config/defaultPreferences';
|
||||||
import {setLoggingLevel} from 'common/log';
|
import {setLoggingLevel} from 'common/log';
|
||||||
import {handleConfigUpdate} from 'main/app/config';
|
import {handleConfigUpdate} from 'main/app/config';
|
||||||
import {handleMainWindowIsShown} from 'main/app/intercom';
|
import {handleMainWindowIsShown} from 'main/app/intercom';
|
||||||
@@ -16,6 +20,7 @@ jest.mock('electron', () => ({
|
|||||||
getAppPath: () => '/path/to/app',
|
getAppPath: () => '/path/to/app',
|
||||||
isReady: jest.fn(),
|
isReady: jest.fn(),
|
||||||
setPath: jest.fn(),
|
setPath: jest.fn(),
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
},
|
},
|
||||||
ipcMain: {
|
ipcMain: {
|
||||||
emit: jest.fn(),
|
emit: jest.fn(),
|
||||||
@@ -23,6 +28,10 @@ jest.mock('electron', () => ({
|
|||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
jest.mock('os', () => ({
|
||||||
|
homedir: jest.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
jest.mock('main/app/utils', () => ({
|
jest.mock('main/app/utils', () => ({
|
||||||
handleUpdateMenuEvent: jest.fn(),
|
handleUpdateMenuEvent: jest.fn(),
|
||||||
updateSpellCheckerLocales: jest.fn(),
|
updateSpellCheckerLocales: jest.fn(),
|
||||||
@@ -51,6 +60,8 @@ jest.mock('main/windows/mainWindow', () => ({
|
|||||||
|
|
||||||
describe('main/app/config', () => {
|
describe('main/app/config', () => {
|
||||||
describe('handleConfigUpdate', () => {
|
describe('handleConfigUpdate', () => {
|
||||||
|
const originalPlatform = process.platform;
|
||||||
|
const originalXDGDownloadDir = process.env.XDG_DOWNLOAD_DIR;
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
AutoLauncher.enable.mockResolvedValue({});
|
AutoLauncher.enable.mockResolvedValue({});
|
||||||
AutoLauncher.disable.mockResolvedValue({});
|
AutoLauncher.disable.mockResolvedValue({});
|
||||||
@@ -58,6 +69,17 @@ describe('main/app/config', () => {
|
|||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
delete Config.registryConfigData;
|
delete Config.registryConfigData;
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: originalPlatform,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (originalXDGDownloadDir) {
|
||||||
|
process.env.XDG_DOWNLOAD_DIR = originalXDGDownloadDir;
|
||||||
|
} else {
|
||||||
|
delete process.env.XDG_DOWNLOAD_DIR;
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
global.__IS_MAC_APP_STORE__ = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should reload renderer config only when app is ready', () => {
|
it('should reload renderer config only when app is ready', () => {
|
||||||
@@ -74,6 +96,50 @@ describe('main/app/config', () => {
|
|||||||
expect(app.setPath).toHaveBeenCalledWith('downloads', '/a/download/location');
|
expect(app.setPath).toHaveBeenCalledWith('downloads', '/a/download/location');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return undefined for Mac App Store builds', () => {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
global.__IS_MAC_APP_STORE__ = true;
|
||||||
|
|
||||||
|
expect(getDefaultDownloadLocation()).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return XDG_DOWNLOAD_DIR if running on Linux and environment variable is set', () => {
|
||||||
|
Object.defineProperty(process, 'platform', {
|
||||||
|
value: 'linux',
|
||||||
|
});
|
||||||
|
|
||||||
|
process.env.XDG_DOWNLOAD_DIR = '/home/user/xdg-downloads';
|
||||||
|
const result = getDefaultDownloadLocation();
|
||||||
|
expect(result).toBe('/home/user/xdg-downloads');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return app.getPath("downloads") if available', () => {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore
|
||||||
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
|
global.__IS_MAC_APP_STORE__ = false;
|
||||||
|
|
||||||
|
(app.getPath).mockReturnValue('/custom/downloads');
|
||||||
|
|
||||||
|
const result = getDefaultDownloadLocation();
|
||||||
|
|
||||||
|
expect(result).toBe('/custom/downloads');
|
||||||
|
expect(app.getPath).toHaveBeenCalledWith('downloads');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fallback to home directory if app.getPath("downloads") is not available', () => {
|
||||||
|
(app.getPath).mockReturnValue(null);
|
||||||
|
|
||||||
|
(os.homedir).mockReturnValue('/home/user');
|
||||||
|
|
||||||
|
const result = getDefaultDownloadLocation();
|
||||||
|
|
||||||
|
expect(result).toBe(path.join('/home/user', 'Downloads'));
|
||||||
|
expect(app.getPath).toHaveBeenCalledWith('downloads');
|
||||||
|
});
|
||||||
|
|
||||||
it('should enable/disable auto launch on windows/linux', () => {
|
it('should enable/disable auto launch on windows/linux', () => {
|
||||||
const originalPlatform = process.platform;
|
const originalPlatform = process.platform;
|
||||||
Object.defineProperty(process, 'platform', {
|
Object.defineProperty(process, 'platform', {
|
||||||
|
@@ -28,6 +28,7 @@ jest.mock('electron', () => {
|
|||||||
return {
|
return {
|
||||||
app: {
|
app: {
|
||||||
getAppPath: jest.fn(),
|
getAppPath: jest.fn(),
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
},
|
},
|
||||||
BrowserView: jest.fn().mockImplementation(() => ({
|
BrowserView: jest.fn().mockImplementation(() => ({
|
||||||
webContents: {
|
webContents: {
|
||||||
|
@@ -30,6 +30,7 @@ jest.mock('electron', () => {
|
|||||||
getAppPath: () => '/path/to/app',
|
getAppPath: () => '/path/to/app',
|
||||||
isReady: jest.fn(),
|
isReady: jest.fn(),
|
||||||
setPath: jest.fn(),
|
setPath: jest.fn(),
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
},
|
},
|
||||||
ipcMain: {
|
ipcMain: {
|
||||||
emit: jest.fn(),
|
emit: jest.fn(),
|
||||||
|
@@ -17,6 +17,7 @@ import MainWindow from '../windows/mainWindow';
|
|||||||
jest.mock('electron', () => ({
|
jest.mock('electron', () => ({
|
||||||
app: {
|
app: {
|
||||||
getVersion: () => '5.0.0',
|
getVersion: () => '5.0.0',
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
},
|
},
|
||||||
BrowserView: jest.fn().mockImplementation(() => ({
|
BrowserView: jest.fn().mockImplementation(() => ({
|
||||||
webContents: {
|
webContents: {
|
||||||
|
@@ -28,6 +28,7 @@ jest.mock('electron', () => {
|
|||||||
return {
|
return {
|
||||||
app: {
|
app: {
|
||||||
getAppPath: () => '',
|
getAppPath: () => '',
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
},
|
},
|
||||||
BrowserView: jest.fn().mockImplementation(() => ({
|
BrowserView: jest.fn().mockImplementation(() => ({
|
||||||
webContents: {
|
webContents: {
|
||||||
|
@@ -36,6 +36,7 @@ jest.mock('electron', () => {
|
|||||||
return {
|
return {
|
||||||
app: {
|
app: {
|
||||||
getAppPath: () => '',
|
getAppPath: () => '',
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
},
|
},
|
||||||
BrowserView: jest.fn().mockImplementation(() => ({
|
BrowserView: jest.fn().mockImplementation(() => ({
|
||||||
webContents: {
|
webContents: {
|
||||||
|
@@ -25,6 +25,9 @@ jest.mock('electron', () => ({
|
|||||||
ipcMain: {
|
ipcMain: {
|
||||||
on: jest.fn(),
|
on: jest.fn(),
|
||||||
},
|
},
|
||||||
|
app: {
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
|
},
|
||||||
}));
|
}));
|
||||||
jest.mock('main/windows/mainWindow', () => ({
|
jest.mock('main/windows/mainWindow', () => ({
|
||||||
on: jest.fn(),
|
on: jest.fn(),
|
||||||
|
@@ -18,6 +18,7 @@ import {ViewManager} from './viewManager';
|
|||||||
jest.mock('electron', () => ({
|
jest.mock('electron', () => ({
|
||||||
app: {
|
app: {
|
||||||
getAppPath: () => '/path/to/app',
|
getAppPath: () => '/path/to/app',
|
||||||
|
getPath: jest.fn(() => '/valid/downloads/path'),
|
||||||
},
|
},
|
||||||
dialog: {
|
dialog: {
|
||||||
showErrorBox: jest.fn(),
|
showErrorBox: jest.fn(),
|
||||||
|
Reference in New Issue
Block a user