feat: persist settings and enrich conversation context

This commit is contained in:
jjbrunton committed 2026-08-08 18:18:28 +01:00
1 parent a36723a325
commit 2c100d72b6
84 files changed
+2248 -644

No files matched your search

+40
View File
@@ -1,5 +1,7 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import axios from 'axios';
import type { AxiosInstance } from 'axios';
import type { BrowserContext } from 'playwright';
import { RedditApiClient } from '../src/reddit/api.js';
import type { RedditPost } from '../src/reddit/api.js';
import { createMockLogger } from '../tests/mockLogger.js';
@@ -394,6 +396,44 @@ describe('RedditApiClient', () => {
});
});
describe('resolveUsernameToT2', () => {
it('uses the imported Reddit session and normalizes the account ID', async () => {
const mockAxios = {
get: vi.fn().mockResolvedValue({ data: { data: { id: 'abc123' } } }),
};
vi.mocked(axios.create).mockReturnValue(mockAxios as unknown as AxiosInstance);
const client2 = new RedditApiClient(getTestConfig(), logger);
const cookies = vi.fn().mockResolvedValue([
{ name: 'reddit_session', value: 'session-value' },
]);
client2.setBrowserContext({ cookies } as unknown as BrowserContext);
await expect(client2.resolveUsernameToT2('alice')).resolves.toBe('t2_abc123');
expect(mockAxios.get).toHaveBeenCalledWith('/user/alice/about.json', {
params: { raw_json: 1 },
headers: { Cookie: 'reddit_session=session-value' },
});
});
it('returns null only when Reddit confirms the user is missing', async () => {
const error = { isAxiosError: true, response: { status: 404 } };
const mockAxios = { get: vi.fn().mockRejectedValue(error) };
vi.mocked(axios.create).mockReturnValue(mockAxios as unknown as AxiosInstance);
const client2 = new RedditApiClient(getTestConfig(), logger);
await expect(client2.resolveUsernameToT2('missing')).resolves.toBeNull();
});
it('does not misclassify a 403 as an unknown user', async () => {
const error = { isAxiosError: true, response: { status: 403 } };
const mockAxios = { get: vi.fn().mockRejectedValue(error) };
vi.mocked(axios.create).mockReturnValue(mockAxios as unknown as AxiosInstance);
const client2 = new RedditApiClient(getTestConfig(), logger);
await expect(client2.resolveUsernameToT2('alice')).rejects.toBe(error);
});
});
describe('getNewPosts', () => {
it('returns empty array for 404 subreddit', async () => {
const error = { isAxiosError: true, response: { status: 404 } };