source-get.test.js
1 import { beforeEach, describe, expect, it, vi } from 'vitest'; 2 const { mockListNotebooklmSourcesViaRpc, mockListNotebooklmSourcesFromPage, mockGetNotebooklmPageState, mockRequireNotebooklmSession, } = vi.hoisted(() => ({ 3 mockListNotebooklmSourcesViaRpc: vi.fn(), 4 mockListNotebooklmSourcesFromPage: vi.fn(), 5 mockGetNotebooklmPageState: vi.fn(), 6 mockRequireNotebooklmSession: vi.fn(), 7 })); 8 vi.mock('./utils.js', async () => { 9 const actual = await vi.importActual('./utils.js'); 10 return { 11 ...actual, 12 getNotebooklmPageState: mockGetNotebooklmPageState, 13 listNotebooklmSourcesViaRpc: mockListNotebooklmSourcesViaRpc, 14 listNotebooklmSourcesFromPage: mockListNotebooklmSourcesFromPage, 15 requireNotebooklmSession: mockRequireNotebooklmSession, 16 }; 17 }); 18 import { getRegistry } from '@jackwener/opencli/registry'; 19 import './source-get.js'; 20 describe('notebooklm source-get', () => { 21 const command = getRegistry().get('notebooklm/source-get'); 22 beforeEach(() => { 23 mockListNotebooklmSourcesViaRpc.mockReset(); 24 mockListNotebooklmSourcesFromPage.mockReset(); 25 mockGetNotebooklmPageState.mockReset(); 26 mockRequireNotebooklmSession.mockReset(); 27 mockRequireNotebooklmSession.mockResolvedValue(undefined); 28 mockGetNotebooklmPageState.mockResolvedValue({ 29 url: 'https://notebooklm.google.com/notebook/nb-demo', 30 title: 'Browser Automation', 31 hostname: 'notebooklm.google.com', 32 kind: 'notebook', 33 notebookId: 'nb-demo', 34 loginRequired: false, 35 notebookCount: 1, 36 }); 37 }); 38 it('returns a source by exact id from rpc results', async () => { 39 mockListNotebooklmSourcesViaRpc.mockResolvedValue([ 40 { 41 id: 'src-1', 42 notebook_id: 'nb-demo', 43 title: 'Release Notes', 44 url: 'https://notebooklm.google.com/notebook/nb-demo', 45 source: 'rpc', 46 type: 'web', 47 }, 48 ]); 49 const result = await command.func({}, { source: 'src-1' }); 50 expect(result).toEqual([ 51 { 52 id: 'src-1', 53 notebook_id: 'nb-demo', 54 title: 'Release Notes', 55 url: 'https://notebooklm.google.com/notebook/nb-demo', 56 source: 'rpc', 57 type: 'web', 58 }, 59 ]); 60 expect(mockListNotebooklmSourcesFromPage).not.toHaveBeenCalled(); 61 }); 62 it('falls back to page results and matches by title when rpc is empty', async () => { 63 mockListNotebooklmSourcesViaRpc.mockResolvedValue([]); 64 mockListNotebooklmSourcesFromPage.mockResolvedValue([ 65 { 66 id: 'Meeting Notes', 67 notebook_id: 'nb-demo', 68 title: 'Meeting Notes', 69 url: 'https://notebooklm.google.com/notebook/nb-demo', 70 source: 'current-page', 71 }, 72 ]); 73 const result = await command.func({}, { source: 'meeting notes' }); 74 expect(result).toEqual([ 75 { 76 id: 'Meeting Notes', 77 notebook_id: 'nb-demo', 78 title: 'Meeting Notes', 79 url: 'https://notebooklm.google.com/notebook/nb-demo', 80 source: 'current-page', 81 }, 82 ]); 83 }); 84 });