fix: harden bookmark retry handling

This commit is contained in:
Peter Steinberger
2026-01-03 15:51:49 +01:00
parent 5b61f65a7c
commit b27643edbb
3 changed files with 18 additions and 8 deletions
+1 -7
View File
@@ -17,12 +17,6 @@ describe('bookmarks command', () => {
} as unknown as CliContext;
registerBookmarksCommand(program, ctx);
const command = program.commands.find((cmd) => cmd.name() === 'bookmarks');
if (!command) {
throw new Error('bookmarks command not registered');
}
const action = (command as { _actionHandler: (opts: Record<string, string>) => Promise<void> })._actionHandler;
const exitSpy = vi
.spyOn(process, 'exit')
.mockImplementation(((code?: number) => {
@@ -31,7 +25,7 @@ describe('bookmarks command', () => {
const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined);
try {
await expect(action({ maxPages: '2' })).rejects.toThrow('exit 1');
await expect(program.parseAsync(['node', 'bird', 'bookmarks', '--max-pages', '2'])).rejects.toThrow('exit 1');
expect(errorSpy).toHaveBeenCalledWith(expect.stringContaining('--max-pages requires --all'));
} finally {
exitSpy.mockRestore();
+16
View File
@@ -155,10 +155,14 @@ describe('TwitterClient API coverage', () => {
it('returns an error for non-ok responses', async () => {
const mockFetch = vi
.fn()
.mockResolvedValueOnce(makeResponse({ ok: false, status: 500, text: async () => 'down' }))
.mockResolvedValueOnce(makeResponse({ ok: false, status: 500, text: async () => 'down' }))
.mockResolvedValueOnce(makeResponse({ ok: false, status: 500, text: async () => 'down' }));
global.fetch = mockFetch as unknown as typeof fetch;
const client = new TwitterClient({ cookies: validCookies });
const clientPrivate = client as unknown as TwitterClientApiPrivate;
clientPrivate.getBookmarksQueryIds = async () => ['test'];
const result = await client.getBookmarks(1);
expect(result.success).toBe(false);
@@ -174,6 +178,8 @@ describe('TwitterClient API coverage', () => {
global.fetch = mockFetch as unknown as typeof fetch;
const client = new TwitterClient({ cookies: validCookies });
const clientPrivate = client as unknown as TwitterClientApiPrivate;
clientPrivate.getBookmarksQueryIds = async () => ['test'];
const result = await client.getBookmarks(1);
expect(result.success).toBe(false);
@@ -185,6 +191,8 @@ describe('TwitterClient API coverage', () => {
global.fetch = mockFetch as unknown as typeof fetch;
const client = new TwitterClient({ cookies: validCookies });
const clientPrivate = client as unknown as TwitterClientApiPrivate;
clientPrivate.getBookmarksQueryIds = async () => ['test'];
const result = await client.getBookmarks(1);
expect(result.success).toBe(false);
@@ -362,10 +370,14 @@ describe('TwitterClient API coverage', () => {
it('returns an error for non-ok responses', async () => {
const mockFetch = vi
.fn()
.mockResolvedValueOnce(makeResponse({ ok: false, status: 500, text: async () => 'down' }))
.mockResolvedValueOnce(makeResponse({ ok: false, status: 500, text: async () => 'down' }))
.mockResolvedValueOnce(makeResponse({ ok: false, status: 500, text: async () => 'down' }));
global.fetch = mockFetch as unknown as typeof fetch;
const client = new TwitterClient({ cookies: validCookies });
const clientPrivate = client as unknown as TwitterClientApiPrivate;
clientPrivate.getBookmarkFolderQueryIds = async () => ['test'];
const result = await client.getBookmarkFolderTimeline('123', 1);
expect(result.success).toBe(false);
@@ -381,6 +393,8 @@ describe('TwitterClient API coverage', () => {
global.fetch = mockFetch as unknown as typeof fetch;
const client = new TwitterClient({ cookies: validCookies });
const clientPrivate = client as unknown as TwitterClientApiPrivate;
clientPrivate.getBookmarkFolderQueryIds = async () => ['test'];
const result = await client.getBookmarkFolderTimeline('123', 1);
expect(result.success).toBe(false);
@@ -392,6 +406,8 @@ describe('TwitterClient API coverage', () => {
global.fetch = mockFetch as unknown as typeof fetch;
const client = new TwitterClient({ cookies: validCookies });
const clientPrivate = client as unknown as TwitterClientApiPrivate;
clientPrivate.getBookmarkFolderQueryIds = async () => ['test'];
const result = await client.getBookmarkFolderTimeline('123', 1);
expect(result.success).toBe(false);