File size: 2,639 Bytes
7421850 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | /**
* @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();
});
});
|