mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-13 05:12:55 -07:00
fix(a2a-server): Fix and unskip GCS persistence test (#11755)
This commit is contained in:
@@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
import { Storage } from '@google-cloud/storage';
|
import { Storage } from '@google-cloud/storage';
|
||||||
import * as fse from 'fs-extra';
|
import * as fse from 'fs-extra';
|
||||||
import { promises as fsPromises, createReadStream } from 'node:fs';
|
|
||||||
import * as tar from 'tar';
|
import * as tar from 'tar';
|
||||||
import { gzipSync, gunzipSync } from 'node:zlib';
|
import { gzipSync, gunzipSync } from 'node:zlib';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
@@ -21,12 +20,18 @@ import * as configModule from '../config/config.js';
|
|||||||
import { getPersistedState, METADATA_KEY } from '../types.js';
|
import { getPersistedState, METADATA_KEY } from '../types.js';
|
||||||
|
|
||||||
// Mock dependencies
|
// Mock dependencies
|
||||||
|
const fsMocks = vi.hoisted(() => ({
|
||||||
|
readdir: vi.fn(),
|
||||||
|
createReadStream: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
vi.mock('@google-cloud/storage');
|
vi.mock('@google-cloud/storage');
|
||||||
vi.mock('fs-extra', () => ({
|
vi.mock('fs-extra', () => ({
|
||||||
pathExists: vi.fn(),
|
pathExists: vi.fn(),
|
||||||
readdir: vi.fn(),
|
readdir: vi.fn(),
|
||||||
remove: vi.fn(),
|
remove: vi.fn(),
|
||||||
ensureDir: vi.fn(),
|
ensureDir: vi.fn(),
|
||||||
|
createReadStream: vi.fn(),
|
||||||
}));
|
}));
|
||||||
vi.mock('node:fs', async () => {
|
vi.mock('node:fs', async () => {
|
||||||
const actual = await vi.importActual<typeof import('node:fs')>('node:fs');
|
const actual = await vi.importActual<typeof import('node:fs')>('node:fs');
|
||||||
@@ -34,12 +39,37 @@ vi.mock('node:fs', async () => {
|
|||||||
...actual,
|
...actual,
|
||||||
promises: {
|
promises: {
|
||||||
...actual.promises,
|
...actual.promises,
|
||||||
readdir: vi.fn(),
|
readdir: fsMocks.readdir,
|
||||||
},
|
},
|
||||||
createReadStream: vi.fn(),
|
createReadStream: fsMocks.createReadStream,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
vi.mock('fs', async () => {
|
||||||
|
const actual = await vi.importActual<typeof import('node:fs')>('node:fs');
|
||||||
|
return {
|
||||||
|
...actual,
|
||||||
|
promises: {
|
||||||
|
...actual.promises,
|
||||||
|
readdir: fsMocks.readdir,
|
||||||
|
},
|
||||||
|
createReadStream: fsMocks.createReadStream,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
vi.mock('tar', async () => {
|
||||||
|
const actualFs = await vi.importActual<typeof import('node:fs')>('node:fs');
|
||||||
|
return {
|
||||||
|
c: vi.fn(({ file }) => {
|
||||||
|
if (file) {
|
||||||
|
actualFs.writeFileSync(file, Buffer.from('dummy tar content'));
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
}),
|
||||||
|
x: vi.fn().mockResolvedValue(undefined),
|
||||||
|
t: vi.fn().mockResolvedValue(undefined),
|
||||||
|
r: vi.fn().mockResolvedValue(undefined),
|
||||||
|
u: vi.fn().mockResolvedValue(undefined),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
vi.mock('tar');
|
|
||||||
vi.mock('zlib');
|
vi.mock('zlib');
|
||||||
vi.mock('uuid');
|
vi.mock('uuid');
|
||||||
vi.mock('../utils/logger.js', () => ({
|
vi.mock('../utils/logger.js', () => ({
|
||||||
@@ -66,7 +96,7 @@ vi.mock('../types.js', async (importOriginal) => {
|
|||||||
|
|
||||||
const mockStorage = Storage as MockedClass<typeof Storage>;
|
const mockStorage = Storage as MockedClass<typeof Storage>;
|
||||||
const mockFse = fse as Mocked<typeof fse>;
|
const mockFse = fse as Mocked<typeof fse>;
|
||||||
const mockCreateReadStream = createReadStream as Mock;
|
const mockCreateReadStream = fsMocks.createReadStream;
|
||||||
const mockTar = tar as Mocked<typeof tar>;
|
const mockTar = tar as Mocked<typeof tar>;
|
||||||
const mockGzipSync = gzipSync as Mock;
|
const mockGzipSync = gzipSync as Mock;
|
||||||
const mockGunzipSync = gunzipSync as Mock;
|
const mockGunzipSync = gunzipSync as Mock;
|
||||||
@@ -76,10 +106,19 @@ const mockGetPersistedState = getPersistedState as Mock;
|
|||||||
const TEST_METADATA_KEY = METADATA_KEY || '__persistedState';
|
const TEST_METADATA_KEY = METADATA_KEY || '__persistedState';
|
||||||
|
|
||||||
type MockWriteStream = {
|
type MockWriteStream = {
|
||||||
|
emit: Mock<(event: string, ...args: unknown[]) => boolean>;
|
||||||
|
removeListener: Mock<
|
||||||
|
(event: string, cb: (error?: Error | null) => void) => MockWriteStream
|
||||||
|
>;
|
||||||
|
once: Mock<
|
||||||
|
(event: string, cb: (error?: Error | null) => void) => MockWriteStream
|
||||||
|
>;
|
||||||
on: Mock<
|
on: Mock<
|
||||||
(event: string, cb: (error?: Error | null) => void) => MockWriteStream
|
(event: string, cb: (error?: Error | null) => void) => MockWriteStream
|
||||||
>;
|
>;
|
||||||
destroy: Mock<() => void>;
|
destroy: Mock<() => void>;
|
||||||
|
write: Mock<(chunk: unknown, encoding?: unknown, cb?: unknown) => boolean>;
|
||||||
|
end: Mock<(cb?: unknown) => void>;
|
||||||
destroyed: boolean;
|
destroyed: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -114,11 +153,18 @@ describe('GCSTaskStore', () => {
|
|||||||
bucketName = 'test-bucket';
|
bucketName = 'test-bucket';
|
||||||
|
|
||||||
mockWriteStream = {
|
mockWriteStream = {
|
||||||
|
emit: vi.fn().mockReturnValue(true),
|
||||||
|
removeListener: vi.fn().mockReturnValue(mockWriteStream),
|
||||||
on: vi.fn((event, cb) => {
|
on: vi.fn((event, cb) => {
|
||||||
if (event === 'finish') setTimeout(cb, 0); // Simulate async finish
|
if (event === 'finish') setTimeout(cb, 0); // Simulate async finish
|
||||||
return mockWriteStream;
|
return mockWriteStream;
|
||||||
}),
|
}),
|
||||||
|
once: vi.fn((event, cb) => {
|
||||||
|
if (event === 'finish') setTimeout(cb, 0); // Simulate async finish return mockWriteStream;
|
||||||
|
}),
|
||||||
destroy: vi.fn(),
|
destroy: vi.fn(),
|
||||||
|
write: vi.fn().mockReturnValue(true),
|
||||||
|
end: vi.fn(),
|
||||||
destroyed: false,
|
destroyed: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -149,14 +195,16 @@ describe('GCSTaskStore', () => {
|
|||||||
_taskState: 'submitted',
|
_taskState: 'submitted',
|
||||||
});
|
});
|
||||||
(fse.pathExists as Mock).mockResolvedValue(true);
|
(fse.pathExists as Mock).mockResolvedValue(true);
|
||||||
(fsPromises.readdir as Mock).mockResolvedValue(['file1.txt']);
|
fsMocks.readdir.mockResolvedValue(['file1.txt']);
|
||||||
mockTar.c.mockResolvedValue(undefined);
|
|
||||||
mockTar.x.mockResolvedValue(undefined);
|
|
||||||
mockFse.remove.mockResolvedValue(undefined);
|
mockFse.remove.mockResolvedValue(undefined);
|
||||||
mockFse.ensureDir.mockResolvedValue(undefined);
|
mockFse.ensureDir.mockResolvedValue(undefined);
|
||||||
mockGzipSync.mockReturnValue(Buffer.from('compressed'));
|
mockGzipSync.mockReturnValue(Buffer.from('compressed'));
|
||||||
mockGunzipSync.mockReturnValue(Buffer.from('{}'));
|
mockGunzipSync.mockReturnValue(Buffer.from('{}'));
|
||||||
mockCreateReadStream.mockReturnValue({ on: vi.fn(), pipe: vi.fn() });
|
mockCreateReadStream.mockReturnValue({ on: vi.fn(), pipe: vi.fn() });
|
||||||
|
mockFse.createReadStream.mockReturnValue({
|
||||||
|
on: vi.fn(),
|
||||||
|
pipe: vi.fn(),
|
||||||
|
} as unknown as import('node:fs').ReadStream);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Constructor & Initialization', () => {
|
describe('Constructor & Initialization', () => {
|
||||||
@@ -201,13 +249,12 @@ describe('GCSTaskStore', () => {
|
|||||||
metadata: {},
|
metadata: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
it.skip('should save metadata and workspace', async () => {
|
it('should save metadata and workspace', async () => {
|
||||||
const store = new GCSTaskStore(bucketName);
|
const store = new GCSTaskStore(bucketName);
|
||||||
await store.save(mockTask);
|
await store.save(mockTask);
|
||||||
|
|
||||||
expect(mockFile.save).toHaveBeenCalledTimes(1);
|
expect(mockFile.save).toHaveBeenCalledTimes(1);
|
||||||
expect(mockTar.c).toHaveBeenCalledTimes(1);
|
expect(mockTar.c).toHaveBeenCalledTimes(1);
|
||||||
expect(mockCreateReadStream).toHaveBeenCalledTimes(1);
|
|
||||||
expect(mockFse.remove).toHaveBeenCalledTimes(1);
|
expect(mockFse.remove).toHaveBeenCalledTimes(1);
|
||||||
expect(logger.info).toHaveBeenCalledWith(
|
expect(logger.info).toHaveBeenCalledWith(
|
||||||
expect.stringContaining('metadata saved to GCS'),
|
expect.stringContaining('metadata saved to GCS'),
|
||||||
|
|||||||
Reference in New Issue
Block a user