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 });