- Agent configs (.opencode/agents/) - Backend: alembic, routes, app, utils, scripts - Frontend: package.json, vite, components, e2e infra - Specs: 028-llm-datasource-supeset updates - Docker e2e config and Playwright setup
90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
// #region ApiHelper [C:2] [TYPE Module] [SEMANTICS e2e, api, helper, auth]
|
|
// @BRIEF Helper for backend API calls in E2E tests (settings CRUD, etc.)
|
|
// @RELATION DEPENDS_ON -> [GlobalSetup]
|
|
|
|
const BACKEND_URL = process.env.BACKEND_URL || 'http://127.0.0.1:8101';
|
|
|
|
/**
|
|
* Get auth token from env (set during global-setup).
|
|
*/
|
|
function getToken() {
|
|
return process.env.E2E_TOKEN;
|
|
}
|
|
|
|
/**
|
|
* Make an authenticated GET request to the backend API.
|
|
*/
|
|
export async function apiGet(path) {
|
|
const token = getToken();
|
|
const res = await fetch(`${BACKEND_URL}${path}`, {
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
if (!res.ok) {
|
|
const body = await res.text().catch(() => '');
|
|
throw new Error(`GET ${path} → ${res.status}: ${body.slice(0, 200)}`);
|
|
}
|
|
return res.json();
|
|
}
|
|
|
|
/**
|
|
* Make an authenticated POST request to the backend API.
|
|
*/
|
|
export async function apiPost(path, body = {}) {
|
|
const token = getToken();
|
|
const res = await fetch(`${BACKEND_URL}${path}`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(body),
|
|
});
|
|
if (!res.ok) {
|
|
const text = await res.text().catch(() => '');
|
|
throw new Error(`POST ${path} → ${res.status}: ${text.slice(0, 200)}`);
|
|
}
|
|
return res.status === 204 ? null : res.json();
|
|
}
|
|
|
|
/**
|
|
* Make an authenticated PUT request to the backend API.
|
|
*/
|
|
export async function apiPut(path, body = {}) {
|
|
const token = getToken();
|
|
const res = await fetch(`${BACKEND_URL}${path}`, {
|
|
method: 'PUT',
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(body),
|
|
});
|
|
if (!res.ok) {
|
|
const text = await res.text().catch(() => '');
|
|
throw new Error(`PUT ${path} → ${res.status}: ${text.slice(0, 200)}`);
|
|
}
|
|
return res.json();
|
|
}
|
|
|
|
/**
|
|
* Make an authenticated DELETE request to the backend API.
|
|
*/
|
|
export async function apiDelete(path) {
|
|
const token = getToken();
|
|
const res = await fetch(`${BACKEND_URL}${path}`, {
|
|
method: 'DELETE',
|
|
headers: {
|
|
'Authorization': `Bearer ${token}`,
|
|
},
|
|
});
|
|
if (!res.ok && res.status !== 204) {
|
|
const text = await res.text().catch(() => '');
|
|
throw new Error(`DELETE ${path} → ${res.status}: ${text.slice(0, 200)}`);
|
|
}
|
|
return res.status === 204 ? null : res.json();
|
|
}
|
|
// #endregion ApiHelper
|