Files
PiAgentUI/src/api/piClient.test.ts
T
Evandro b3489e1ede
Build & Push Frontend Docker Image / build-and-push (push) Canceled after 0s
Build Validation / validate (push) Canceled after 6s
Build & Push Backend Docker Image / build-and-push (push) Failing after 10m10s
Build & Push Gateway Docker Image / build-and-push (push) Failing after 10m9s
🎉 Initial commit: PiAgentUI — AI Agent Desktop & Web UI
A professional workspace for AI coding agents with:
- Real-time streaming chat with SSE
- Session management (fork, clone, tree navigation)
- MCP tools browser & metadata panel
- Skills browser (global, project, package sources)
- Voice input & STT provider configuration
- Integrated terminal & file explorer
- Model selector with capability metadata
- Keyboard-first UI with command palette
- 8 languages (en, pt-BR, es, ja, zh-CN, ar, bn, hi)
- Tauri 2 desktop app
- React 19 + TypeScript + Vite 8 + Tailwind CSS 4
- Pi Agent extension runtime

Originally forked from OpenCodeUI, now an independent project.
License: GPL-3.0-only
2026-06-01 00:50:06 -03:00

52 lines
1.8 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from 'vitest'
import { piClient } from './piClient'
import { serverStore } from '../store/serverStore'
describe('piClient Authenticated Fetch Client', () => {
beforeEach(() => {
vi.restoreAllMocks()
vi.resetModules()
localStorage.clear()
sessionStorage.clear()
})
it('builds headers with Bearer token if running in Pi Mode', async () => {
vi.spyOn(serverStore, 'isPiMode').mockReturnValue(true)
vi.spyOn(serverStore, 'getActiveToken').mockReturnValue('my-test-bearer-token')
vi.spyOn(serverStore, 'getActiveBaseUrl').mockReturnValue('http://127.0.0.1:4000')
const fetchSpy = vi
.spyOn(globalThis, 'fetch')
.mockImplementation(() => Promise.resolve(new Response(JSON.stringify({ ok: true }))))
const result = await piClient.get<{ ok: boolean }>('/api/test')
expect(result.ok).toBe(true)
expect(fetchSpy).toHaveBeenCalledWith(
'http://127.0.0.1:4000/api/test',
expect.objectContaining({
headers: expect.objectContaining({
Authorization: 'Bearer my-test-bearer-token',
'Content-Type': 'application/json',
}),
}),
)
})
it('throws backend JSON error messages instead of generic HTTP status text', async () => {
vi.spyOn(serverStore, 'getActiveToken').mockReturnValue('my-test-bearer-token')
vi.spyOn(serverStore, 'getActiveBaseUrl').mockReturnValue('http://127.0.0.1:4000')
vi.spyOn(globalThis, 'fetch').mockImplementation(() =>
Promise.resolve(
new Response(JSON.stringify({ error: 'fatal: not a git repository' }), {
status: 400,
statusText: 'Bad Request',
headers: { 'Content-Type': 'application/json' },
}),
),
)
await expect(piClient.get('/api/vcs/status')).rejects.toThrow('fatal: not a git repository')
})
})