Migrate viewManager to singleton (#2656)

This commit is contained in:
Devin Binnie
2023-04-05 13:01:09 -04:00
committed by GitHub
parent 245215c678
commit 862287edff
26 changed files with 743 additions and 949 deletions

View File

@@ -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),