Files
continue/core/autocomplete/snippets/gitDiffCache.vitest.ts
2025-06-17 10:35:25 +05:30

86 lines
2.6 KiB
TypeScript

import { beforeEach, expect, test, vi } from "vitest";
import { GitDiffCache } from "./gitDiffCache";
beforeEach(() => {
// Add this line to GitDiffCache class to make instance accessible
(GitDiffCache as any).instance = null;
});
test("GitDiffCache returns cached results within cache time", async () => {
const mockDiff = ["file1.ts", "file2.ts"];
const getDiffFn = vi.fn().mockResolvedValue(mockDiff);
const cache = GitDiffCache.getInstance(getDiffFn, 1); // 1 second cache
const result1 = await cache.get();
const result2 = await cache.get();
expect(result1).toEqual(mockDiff);
expect(result2).toEqual(mockDiff);
expect(getDiffFn).toHaveBeenCalledTimes(1);
});
test("GitDiffCache refreshes cache after expiration", async () => {
const mockDiff = ["file1.ts"];
const getDiffFn = vi.fn().mockResolvedValue(mockDiff);
const cache = GitDiffCache.getInstance(getDiffFn, 0.1); // 100ms cache
const result1 = await cache.get();
await new Promise((resolve) => setTimeout(resolve, 200)); // Wait for cache to expire
const result2 = await cache.get();
expect(getDiffFn).toHaveBeenCalledTimes(2);
});
test("GitDiffCache returns empty array on error", async () => {
const getDiffFn = vi.fn().mockRejectedValue(new Error("Git error"));
const cache = GitDiffCache.getInstance(getDiffFn);
const result = await cache.get();
expect(result).toEqual([]);
});
test("GitDiffCache reuses pending request", async () => {
const mockDiff = ["file1.ts"];
let resolvePromise: (value: string[]) => void;
const getDiffFn = vi.fn().mockImplementation(() => {
return new Promise((resolve) => {
resolvePromise = resolve;
});
});
const cache = GitDiffCache.getInstance(getDiffFn);
const promise1 = cache.get();
const promise2 = cache.get();
resolvePromise!(mockDiff);
const [result1, result2] = await Promise.all([promise1, promise2]);
expect(result1).toEqual(mockDiff);
expect(result2).toEqual(mockDiff);
expect(getDiffFn).toHaveBeenCalledTimes(1);
});
test("GitDiffCache invalidate clears cache", async () => {
const mockDiff = ["file1.ts"];
const getDiffFn = vi.fn().mockResolvedValue(mockDiff);
const cache = GitDiffCache.getInstance(getDiffFn);
await cache.get();
cache.invalidate();
await cache.get();
expect(getDiffFn).toHaveBeenCalledTimes(2);
});
test("GitDiffCache maintains singleton instance", () => {
const getDiffFn1 = vi.fn();
const getDiffFn2 = vi.fn();
const instance1 = GitDiffCache.getInstance(getDiffFn1);
const instance2 = GitDiffCache.getInstance(getDiffFn2);
expect(instance1).toBe(instance2);
});