Merge pull request #633 from yuya-oc/simplify-two-config

Simplify and split config.json into defaultPreferences and buildConfig
This commit is contained in:
Yuya Ochiai 2017-11-09 00:49:09 +09:00 committed by GitHub
commit 3a865f3d24
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 212 additions and 177 deletions

View file

@ -1734,36 +1734,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
## deepmerge
This product contains 'deepmerge', a library for deep merging of JavaScript objects, by Kyle Mathews.
* HOMEPAGE:
* https://github.com/KyleAMathews/deepmerge
* LICENSE:
The MIT License (MIT)
Copyright (c) 2012 Nicholas Fisher
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View file

@ -27,15 +27,15 @@
"serve": "gulp watch", "serve": "gulp watch",
"test": "npm-run-all test:* lint:*", "test": "npm-run-all test:* lint:*",
"test:app": "npm run build && mocha --reporter mocha-circleci-reporter --recursive test/specs", "test:app": "npm run build && mocha --reporter mocha-circleci-reporter --recursive test/specs",
"package:all": "npm-run-all package:windows package:mac package:linux", "package:all": "npm-run-all check-build-config package:windows package:mac package:linux",
"package:windows": "npm run build && build --win --x64 --ia32 --em.name=mattermost --publish=never && npm run manipulate-windows-zip", "package:windows": "npm-run-all check-build-config build && build --win --x64 --ia32 --em.name=mattermost --publish=never && npm run manipulate-windows-zip",
"package:mac": "npm run build && build --mac --publish=never", "package:mac": "npm-run-all check-build-config build && build --mac --publish=never",
"package:linux": "npm run build && build --linux --x64 --ia32 --em.name=mattermost-desktop --publish=never", "package:linux": "npm-run-all check-build-config build && build --linux --x64 --ia32 --em.name=mattermost-desktop --publish=never",
"manipulate-windows-zip": "node scripts/manipulate_windows_zip.js", "manipulate-windows-zip": "node scripts/manipulate_windows_zip.js",
"lint:js": "eslint --ext .js --ext .jsx ." "lint:js": "eslint --ext .js --ext .jsx .",
"check-build-config": "node scripts/check_build_config.js"
}, },
"devDependencies": { "devDependencies": {
"deepmerge": "^1.5.2",
"7zip-bin": "^2.0.4", "7zip-bin": "^2.0.4",
"babel-core": "^6.24.1", "babel-core": "^6.24.1",
"babel-eslint": "^7.2.3", "babel-eslint": "^7.2.3",

View file

@ -0,0 +1,16 @@
const buildConfig = require('../src/common/config/buildConfig');
function validateBuildConfig(config) {
if (config.enableServerManagement === false && config.defaultTeams && config.defaultTeams.length === 0) {
return {
result: false,
message: `Specify at least one server for "defaultTeams" in buildConfig.js when "enableServerManagement is set to false.\n${JSON.stringify(config, null, 2)}`
};
}
return {result: true};
}
const ret = validateBuildConfig(buildConfig);
if (ret.result === false) {
throw new Error(ret.message);
}

View file

@ -8,6 +8,7 @@ const {ipcRenderer, remote} = require('electron');
const AutoLaunch = require('auto-launch'); const AutoLaunch = require('auto-launch');
const {debounce} = require('underscore'); const {debounce} = require('underscore');
const buildConfig = require('../../common/config/buildConfig');
const settings = require('../../common/settings'); const settings = require('../../common/settings');
const TeamList = require('./TeamList.jsx'); const TeamList = require('./TeamList.jsx');
@ -29,7 +30,8 @@ const CONFIG_TYPE_APP_OPTIONS = 'appOptions';
const SettingsPage = createReactClass({ const SettingsPage = createReactClass({
propTypes: { propTypes: {
configFile: PropTypes.string configFile: PropTypes.string,
enableServerManagement: PropTypes.bool
}, },
getInitialState() { getInitialState() {
@ -301,8 +303,10 @@ const SettingsPage = createReactClass({
onTeamsChange={this.handleTeamsChange} onTeamsChange={this.handleTeamsChange}
updateTeam={this.updateTeam} updateTeam={this.updateTeam}
addServer={this.addServer} addServer={this.addServer}
onTeamClick={backToIndex}
allowTeamEdit={this.state.enableTeamModification} allowTeamEdit={this.state.enableTeamModification}
onTeamClick={(index) => {
backToIndex(index + buildConfig.defaultTeams.length);
}}
/> />
</Col> </Col>
</Row> </Row>
@ -339,7 +343,7 @@ const SettingsPage = createReactClass({
); );
var srvMgmt; var srvMgmt;
if (this.state.enableServerManagement || this.state.teams.length === 0) { if (this.props.enableServerManagement === true) {
srvMgmt = ( srvMgmt = (
<div> <div>
{serversRow} {serversRow}
@ -514,7 +518,7 @@ const SettingsPage = createReactClass({
bsStyle='link' bsStyle='link'
style={settingsPage.close} style={settingsPage.close}
onClick={this.handleCancel} onClick={this.handleCancel}
disabled={this.state.teams.length === 0} disabled={settings.mergeDefaultTeams(this.state.teams).length === 0}
> >
<span>{'×'}</span> <span>{'×'}</span>
</Button> </Button>

View file

@ -12,14 +12,18 @@ const {remote, ipcRenderer} = require('electron');
const MainPage = require('./components/MainPage.jsx'); const MainPage = require('./components/MainPage.jsx');
const AppConfig = require('./config/AppConfig.js'); const AppConfig = require('./config/AppConfig.js');
const buildConfig = require('../common/config/buildConfig');
const settings = require('../common/settings');
const url = require('url'); const url = require('url');
const badge = require('./js/badge'); const badge = require('./js/badge');
const utils = require('../utils/util'); const utils = require('../utils/util');
const teams = settings.mergeDefaultTeams(AppConfig.data.teams);
remote.getCurrentWindow().removeAllListeners('focus'); remote.getCurrentWindow().removeAllListeners('focus');
if (AppConfig.data.teams.length === 0) { if (teams.length === 0) {
window.location = 'settings.html'; window.location = 'settings.html';
} }
@ -90,8 +94,9 @@ function showUnreadBadge(unreadCount, mentionCount) {
const permissionRequestQueue = []; const permissionRequestQueue = [];
const requestingPermission = new Array(AppConfig.data.teams.length); const requestingPermission = new Array(AppConfig.data.teams.length);
function teamConfigChange(teams) { function teamConfigChange(updatedTeams) {
AppConfig.set('teams', teams); AppConfig.set('teams', updatedTeams.slice(buildConfig.defaultTeams.length));
teams.splice(0, teams.length, ...updatedTeams);
requestingPermission.length = teams.length; requestingPermission.length = teams.length;
ipcRenderer.send('update-menu', AppConfig.data); ipcRenderer.send('update-menu', AppConfig.data);
ipcRenderer.send('update-config'); ipcRenderer.send('update-config');
@ -157,14 +162,14 @@ if (!parsedURL.query.index || parsedURL.query.index === null) {
ReactDOM.render( ReactDOM.render(
<MainPage <MainPage
teams={AppConfig.data.teams} teams={teams}
initialIndex={initialIndex} initialIndex={initialIndex}
onUnreadCountChange={showUnreadBadge} onUnreadCountChange={showUnreadBadge}
onTeamConfigChange={teamConfigChange} onTeamConfigChange={teamConfigChange}
useSpellChecker={AppConfig.data.useSpellChecker} useSpellChecker={AppConfig.data.useSpellChecker}
onSelectSpellCheckerLocale={handleSelectSpellCheckerLocale} onSelectSpellCheckerLocale={handleSelectSpellCheckerLocale}
deeplinkingUrl={deeplinkingUrl} deeplinkingUrl={deeplinkingUrl}
showAddServerButton={AppConfig.data.enableServerManagement} showAddServerButton={buildConfig.enableServerManagement}
requestingPermission={requestingPermission} requestingPermission={requestingPermission}
onClickPermissionDialog={handleClickPermissionDialog} onClickPermissionDialog={handleClickPermissionDialog}
/>, />,

View file

@ -9,13 +9,17 @@ const React = require('react');
const ReactDOM = require('react-dom'); const ReactDOM = require('react-dom');
const SettingsPage = require('./components/SettingsPage.jsx'); const SettingsPage = require('./components/SettingsPage.jsx');
const contextMenu = require('./js/contextMenu'); const contextMenu = require('./js/contextMenu');
const buildConfig = require('../common/config/buildConfig');
const configFile = remote.app.getPath('userData') + '/config.json'; const configFile = remote.app.getPath('userData') + '/config.json';
contextMenu.setup(remote.getCurrentWindow()); contextMenu.setup(remote.getCurrentWindow());
ReactDOM.render( ReactDOM.render(
<SettingsPage configFile={configFile}/>, <SettingsPage
configFile={configFile}
enableServerManagement={buildConfig.enableServerManagement}
/>,
document.getElementById('content') document.getElementById('content')
); );

View file

@ -1,32 +0,0 @@
{
"default": {
"teams": [],
"showTrayIcon": false,
"trayIconTheme": "light",
"minimizeToTray": false,
"version": 1,
"notifications": {
"flashWindow": 0
},
"showUnreadBadge": true,
"useSpellChecker": true,
"spellCheckerLocale": "en-US",
"helpLink": "https://docs.mattermost.com/help/apps/desktop-guide.html",
"enableServerManagement": true
},
"1": {
"teams": [],
"showTrayIcon": false,
"trayIconTheme": "light",
"minimizeToTray": false,
"version": 1,
"notifications": {
"flashWindow": 0
},
"showUnreadBadge": true,
"useSpellChecker": true,
"spellCheckerLocale": "en-US",
"helpLink": "https://docs.mattermost.com/help/apps/desktop-guide.html",
"enableServerManagement": true
}
}

View file

@ -0,0 +1,23 @@
/**
* Build-time configuration. End-users can't change these parameters.
* @prop {Object[]} defaultTeams
* @prop {string} defaultTeams[].name - The tab name for default team.
* @prop {string} defaultTeams[].url - The URL for default team.
* @prop {string} helpLink - The URL for "Help->Learn More..." menu item.
* If null is specified, the menu disappears.
* @prop {boolean} enableServerManagement - Whether users can edit servers configuration.
* Specify at least one server for "defaultTeams"
* when "enableServerManagement is set to false
*/
const buildConfig = {
defaultTeams: [/*
{
name: 'example',
url: 'https://example.com'
}*/
],
helpLink: 'https://docs.mattermost.com/help/apps/desktop-guide.html',
enableServerManagement: true
};
module.exports = buildConfig;

View file

@ -0,0 +1,19 @@
/**
* Default user preferences. End-users can change these parameters by editing config.json
* @param {number} version - Scheme version. (Not application version)
*/
const defaultPreferences = {
version: 1,
teams: [],
showTrayIcon: false,
trayIconTheme: 'light',
minimizeToTray: false,
notifications: {
flashWindow: 0
},
showUnreadBadge: true,
useSpellChecker: true,
spellCheckerLocale: 'en-US'
};
module.exports = defaultPreferences;

View file

@ -1,3 +0,0 @@
{
}

View file

@ -0,0 +1,11 @@
const defaultPreferences = require('./defaultPreferences');
const pastDefaultPreferences = {
0: {
url: ''
}
};
pastDefaultPreferences[`${defaultPreferences.version}`] = defaultPreferences;
module.exports = pastDefaultPreferences;

View file

@ -0,0 +1,29 @@
const pastDefaultPreferences = require('./pastDefaultPreferences');
function deepCopy(object) {
return JSON.parse(JSON.stringify(object));
}
function upgradeV0toV1(configV0) {
const config = deepCopy(pastDefaultPreferences['1']);
if (config.version !== 1) {
throw new Error('pastDefaultPreferences[\'1\'].version is not equal to 1');
}
config.teams.push({
name: 'Primary team',
url: configV0.url
});
return config;
}
function upgradeToLatest(config) {
var configVersion = config.version ? config.version : 0;
switch (configVersion) {
case 0:
return upgradeToLatest(upgradeV0toV1(config));
default:
return config;
}
}
module.exports = upgradeToLatest;

View file

@ -1,90 +1,56 @@
'use strict'; 'use strict';
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const deepmerge = require('./deepmerge'); const buildConfig = require('./config/buildConfig');
const settingsVersion = 1;
const baseConfig = require('./config/base.json');
const overrideConfig = require('./config/override.json');
function merge(base, target) { function merge(base, target) {
return Object.assign({}, base, target); return Object.assign({}, base, target);
} }
function deepMergeArray(source, dest) { const defaultPreferences = require('./config/defaultPreferences');
return dest; const upgradePreferences = require('./config/upgradePreferences');
}
function loadDefault(version, spellCheckerLocale) { function loadDefault(spellCheckerLocale) {
var ver = version; const config = JSON.parse(JSON.stringify(defaultPreferences));
if (version == null) { return Object.assign({}, config, {
ver = settingsVersion; spellCheckerLocale: spellCheckerLocale || defaultPreferences.pellCheckerLocale || 'en-US'
}
const base = baseConfig[ver] || baseConfig.default;
const override = overrideConfig[ver] || {};
const defaults = deepmerge(base, override, {arrayMerge: deepMergeArray});
return Object.assign(defaults, {
spellCheckerLocale: spellCheckerLocale || defaults.spellCheckerLocale || 'en-US'
}); });
} }
function upgradeV0toV1(configV0) { function hasBuildConfigDefaultTeams(config) {
var config = loadDefault(1); return config.defaultTeams.length > 0;
config.teams.push({
name: 'Primary team',
url: configV0.url
});
return config;
} }
function upgrade(config, newAppVersion) { function upgrade(config) {
var configVersion = config.version ? config.version : 0; return upgradePreferences(config);
if (newAppVersion) {
config.lastMattermostVersion = newAppVersion;
}
switch (configVersion) {
case 0:
return upgrade(upgradeV0toV1(config));
default:
return config;
}
} }
module.exports = { module.exports = {
version: settingsVersion, version: defaultPreferences.version,
upgrade, upgrade,
readFileSync(configFile) { readFileSync(configFile) {
var config = JSON.parse(fs.readFileSync(configFile, 'utf8')); const config = JSON.parse(fs.readFileSync(configFile, 'utf8'));
if (config.version === defaultPreferences.version) {
// need to be able to compare 1 to '1' const defaultConfig = loadDefault();
if (config.version == settingsVersion) { // eslint-disable-line return merge(defaultConfig, config);
var defaultConfig = this.loadDefault();
config = merge(defaultConfig, config);
} }
return config; return config;
}, },
writeFile(configFile, config, callback) { writeFile(configFile, config, callback) {
// need to be able to compare 1 to '1' if (config.version !== defaultPreferences.version) {
if (config.version != settingsVersion) { // eslint-disable-line throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version);
throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion);
} }
var data = JSON.stringify(config, null, ' '); var data = JSON.stringify(config, null, ' ');
fs.writeFile(configFile, data, 'utf8', callback); fs.writeFile(configFile, data, 'utf8', callback);
}, },
writeFileSync(configFile, config) { writeFileSync(configFile, config) {
// need to be able to compare 1 to '1' if (config.version !== defaultPreferences.version) {
if (config.version != settingsVersion) { // eslint-disable-line throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version);
throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion);
} }
const dir = path.dirname(configFile); const dir = path.dirname(configFile);
@ -96,5 +62,16 @@ module.exports = {
fs.writeFileSync(configFile, data, 'utf8'); fs.writeFileSync(configFile, data, 'utf8');
}, },
loadDefault loadDefault,
mergeDefaultTeams(teams) {
const newTeams = [];
if (hasBuildConfigDefaultTeams(buildConfig)) {
newTeams.push(...JSON.parse(JSON.stringify(buildConfig.defaultTeams)));
}
if (buildConfig.enableServerManagement) {
newTeams.push(...JSON.parse(JSON.stringify(teams)));
}
return newTeams;
}
}; };

View file

@ -69,7 +69,7 @@ try {
config = settings.readFileSync(configFile); config = settings.readFileSync(configFile);
if (config.version !== settings.version || wasUpdated()) { if (config.version !== settings.version || wasUpdated()) {
clearAppCache(); clearAppCache();
config = settings.upgrade(config, app.getVersion()); config = settings.upgrade(config);
settings.writeFileSync(configFile, config); settings.writeFileSync(configFile, config);
} }
} catch (e) { } catch (e) {

View file

@ -1,6 +1,8 @@
'use strict'; 'use strict';
const electron = require('electron'); const electron = require('electron');
const settings = require('../../common/settings');
const buildConfig = require('../../common/config/buildConfig');
const Menu = electron.Menu; const Menu = electron.Menu;
@ -38,7 +40,7 @@ function createTemplate(mainWindow, config, isDev) {
} }
}]; }];
if (config.enableServerManagement === true || config.teams.length === 0) { if (buildConfig.enableServerManagement === true) {
platformAppMenu.push({ platformAppMenu.push({
label: 'Sign in to Another Server', label: 'Sign in to Another Server',
click() { click() {
@ -173,13 +175,14 @@ function createTemplate(mainWindow, config, isDev) {
}] }]
}); });
const teams = settings.mergeDefaultTeams(config.teams);
const windowMenu = { const windowMenu = {
label: '&Window', label: '&Window',
submenu: [{ submenu: [{
role: 'minimize' role: 'minimize'
}, { }, {
role: 'close' role: 'close'
}, separatorItem, ...config.teams.slice(0, 9).map((team, i) => { }, separatorItem, ...teams.slice(0, 9).map((team, i) => {
return { return {
label: team.name, label: team.name,
accelerator: `CmdOrCtrl+${i + 1}`, accelerator: `CmdOrCtrl+${i + 1}`,
@ -194,23 +197,23 @@ function createTemplate(mainWindow, config, isDev) {
click() { click() {
mainWindow.webContents.send('select-next-tab'); mainWindow.webContents.send('select-next-tab');
}, },
enabled: (config.teams.length > 1) enabled: (teams.length > 1)
}, { }, {
label: 'Select Previous Server', label: 'Select Previous Server',
accelerator: 'Ctrl+Shift+Tab', accelerator: 'Ctrl+Shift+Tab',
click() { click() {
mainWindow.webContents.send('select-previous-tab'); mainWindow.webContents.send('select-previous-tab');
}, },
enabled: (config.teams.length > 1) enabled: (teams.length > 1)
}] }]
}; };
template.push(windowMenu); template.push(windowMenu);
var submenu = []; var submenu = [];
if (config.helpLink) { if (buildConfig.helpLink) {
submenu.push({ submenu.push({
label: 'Learn More...', label: 'Learn More...',
click() { click() {
electron.shell.openExternal(config.helpLink); electron.shell.openExternal(buildConfig.helpLink);
} }
}); });
submenu.push(separatorItem); submenu.push(separatorItem);

View file

@ -4,11 +4,13 @@ const {
app, app,
Menu Menu
} = require('electron'); } = require('electron');
const settings = require('../../common/settings');
function createTemplate(mainWindow, config, isDev) { function createTemplate(mainWindow, config, isDev) {
const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`; const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`;
const teams = settings.mergeDefaultTeams(config.teams);
var template = [ var template = [
...config.teams.slice(0, 9).map((team, i) => { ...teams.slice(0, 9).map((team, i) => {
return { return {
label: team.name, label: team.name,
click: () => { click: () => {

View file

@ -12,7 +12,6 @@
"auto-launch": "^5.0.1", "auto-launch": "^5.0.1",
"bootstrap": "^3.3.7", "bootstrap": "^3.3.7",
"create-react-class": "^15.6.2", "create-react-class": "^15.6.2",
"deepmerge": "^1.5.2",
"electron-context-menu": "^0.9.0", "electron-context-menu": "^0.9.0",
"electron-devtools-installer": "^2.2.1", "electron-devtools-installer": "^2.2.1",
"electron-is-dev": "^0.3.0", "electron-is-dev": "^0.3.0",

View file

@ -141,10 +141,6 @@ decamelize@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
deepmerge@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
dom-helpers@^3.2.0, dom-helpers@^3.2.1: dom-helpers@^3.2.0, dom-helpers@^3.2.1:
version "3.2.1" version "3.2.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"

View file

@ -39,6 +39,12 @@ module.exports = {
}); });
}, },
createTestUserDataDir() {
if (!fs.existsSync(userDataDir)) {
fs.mkdirSync(userDataDir);
}
},
getSpectronApp() { getSpectronApp() {
return new Application({ return new Application({
path: electronBinaryPath, path: electronBinaryPath,

View file

@ -8,17 +8,15 @@ describe('application', function desc() {
this.timeout(30000); this.timeout(30000);
beforeEach(() => { beforeEach(() => {
env.createTestUserDataDir();
env.cleanTestConfig(); env.cleanTestConfig();
this.app = env.getSpectronApp(); this.app = env.getSpectronApp();
}); });
afterEach(() => { afterEach(() => {
if (this.app && this.app.isRunning()) { if (this.app && this.app.isRunning()) {
return this.app.stop().then(() => { return this.app.stop();
env.cleanTestConfig();
});
} }
env.cleanTestConfig();
return true; return true;
}); });

View file

@ -1,15 +1,9 @@
const settings = require('../../src/common/settings'); const settings = require('../../src/common/settings');
const deepmerge = require('deepmerge'); const buildConfig = require('../../src/common/config/buildConfig');
const defaultPreferences = require('../../src/common/config/defaultPreferences');
const pastDefaultPreferences = require('../../src/common/config/pastDefaultPreferences');
describe('common/settings.js', () => { describe('common/settings.js', () => {
before(() => {
process.env.TEST = 1;
});
after(() => {
delete process.env.TEST;
});
it('should upgrade v0 config file', () => { it('should upgrade v0 config file', () => {
const v0Config = { const v0Config = {
url: 'https://example.com/team' url: 'https://example.com/team'
@ -20,13 +14,34 @@ describe('common/settings.js', () => {
config.version.should.equal(settings.version); config.version.should.equal(settings.version);
}); });
it('should loadDefault config for version 1', () => { it('should merge teams with buildConfig.defaultTeams', () => {
const baseConfig = require('../../src/common/config/base.json'); const teams = [
const overrideConfig = require('../../src/common/config/override.json'); {
const expectedDefaults = deepmerge( name: 'test',
baseConfig[1], overrideConfig[1] || {}, {clone: true, arrayMerge: settings.deepMergeArray} url: 'https://example.com'
); }
const defaultConfig = settings.loadDefault(); ];
defaultConfig.should.eql(expectedDefaults);
const mergedTeams = settings.mergeDefaultTeams(teams);
mergedTeams.should.deep.equal([
{
name: 'test',
url: 'https://example.com'
},
...buildConfig.defaultTeams
]);
});
});
describe('common/config/', () => {
it('pastDefaultPreferences should have each past version of defaultPreferences', () => {
for (let version = 0; version <= defaultPreferences.version; version++) {
pastDefaultPreferences[`${version}`].should.exist; // eslint-disable-line no-unused-expressions
}
});
it('defaultPreferences equal to one of pastDefaultPreferences', () => {
const pastPreferences = pastDefaultPreferences[`${defaultPreferences.version}`];
pastPreferences.should.deep.equal(defaultPreferences);
}); });
}); });

View file

@ -1352,10 +1352,6 @@ deep-is@~0.1.3:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
deepmerge@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
deepmerge@~1.3.2: deepmerge@~1.3.2:
version "1.3.2" version "1.3.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050"