116 lines
3.2 KiB
TypeScript
116 lines
3.2 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest'
|
|
import { ConfigManager } from '@services/config/config-manager'
|
|
import type { SettingsData } from '@types/settings.types'
|
|
|
|
describe('ConfigManager - deep merge utilities', () => {
|
|
it('should deep merge objects, updating only specified fields', async () => {
|
|
const manager = ConfigManager.getInstance()
|
|
await manager.initialize()
|
|
|
|
// Setup initial state
|
|
const initial: SettingsData = {
|
|
erp: {
|
|
url: 'http://old.com',
|
|
username: 'user1',
|
|
password: 'pass1',
|
|
headless: true,
|
|
ignoreHttpsErrors: true,
|
|
autoCloseBrowser: true
|
|
},
|
|
database: {
|
|
dbType: 'mysql',
|
|
server: '',
|
|
mysqlHost: 'localhost',
|
|
mysqlPort: 3306,
|
|
database: 'db',
|
|
username: 'user',
|
|
password: ''
|
|
},
|
|
paths: { dataDir: '/data', defaultOutput: 'out.xlsx', validationOutput: 'validation.xlsx' },
|
|
extraction: {
|
|
batchSize: 100,
|
|
verbose: true,
|
|
autoConvert: true,
|
|
mergeBatches: true,
|
|
enableDbPersistence: true
|
|
},
|
|
validation: {
|
|
dataSource: 'database_full',
|
|
batchSize: 2000,
|
|
matchMode: 'substring',
|
|
enableCrud: false,
|
|
defaultManager: ''
|
|
},
|
|
ui: { fontFamily: 'Arial', fontSize: 12, productionIdInputWidth: 20 },
|
|
execution: { dryRun: false }
|
|
}
|
|
|
|
// Load initial settings
|
|
await manager.saveAllSettings(initial)
|
|
|
|
// Partial update
|
|
const partial = {
|
|
erp: { url: 'http://new.com' }
|
|
}
|
|
|
|
const result = await manager.savePartialSettings(partial)
|
|
|
|
expect(result.success).toBe(true)
|
|
|
|
const current = manager.getAllSettings()
|
|
|
|
// Updated field
|
|
expect(current.erp.url).toBe('http://new.com')
|
|
|
|
// Preserved fields
|
|
expect(current.erp.username).toBe('user1')
|
|
expect(current.database.dbType).toBe('mysql')
|
|
expect(current.paths.dataDir).toBe('/data')
|
|
})
|
|
})
|
|
|
|
describe('ConfigManager - backup and restore', () => {
|
|
it('should create backup before saving', async () => {
|
|
const manager = ConfigManager.getInstance()
|
|
await manager.initialize()
|
|
|
|
const backupSuccess = await manager['backupEnvFile']()
|
|
|
|
expect(backupSuccess).toBe(true)
|
|
|
|
// Check backup file exists (in same location as .env file)
|
|
const fs = await import('fs')
|
|
const path = await import('path')
|
|
const backupPath = path.resolve('src/main/.env.backup')
|
|
|
|
expect(fs.existsSync(backupPath)).toBe(true)
|
|
})
|
|
|
|
it('should restore from backup when save fails', async () => {
|
|
const manager = ConfigManager.getInstance()
|
|
await manager.initialize()
|
|
|
|
// Create initial state
|
|
const initial = manager.getAllSettings()
|
|
const originalUrl = initial.erp.url
|
|
|
|
// Mock fs.writeFileSync to fail
|
|
const fs = await import('fs')
|
|
const writeFileSyncSpy = vi.spyOn(fs, 'writeFileSync').mockImplementation(() => {
|
|
throw new Error('Disk full')
|
|
})
|
|
|
|
const result = await manager.savePartialSettings({
|
|
erp: { url: 'http://should-not-save.com' }
|
|
})
|
|
|
|
expect(result.success).toBe(false)
|
|
|
|
// Restore should have happened
|
|
const current = manager.getAllSettings()
|
|
expect(current.erp.url).toBe(originalUrl)
|
|
|
|
writeFileSyncSpy.mockRestore()
|
|
})
|
|
})
|