mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-15 16:41:11 -07:00
Improve code coverage for cli package (#13724)
This commit is contained in:
83
packages/cli/src/utils/persistentState.test.ts
Normal file
83
packages/cli/src/utils/persistentState.test.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2025 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import * as fs from 'node:fs';
|
||||
import * as path from 'node:path';
|
||||
import { Storage, debugLogger } from '@google/gemini-cli-core';
|
||||
import { PersistentState } from './persistentState.js';
|
||||
|
||||
vi.mock('node:fs');
|
||||
vi.mock('@google/gemini-cli-core', () => ({
|
||||
Storage: {
|
||||
getGlobalGeminiDir: vi.fn(),
|
||||
},
|
||||
debugLogger: {
|
||||
warn: vi.fn(),
|
||||
},
|
||||
}));
|
||||
|
||||
describe('PersistentState', () => {
|
||||
let persistentState: PersistentState;
|
||||
const mockDir = '/mock/dir';
|
||||
const mockFilePath = path.join(mockDir, 'state.json');
|
||||
|
||||
beforeEach(() => {
|
||||
vi.resetAllMocks();
|
||||
vi.mocked(Storage.getGlobalGeminiDir).mockReturnValue(mockDir);
|
||||
persistentState = new PersistentState();
|
||||
});
|
||||
|
||||
it('should load state from file if it exists', () => {
|
||||
const mockData = { defaultBannerShownCount: { banner1: 1 } };
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(mockData));
|
||||
|
||||
const value = persistentState.get('defaultBannerShownCount');
|
||||
expect(value).toEqual(mockData.defaultBannerShownCount);
|
||||
expect(fs.readFileSync).toHaveBeenCalledWith(mockFilePath, 'utf-8');
|
||||
});
|
||||
|
||||
it('should return undefined if key does not exist', () => {
|
||||
vi.mocked(fs.existsSync).mockReturnValue(false);
|
||||
const value = persistentState.get('defaultBannerShownCount');
|
||||
expect(value).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should save state to file', () => {
|
||||
vi.mocked(fs.existsSync).mockReturnValue(false);
|
||||
persistentState.set('defaultBannerShownCount', { banner1: 1 });
|
||||
|
||||
expect(fs.mkdirSync).toHaveBeenCalledWith(path.normalize(mockDir), {
|
||||
recursive: true,
|
||||
});
|
||||
expect(fs.writeFileSync).toHaveBeenCalledWith(
|
||||
mockFilePath,
|
||||
JSON.stringify({ defaultBannerShownCount: { banner1: 1 } }, null, 2),
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle load errors and start fresh', () => {
|
||||
vi.mocked(fs.existsSync).mockReturnValue(true);
|
||||
vi.mocked(fs.readFileSync).mockImplementation(() => {
|
||||
throw new Error('Read error');
|
||||
});
|
||||
|
||||
const value = persistentState.get('defaultBannerShownCount');
|
||||
expect(value).toBeUndefined();
|
||||
expect(debugLogger.warn).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should handle save errors', () => {
|
||||
vi.mocked(fs.existsSync).mockReturnValue(false);
|
||||
vi.mocked(fs.writeFileSync).mockImplementation(() => {
|
||||
throw new Error('Write error');
|
||||
});
|
||||
|
||||
persistentState.set('defaultBannerShownCount', { banner1: 1 });
|
||||
expect(debugLogger.warn).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user