fix(auto-update): clean stale OMO cache roots
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
committed by
전나맛있는어쩌고힙한하루보내세요
parent
babee921b2
commit
37d9d613b6
@@ -1,38 +1,19 @@
|
||||
import { afterAll, afterEach, beforeEach, describe, expect, it, mock } from "bun:test"
|
||||
import { afterEach, beforeEach, describe, expect, it } from "bun:test"
|
||||
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"
|
||||
import { join } from "node:path"
|
||||
import { invalidatePackage } from "../auto-update-checker/cache"
|
||||
|
||||
const TEST_CACHE_DIR = join(import.meta.dir, "__test-cache__")
|
||||
const TEST_OPENCODE_CACHE_DIR = join(TEST_CACHE_DIR, "opencode")
|
||||
const TEST_USER_CONFIG_DIR = "/tmp/opencode-config"
|
||||
|
||||
let importCounter = 0
|
||||
|
||||
// Capture real modules BEFORE mocking
|
||||
const _realConstants = require("../auto-update-checker/constants")
|
||||
const _realLogger = require("../../shared/logger")
|
||||
|
||||
async function importFreshCacheModule(): Promise<typeof import("../auto-update-checker/cache")> {
|
||||
mock.module("../auto-update-checker/constants", () => ({
|
||||
CACHE_DIR: TEST_OPENCODE_CACHE_DIR,
|
||||
PACKAGE_NAME: "oh-my-opencode",
|
||||
NPM_REGISTRY_URL: "https://registry.npmjs.org/-/package/oh-my-opencode/dist-tags",
|
||||
NPM_FETCH_TIMEOUT: 5000,
|
||||
VERSION_FILE: join(TEST_OPENCODE_CACHE_DIR, "version"),
|
||||
INSTALLED_PACKAGE_JSON: join(TEST_OPENCODE_CACHE_DIR, "node_modules", "oh-my-opencode", "package.json"),
|
||||
getUserConfigDir: () => TEST_USER_CONFIG_DIR,
|
||||
getUserOpencodeConfig: () => join(TEST_USER_CONFIG_DIR, "opencode.json"),
|
||||
getUserOpencodeConfigJsonc: () => join(TEST_USER_CONFIG_DIR, "opencode.jsonc"),
|
||||
getWindowsAppdataDir: () => null,
|
||||
}))
|
||||
|
||||
mock.module("../../shared/logger", () => ({
|
||||
log: () => {},
|
||||
}))
|
||||
|
||||
const cacheModule = await import(`../auto-update-checker/cache?test=${importCounter++}`)
|
||||
mock.restore()
|
||||
return cacheModule
|
||||
function testInvalidatePackage(packageName?: string): boolean {
|
||||
return invalidatePackage(packageName, {
|
||||
acceptedPackageNames: ["oh-my-opencode", "oh-my-openagent"],
|
||||
cacheDir: TEST_OPENCODE_CACHE_DIR,
|
||||
defaultPackageName: "oh-my-opencode",
|
||||
userConfigDir: TEST_USER_CONFIG_DIR,
|
||||
})
|
||||
}
|
||||
|
||||
function resetTestCache(): void {
|
||||
@@ -56,6 +37,8 @@ function resetTestCache(): void {
|
||||
},
|
||||
packages: {
|
||||
"oh-my-opencode": {},
|
||||
"oh-my-openagent": {},
|
||||
"some-other-package": {},
|
||||
other: {},
|
||||
},
|
||||
},
|
||||
@@ -81,12 +64,28 @@ describe("invalidatePackage", () => {
|
||||
})
|
||||
|
||||
it("invalidates the installed package from the OpenCode cache directory", async () => {
|
||||
const { invalidatePackage } = await importFreshCacheModule()
|
||||
const rootSpecifierDir = join(TEST_OPENCODE_CACHE_DIR, "oh-my-opencode@latest")
|
||||
const rootAcceptedSpecifierDir = join(TEST_OPENCODE_CACHE_DIR, "oh-my-openagent@latest")
|
||||
const packagesSpecifierDir = join(TEST_OPENCODE_CACHE_DIR, "packages", "oh-my-opencode@latest")
|
||||
const packagesAcceptedSpecifierDir = join(TEST_OPENCODE_CACHE_DIR, "packages", "oh-my-openagent@latest")
|
||||
const otherSpecifierDir = join(TEST_OPENCODE_CACHE_DIR, "packages", "other@latest")
|
||||
mkdirSync(join(TEST_OPENCODE_CACHE_DIR, "node_modules", "oh-my-openagent"), { recursive: true })
|
||||
mkdirSync(join(rootSpecifierDir, "node_modules", "oh-my-opencode"), { recursive: true })
|
||||
mkdirSync(join(rootAcceptedSpecifierDir, "node_modules", "oh-my-openagent"), { recursive: true })
|
||||
mkdirSync(join(packagesSpecifierDir, "node_modules", "oh-my-opencode"), { recursive: true })
|
||||
mkdirSync(join(packagesAcceptedSpecifierDir, "node_modules", "oh-my-openagent"), { recursive: true })
|
||||
mkdirSync(otherSpecifierDir, { recursive: true })
|
||||
|
||||
const result = invalidatePackage()
|
||||
const result = testInvalidatePackage()
|
||||
|
||||
expect(result).toBe(true)
|
||||
expect(existsSync(rootSpecifierDir)).toBe(false)
|
||||
expect(existsSync(rootAcceptedSpecifierDir)).toBe(false)
|
||||
expect(existsSync(packagesSpecifierDir)).toBe(false)
|
||||
expect(existsSync(packagesAcceptedSpecifierDir)).toBe(false)
|
||||
expect(existsSync(otherSpecifierDir)).toBe(true)
|
||||
expect(existsSync(join(TEST_OPENCODE_CACHE_DIR, "node_modules", "oh-my-opencode"))).toBe(false)
|
||||
expect(existsSync(join(TEST_OPENCODE_CACHE_DIR, "node_modules", "oh-my-openagent"))).toBe(false)
|
||||
|
||||
const packageJson = JSON.parse(readFileSync(join(TEST_OPENCODE_CACHE_DIR, "package.json"), "utf-8")) as {
|
||||
dependencies?: Record<string, string>
|
||||
@@ -101,12 +100,25 @@ describe("invalidatePackage", () => {
|
||||
expect(bunLock.workspaces?.[""]?.dependencies?.["oh-my-opencode"]).toBe("latest")
|
||||
expect(bunLock.workspaces?.[""]?.dependencies?.other).toBe("1.0.0")
|
||||
expect(bunLock.packages?.["oh-my-opencode"]).toBeUndefined()
|
||||
expect(bunLock.packages?.["oh-my-openagent"]).toBeUndefined()
|
||||
expect(bunLock.packages?.["some-other-package"]).toEqual({})
|
||||
expect(bunLock.packages?.other).toEqual({})
|
||||
|
||||
const explicitSpecifierDir = join(TEST_OPENCODE_CACHE_DIR, "some-other-package@latest")
|
||||
const acceptedSpecifierDir = join(TEST_OPENCODE_CACHE_DIR, "oh-my-openagent@beta")
|
||||
mkdirSync(explicitSpecifierDir, { recursive: true })
|
||||
mkdirSync(acceptedSpecifierDir, { recursive: true })
|
||||
|
||||
const explicitResult = testInvalidatePackage("some-other-package")
|
||||
|
||||
expect(explicitResult).toBe(true)
|
||||
expect(existsSync(explicitSpecifierDir)).toBe(false)
|
||||
expect(existsSync(acceptedSpecifierDir)).toBe(true)
|
||||
|
||||
const explicitBunLock = JSON.parse(readFileSync(join(TEST_OPENCODE_CACHE_DIR, "bun.lock"), "utf-8")) as {
|
||||
packages?: Record<string, unknown>
|
||||
}
|
||||
expect(explicitBunLock.packages?.["some-other-package"]).toBeUndefined()
|
||||
expect(explicitBunLock.packages?.other).toEqual({})
|
||||
})
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
mock.module("../auto-update-checker/constants", () => _realConstants)
|
||||
mock.module("../../shared/logger", () => _realLogger)
|
||||
mock.restore()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user