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:
Pablo Vélez
2024-10-18 15:39:56 +02:00
committed by GitHub
parent d047febb93
commit da88b8643e
12 changed files with 93 additions and 1 deletions

View File

@@ -15,6 +15,9 @@ import MainWindow from 'main/windows/mainWindow';
import {ServerViewState} from './serverViewState';
jest.mock('electron', () => ({
app: {
getPath: jest.fn(() => '/valid/downloads/path'),
},
ipcMain: {
on: jest.fn(),
handle: jest.fn(),

View File

@@ -5,6 +5,8 @@
import os from 'os';
import path from 'path';
import {app} from 'electron';
/**
* Default user preferences. End-users can change these parameters by editing config.json
* @param {number} version - Scheme version. (Not application version)
@@ -24,7 +26,7 @@ export const getDefaultDownloadLocation = (): string | undefined => {
return process.env.XDG_DOWNLOAD_DIR;
}
return path.join(os.homedir(), 'Downloads');
return app.getPath('downloads') || path.join(os.homedir(), 'Downloads');
};
const defaultPreferences: ConfigV3 = {

View File

@@ -94,6 +94,12 @@ jest.mock('common/config/RegistryConfig', () => {
return jest.fn();
});
jest.mock('electron', () => ({
app: {
getPath: jest.fn(() => '/valid/downloads/path'),
},
}));
describe('common/config', () => {
it('should load buildConfig', () => {
const config = new Config();

View File

@@ -18,6 +18,12 @@ jest.mock('common/views/View', () => ({
}),
}));
jest.mock('electron', () => ({
app: {
getPath: jest.fn(() => '/valid/downloads/path'),
},
}));
describe('common/config/upgradePreferences', () => {
describe('upgradeV0toV1', () => {
it('should upgrade from v0', () => {

View File

@@ -1,10 +1,14 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import os from 'os';
import path from 'path';
import {app} from 'electron';
import {RELOAD_CONFIGURATION} from 'common/communication';
import Config from 'common/config';
import {getDefaultDownloadLocation} from 'common/config/defaultPreferences';
import {setLoggingLevel} from 'common/log';
import {handleConfigUpdate} from 'main/app/config';
import {handleMainWindowIsShown} from 'main/app/intercom';
@@ -16,6 +20,7 @@ jest.mock('electron', () => ({
getAppPath: () => '/path/to/app',
isReady: jest.fn(),
setPath: jest.fn(),
getPath: jest.fn(() => '/valid/downloads/path'),
},
ipcMain: {
emit: jest.fn(),
@@ -23,6 +28,10 @@ jest.mock('electron', () => ({
},
}));
jest.mock('os', () => ({
homedir: jest.fn(),
}));
jest.mock('main/app/utils', () => ({
handleUpdateMenuEvent: jest.fn(),
updateSpellCheckerLocales: jest.fn(),
@@ -51,6 +60,8 @@ jest.mock('main/windows/mainWindow', () => ({
describe('main/app/config', () => {
describe('handleConfigUpdate', () => {
const originalPlatform = process.platform;
const originalXDGDownloadDir = process.env.XDG_DOWNLOAD_DIR;
beforeEach(() => {
AutoLauncher.enable.mockResolvedValue({});
AutoLauncher.disable.mockResolvedValue({});
@@ -58,6 +69,17 @@ describe('main/app/config', () => {
afterEach(() => {
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', () => {
@@ -74,6 +96,50 @@ describe('main/app/config', () => {
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', () => {
const originalPlatform = process.platform;
Object.defineProperty(process, 'platform', {

View File

@@ -28,6 +28,7 @@ jest.mock('electron', () => {
return {
app: {
getAppPath: jest.fn(),
getPath: jest.fn(() => '/valid/downloads/path'),
},
BrowserView: jest.fn().mockImplementation(() => ({
webContents: {

View File

@@ -30,6 +30,7 @@ jest.mock('electron', () => {
getAppPath: () => '/path/to/app',
isReady: jest.fn(),
setPath: jest.fn(),
getPath: jest.fn(() => '/valid/downloads/path'),
},
ipcMain: {
emit: jest.fn(),

View File

@@ -17,6 +17,7 @@ import MainWindow from '../windows/mainWindow';
jest.mock('electron', () => ({
app: {
getVersion: () => '5.0.0',
getPath: jest.fn(() => '/valid/downloads/path'),
},
BrowserView: jest.fn().mockImplementation(() => ({
webContents: {

View File

@@ -28,6 +28,7 @@ jest.mock('electron', () => {
return {
app: {
getAppPath: () => '',
getPath: jest.fn(() => '/valid/downloads/path'),
},
BrowserView: jest.fn().mockImplementation(() => ({
webContents: {

View File

@@ -36,6 +36,7 @@ jest.mock('electron', () => {
return {
app: {
getAppPath: () => '',
getPath: jest.fn(() => '/valid/downloads/path'),
},
BrowserView: jest.fn().mockImplementation(() => ({
webContents: {

View File

@@ -25,6 +25,9 @@ jest.mock('electron', () => ({
ipcMain: {
on: jest.fn(),
},
app: {
getPath: jest.fn(() => '/valid/downloads/path'),
},
}));
jest.mock('main/windows/mainWindow', () => ({
on: jest.fn(),

View File

@@ -18,6 +18,7 @@ import {ViewManager} from './viewManager';
jest.mock('electron', () => ({
app: {
getAppPath: () => '/path/to/app',
getPath: jest.fn(() => '/valid/downloads/path'),
},
dialog: {
showErrorBox: jest.fn(),