Files
deepseek-harness/packages/experimental/forge-github/tests/plugin.spec.ts
T
Yichen Jiang 38b59a84bc feat(forge): read pull request commits and commit ranges
ForgeProvider gains optional commits and compare methods, which a provider
implements together. The forge service returns undefined from commits and an
unavailable failure from compare when either is missing. The GitHub provider
lists commits through GraphQL pages pinned to one head, bounded by the new
maxCommits setting, and reads ranges through the compare API in diff form.
2026-11-06 17:50:54 +08:00

73 lines
3.1 KiB
TypeScript

import { Context } from '@deepseek-ai/cordis'
import ForgeService from '@deepseek-ai/dsh-experimental-forge'
import { afterEach, describe, expect, it } from 'vitest'
import * as ForgeGitHub from '../src/index.ts'
let ctx: Context | undefined
afterEach(async () => {
await ctx?.fiber.dispose()
ctx = undefined
})
async function forge(): Promise<Context> {
ctx = new Context()
await ctx.plugin(ForgeService)
return ctx
}
describe('forge-github plugin', () => {
it('registers the GitHub provider for the configured hosts', async () => {
const context = await forge()
await context.plugin(ForgeGitHub, { hosts: ['github.com', 'ghe.corp.example'] })
expect(context.forge.changeRequestFromUrl('https://github.com/octo/demo/pull/1')).toEqual({
repository: { forge: 'github', host: 'github.com', owner: 'octo', name: 'demo' },
number: 1,
})
expect(context.forge.repositoryFromRemote('[email protected]:team/svc.git')).toEqual({ forge: 'github', host: 'ghe.corp.example', owner: 'team', name: 'svc' })
})
it('serves github.com by default', async () => {
const context = await forge()
await context.plugin(ForgeGitHub, {})
expect(context.forge.repositoryFromRemote('https://github.com/octo/demo.git')).toBeDefined()
expect(context.forge.repositoryFromRemote('https://ghe.corp.example/team/svc.git')).toBeUndefined()
})
it('unregisters the provider when its fiber is disposed', async () => {
const context = await forge()
const fiber = context.plugin(ForgeGitHub, {})
await fiber
await fiber.dispose()
expect(context.forge.changeRequestFromUrl('https://github.com/octo/demo/pull/1')).toBeUndefined()
})
it.each([
[{ ghCommand: ' ' }, 'forge-github: ghCommand must not be empty'],
[{ hosts: [] }, 'forge-github: hosts must list at least one host'],
[{ hosts: ['https://github.com'] }, 'forge-github: invalid host "https://github.com"'],
[{ timeoutMs: 0 }, 'forge-github: timeoutMs must be a positive integer no greater than 2147483647'],
[{ timeoutMs: 2_147_483_648 }, 'forge-github: timeoutMs must be a positive integer no greater than 2147483647'],
[{ timeoutMs: 1.5 }, 'forge-github: timeoutMs must be a positive integer no greater than 2147483647'],
[{ maxOutputBytes: 1.5 }, 'forge-github: maxOutputBytes must be a positive safe integer'],
[{ maxOutputBytes: 0 }, 'forge-github: maxOutputBytes must be a positive safe integer'],
[{ maxOutputBytes: Number.MAX_SAFE_INTEGER + 1 }, 'forge-github: maxOutputBytes must be a positive safe integer'],
[{ maxCommits: 0 }, 'forge-github: maxCommits must be a positive safe integer'],
[{ maxCommits: 2.5 }, 'forge-github: maxCommits must be a positive safe integer'],
])('rejects %j at load', async (config, message) => {
const context = await forge()
await expect(context.plugin(ForgeGitHub, config)).rejects.toThrow(message)
})
it('does not apply timer limits to the output byte budget', async () => {
const context = await forge()
await context.plugin(ForgeGitHub, { maxOutputBytes: 2_147_483_648 })
expect(context.forge.repositoryFromRemote('https://github.com/octo/demo.git')).toBeDefined()
})
})