fix: JSON validation for unquoted @placeholders@

This commit is contained in:
sokol
2026-02-19 00:14:56 +03:00
parent 529b506612
commit 0c97c4421c
3 changed files with 163 additions and 8 deletions

View File

@@ -0,0 +1,108 @@
import { describe, it, expect } from 'vitest';
describe('JSON Validation with @placeholders@', () => {
/**
* Helper function that mimics the validation logic in ConfigTemplate.tsx
*/
function validateJsonWithPlaceholders(value: string): { valid: boolean; error?: string } {
try {
if (!value.trim()) {
return { valid: true };
}
// This is the current implementation from ConfigTemplate.tsx
// Replace ALL @...@ patterns with "1" (valid for both string and numeric contexts)
const sanitizedValue = value.replace(/@[^@]+@/g, '1');
JSON.parse(sanitizedValue);
return { valid: true };
} catch (e) {
return { valid: false, error: (e as Error).message };
}
}
it('should validate quoted placeholders', () => {
const json = `{
"Host": "@host@",
"Port": "@port@"
}`;
const result = validateJsonWithPlaceholders(json);
expect(result.valid).toBe(true);
});
it('should validate unquoted placeholders', () => {
const json = `{
"Host": "@host@",
"Port": @port@
}`;
const result = validateJsonWithPlaceholders(json);
expect(result.valid).toBe(true);
});
it('should validate mixed quoted and unquoted placeholders', () => {
const json = `{
"Host": "@host@",
"Port": @port@,
"ApiPath": "@host@:@port@/v1/data",
"MessageBroker": {
"hosts": @MessageBrokerHosts@
}
}`;
const result = validateJsonWithPlaceholders(json);
expect(result.valid).toBe(true);
});
it('should validate placeholders inside strings (URLs)', () => {
const json = `{
"ApiUrl": "http://@host@:@port@/api"
}`;
const result = validateJsonWithPlaceholders(json);
expect(result.valid).toBe(true);
});
it('should validate complex real-world template', () => {
const json = `{
"Host": "@host@",
"Port": @port@,
"ApiPath": "@host@:@port@/v1/data",
"MessageBroker": {
"hosts": @MessageBrokerHosts@
},
"basePath": "./@env_name@/in",
"NoParam": "@no_param@"
}`;
const result = validateJsonWithPlaceholders(json);
expect(result.valid).toBe(true);
});
it('should reject invalid JSON structure', () => {
const json = `{
"Host": "@host@",
"Port": @port@
"Missing": "comma"
}`;
const result = validateJsonWithPlaceholders(json);
expect(result.valid).toBe(false);
expect(result.error).toContain('Expected');
});
it('should handle empty value', () => {
const result = validateJsonWithPlaceholders('');
expect(result.valid).toBe(true);
});
it('should handle whitespace only', () => {
const result = validateJsonWithPlaceholders(' \n\t ');
expect(result.valid).toBe(true);
});
});