Path: blob/main/extensions/copilot/test/prompts/devContainerConfigGenerator.stest.ts
13388 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*--------------------------------------------------------------------------------------------*/4import * as assert from 'assert';5import * as fs from 'fs';6import * as path from 'path';7import { DevContainerConfigGenerator } from '../../src/extension/prompt/node/devContainerConfigGenerator';8import { DevContainerConfigIndex, DevContainerConfigTemplate } from '../../src/platform/devcontainer/common/devContainerConfigurationService';9import { CancellationToken } from '../../src/util/vs/base/common/cancellation';10import { IInstantiationService } from '../../src/util/vs/platform/instantiation/common/instantiation';11import { ssuite, stest } from '../base/stest';121314let index: Promise<DevContainerConfigIndex> | undefined;15async function loadIndex() {16return index || (index = (async () => {17const indexPath = path.join(__dirname, '../test/prompts/fixtures/devcontainer/devContainerIndex.json'); // Cached copy of https://containers.dev/static/devcontainer-index.json18const index = JSON.parse(await fs.promises.readFile(indexPath, 'utf8'));19const templates = index.collections20.filter((c: any) => c.sourceInformation.repository === 'https://github.com/devcontainers/templates')21.map((c: any) => c.templates)22.flat()23.map(({ id, name, description }: any) => ({ id, name, description } as DevContainerConfigTemplate));24const features = index.collections25.filter((c: any) => c.sourceInformation.repository === 'https://github.com/devcontainers/features')26.map((c: any) => c.features)27.flat()28.map(({ id, name, description }: any) => ({ id, name, description } as DevContainerConfigTemplate));29return {30templates,31features,32};33})());34}3536ssuite({ title: 'Dev Container Configuration', location: 'external' }, () => {37const dataPath = path.join(__dirname, '../test/prompts/fixtures/devcontainer/devContainerConfigTestData.json');38const data = JSON.parse(fs.readFileSync(dataPath, 'utf8')).slice(0, 11);39for (let i = 0; i < data.length; i++) {40const d = data[i];41stest({ description: `Suggests a devcontainer.json template (sample ${i})` }, async (testingServiceCollection) => {42const accessor = testingServiceCollection.createTestingAccessor();43const instantiationService = accessor.get(IInstantiationService);44const generator = instantiationService.createInstance(DevContainerConfigGenerator);45const result = await generator.generate(await loadIndex(), d.files, CancellationToken.None);46assert.strictEqual(result.type, 'success');47assert.strictEqual(result.template, d.template);48});4950stest({ description: `Suggests devcontainer.json features (sample ${i})` }, async (testingServiceCollection) => {51const accessor = testingServiceCollection.createTestingAccessor();52const instantiationService = accessor.get(IInstantiationService);53const generator = instantiationService.createInstance(DevContainerConfigGenerator);54const result = await generator.generate(await loadIndex(), d.files, CancellationToken.None);55assert.strictEqual(result.type, 'success');56assert.ok(result.features.find(f => d.features.includes(f)));57});58}5960// // npm run simulate -- --grep=devcontainer.json --n=161// stest({ description: `Suggests a devcontainer.json template` }, async (testingServiceCollection) => {62// const dataPath = path.join(__dirname, '../test/prompts/fixtures/devcontainer/devContainerConfigTestData.json');63// const data = JSON.parse(await fs.promises.readFile(dataPath, 'utf8')).slice(0, 11);64// const results = [];65// for (let i = 0; i < data.length; i++) {66// const generator = new DevContainerConfigGenerator(accessor);67// const result = await generator.generate(await loadIndex(), data[i].files, CancellationToken.None);68// assert.strictEqual(result.type, 'success');69// results.push({70// ...data[i],71// suggestedTemplate: result.template,72// suggestedFeatures: result.features,73// });74// }75// await fs.promises.writeFile(path.join(__dirname, '../test/prompts/devContainerConfigTestResults.json'), JSON.stringify(results, null, 4));76// });77});787980