chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
import fs from 'node:fs/promises'
|
||||
import os from 'node:os'
|
||||
import path from 'node:path'
|
||||
import { describe, expect, it, vi } from 'vitest'
|
||||
|
||||
vi.mock('@/helpers/log-helper', () => ({
|
||||
LogHelper: {
|
||||
title: vi.fn(),
|
||||
error: vi.fn(),
|
||||
warning: vi.fn()
|
||||
}
|
||||
}))
|
||||
|
||||
describe('External HTTP plugin loader', () => {
|
||||
it('loads plugins from conventional roots and lets profile plugins override global plugins', async () => {
|
||||
const { loadExternalHTTPPlugins } = await import(
|
||||
'@/core/http-server/http-plugins/loader'
|
||||
)
|
||||
const tempRoot = await fs.mkdtemp(
|
||||
path.join(os.tmpdir(), 'leon-http-plugins-')
|
||||
)
|
||||
const globalPluginsRoot = path.join(tempRoot, 'global')
|
||||
const profilePluginsRoot = path.join(tempRoot, 'profile')
|
||||
const globalPlugin = path.join(globalPluginsRoot, 'company-agent')
|
||||
const profilePlugin = path.join(profilePluginsRoot, 'company-agent')
|
||||
|
||||
await fs.mkdir(globalPlugin, { recursive: true })
|
||||
await fs.mkdir(profilePlugin, { recursive: true })
|
||||
await fs.writeFile(
|
||||
path.join(globalPlugin, 'plugin.yml'),
|
||||
[
|
||||
'id: company_agent',
|
||||
'name: Company Agent',
|
||||
'version: 1.0.0',
|
||||
'description: Global company integration',
|
||||
'entry: index.mjs'
|
||||
].join('\n')
|
||||
)
|
||||
await fs.writeFile(
|
||||
path.join(globalPlugin, 'index.mjs'),
|
||||
[
|
||||
'export default {',
|
||||
' id: "company-agent",',
|
||||
' name: "Company Agent",',
|
||||
' version: "1.0.0",',
|
||||
' description: "Global company integration",',
|
||||
' register: async () => undefined',
|
||||
'}'
|
||||
].join('\n')
|
||||
)
|
||||
await fs.writeFile(
|
||||
path.join(profilePlugin, 'plugin.yml'),
|
||||
[
|
||||
'id: company_agent',
|
||||
'name: Profile Company Agent',
|
||||
'version: 2.0.0',
|
||||
'description: Profile company integration',
|
||||
'entry: index.mjs'
|
||||
].join('\n')
|
||||
)
|
||||
await fs.writeFile(
|
||||
path.join(profilePlugin, 'index.mjs'),
|
||||
[
|
||||
'export const httpPlugin = {',
|
||||
' id: "company-agent",',
|
||||
' name: "Profile Company Agent",',
|
||||
' version: "2.0.0",',
|
||||
' description: "Profile company integration",',
|
||||
' register: async () => undefined',
|
||||
'}'
|
||||
].join('\n')
|
||||
)
|
||||
|
||||
const plugins = await loadExternalHTTPPlugins([
|
||||
{
|
||||
scope: 'global',
|
||||
directory: globalPluginsRoot
|
||||
},
|
||||
{
|
||||
scope: 'profile',
|
||||
directory: profilePluginsRoot
|
||||
}
|
||||
])
|
||||
|
||||
expect(plugins).toHaveLength(1)
|
||||
expect(plugins[0]).toMatchObject({
|
||||
source: 'profile',
|
||||
path: profilePlugin,
|
||||
definition: {
|
||||
id: 'company-agent',
|
||||
name: 'Profile Company Agent',
|
||||
version: '2.0.0',
|
||||
description: 'Profile company integration'
|
||||
}
|
||||
})
|
||||
|
||||
await fs.rm(tempRoot, { recursive: true, force: true })
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user