/ clis / notebooklm / notes-get.test.js
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  });