- Implement tests for the CenteredModal component to ensure it follows the shared modal shell pattern. - Add comprehensive tests for the SearchModal results, including API interactions and UI behavior. - Create tests for accounts batch actions, verifying the functionality of refreshing balances and selecting accounts via row clicks. - Introduce tests for the accounts centered modal to confirm the use of CenteredModal for add/edit/rebind flows. - Add tests for the accounts edit panel to ensure proper rendering and functionality when opening the edit modal. - Implement tests for the accounts tokens header to verify the reuse of the accounts page header in the tokens segment. - Create tests for the system proxy settings, ensuring the correct saving of the proxy URL. - Add tests for the tokens actions layout to confirm the proper layout and styling of token row actions. - Implement tests for the tokens batch actions, including deletion of selected tokens and row selection behavior. - Introduce tests for the tokens focus navigation to ensure the correct highlighting of focused token rows.
73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest';
|
|
import { mkdtempSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
import { sql } from 'drizzle-orm';
|
|
|
|
type DbModule = typeof import('../db/index.js');
|
|
|
|
describe('siteProxy', () => {
|
|
let db: DbModule['db'];
|
|
let schema: DbModule['schema'];
|
|
let dataDir = '';
|
|
|
|
beforeAll(async () => {
|
|
dataDir = mkdtempSync(join(tmpdir(), 'metapi-site-proxy-'));
|
|
process.env.DATA_DIR = dataDir;
|
|
await import('../db/migrate.js');
|
|
const dbModule = await import('../db/index.js');
|
|
db = dbModule.db;
|
|
schema = dbModule.schema;
|
|
});
|
|
|
|
beforeEach(async () => {
|
|
const { invalidateSiteProxyCache } = await import('./siteProxy.js');
|
|
await db.delete(schema.accounts).run();
|
|
await db.delete(schema.settings).run();
|
|
await db.delete(schema.sites).run();
|
|
invalidateSiteProxyCache();
|
|
});
|
|
|
|
afterAll(() => {
|
|
delete process.env.DATA_DIR;
|
|
});
|
|
|
|
it('resolves system proxy only for sites that opt in', async () => {
|
|
await db.insert(schema.settings).values({
|
|
key: 'system_proxy_url',
|
|
value: JSON.stringify('http://127.0.0.1:7890'),
|
|
}).run();
|
|
|
|
await db.run(sql`
|
|
INSERT INTO sites (name, url, platform, use_system_proxy)
|
|
VALUES
|
|
('base-site', 'https://relay.example.com', 'new-api', 0),
|
|
('openai-site', 'https://relay.example.com/openai', 'new-api', 1)
|
|
`);
|
|
|
|
const { resolveSiteProxyUrlByRequestUrl } = await import('./siteProxy.js');
|
|
expect(await resolveSiteProxyUrlByRequestUrl('https://relay.example.com/openai/v1/models'))
|
|
.toBe('http://127.0.0.1:7890');
|
|
expect(await resolveSiteProxyUrlByRequestUrl('https://relay.example.com/v1/models'))
|
|
.toBeNull();
|
|
});
|
|
|
|
it('injects dispatcher when a site opts into the configured system proxy', async () => {
|
|
await db.insert(schema.settings).values({
|
|
key: 'system_proxy_url',
|
|
value: JSON.stringify('http://127.0.0.1:7890'),
|
|
}).run();
|
|
await db.run(sql`
|
|
INSERT INTO sites (name, url, platform, use_system_proxy)
|
|
VALUES ('proxy-site', 'https://proxy-site.example.com', 'new-api', 1)
|
|
`);
|
|
|
|
const { withSiteProxyRequestInit } = await import('./siteProxy.js');
|
|
const requestInit = await withSiteProxyRequestInit('https://proxy-site.example.com/v1/chat/completions', {
|
|
method: 'POST',
|
|
});
|
|
|
|
expect('dispatcher' in requestInit).toBe(true);
|
|
});
|
|
});
|