api-service-workers-spec.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import * as fs from 'fs';
  2. import * as http from 'http';
  3. import * as path from 'path';
  4. import { session, BrowserWindow } from 'electron';
  5. import { expect } from 'chai';
  6. import { v4 } from 'uuid';
  7. import { AddressInfo } from 'net';
  8. import { closeWindow } from './window-helpers';
  9. import { emittedOnce, emittedNTimes } from './events-helpers';
  10. const partition = 'service-workers-spec';
  11. const uuid = v4();
  12. describe('session.serviceWorkers', () => {
  13. let ses: Electron.Session;
  14. let server: http.Server;
  15. let baseUrl: string;
  16. let w: BrowserWindow;
  17. before(async () => {
  18. ses = session.fromPartition(partition);
  19. await ses.clearStorageData();
  20. server = http.createServer((req, res) => {
  21. // /{uuid}/{file}
  22. const file = req.url!.split('/')[2]!;
  23. if (file.endsWith('.js')) {
  24. res.setHeader('Content-Type', 'application/javascript');
  25. }
  26. res.end(fs.readFileSync(path.resolve(__dirname, 'fixtures', 'api', 'service-workers', file)));
  27. });
  28. await new Promise(resolve => {
  29. server.listen(0, '127.0.0.1', () => {
  30. baseUrl = `http://localhost:${(server.address() as AddressInfo).port}/${uuid}`;
  31. resolve();
  32. });
  33. });
  34. });
  35. beforeEach(() => {
  36. w = new BrowserWindow({ show: false, webPreferences: { session: ses } });
  37. });
  38. afterEach(async () => {
  39. await ses.clearStorageData();
  40. await closeWindow(w);
  41. w = null as any;
  42. });
  43. after(async () => {
  44. server.close();
  45. });
  46. describe('getAllRunning()', () => {
  47. it('should initially report none are running', () => {
  48. expect(ses.serviceWorkers.getAllRunning()).to.deep.equal({});
  49. });
  50. it('should report one as running once you load a page with a service worker', async () => {
  51. await emittedOnce(ses.serviceWorkers, 'console-message', () => w.loadURL(`${baseUrl}/index.html`));
  52. const workers = ses.serviceWorkers.getAllRunning();
  53. const ids = Object.keys(workers) as any[] as number[];
  54. expect(ids).to.have.lengthOf(1, 'should have one worker running');
  55. });
  56. });
  57. describe('getFromVersionID()', () => {
  58. it('should report the correct script url and scope', async () => {
  59. const eventInfo = await emittedOnce(ses.serviceWorkers, 'console-message', () => w.loadURL(`${baseUrl}/index.html`));
  60. const details: Electron.MessageDetails = eventInfo[1];
  61. const worker = ses.serviceWorkers.getFromVersionID(details.versionId);
  62. expect(worker).to.not.equal(null);
  63. expect(worker).to.have.property('scope', baseUrl + '/');
  64. expect(worker).to.have.property('scriptUrl', baseUrl + '/sw.js');
  65. });
  66. });
  67. describe('console-message event', () => {
  68. it('should correctly keep the source, message and level', async () => {
  69. const messages: Record<string, Electron.MessageDetails> = {};
  70. const events = await emittedNTimes(ses.serviceWorkers, 'console-message', 4, () => w.loadURL(`${baseUrl}/logs.html`));
  71. for (const event of events) {
  72. messages[event[1].message] = event[1];
  73. expect(event[1]).to.have.property('source', 'console-api');
  74. }
  75. expect(messages).to.have.property('log log');
  76. expect(messages).to.have.property('info log');
  77. expect(messages).to.have.property('warn log');
  78. expect(messages).to.have.property('error log');
  79. expect(messages['log log']).to.have.property('level', 1);
  80. expect(messages['info log']).to.have.property('level', 1);
  81. expect(messages['warn log']).to.have.property('level', 2);
  82. expect(messages['error log']).to.have.property('level', 3);
  83. });
  84. });
  85. });