summaryrefslogtreecommitdiff
path: root/packages/cli/src/config/memoryUtils.test.ts
blob: 3ed51e744b6b961052a868dbf6667b7535fd9ed8 (plain)
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
85
86
87
88
89
90
91
92
/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

import {
  describe,
  it,
  expect,
  vi,
  beforeEach,
  // afterEach, // Removed as it's not used
  type Mocked,
  type Mock,
} from 'vitest';
import * as path from 'path';
import { homedir } from 'os';
import * as fs from 'fs/promises';
import { getGlobalMemoryFilePath, addMemoryEntry } from './memoryUtils.js';
import { SETTINGS_DIRECTORY_NAME } from './settings.js';
import {
  MemoryTool,
  GEMINI_MD_FILENAME,
  // MEMORY_SECTION_HEADER, // Removed as it's not used
  // getErrorMessage, // Removed as it's not used
} from '@gemini-code/server';

// Mock the entire fs/promises module
vi.mock('fs/promises');
// Mock MemoryTool static method
vi.mock('@gemini-code/server', async (importOriginal) => {
  const actual = await importOriginal<typeof import('@gemini-code/server')>();
  return {
    ...actual,
    MemoryTool: {
      ...actual.MemoryTool,
      performAddMemoryEntry: vi.fn(),
    },
  };
});

describe('memoryUtils', () => {
  beforeEach(() => {
    // Reset mocks before each test
    vi.resetAllMocks();
  });

  describe('getGlobalMemoryFilePath', () => {
    it('should return the correct global memory file path', () => {
      const expectedPath = path.join(
        homedir(),
        SETTINGS_DIRECTORY_NAME,
        GEMINI_MD_FILENAME,
      );
      expect(getGlobalMemoryFilePath()).toBe(expectedPath);
    });
  });

  describe('addMemoryEntry', () => {
    const mockFs = fs as Mocked<typeof fs>; // Type cast for mocked fs
    const mockPerformAddMemoryEntry = MemoryTool.performAddMemoryEntry as Mock;

    it('should call MemoryTool.performAddMemoryEntry with correct parameters', async () => {
      const testText = 'Remember this important fact.';
      const expectedFilePath = getGlobalMemoryFilePath();

      await addMemoryEntry(testText);

      expect(mockPerformAddMemoryEntry).toHaveBeenCalledOnce();
      expect(mockPerformAddMemoryEntry).toHaveBeenCalledWith(
        testText,
        expectedFilePath,
        {
          readFile: mockFs.readFile,
          writeFile: mockFs.writeFile,
          mkdir: mockFs.mkdir,
        },
      );
    });

    it('should propagate errors from MemoryTool.performAddMemoryEntry', async () => {
      const testText = 'This will fail.';
      const expectedError = new Error('Failed to add memory entry');
      mockPerformAddMemoryEntry.mockRejectedValueOnce(expectedError);

      await expect(addMemoryEntry(testText)).rejects.toThrow(expectedError);
    });
  });

  // More tests will be added here
});