Recently Written · git

scan-subread

PDF reader that follows an audiobook with the SubRead suite

git clone https://github.com/equwal/scan-subread

Log | Files | Refs


test/subread.test.ts (2909 bytes)

1 import { afterEach, describe, expect, it, vi } from 'vitest';
2 import { SubRead } from '../src/subread';
3 
4 /** A fake Screen Wake Lock API that keeps each lock it gives. */
5 function fakeWakeLock() {
6   const locks: { released: boolean; release: () => Promise<void> }[] = [];
7   const request = vi.fn(async (type: string) => {
8     expect(type).toBe('screen');
9     const lock = {
10       released: false,
11       release: async () => {
12         lock.released = true;
13       },
14     };
15     locks.push(lock);
16     return lock;
17   });
18   return { wakeLock: { request }, request, locks };
19 }
20 
21 describe('the web fallback of the plugin', () => {
22   afterEach(() => {
23     vi.unstubAllGlobals();
24   });
25 
26   it('holds one screen wake lock while keepAwake is on', async () => {
27     const { wakeLock, request, locks } = fakeWakeLock();
28     vi.stubGlobal('navigator', { wakeLock });
29     await SubRead.keepAwake({ on: true });
30     await SubRead.keepAwake({ on: true });
31     expect(request).toHaveBeenCalledTimes(1);
32     await SubRead.keepAwake({ on: false });
33     expect(locks[0]!.released).toBe(true);
34     await SubRead.keepAwake({ on: false });
35     expect(request).toHaveBeenCalledTimes(1);
36   });
37 
38   it('asks again for a lock that the browser released', async () => {
39     const { wakeLock, request, locks } = fakeWakeLock();
40     vi.stubGlobal('navigator', { wakeLock });
41     await SubRead.keepAwake({ on: true });
42     // The browser releases the lock when the page is hidden.
43     locks[0]!.released = true;
44     await SubRead.keepAwake({ on: true });
45     expect(request).toHaveBeenCalledTimes(2);
46     await SubRead.keepAwake({ on: false });
47     expect(locks[1]!.released).toBe(true);
48   });
49 
50   it('has no SubRead Anki', async () => {
51     await expect(SubRead.ankiAdd({ word: '猫', sentence: '吾輩は猫である。' })).resolves.toEqual({
52       error: 'not_installed',
53     });
54   });
55 
56   it('has no app of the suite', async () => {
57     await expect(SubRead.suite()).resolves.toEqual({
58       overlay: false,
59       overlayDebug: false,
60       subread: null,
61       anki: false,
62       dictionaries: 0,
63     });
64   });
65 
66   it('has no result file of SubRead', async () => {
67     await expect(SubRead.pendingSubtitles({ resultName: 'book.srt' })).resolves.toEqual({});
68   });
69 
70   it('cannot open SubRead Overlay', async () => {
71     await expect(SubRead.openOverlay()).rejects.toThrow('Android only.');
72   });
73 
74   it('ignores a browser with no wake lock, and a refused request', async () => {
75     vi.stubGlobal('navigator', {});
76     await expect(SubRead.keepAwake({ on: true })).resolves.toBeUndefined();
77     const refuse = vi.fn(() => Promise.reject(new Error('NotAllowedError')));
78     vi.stubGlobal('navigator', { wakeLock: { request: refuse } });
79     await expect(SubRead.keepAwake({ on: true })).resolves.toBeUndefined();
80     expect(refuse).toHaveBeenCalledTimes(1);
81     await expect(SubRead.keepAwake({ on: false })).resolves.toBeUndefined();
82   });
83 });