mirror of https://github.com/langgenius/dify.git
160 lines
5.4 KiB
TypeScript
160 lines
5.4 KiB
TypeScript
/**
|
|
* Integration Test: Plugin Data Utilities
|
|
*
|
|
* Tests the integration between plugin utility functions, including
|
|
* tag/category validation, form schema transformation, and
|
|
* credential data processing. Verifies that these utilities work
|
|
* correctly together in processing plugin metadata.
|
|
*/
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
import { transformFormSchemasSecretInput } from '@/app/components/plugins/plugin-auth/utils'
|
|
import { getValidCategoryKeys, getValidTagKeys } from '@/app/components/plugins/utils'
|
|
|
|
type TagInput = Parameters<typeof getValidTagKeys>[0]
|
|
|
|
describe('Plugin Data Utilities Integration', () => {
|
|
describe('Tag and Category Validation Pipeline', () => {
|
|
it('validates tags and categories in a metadata processing flow', () => {
|
|
const pluginMetadata = {
|
|
tags: ['search', 'productivity', 'invalid-tag', 'media-generate'],
|
|
category: 'tool',
|
|
}
|
|
|
|
const validTags = getValidTagKeys(pluginMetadata.tags as TagInput)
|
|
expect(validTags.length).toBeGreaterThan(0)
|
|
expect(validTags.length).toBeLessThanOrEqual(pluginMetadata.tags.length)
|
|
|
|
const validCategory = getValidCategoryKeys(pluginMetadata.category)
|
|
expect(validCategory).toBeDefined()
|
|
})
|
|
|
|
it('handles completely invalid metadata gracefully', () => {
|
|
const invalidMetadata = {
|
|
tags: ['nonexistent-1', 'nonexistent-2'],
|
|
category: 'nonexistent-category',
|
|
}
|
|
|
|
const validTags = getValidTagKeys(invalidMetadata.tags as TagInput)
|
|
expect(validTags).toHaveLength(0)
|
|
|
|
const validCategory = getValidCategoryKeys(invalidMetadata.category)
|
|
expect(validCategory).toBeUndefined()
|
|
})
|
|
|
|
it('handles undefined and empty inputs', () => {
|
|
expect(getValidTagKeys([] as TagInput)).toHaveLength(0)
|
|
expect(getValidCategoryKeys(undefined)).toBeUndefined()
|
|
expect(getValidCategoryKeys('')).toBeUndefined()
|
|
})
|
|
})
|
|
|
|
describe('Credential Secret Masking Pipeline', () => {
|
|
it('masks secrets when displaying credential form data', () => {
|
|
const credentialValues = {
|
|
api_key: 'sk-abc123456789',
|
|
api_endpoint: 'https://api.example.com',
|
|
secret_token: 'secret-token-value',
|
|
description: 'My credential set',
|
|
}
|
|
|
|
const secretFields = ['api_key', 'secret_token']
|
|
|
|
const displayValues = transformFormSchemasSecretInput(secretFields, credentialValues)
|
|
|
|
expect(displayValues.api_key).toBe('[__HIDDEN__]')
|
|
expect(displayValues.secret_token).toBe('[__HIDDEN__]')
|
|
expect(displayValues.api_endpoint).toBe('https://api.example.com')
|
|
expect(displayValues.description).toBe('My credential set')
|
|
})
|
|
|
|
it('preserves original values when no secret fields', () => {
|
|
const values = {
|
|
name: 'test',
|
|
endpoint: 'https://api.example.com',
|
|
}
|
|
|
|
const result = transformFormSchemasSecretInput([], values)
|
|
expect(result).toEqual(values)
|
|
})
|
|
|
|
it('handles falsy secret values without masking', () => {
|
|
const values = {
|
|
api_key: '',
|
|
secret: null as unknown as string,
|
|
other: 'visible',
|
|
}
|
|
|
|
const result = transformFormSchemasSecretInput(['api_key', 'secret'], values)
|
|
expect(result.api_key).toBe('')
|
|
expect(result.secret).toBeNull()
|
|
expect(result.other).toBe('visible')
|
|
})
|
|
|
|
it('does not mutate the original values object', () => {
|
|
const original = {
|
|
api_key: 'my-secret-key',
|
|
name: 'test',
|
|
}
|
|
const originalCopy = { ...original }
|
|
|
|
transformFormSchemasSecretInput(['api_key'], original)
|
|
|
|
expect(original).toEqual(originalCopy)
|
|
})
|
|
})
|
|
|
|
describe('Combined Plugin Metadata Validation', () => {
|
|
it('processes a complete plugin entry with tags and credentials', () => {
|
|
const pluginEntry = {
|
|
name: 'test-plugin',
|
|
category: 'tool',
|
|
tags: ['search', 'invalid-tag'],
|
|
credentials: {
|
|
api_key: 'sk-test-key-123',
|
|
base_url: 'https://api.test.com',
|
|
},
|
|
secretFields: ['api_key'],
|
|
}
|
|
|
|
const validCategory = getValidCategoryKeys(pluginEntry.category)
|
|
expect(validCategory).toBe('tool')
|
|
|
|
const validTags = getValidTagKeys(pluginEntry.tags as TagInput)
|
|
expect(validTags).toContain('search')
|
|
|
|
const displayCredentials = transformFormSchemasSecretInput(
|
|
pluginEntry.secretFields,
|
|
pluginEntry.credentials,
|
|
)
|
|
expect(displayCredentials.api_key).toBe('[__HIDDEN__]')
|
|
expect(displayCredentials.base_url).toBe('https://api.test.com')
|
|
|
|
expect(pluginEntry.credentials.api_key).toBe('sk-test-key-123')
|
|
})
|
|
|
|
it('handles multiple plugins in batch processing', () => {
|
|
const plugins = [
|
|
{ tags: ['search', 'productivity'], category: 'tool' },
|
|
{ tags: ['image', 'design'], category: 'model' },
|
|
{ tags: ['invalid'], category: 'extension' },
|
|
]
|
|
|
|
const results = plugins.map(p => ({
|
|
validTags: getValidTagKeys(p.tags as TagInput),
|
|
validCategory: getValidCategoryKeys(p.category),
|
|
}))
|
|
|
|
expect(results[0].validTags.length).toBeGreaterThan(0)
|
|
expect(results[0].validCategory).toBe('tool')
|
|
|
|
expect(results[1].validTags).toContain('image')
|
|
expect(results[1].validTags).toContain('design')
|
|
expect(results[1].validCategory).toBe('model')
|
|
|
|
expect(results[2].validTags).toHaveLength(0)
|
|
expect(results[2].validCategory).toBe('extension')
|
|
})
|
|
})
|
|
})
|