Path: blob/main/extensions/copilot/src/extension/chatSessions/copilotcli/vscode-node/test/readonlyContentProvider.spec.ts
13406 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { beforeEach, describe, expect, it, vi } from 'vitest';67vi.mock('vscode', () => ({8Uri: {9file: (path: string) => ({10scheme: 'file',11path,12fsPath: path,13toString: () => `file://${path}`,14}),15from: (components: { scheme: string; path: string; query: string }) => ({16scheme: components.scheme,17path: components.path,18query: components.query,19toString: () => `${components.scheme}:${components.path}?${components.query}`,20}),21},22workspace: {23registerTextDocumentContentProvider: vi.fn(() => ({ dispose: () => { } })),24},25}));2627import type { Uri } from 'vscode';28import { ReadonlyContentProvider, createReadonlyUri } from '../readonlyContentProvider';2930/** Creates a mock URI using the same factory as the source code */31function mockUri(path: string, query: string): Uri {32return createReadonlyUri(path, query);33}3435describe('ReadonlyContentProvider', () => {36let provider: ReadonlyContentProvider;3738beforeEach(() => {39provider = new ReadonlyContentProvider();40});4142it('should store and retrieve content by URI', () => {43const uri = mockUri('/test/file.ts', 'version=1');44provider.setContent(uri, 'Hello World');4546const content = provider.provideTextDocumentContent(uri);4748expect(content).toBe('Hello World');49});5051it('should return empty string for unknown URIs', () => {52const content = provider.provideTextDocumentContent(mockUri('/unknown/file.ts', 'version=1'));5354expect(content).toBe('');55});5657it('should clear content', () => {58const uri = mockUri('/test/file.ts', 'version=1');59provider.setContent(uri, 'Hello World');60provider.clearContent(uri);6162const content = provider.provideTextDocumentContent(uri);6364expect(content).toBe('');65});6667it('should overwrite existing content', () => {68const uri = mockUri('/test/file.ts', 'v=1');69provider.setContent(uri, 'First content');70provider.setContent(uri, 'Updated content');7172const content = provider.provideTextDocumentContent(uri);7374expect(content).toBe('Updated content');75});7677it('should distinguish URIs by query parameter', () => {78const originalUri = mockUri('/test/file.ts', 'original');79const modifiedUri = mockUri('/test/file.ts', 'modified');8081provider.setContent(originalUri, 'Original');82provider.setContent(modifiedUri, 'Modified');8384expect(provider.provideTextDocumentContent(originalUri)).toBe('Original');85expect(provider.provideTextDocumentContent(modifiedUri)).toBe('Modified');86});8788it('should register as a text document content provider', async () => {89const disposable = provider.register();9091const vscodeModule = await import('vscode');92expect(vscodeModule.workspace.registerTextDocumentContentProvider).toHaveBeenCalled();93expect(disposable).toBeDefined();94});9596it('should handle URIs with special characters in path', () => {97const uri = mockUri('/test/file with spaces.ts', 'version=1');98provider.setContent(uri, 'Special content');99100const content = provider.provideTextDocumentContent(uri);101102expect(content).toBe('Special content');103});104105it('should handle empty content', () => {106const uri = mockUri('/test/empty.ts', 'v=1');107provider.setContent(uri, '');108109const content = provider.provideTextDocumentContent(uri);110111expect(content).toBe('');112});113114it('should handle multiple different files', () => {115const uri1 = mockUri('/file1.ts', 'v=1');116const uri2 = mockUri('/file2.ts', 'v=1');117const uri3 = mockUri('/file3.ts', 'v=1');118119provider.setContent(uri1, 'Content 1');120provider.setContent(uri2, 'Content 2');121provider.setContent(uri3, 'Content 3');122123expect(provider.provideTextDocumentContent(uri1)).toBe('Content 1');124expect(provider.provideTextDocumentContent(uri2)).toBe('Content 2');125expect(provider.provideTextDocumentContent(uri3)).toBe('Content 3');126});127});128129130