profile-mcp.spec.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /** MCP resource ownership across the resolved shipped profile templates. */
  2. import { mkdtempSync, readFileSync, rmSync } from 'node:fs'
  3. import { tmpdir } from 'node:os'
  4. import { join } from 'node:path'
  5. import { fileURLToPath } from 'node:url'
  6. import { describe, expect, it } from 'vitest'
  7. import { composeEntries, loadProfile, PROFILE_TEMPLATES } from '@deepseek-ai/dsh-app-boot'
  8. const installAnchor = fileURLToPath(new URL('../package.json', import.meta.url))
  9. const resourcePackage = '@deepseek-ai/dsh-mcp-resources'
  10. describe('shipped MCP resource composition', () => {
  11. it.each(Object.keys(PROFILE_TEMPLATES))('%s carries one shared resource consumer without a server', (name) => {
  12. const home = mkdtempSync(join(tmpdir(), 'dsh-profile-mcp-'))
  13. try {
  14. const profile = loadProfile('dsh', name, installAnchor, home)
  15. const warnings: string[] = []
  16. const rows = composeEntries([
  17. ...profile.layers.map(layer => layer.patches),
  18. profile.patches,
  19. ], message => warnings.push(message))
  20. expect(rows.filter(row => row.name === resourcePackage)).toEqual([
  21. { id: 'mcp-resources', name: resourcePackage },
  22. ])
  23. expect(rows.filter(row => row.name === '@deepseek-ai/dsh-mcp-client')).toEqual([])
  24. expect(warnings).toEqual([])
  25. const owners = profile.layers.filter((layer) => {
  26. const manifest = JSON.parse(readFileSync(join(layer.packageDir, 'package.json'), 'utf8')) as {
  27. dependencies?: Record<string, string>
  28. }
  29. return manifest.dependencies?.[resourcePackage] !== undefined
  30. })
  31. expect(owners.map(owner => owner.packageName)).toEqual([
  32. name === 'sdk-minimal' ? '@deepseek-ai/dsh-sdk-minimal' : '@deepseek-ai/dsh-base',
  33. ])
  34. } finally {
  35. rmSync(home, { recursive: true, force: true })
  36. }
  37. })
  38. })