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