test: cover firefox cookie resolution

This commit is contained in:
Peter Steinberger
2025-12-03 16:48:38 +00:00
parent 3e2d5641d7
commit dfe71082c6
+41 -10
View File
@@ -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<typeof import('node:fs')>('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',