providerLogo.test.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { mount } from '@vue/test-utils'
  2. import { expect, it } from 'vitest'
  3. import ProviderLogo from '@/components/common/ProviderLogo.vue'
  4. import { mcpProviderLogo } from '@shared/botProviderLogos'
  5. import type { BotMcpPlugin } from '@shared/workspacePlugins'
  6. it('uses bundled logos offline and falls back through the catalog logo to an initial', async () => {
  7. const remote = 'https://logos.composio.dev/api/github'
  8. const wrapper = mount(ProviderLogo, { props: { name: 'GitHub', logo: remote, bundledLogo: '/provider-logos/github.svg' } })
  9. expect(wrapper.get('img').attributes('src')).toBe('/provider-logos/github.svg')
  10. await wrapper.get('img').trigger('error')
  11. expect(wrapper.get('img').attributes('src')).toBe(remote)
  12. expect(wrapper.get('img').attributes('referrerpolicy')).toBe('no-referrer')
  13. await wrapper.get('img').trigger('error')
  14. expect(wrapper.find('img').exists()).toBe(false)
  15. expect(wrapper.text()).toBe('G')
  16. await wrapper.setProps({ logo: 'https://logos.composio.dev/api/github?version=2' })
  17. expect(wrapper.get('img').attributes('src')).toBe('/provider-logos/github.svg')
  18. wrapper.unmount()
  19. })
  20. it.each(['javascript:alert(1)', 'https://unknown.example/logo.svg', 'https://user:secret@logos.composio.dev/api/github', '//logos.composio.dev/api/github'])('keeps a readable placeholder for an unsupported logo: %s', logo => {
  21. const wrapper = mount(ProviderLogo, { props: { name: '供应商', logo } })
  22. expect(wrapper.find('img').exists()).toBe(false)
  23. expect(wrapper.text()).toBe('供')
  24. wrapper.unmount()
  25. })
  26. it.each([
  27. [{ name: '工作代码', transport: 'http', url: 'https://api.githubcopilot.com/mcp' }, 'github'],
  28. [{ name: '工作文档', transport: 'http', url: 'https://mcp.notion.com/mcp' }, 'notion'],
  29. [{ name: '团队沟通', transport: 'stdio', command: 'npx', args: ['-y', '@modelcontextprotocol/server-slack@1.0.0'] }, 'slack'],
  30. [{ name: 'GitHub MCP 服务', transport: 'stdio', command: 'local-mcp' }, 'github'],
  31. [{ name: '未知工具', transport: 'http', url: 'https://github.com.example.test/mcp' }, undefined],
  32. ] as const)('recognizes MCP providers without matching lookalike hosts: %o', (definition, provider) => {
  33. expect(mcpProviderLogo(definition as unknown as BotMcpPlugin)).toBe(provider ? `/provider-logos/${provider}.svg` : undefined)
  34. })