From dfe71082c6549ef2a4c878940f9f73dd19ed5608 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 3 Dec 2025 16:48:38 +0000 Subject: [PATCH] test: cover firefox cookie resolution --- tests/cookies.test.ts | 51 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/tests/cookies.test.ts b/tests/cookies.test.ts index 211e646..7f7e646 100644 --- a/tests/cookies.test.ts +++ b/tests/cookies.test.ts @@ -6,12 +6,17 @@ vi.mock('node:child_process', () => ({ })); // Mock fs to prevent actual file operations -vi.mock('node:fs', () => ({ - existsSync: vi.fn(() => false), - copyFileSync: vi.fn(), - mkdtempSync: vi.fn(() => '/tmp/test-dir'), - rmSync: vi.fn(), -})); +vi.mock('node:fs', () => { + const fs = vi.importActual('node:fs'); + return { + ...fs, + existsSync: vi.fn(() => false), + copyFileSync: vi.fn(), + mkdtempSync: vi.fn(() => '/tmp/test-dir'), + readdirSync: vi.fn(() => []), + rmSync: vi.fn(), + }; +}); describe('cookies', () => { const originalEnv = process.env; @@ -32,6 +37,32 @@ describe('cookies', () => { }); describe('resolveCredentials', () => { + it('uses firefox when enabled and returns cookies', async () => { + const { resolveCredentials } = await import('../src/lib/cookies.js'); + const fs = await import('node:fs'); + + // Firefox present with cookies.sqlite + (fs.existsSync as unknown as vi.Mock).mockImplementation((path: string) => { + const lower = path.toLowerCase(); + if (lower.endsWith('cookies.sqlite')) return true; + if (lower.includes('firefox')) return true; + return false; + }); + (fs.readdirSync as unknown as vi.Mock).mockReturnValue([{ isDirectory: () => true, name: 'abc.default-release' }]); + (fs.copyFileSync as unknown as vi.Mock).mockImplementation(() => {}); + (fs.mkdtempSync as unknown as vi.Mock).mockReturnValue('/tmp/test-dir'); + + // sqlite3 output for firefox + const { execSync } = await import('node:child_process'); + (execSync as unknown as vi.Mock).mockReturnValue('auth_token|firefox_auth\nct0|firefox_ct0'); + + const result = await resolveCredentials({ allowFirefox: true, allowChrome: false, firefoxProfile: 'abc.default-release' }); + + expect(result.cookies.authToken).toBe('firefox_auth'); + expect(result.cookies.ct0).toBe('firefox_ct0'); + expect(result.cookies.source).toContain('Firefox'); + }); + it('should prioritize CLI arguments over env vars', async () => { process.env.AUTH_TOKEN = 'env_auth'; process.env.CT0 = 'env_ct0'; @@ -52,7 +83,7 @@ describe('cookies', () => { process.env.CT0 = 'test_ct0'; const { resolveCredentials } = await import('../src/lib/cookies.js'); - const result = await resolveCredentials({}); + const result = await resolveCredentials({ allowFirefox: false, allowChrome: false }); expect(result.cookies.authToken).toBe('test_auth_token'); expect(result.cookies.ct0).toBe('test_ct0'); @@ -64,7 +95,7 @@ describe('cookies', () => { process.env.TWITTER_CT0 = 'twitter_ct0'; const { resolveCredentials } = await import('../src/lib/cookies.js'); - const result = await resolveCredentials({}); + const result = await resolveCredentials({ allowFirefox: false, allowChrome: false }); expect(result.cookies.authToken).toBe('twitter_auth'); expect(result.cookies.ct0).toBe('twitter_ct0'); @@ -86,7 +117,7 @@ describe('cookies', () => { process.env.CT0 = ''; const { resolveCredentials } = await import('../src/lib/cookies.js'); - const result = await resolveCredentials({}); + const result = await resolveCredentials({ allowFirefox: false, allowChrome: false }); expect(result.cookies.authToken).toBeNull(); expect(result.cookies.ct0).toBeNull(); @@ -95,7 +126,7 @@ describe('cookies', () => { it('should warn when credentials are missing', async () => { const { resolveCredentials } = await import('../src/lib/cookies.js'); - const result = await resolveCredentials({}); + const result = await resolveCredentials({ allowFirefox: false, allowChrome: false }); expect(result.warnings).toContain( 'Missing auth_token - provide via --auth-token, AUTH_TOKEN env var, or login to x.com in Chrome/Firefox',