mirror of
https://github.com/langgenius/dify.git
synced 2025-11-24 00:42:41 +00:00
237 lines
7.7 KiB
TypeScript
237 lines
7.7 KiB
TypeScript
import {
|
|
checkKey,
|
|
checkKeys,
|
|
getMarketplaceUrl,
|
|
getNewVar,
|
|
getNewVarInWorkflow,
|
|
getVars,
|
|
hasDuplicateStr,
|
|
replaceSpaceWithUnderscoreInVarNameInput,
|
|
} from './var'
|
|
import { InputVarType } from '@/app/components/workflow/types'
|
|
|
|
describe('Variable Utilities', () => {
|
|
describe('checkKey', () => {
|
|
it('should return error for empty key when canBeEmpty is false', () => {
|
|
expect(checkKey('', false)).toBe('canNoBeEmpty')
|
|
})
|
|
|
|
it('should return true for empty key when canBeEmpty is true', () => {
|
|
expect(checkKey('', true)).toBe(true)
|
|
})
|
|
|
|
it('should return error for key that is too long', () => {
|
|
const longKey = 'a'.repeat(101) // Assuming MAX_VAR_KEY_LENGTH is 100
|
|
expect(checkKey(longKey)).toBe('tooLong')
|
|
})
|
|
|
|
it('should return error for key starting with number', () => {
|
|
expect(checkKey('1variable')).toBe('notStartWithNumber')
|
|
})
|
|
|
|
it('should return true for valid key', () => {
|
|
expect(checkKey('valid_variable_name')).toBe(true)
|
|
expect(checkKey('validVariableName')).toBe(true)
|
|
expect(checkKey('valid123')).toBe(true)
|
|
})
|
|
|
|
it('should return error for invalid characters', () => {
|
|
expect(checkKey('invalid-key')).toBe('notValid')
|
|
expect(checkKey('invalid key')).toBe('notValid')
|
|
expect(checkKey('invalid.key')).toBe('notValid')
|
|
expect(checkKey('invalid@key')).toBe('notValid')
|
|
})
|
|
|
|
it('should handle underscore correctly', () => {
|
|
expect(checkKey('_valid')).toBe(true)
|
|
expect(checkKey('valid_name')).toBe(true)
|
|
expect(checkKey('valid_name_123')).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('checkKeys', () => {
|
|
it('should return valid for all valid keys', () => {
|
|
const result = checkKeys(['key1', 'key2', 'validKey'])
|
|
expect(result.isValid).toBe(true)
|
|
expect(result.errorKey).toBe('')
|
|
expect(result.errorMessageKey).toBe('')
|
|
})
|
|
|
|
it('should return error for first invalid key', () => {
|
|
const result = checkKeys(['validKey', '1invalid', 'anotherValid'])
|
|
expect(result.isValid).toBe(false)
|
|
expect(result.errorKey).toBe('1invalid')
|
|
expect(result.errorMessageKey).toBe('notStartWithNumber')
|
|
})
|
|
|
|
it('should handle empty array', () => {
|
|
const result = checkKeys([])
|
|
expect(result.isValid).toBe(true)
|
|
})
|
|
|
|
it('should stop checking after first error', () => {
|
|
const result = checkKeys(['valid', 'invalid-key', '1invalid'])
|
|
expect(result.isValid).toBe(false)
|
|
expect(result.errorKey).toBe('invalid-key')
|
|
expect(result.errorMessageKey).toBe('notValid')
|
|
})
|
|
})
|
|
|
|
describe('hasDuplicateStr', () => {
|
|
it('should return false for unique strings', () => {
|
|
expect(hasDuplicateStr(['a', 'b', 'c'])).toBe(false)
|
|
})
|
|
|
|
it('should return true for duplicate strings', () => {
|
|
expect(hasDuplicateStr(['a', 'b', 'a'])).toBe(true)
|
|
expect(hasDuplicateStr(['test', 'test'])).toBe(true)
|
|
})
|
|
|
|
it('should handle empty array', () => {
|
|
expect(hasDuplicateStr([])).toBe(false)
|
|
})
|
|
|
|
it('should handle single element', () => {
|
|
expect(hasDuplicateStr(['single'])).toBe(false)
|
|
})
|
|
|
|
it('should handle multiple duplicates', () => {
|
|
expect(hasDuplicateStr(['a', 'b', 'a', 'b', 'c'])).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('getVars', () => {
|
|
it('should extract variables from template string', () => {
|
|
const result = getVars('Hello {{name}}, your age is {{age}}')
|
|
expect(result).toEqual(['name', 'age'])
|
|
})
|
|
|
|
it('should handle empty string', () => {
|
|
expect(getVars('')).toEqual([])
|
|
})
|
|
|
|
it('should handle string without variables', () => {
|
|
expect(getVars('Hello world')).toEqual([])
|
|
})
|
|
|
|
it('should remove duplicate variables', () => {
|
|
const result = getVars('{{name}} and {{name}} again')
|
|
expect(result).toEqual(['name'])
|
|
})
|
|
|
|
it('should filter out placeholder variables', () => {
|
|
const result = getVars('{{#context#}} {{name}} {{#histories#}}')
|
|
expect(result).toEqual(['name'])
|
|
})
|
|
|
|
it('should handle variables with underscores', () => {
|
|
const result = getVars('{{user_name}} {{user_age}}')
|
|
expect(result).toEqual(['user_name', 'user_age'])
|
|
})
|
|
|
|
it('should handle variables with numbers', () => {
|
|
const result = getVars('{{var1}} {{var2}} {{var123}}')
|
|
expect(result).toEqual(['var1', 'var2', 'var123'])
|
|
})
|
|
|
|
it('should ignore invalid variable names', () => {
|
|
const result = getVars('{{1invalid}} {{valid}} {{-invalid}}')
|
|
expect(result).toEqual(['valid'])
|
|
})
|
|
|
|
it('should filter out variables that are too long', () => {
|
|
const longVar = 'a'.repeat(101)
|
|
const result = getVars(`{{${longVar}}} {{valid}}`)
|
|
expect(result).toEqual(['valid'])
|
|
})
|
|
})
|
|
|
|
describe('getNewVar', () => {
|
|
it('should create new string variable', () => {
|
|
const result = getNewVar('testKey', 'string')
|
|
expect(result.key).toBe('testKey')
|
|
expect(result.type).toBe('string')
|
|
expect(result.name).toBe('testKey')
|
|
})
|
|
|
|
it('should create new number variable', () => {
|
|
const result = getNewVar('numKey', 'number')
|
|
expect(result.key).toBe('numKey')
|
|
expect(result.type).toBe('number')
|
|
})
|
|
|
|
it('should truncate long names', () => {
|
|
const longKey = 'a'.repeat(100)
|
|
const result = getNewVar(longKey, 'string')
|
|
expect(result.name.length).toBeLessThanOrEqual(result.key.length)
|
|
})
|
|
})
|
|
|
|
describe('getNewVarInWorkflow', () => {
|
|
it('should create text input variable by default', () => {
|
|
const result = getNewVarInWorkflow('testVar')
|
|
expect(result.variable).toBe('testVar')
|
|
expect(result.type).toBe(InputVarType.textInput)
|
|
expect(result.label).toBe('testVar')
|
|
})
|
|
|
|
it('should create select variable', () => {
|
|
const result = getNewVarInWorkflow('selectVar', InputVarType.select)
|
|
expect(result.variable).toBe('selectVar')
|
|
expect(result.type).toBe(InputVarType.select)
|
|
})
|
|
|
|
it('should create number variable', () => {
|
|
const result = getNewVarInWorkflow('numVar', InputVarType.number)
|
|
expect(result.variable).toBe('numVar')
|
|
expect(result.type).toBe(InputVarType.number)
|
|
})
|
|
})
|
|
|
|
describe('getMarketplaceUrl', () => {
|
|
beforeEach(() => {
|
|
Object.defineProperty(window, 'location', {
|
|
value: { origin: 'https://example.com' },
|
|
writable: true,
|
|
})
|
|
})
|
|
|
|
it('should add additional parameters', () => {
|
|
const url = getMarketplaceUrl('/plugins', { category: 'ai', version: '1.0' })
|
|
expect(url).toContain('category=ai')
|
|
expect(url).toContain('version=1.0')
|
|
})
|
|
|
|
it('should skip undefined parameters', () => {
|
|
const url = getMarketplaceUrl('/plugins', { category: 'ai', version: undefined })
|
|
expect(url).toContain('category=ai')
|
|
expect(url).not.toContain('version=')
|
|
})
|
|
})
|
|
|
|
describe('replaceSpaceWithUnderscoreInVarNameInput', () => {
|
|
it('should replace spaces with underscores', () => {
|
|
const input = document.createElement('input')
|
|
input.value = 'test variable name'
|
|
replaceSpaceWithUnderscoreInVarNameInput(input)
|
|
expect(input.value).toBe('test_variable_name')
|
|
})
|
|
|
|
it('should preserve cursor position', () => {
|
|
const input = document.createElement('input')
|
|
input.value = 'test name'
|
|
input.setSelectionRange(5, 5)
|
|
replaceSpaceWithUnderscoreInVarNameInput(input)
|
|
expect(input.selectionStart).toBe(5)
|
|
expect(input.selectionEnd).toBe(5)
|
|
})
|
|
|
|
it('should handle multiple spaces', () => {
|
|
const input = document.createElement('input')
|
|
input.value = 'test multiple spaces'
|
|
replaceSpaceWithUnderscoreInVarNameInput(input)
|
|
expect(input.value).toBe('test__multiple___spaces')
|
|
})
|
|
})
|
|
})
|