mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-03-30 13:54:01 +00:00
111 lines
3.8 KiB
TypeScript
111 lines
3.8 KiB
TypeScript
import { describe, test, expect, beforeAll, afterAll } from "bun:test"
|
|
import { Discovery } from "../../src/skill/discovery"
|
|
import { Filesystem } from "../../src/util/filesystem"
|
|
import { rm } from "fs/promises"
|
|
import path from "path"
|
|
|
|
let CLOUDFLARE_SKILLS_URL: string
|
|
let server: ReturnType<typeof Bun.serve>
|
|
let downloadCount = 0
|
|
|
|
const fixturePath = path.join(import.meta.dir, "../fixture/skills")
|
|
|
|
beforeAll(async () => {
|
|
await rm(Discovery.dir(), { recursive: true, force: true })
|
|
|
|
server = Bun.serve({
|
|
port: 0,
|
|
async fetch(req) {
|
|
const url = new URL(req.url)
|
|
|
|
// route /.well-known/skills/* to the fixture directory
|
|
if (url.pathname.startsWith("/.well-known/skills/")) {
|
|
const filePath = url.pathname.replace("/.well-known/skills/", "")
|
|
const fullPath = path.join(fixturePath, filePath)
|
|
|
|
if (await Filesystem.exists(fullPath)) {
|
|
if (!fullPath.endsWith("index.json")) {
|
|
downloadCount++
|
|
}
|
|
return new Response(Bun.file(fullPath))
|
|
}
|
|
}
|
|
|
|
return new Response("Not Found", { status: 404 })
|
|
},
|
|
})
|
|
|
|
CLOUDFLARE_SKILLS_URL = `http://localhost:${server.port}/.well-known/skills/`
|
|
})
|
|
|
|
afterAll(async () => {
|
|
server?.stop()
|
|
await rm(Discovery.dir(), { recursive: true, force: true })
|
|
})
|
|
|
|
describe("Discovery.pull", () => {
|
|
test("downloads skills from cloudflare url", async () => {
|
|
const dirs = await Discovery.pull(CLOUDFLARE_SKILLS_URL)
|
|
expect(dirs.length).toBeGreaterThan(0)
|
|
for (const dir of dirs) {
|
|
expect(dir).toStartWith(Discovery.dir())
|
|
const md = path.join(dir, "SKILL.md")
|
|
expect(await Filesystem.exists(md)).toBe(true)
|
|
}
|
|
})
|
|
|
|
test("url without trailing slash works", async () => {
|
|
const dirs = await Discovery.pull(CLOUDFLARE_SKILLS_URL.replace(/\/$/, ""))
|
|
expect(dirs.length).toBeGreaterThan(0)
|
|
for (const dir of dirs) {
|
|
const md = path.join(dir, "SKILL.md")
|
|
expect(await Filesystem.exists(md)).toBe(true)
|
|
}
|
|
})
|
|
|
|
test("returns empty array for invalid url", async () => {
|
|
const dirs = await Discovery.pull(`http://localhost:${server.port}/invalid-url/`)
|
|
expect(dirs).toEqual([])
|
|
})
|
|
|
|
test("returns empty array for non-json response", async () => {
|
|
// any url not explicitly handled in server returns 404 text "Not Found"
|
|
const dirs = await Discovery.pull(`http://localhost:${server.port}/some-other-path/`)
|
|
expect(dirs).toEqual([])
|
|
})
|
|
|
|
test("downloads reference files alongside SKILL.md", async () => {
|
|
const dirs = await Discovery.pull(CLOUDFLARE_SKILLS_URL)
|
|
// find a skill dir that should have reference files (e.g. agents-sdk)
|
|
const agentsSdk = dirs.find((d) => d.endsWith(path.sep + "agents-sdk"))
|
|
expect(agentsSdk).toBeDefined()
|
|
if (agentsSdk) {
|
|
const refs = path.join(agentsSdk, "references")
|
|
expect(await Filesystem.exists(path.join(agentsSdk, "SKILL.md"))).toBe(true)
|
|
// agents-sdk has reference files per the index
|
|
const refDir = await Array.fromAsync(new Bun.Glob("**/*.md").scan({ cwd: refs, onlyFiles: true }))
|
|
expect(refDir.length).toBeGreaterThan(0)
|
|
}
|
|
})
|
|
|
|
test("caches downloaded files on second pull", async () => {
|
|
// clear dir and downloadCount
|
|
await rm(Discovery.dir(), { recursive: true, force: true })
|
|
downloadCount = 0
|
|
|
|
// first pull to populate cache
|
|
const first = await Discovery.pull(CLOUDFLARE_SKILLS_URL)
|
|
expect(first.length).toBeGreaterThan(0)
|
|
const firstCount = downloadCount
|
|
expect(firstCount).toBeGreaterThan(0)
|
|
|
|
// second pull should return same results from cache
|
|
const second = await Discovery.pull(CLOUDFLARE_SKILLS_URL)
|
|
expect(second.length).toBe(first.length)
|
|
expect(second.sort()).toEqual(first.sort())
|
|
|
|
// second pull should NOT increment download count
|
|
expect(downloadCount).toBe(firstCount)
|
|
})
|
|
})
|