all package manager related tests passing together

This commit is contained in:
Smartsheet-JB-Brown 2025-04-14 22:24:41 -07:00
parent c05d760747
commit 4c88e930e9
15 changed files with 78 additions and 79 deletions

View file

@ -177,19 +177,6 @@ const extensionConfig = {
build.onResolve({ filter: /^pkce-challenge$/ }, (args) => {
return { path: require.resolve("pkce-challenge/dist/index.browser.js") }
})
// Handle @package-manager barrel file
build.onResolve({ filter: /^@package-manager$/ }, (args) => {
const resolvedPath = path.resolve(__dirname, "src/services/package-manager/index.ts")
return { path: resolvedPath }
})
// Handle @package-manager/* paths
build.onResolve({ filter: /^@package-manager\// }, (args) => {
const modulePath = args.path.replace(/^@package-manager\//, "")
const fullPath = path.resolve(__dirname, "src/services/package-manager", `${modulePath}.ts`)
return { path: fullPath }
})
},
},
],

View file

@ -9,8 +9,8 @@ import {
PackageManagerSource,
validateSources,
ValidationError,
} from "@package-manager"
import { DEFAULT_PACKAGE_MANAGER_SOURCE } from "@package-manager/constants"
} from "../../services/package-manager"
import { DEFAULT_PACKAGE_MANAGER_SOURCE } from "../../services/package-manager/constants"
import { GlobalState } from "../../schemas"
/**

View file

@ -3,15 +3,10 @@ import * as path from "path"
import * as fs from "fs/promises"
import * as yaml from "js-yaml"
import simpleGit, { SimpleGit } from "simple-git"
import { MetadataScanner } from "@package-manager/MetadataScanner"
import { validateAnyMetadata } from "@package-manager/schemas"
import {
LocalizationOptions,
PackageManagerItem,
PackageManagerRepository,
RepositoryMetadata,
} from "@package-manager/types"
import { getUserLocale } from "@package-manager/utils"
import { MetadataScanner } from "./MetadataScanner"
import { validateAnyMetadata } from "./schemas"
import { LocalizationOptions, PackageManagerItem, PackageManagerRepository, RepositoryMetadata } from "./types"
import { getUserLocale } from "./utils"
/**
* Handles fetching and caching package manager repositories

View file

@ -3,7 +3,7 @@ import * as fs from "fs/promises"
import * as vscode from "vscode"
import * as yaml from "js-yaml"
import { SimpleGit } from "simple-git"
import { validateAnyMetadata } from "@package-manager/schemas"
import { validateAnyMetadata } from "./schemas"
import {
ComponentMetadata,
ComponentType,
@ -11,8 +11,8 @@ import {
LocalizedMetadata,
PackageManagerItem,
PackageMetadata,
} from "@package-manager/types"
import { getUserLocale } from "@package-manager/utils"
} from "./types"
import { getUserLocale } from "./utils"
/**
* Handles component discovery and metadata loading

View file

@ -1,7 +1,7 @@
import * as vscode from "vscode"
import * as path from "path"
import * as fs from "fs/promises"
import { GitFetcher } from "@package-manager/GitFetcher"
import { GitFetcher } from "./GitFetcher"
import {
PackageManagerItem,
PackageManagerRepository,
@ -9,8 +9,8 @@ import {
ComponentType,
ComponentMetadata,
LocalizationOptions,
} from "@package-manager/types"
import { getUserLocale } from "@package-manager/utils"
} from "./types"
import { getUserLocale } from "./utils"
/**
* Service for managing package manager data

View file

@ -1,9 +1,9 @@
import * as vscode from "vscode"
import { GitFetcher } from "@package-manager/GitFetcher"
import { GitFetcher } from "../GitFetcher"
import * as fs from "fs/promises"
import { Dirent, Stats } from "fs"
import simpleGit, { SimpleGit } from "simple-git"
import { MetadataScanner } from "@package-manager/MetadataScanner"
import { MetadataScanner } from "../MetadataScanner"
import { exec, ChildProcess } from "child_process"
import { promisify } from "util"
import { EventEmitter } from "events"

View file

@ -1,9 +1,9 @@
import * as path from "path"
import * as fs from "fs/promises"
import { Dirent } from "fs"
import { MetadataScanner } from "@package-manager/MetadataScanner"
import { MetadataScanner } from "../MetadataScanner"
import { SimpleGit } from "simple-git"
import { ComponentMetadata, LocalizationOptions, LocalizedMetadata, PackageMetadata } from "@package-manager/types"
import { ComponentMetadata, LocalizationOptions, LocalizedMetadata, PackageMetadata } from "../types"
// Mock fs/promises
jest.mock("fs/promises")

View file

@ -1,7 +1,7 @@
import { PackageManagerManager } from "@package-manager/PackageManagerManager"
import { PackageManagerItem, PackageManagerSource, PackageManagerRepository } from "@package-manager/types"
import { MetadataScanner } from "@package-manager/MetadataScanner"
import { GitFetcher } from "@package-manager/GitFetcher"
import { PackageManagerManager } from "../PackageManagerManager"
import { PackageManagerItem, PackageManagerSource, PackageManagerRepository, ComponentType } from "../types"
import { MetadataScanner } from "../MetadataScanner"
import { GitFetcher } from "../GitFetcher"
import * as path from "path"
import * as vscode from "vscode"
@ -511,20 +511,49 @@ describe("Concurrency Control", () => {
let activeScans = 0
let maxConcurrentScans = 0
const scanPromises: Promise<void>[] = []
// Mock metadata scanner to track concurrent scans
jest.spyOn(MetadataScanner.prototype, "scanDirectory").mockImplementation(async () => {
// Create a mock MetadataScanner
const mockScanner = new MetadataScanner()
const scanDirectorySpy = jest.spyOn(mockScanner, "scanDirectory").mockImplementation(async () => {
activeScans++
maxConcurrentScans = Math.max(maxConcurrentScans, activeScans)
await new Promise((resolve) => setTimeout(resolve, 50))
const promise = new Promise<void>((resolve) => setTimeout(resolve, 50))
scanPromises.push(promise)
await promise
activeScans--
return []
})
// Create a mock GitFetcher that uses our mock scanner
const mockGitFetcher = new GitFetcher({
globalStorageUri: { fsPath: "/test/path" },
} as vscode.ExtensionContext)
// Replace GitFetcher's metadataScanner with our mock
;(mockGitFetcher as any).metadataScanner = mockScanner
// Mock GitFetcher's fetchRepository to trigger metadata scanning
jest.spyOn(mockGitFetcher, "fetchRepository").mockImplementation(async (repoUrl: string) => {
// Call scanDirectory through our mock scanner
await mockScanner.scanDirectory("/test/path", repoUrl)
return {
metadata: { name: "test", description: "test", version: "1.0.0" },
items: [],
url: repoUrl,
}
})
// Replace the GitFetcher instance in the manager
;(manager as any).gitFetcher = mockGitFetcher
// Process all sources
await manager.getPackageManagerItems(sources)
await Promise.all(scanPromises)
// Verify only one scan was active at a time
// Verify scans were called and only one was active at a time
expect(scanDirectorySpy).toHaveBeenCalledTimes(sources.length)
expect(maxConcurrentScans).toBe(1)
})
})

View file

@ -6,8 +6,8 @@ import {
validateSource,
validateSources,
ValidationError,
} from "@package-manager/PackageManagerSourceValidation"
import { PackageManagerSource } from "@package-manager/types"
} from "../PackageManagerSourceValidation"
import { PackageManagerSource } from "../types"
describe("PackageManagerSourceValidation", () => {
describe("isValidGitRepositoryUrl", () => {

View file

@ -20,10 +20,7 @@
"useDefineForClassFields": true,
"useUnknownInCatchVariables": false,
"baseUrl": ".",
"paths": {
"@package-manager": ["src/services/package-manager"],
"@package-manager/*": ["src/services/package-manager/*"]
}
"paths": {}
},
"include": ["src/**/*", "scripts/**/*", ".changeset/**/*"],
"exclude": ["node_modules", ".vscode-test", "webview-ui"]

