Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/a2a-server/src/http/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,7 @@ export async function createApp() {
error:
'Listing all task metadata is only supported when using InMemoryTaskStore.',
});
return;
}
try {
const wrappers = agentExecutor.getAllTasks();
Expand Down
38 changes: 38 additions & 0 deletions packages/a2a-server/src/http/endpoints.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ vi.mock('../utils/logger.js', () => ({
logger: { info: vi.fn(), warn: vi.fn(), error: vi.fn() },
}));

// Mock @google-cloud/storage so GCSTaskStore can be instantiated without
// a real GCS connection. This is only exercised when GCS_BUCKET_NAME is set.
vi.mock('@google-cloud/storage', () => ({
Storage: vi.fn().mockImplementation(() => ({
getBuckets: vi
.fn()
.mockResolvedValue([[{ name: 'test-bucket-for-metadata' }]]),
})),
}));

// Mock Task.create to avoid its complex setup
vi.mock('../agent/task.js', () => {
class MockTask {
Expand Down Expand Up @@ -160,3 +170,31 @@ describe('Agent Server Endpoints', () => {
expect(response.body.url).toBe(`http://localhost:${port}/`);
});
});

describe('Agent Server Endpoints (GCS Task Store)', () => {
let gcsApp: express.Express;
let gcsServer: Server;

beforeAll(async () => {
vi.stubEnv('GCS_BUCKET_NAME', 'test-bucket-for-metadata');
gcsApp = await createApp();
await new Promise<void>((resolve) => {
gcsServer = gcsApp.listen(0, () => resolve());
});
});

afterAll(async () => {
vi.unstubAllEnvs();
if (gcsServer) {
await new Promise<void>((resolve, reject) => {
gcsServer.close((err) => (err ? reject(err) : resolve()));
});
}
});

it('should return 501 for GET /tasks/metadata when not using InMemoryTaskStore', async () => {
const response = await request(gcsApp).get('/tasks/metadata');
expect(response.status).toBe(501);
expect(response.body.error).toContain('InMemoryTaskStore');
});
});