160 lines
4.9 KiB
TypeScript
160 lines
4.9 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { Config } from '../models/Config';
|
|
import { Env } from '../models/Env';
|
|
import { EnvParam } from '../models/EnvParam';
|
|
|
|
describe('Config Template Update', () => {
|
|
it('should preserve existing template when adding new parameter', () => {
|
|
// Arrange: Create config with existing template
|
|
const config = new Config();
|
|
const existingTemplate = `{
|
|
"existingKey": "existingValue",
|
|
"anotherKey": 123
|
|
}`;
|
|
config.setTemplate(existingTemplate);
|
|
|
|
const env = new Env(0, 'DEFAULT', [
|
|
new EnvParam(1, 'host', 'localhost'),
|
|
new EnvParam(2, 'port', '8080')
|
|
]);
|
|
config.setEnvs([env]);
|
|
|
|
// Act: Update template from env (simulating adding parameters)
|
|
config.updateTemplateFromEnv(env);
|
|
|
|
// Assert: Template should have both existing content and new placeholders
|
|
const templateContent = config.template.content;
|
|
const templateObj = JSON.parse(templateContent);
|
|
|
|
expect(templateObj.existingKey).toBe('existingValue');
|
|
expect(templateObj.anotherKey).toBe(123);
|
|
expect(templateObj['!!! host']).toBe('@host@');
|
|
expect(templateObj['!!! port']).toBe('@port@');
|
|
});
|
|
|
|
it('should not duplicate placeholders that already exist', () => {
|
|
// Arrange: Create config with template that already has placeholder
|
|
const config = new Config();
|
|
const existingTemplate = `{
|
|
"host": "@host@",
|
|
"port": 8080
|
|
}`;
|
|
config.setTemplate(existingTemplate);
|
|
|
|
const env = new Env(0, 'DEFAULT', [
|
|
new EnvParam(1, 'host', 'localhost'), // Already in template
|
|
new EnvParam(2, 'port', '8080') // Already in template
|
|
]);
|
|
config.setEnvs([env]);
|
|
|
|
// Act: Update template
|
|
config.updateTemplateFromEnv(env);
|
|
|
|
// Assert: Should not add !!! entries for existing placeholders
|
|
const templateContent = config.template.content;
|
|
// Count occurrences of @host@
|
|
const hostCount = (templateContent.match(/@host@/g) || []).length;
|
|
expect(hostCount).toBe(1); // Only original, no duplicate
|
|
|
|
// Should preserve original structure
|
|
expect(templateContent).toContain('"host": "@host@"');
|
|
});
|
|
|
|
it('should initialize empty template', () => {
|
|
// Arrange: Create config with empty template
|
|
const config = new Config();
|
|
config.setTemplate('');
|
|
|
|
const env = new Env(0, 'DEFAULT', [
|
|
new EnvParam(1, 'host', 'localhost')
|
|
]);
|
|
config.setEnvs([env]);
|
|
|
|
// Act: Update template
|
|
config.updateTemplateFromEnv(env);
|
|
|
|
// Assert: Should create template with placeholder
|
|
const templateContent = config.template.content;
|
|
const templateObj = JSON.parse(templateContent);
|
|
expect(templateObj['!!! host']).toBe('@host@');
|
|
});
|
|
|
|
it('should not modify invalid JSON template', () => {
|
|
// Arrange: Create config with invalid JSON template
|
|
const config = new Config();
|
|
const invalidTemplate = `{
|
|
"key": "value" // missing comma
|
|
"another": "key"
|
|
}`;
|
|
config.setTemplate(invalidTemplate);
|
|
const originalTemplate = config.template.content;
|
|
|
|
const env = new Env(0, 'DEFAULT', [
|
|
new EnvParam(1, 'host', 'localhost')
|
|
]);
|
|
config.setEnvs([env]);
|
|
|
|
// Act: Update template (should not modify invalid JSON)
|
|
config.updateTemplateFromEnv(env);
|
|
|
|
// Assert: Template should remain unchanged
|
|
expect(config.template.content).toBe(originalTemplate);
|
|
});
|
|
|
|
it('should add multiple new placeholders to existing template', () => {
|
|
// Arrange
|
|
const config = new Config();
|
|
const existingTemplate = `{
|
|
"name": "myapp"
|
|
}`;
|
|
config.setTemplate(existingTemplate);
|
|
|
|
const env = new Env(0, 'DEFAULT', [
|
|
new EnvParam(1, 'host', 'localhost'),
|
|
new EnvParam(2, 'port', '8080'),
|
|
new EnvParam(3, 'user', 'admin')
|
|
]);
|
|
config.setEnvs([env]);
|
|
|
|
// Act
|
|
config.updateTemplateFromEnv(env);
|
|
|
|
// Assert
|
|
const templateObj = JSON.parse(config.template.content);
|
|
expect(templateObj.name).toBe('myapp');
|
|
expect(templateObj['!!! host']).toBe('@host@');
|
|
expect(templateObj['!!! port']).toBe('@port@');
|
|
expect(templateObj['!!! user']).toBe('@user@');
|
|
});
|
|
|
|
it('should only add placeholders for params not in template', () => {
|
|
// Arrange: Template has @host@ but not @port@
|
|
const config = new Config();
|
|
config.setTemplate(`{
|
|
"host": "@host@",
|
|
"name": "test"
|
|
}`);
|
|
|
|
const env = new Env(0, 'DEFAULT', [
|
|
new EnvParam(1, 'host', 'localhost'), // In template
|
|
new EnvParam(2, 'port', '8080') // Not in template
|
|
]);
|
|
config.setEnvs([env]);
|
|
|
|
// Act
|
|
config.updateTemplateFromEnv(env);
|
|
|
|
// Assert
|
|
const templateContent = config.template.content;
|
|
const templateObj = JSON.parse(templateContent);
|
|
|
|
// Should preserve original
|
|
expect(templateObj.host).toBe('@host@');
|
|
expect(templateObj.name).toBe('test');
|
|
|
|
// Should add only missing
|
|
expect(templateObj['!!! port']).toBe('@port@');
|
|
expect(templateObj['!!! host']).toBeUndefined(); // Not added, already exists
|
|
});
|
|
});
|