View file

@ -6,7 +6,7 @@ import { PackageManagerSource } from "../../../../src/services/package-manager/t
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "cmdk"
import { isFilterActive as checkFilterActive } from "./selectors"
import { PackageManagerItemCard } from "./components/PackageManagerItemCard"
import { useStateManager } from "./state/useStateManager"
import { useStateManager } from "./useStateManager"
interface PackageManagerViewProps {
onDone?: () => void

View file

@ -1,6 +1,6 @@
import { PackageManagerItem, PackageManagerSource } from "@package-manager/types"
import { vscode } from "@/utils/vscode"
import { WebviewMessage } from "@shared/WebviewMessage"
import { PackageManagerItem, PackageManagerSource } from "../../../../src/services/package-manager/types"
import { vscode } from "../../utils/vscode"
import { WebviewMessage } from "../../../../src/shared/WebviewMessage"
export interface ViewState {
allItems: PackageManagerItem[]
@ -219,8 +219,15 @@ export class PackageManagerViewStateManager {
})
if (isActive) {
// In test environment, execute filter immediately
if (process.env.NODE_ENV === "test") {
// Always use debounce
if (this.filterTimeoutId) {
console.log("Clearing existing filter timeout")
clearTimeout(this.filterTimeoutId)
}
console.log("Setting up new filter timeout")
this.filterTimeoutId = setTimeout(() => {
console.log("Filter timeout executed, sending message")
vscode.postMessage({
type: "filterPackageManagerItems",
filters: {
@ -229,27 +236,8 @@ export class PackageManagerViewStateManager {
tags: this.state.filters.tags.length > 0 ? this.state.filters.tags : undefined,
},
} as WebviewMessage)
} else {
// In production, use debounce
if (this.filterTimeoutId) {
console.log("Clearing existing filter timeout")
clearTimeout(this.filterTimeoutId)
}
console.log("Setting up new filter timeout")
this.filterTimeoutId = setTimeout(() => {
console.log("Filter timeout executed, sending message")
vscode.postMessage({
type: "filterPackageManagerItems",
filters: {
type: this.state.filters.type || undefined,
search: this.state.filters.search || undefined,
tags: this.state.filters.tags.length > 0 ? this.state.filters.tags : undefined,
},
} as WebviewMessage)
this.filterTimeoutId = undefined
}, this.FILTER_DEBOUNCE)
}
this.filterTimeoutId = undefined
}, this.FILTER_DEBOUNCE)
}
console.log("=== UPDATE_FILTERS Finished ===")
break

View file

@ -1,6 +1,10 @@
import { PackageManagerViewStateManager } from "../PackageManagerViewStateManager"
import { vscode } from "@/utils/vscode"
import { ComponentType, PackageManagerItem, PackageManagerSource } from "@package-manager/types"
import { vscode } from "../../../utils/vscode"
import {
ComponentType,
PackageManagerItem,
PackageManagerSource,
} from "../../../../../src/services/package-manager/types"
const createTestItem = (overrides = {}): PackageManagerItem => ({
name: "test",
@ -22,7 +26,7 @@ const createTestSources = (): PackageManagerSource[] => [
]
// Mock vscode.postMessage
jest.mock("@/utils/vscode", () => ({
jest.mock("../../../utils/vscode", () => ({
vscode: {
postMessage: jest.fn(),
},

View file

@ -18,7 +18,6 @@
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
"@package-manager/*": ["../src/services/package-manager/*"],
"@shared/*": ["../src/shared/*"]
}
},