notes-get.test.js
1 import { beforeEach, describe, expect, it, vi } from 'vitest'; 2 const { mockListNotebooklmNotesFromPage, mockReadNotebooklmVisibleNoteFromPage, mockGetNotebooklmPageState, mockRequireNotebooklmSession, } = vi.hoisted(() => ({ 3 mockListNotebooklmNotesFromPage: vi.fn(), 4 mockReadNotebooklmVisibleNoteFromPage: 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 listNotebooklmNotesFromPage: mockListNotebooklmNotesFromPage, 13 readNotebooklmVisibleNoteFromPage: mockReadNotebooklmVisibleNoteFromPage, 14 getNotebooklmPageState: mockGetNotebooklmPageState, 15 requireNotebooklmSession: mockRequireNotebooklmSession, 16 }; 17 }); 18 import { getRegistry } from '@jackwener/opencli/registry'; 19 import './notes-get.js'; 20 describe('notebooklm notes-get', () => { 21 const command = getRegistry().get('notebooklm/notes-get'); 22 beforeEach(() => { 23 mockListNotebooklmNotesFromPage.mockReset(); 24 mockReadNotebooklmVisibleNoteFromPage.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 the currently visible note editor content when the title matches', async () => { 39 mockReadNotebooklmVisibleNoteFromPage.mockResolvedValue({ 40 notebook_id: 'nb-demo', 41 title: '新建笔记', 42 content: '第一段\\n第二段', 43 url: 'https://notebooklm.google.com/notebook/nb-demo', 44 source: 'studio-editor', 45 }); 46 const result = await command.func({}, { note: '新建笔记' }); 47 expect(result).toEqual([ 48 { 49 notebook_id: 'nb-demo', 50 title: '新建笔记', 51 content: '第一段\\n第二段', 52 url: 'https://notebooklm.google.com/notebook/nb-demo', 53 source: 'studio-editor', 54 }, 55 ]); 56 }); 57 it('explains the current visible-note limitation when the target note is listed but not open', async () => { 58 mockReadNotebooklmVisibleNoteFromPage.mockResolvedValue(null); 59 mockListNotebooklmNotesFromPage.mockResolvedValue([ 60 { 61 notebook_id: 'nb-demo', 62 title: '新建笔记', 63 created_at: '6 分钟前', 64 url: 'https://notebooklm.google.com/notebook/nb-demo', 65 source: 'studio-list', 66 }, 67 ]); 68 await expect(command.func({}, { note: '新建笔记' })).rejects.toMatchObject({ 69 hint: expect.stringMatching(/currently reads note content only from the visible note editor/i), 70 }); 71 }); 72 });