2023-03-02 17:50:00 +01:00
|
|
|
import browser from 'webextension-polyfill';
|
|
|
|
import NotificationManager from './notification-manager';
|
|
|
|
|
|
|
|
function generateMockWindow(overrides?: object) {
|
|
|
|
return {
|
|
|
|
alwaysOnTop: false,
|
|
|
|
focused: true,
|
|
|
|
height: 620,
|
|
|
|
width: 360,
|
|
|
|
id: 1312883868,
|
|
|
|
incognito: false,
|
|
|
|
left: 1326,
|
|
|
|
state: 'normal',
|
|
|
|
tabs: [
|
|
|
|
{
|
|
|
|
active: true,
|
|
|
|
audible: false,
|
|
|
|
autoDiscardable: true,
|
|
|
|
discarded: false,
|
|
|
|
groupId: -1,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
top: 25,
|
|
|
|
type: 'popup',
|
|
|
|
...overrides,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
jest.mock('webextension-polyfill', () => {
|
|
|
|
return {
|
|
|
|
windows: {
|
|
|
|
onRemoved: {
|
|
|
|
addListener: jest.fn(),
|
|
|
|
},
|
|
|
|
getAll: jest.fn(),
|
|
|
|
create: jest.fn(),
|
|
|
|
update: jest.fn(),
|
2023-08-31 16:15:09 +02:00
|
|
|
getLastFocused: jest.fn(),
|
2023-03-02 17:50:00 +01:00
|
|
|
},
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('Notification Manager', () => {
|
|
|
|
let notificationManager: NotificationManager,
|
|
|
|
setCurrentPopupIdSpy: (a: number) => void,
|
|
|
|
focusWindowSpy: () => void,
|
|
|
|
currentPopupId: number;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
notificationManager = new NotificationManager();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not create a new popup window if there is one', async () => {
|
|
|
|
focusWindowSpy = jest.fn();
|
|
|
|
browser.windows.getAll.mockReturnValue([generateMockWindow()]);
|
|
|
|
browser.windows.update.mockImplementation(focusWindowSpy);
|
|
|
|
currentPopupId = 1312883868;
|
|
|
|
await notificationManager.showPopup(setCurrentPopupIdSpy, currentPopupId);
|
|
|
|
expect(focusWindowSpy).toHaveBeenCalledTimes(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should create a new popup window if there is no existing one', async () => {
|
|
|
|
const newPopupWindow = generateMockWindow();
|
|
|
|
setCurrentPopupIdSpy = jest.fn();
|
|
|
|
browser.windows.getAll.mockReturnValue([]);
|
|
|
|
browser.windows.create.mockReturnValue(newPopupWindow);
|
|
|
|
currentPopupId = undefined;
|
|
|
|
await notificationManager.showPopup(setCurrentPopupIdSpy, currentPopupId);
|
|
|
|
expect(setCurrentPopupIdSpy).toHaveBeenCalledTimes(1);
|
|
|
|
expect(setCurrentPopupIdSpy).toHaveBeenCalledWith(newPopupWindow.id);
|
|
|
|
});
|
2023-08-31 16:15:09 +02:00
|
|
|
|
|
|
|
it('should not pass negative left value for extension window created from last focused window', async () => {
|
|
|
|
const newPopupWindow = generateMockWindow();
|
|
|
|
setCurrentPopupIdSpy = jest.fn();
|
|
|
|
const createSpy = jest.fn().mockReturnValue(newPopupWindow);
|
|
|
|
browser.windows.getAll.mockReturnValue([]);
|
|
|
|
browser.windows.create = createSpy;
|
|
|
|
browser.windows.getLastFocused.mockReturnValue({
|
|
|
|
top: 0,
|
|
|
|
left: 0,
|
|
|
|
width: 120, // make sure this is smalled than NOTIFICATION_WIDTH
|
|
|
|
});
|
|
|
|
currentPopupId = undefined;
|
|
|
|
await notificationManager.showPopup(setCurrentPopupIdSpy, currentPopupId);
|
|
|
|
expect(createSpy).toHaveBeenCalledTimes(1);
|
|
|
|
expect(createSpy).toHaveBeenCalledWith({
|
|
|
|
height: 620,
|
|
|
|
left: 0, // this is critical, means error related to polyfill is not triggered
|
|
|
|
top: 0,
|
|
|
|
type: 'popup',
|
|
|
|
url: 'notification.html',
|
|
|
|
width: 360,
|
|
|
|
});
|
|
|
|
});
|
2023-03-02 17:50:00 +01:00
|
|
|
});
|