Migrate viewManager to singleton (#2656)
This commit is contained in:
@@ -7,7 +7,8 @@
|
||||
import {dialog, ipcMain} from 'electron';
|
||||
import {Tuple as tuple} from '@bloomberg/record-tuple-polyfill';
|
||||
|
||||
import {LOAD_SUCCESS, MAIN_WINDOW_SHOWN, BROWSER_HISTORY_PUSH} from 'common/communication';
|
||||
import {BROWSER_HISTORY_PUSH, LOAD_SUCCESS, MAIN_WINDOW_SHOWN} from 'common/communication';
|
||||
import Config from 'common/config';
|
||||
import {MattermostServer} from 'common/servers/MattermostServer';
|
||||
import {getTabViewName} from 'common/tabs/TabView';
|
||||
import {equalUrlsIgnoringSubpath} from 'common/utils/url';
|
||||
@@ -28,9 +29,12 @@ jest.mock('electron', () => ({
|
||||
ipcMain: {
|
||||
emit: jest.fn(),
|
||||
on: jest.fn(),
|
||||
handle: jest.fn(),
|
||||
},
|
||||
}));
|
||||
|
||||
jest.mock('common/config', () => ({
|
||||
teams: [],
|
||||
}));
|
||||
jest.mock('common/tabs/TabView', () => ({
|
||||
getTabViewName: jest.fn((a, b) => `${a}-${b}`),
|
||||
TAB_MESSAGING: 'tab',
|
||||
@@ -41,6 +45,9 @@ jest.mock('common/servers/MattermostServer', () => ({
|
||||
}));
|
||||
|
||||
jest.mock('common/utils/url', () => ({
|
||||
isTeamUrl: jest.fn(),
|
||||
isAdminUrl: jest.fn(),
|
||||
cleanPathName: jest.fn(),
|
||||
parseURL: (url) => {
|
||||
try {
|
||||
return new URL(url);
|
||||
@@ -73,6 +80,7 @@ jest.mock('./modalManager', () => ({
|
||||
showModal: jest.fn(),
|
||||
}));
|
||||
jest.mock('./webContentEvents', () => ({}));
|
||||
jest.mock('../appState', () => ({}));
|
||||
|
||||
describe('main/views/viewManager', () => {
|
||||
describe('loadView', () => {
|
||||
@@ -119,12 +127,11 @@ describe('main/views/viewManager', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('reloadViewIfNeeded', () => {
|
||||
describe('handleAppLoggedIn', () => {
|
||||
const viewManager = new ViewManager({});
|
||||
|
||||
afterEach(() => {
|
||||
jest.resetAllMocks();
|
||||
viewManager.views = new Map();
|
||||
});
|
||||
|
||||
it('should reload view when URL is not on subpath of original server URL', () => {
|
||||
@@ -140,7 +147,7 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
};
|
||||
viewManager.views.set('view1', view);
|
||||
viewManager.reloadViewIfNeeded('view1');
|
||||
viewManager.handleAppLoggedIn({}, 'view1');
|
||||
expect(view.load).toHaveBeenCalledWith(new URL('http://server-1.com/'));
|
||||
});
|
||||
|
||||
@@ -157,7 +164,7 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
};
|
||||
viewManager.views.set('view1', view);
|
||||
viewManager.reloadViewIfNeeded('view1');
|
||||
viewManager.handleAppLoggedIn({}, 'view1');
|
||||
expect(view.load).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
@@ -174,7 +181,7 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
};
|
||||
viewManager.views.set('view1', view);
|
||||
viewManager.reloadViewIfNeeded('view1');
|
||||
viewManager.handleAppLoggedIn({}, 'view1');
|
||||
expect(view.load).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
@@ -186,6 +193,7 @@ describe('main/views/viewManager', () => {
|
||||
viewManager.loadView = jest.fn();
|
||||
viewManager.showByName = jest.fn();
|
||||
viewManager.showInitial = jest.fn();
|
||||
|
||||
const mainWindow = {
|
||||
webContents: {
|
||||
send: jest.fn(),
|
||||
@@ -225,14 +233,7 @@ describe('main/views/viewManager', () => {
|
||||
});
|
||||
|
||||
it('should recycle existing views', () => {
|
||||
const makeSpy = jest.spyOn(viewManager, 'makeView');
|
||||
const view = new MattermostView({
|
||||
name: 'server1-tab1',
|
||||
urlTypeTuple: tuple(new URL('http://server1.com').href, 'tab1'),
|
||||
server: 'server1',
|
||||
});
|
||||
viewManager.views.set('server1-tab1', view);
|
||||
viewManager.reloadConfiguration([
|
||||
Config.teams = [
|
||||
{
|
||||
name: 'server1',
|
||||
url: 'http://server1.com',
|
||||
@@ -244,14 +245,22 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
];
|
||||
const makeSpy = jest.spyOn(viewManager, 'makeView');
|
||||
const view = new MattermostView({
|
||||
name: 'server1-tab1',
|
||||
urlTypeTuple: tuple(new URL('http://server1.com').href, 'tab1'),
|
||||
server: 'server1',
|
||||
});
|
||||
viewManager.views.set('server1-tab1', view);
|
||||
viewManager.reloadConfiguration();
|
||||
expect(viewManager.views.get('server1-tab1')).toBe(view);
|
||||
expect(makeSpy).not.toHaveBeenCalled();
|
||||
makeSpy.mockRestore();
|
||||
});
|
||||
|
||||
it('should close tabs that arent open', () => {
|
||||
viewManager.reloadConfiguration([
|
||||
Config.teams = [
|
||||
{
|
||||
name: 'server1',
|
||||
url: 'http://server1.com',
|
||||
@@ -263,13 +272,14 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
];
|
||||
viewManager.reloadConfiguration();
|
||||
expect(viewManager.closedViews.has('server1-tab1')).toBe(true);
|
||||
});
|
||||
|
||||
it('should create new views for new tabs', () => {
|
||||
const makeSpy = jest.spyOn(viewManager, 'makeView');
|
||||
viewManager.reloadConfiguration([
|
||||
Config.teams = [
|
||||
{
|
||||
name: 'server1',
|
||||
url: 'http://server1.com',
|
||||
@@ -281,7 +291,8 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
];
|
||||
viewManager.reloadConfiguration();
|
||||
expect(makeSpy).toHaveBeenCalledWith(
|
||||
{
|
||||
name: 'server1',
|
||||
@@ -313,7 +324,7 @@ describe('main/views/viewManager', () => {
|
||||
};
|
||||
viewManager.currentView = 'server1-tab1';
|
||||
viewManager.views.set('server1-tab1', view);
|
||||
viewManager.reloadConfiguration([
|
||||
Config.teams = [
|
||||
{
|
||||
name: 'server1',
|
||||
url: 'http://server1.com',
|
||||
@@ -325,7 +336,8 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
];
|
||||
viewManager.reloadConfiguration();
|
||||
expect(viewManager.showByName).toHaveBeenCalledWith('server1-tab1');
|
||||
});
|
||||
|
||||
@@ -342,7 +354,7 @@ describe('main/views/viewManager', () => {
|
||||
};
|
||||
viewManager.currentView = 'server1-tab1';
|
||||
viewManager.views.set('server1-tab1', view);
|
||||
viewManager.reloadConfiguration([
|
||||
Config.teams = [
|
||||
{
|
||||
name: 'server2',
|
||||
url: 'http://server2.com',
|
||||
@@ -354,7 +366,8 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
];
|
||||
viewManager.reloadConfiguration();
|
||||
expect(viewManager.showInitial).toBeCalled();
|
||||
});
|
||||
|
||||
@@ -368,7 +381,7 @@ describe('main/views/viewManager', () => {
|
||||
destroy: jest.fn(),
|
||||
};
|
||||
viewManager.views.set('server1-tab1', view);
|
||||
viewManager.reloadConfiguration([
|
||||
Config.teams = [
|
||||
{
|
||||
name: 'server2',
|
||||
url: 'http://server2.com',
|
||||
@@ -380,65 +393,64 @@ describe('main/views/viewManager', () => {
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
];
|
||||
viewManager.reloadConfiguration();
|
||||
expect(view.destroy).toBeCalled();
|
||||
expect(viewManager.showInitial).toBeCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('showInitial', () => {
|
||||
const teams = [{
|
||||
name: 'server-1',
|
||||
order: 1,
|
||||
tabs: [
|
||||
{
|
||||
name: 'tab-1',
|
||||
order: 0,
|
||||
isOpen: false,
|
||||
},
|
||||
{
|
||||
name: 'tab-2',
|
||||
order: 2,
|
||||
isOpen: true,
|
||||
},
|
||||
{
|
||||
name: 'tab-3',
|
||||
order: 1,
|
||||
isOpen: true,
|
||||
},
|
||||
],
|
||||
}, {
|
||||
name: 'server-2',
|
||||
order: 0,
|
||||
tabs: [
|
||||
{
|
||||
name: 'tab-1',
|
||||
order: 0,
|
||||
isOpen: false,
|
||||
},
|
||||
{
|
||||
name: 'tab-2',
|
||||
order: 2,
|
||||
isOpen: true,
|
||||
},
|
||||
{
|
||||
name: 'tab-3',
|
||||
order: 1,
|
||||
isOpen: true,
|
||||
},
|
||||
],
|
||||
}];
|
||||
const viewManager = new ViewManager({});
|
||||
viewManager.getServers = () => teams.concat();
|
||||
|
||||
beforeEach(() => {
|
||||
Config.teams = [{
|
||||
name: 'server-1',
|
||||
order: 1,
|
||||
tabs: [
|
||||
{
|
||||
name: 'tab-1',
|
||||
order: 0,
|
||||
isOpen: false,
|
||||
},
|
||||
{
|
||||
name: 'tab-2',
|
||||
order: 2,
|
||||
isOpen: true,
|
||||
},
|
||||
{
|
||||
name: 'tab-3',
|
||||
order: 1,
|
||||
isOpen: true,
|
||||
},
|
||||
],
|
||||
}, {
|
||||
name: 'server-2',
|
||||
order: 0,
|
||||
tabs: [
|
||||
{
|
||||
name: 'tab-1',
|
||||
order: 0,
|
||||
isOpen: false,
|
||||
},
|
||||
{
|
||||
name: 'tab-2',
|
||||
order: 2,
|
||||
isOpen: true,
|
||||
},
|
||||
{
|
||||
name: 'tab-3',
|
||||
order: 1,
|
||||
isOpen: true,
|
||||
},
|
||||
],
|
||||
}];
|
||||
viewManager.showByName = jest.fn();
|
||||
getTabViewName.mockImplementation((server, tab) => `${server}_${tab}`);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.resetAllMocks();
|
||||
viewManager.getServers = () => teams;
|
||||
delete viewManager.lastActiveServer;
|
||||
});
|
||||
|
||||
@@ -454,7 +466,7 @@ describe('main/views/viewManager', () => {
|
||||
});
|
||||
|
||||
it('should show last active tab of first server', () => {
|
||||
viewManager.getServers = () => [{
|
||||
Config.teams = [{
|
||||
name: 'server-1',
|
||||
order: 1,
|
||||
tabs: [
|
||||
@@ -501,7 +513,7 @@ describe('main/views/viewManager', () => {
|
||||
});
|
||||
|
||||
it('should show next tab when last active tab is closed', () => {
|
||||
viewManager.getServers = () => [{
|
||||
Config.teams = [{
|
||||
name: 'server-1',
|
||||
order: 1,
|
||||
tabs: [
|
||||
@@ -553,7 +565,7 @@ describe('main/views/viewManager', () => {
|
||||
send: jest.fn(),
|
||||
},
|
||||
};
|
||||
viewManager.getServers = () => [];
|
||||
Config.teams = [];
|
||||
viewManager.showInitial();
|
||||
expect(ipcMain.emit).toHaveBeenCalledWith(MAIN_WINDOW_SHOWN);
|
||||
});
|
||||
@@ -654,8 +666,8 @@ describe('main/views/viewManager', () => {
|
||||
});
|
||||
|
||||
describe('getViewByURL', () => {
|
||||
const viewManager = new ViewManager({});
|
||||
viewManager.getServers = () => [
|
||||
const viewManager = new ViewManager();
|
||||
const servers = [
|
||||
{
|
||||
name: 'server-1',
|
||||
url: 'http://server-1.com',
|
||||
@@ -696,6 +708,7 @@ describe('main/views/viewManager', () => {
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
Config.teams = servers.concat();
|
||||
MattermostServer.mockImplementation((name, url) => ({
|
||||
name,
|
||||
url: new URL(url),
|
||||
|
Reference in New Issue
Block a user