yaml-config.test.mjs
2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { test } from 'node:test'
import assert from 'node:assert/strict'
import { parseScalar, parseYamlConfig } from './yaml-config.mjs'
test('parseScalar strips one layer of matching quotes', () => {
assert.equal(parseScalar(' "hello world" '), 'hello world')
assert.equal(parseScalar("'a: b: c'"), 'a: b: c')
})
test('parseScalar drops a trailing inline comment after a quoted value', () => {
assert.equal(parseScalar("'' # default empty"), '')
assert.equal(parseScalar("'mysql.dev' # remote test host"), 'mysql.dev')
})
test('parseScalar cuts an unquoted value at a space-hash comment', () => {
assert.equal(parseScalar('8080 # default port'), '8080')
assert.equal(parseScalar('com.acme.erp'), 'com.acme.erp')
})
test('parseScalar treats empty / comment-only values as empty', () => {
assert.equal(parseScalar(''), '')
assert.equal(parseScalar(' '), '')
assert.equal(parseScalar('# just a comment'), '')
})
test('parseScalar does NOT expand variables and keeps special chars literally', () => {
assert.equal(parseScalar('${A}'), '${A}')
assert.equal(parseScalar('$(whoami)'), '$(whoami)')
assert.equal(parseScalar("'p@ss$w0rd!'"), 'p@ss$w0rd!')
// a `#` not preceded by a space stays part of an unquoted value
assert.equal(parseScalar('a#b'), 'a#b')
})
test('parseYamlConfig builds a two-level nested object', () => {
const cfg = parseYamlConfig(
[
'backend:',
' base_package: com.acme.erp',
' http_port: 8080',
'database:',
' host: 127.0.0.1',
' schema: erp_dev',
'',
].join('\n')
)
assert.deepEqual(cfg.backend, { base_package: 'com.acme.erp', http_port: '8080' })
assert.deepEqual(cfg.database, { host: '127.0.0.1', schema: 'erp_dev' })
})
test('parseYamlConfig skips blank lines, full-line and indented comments', () => {
const cfg = parseYamlConfig(
['# top comment', 'database:', ' # inline section comment', ' host: localhost', '', ' '].join('\n')
)
assert.deepEqual(cfg.database, { host: 'localhost' })
})
test('parseYamlConfig keeps a quoted empty value and ignores its trailing comment', () => {
const cfg = parseYamlConfig(['database:', " password: '' # default empty"].join('\n'))
assert.equal(cfg.database.password, '')
})
test('parseYamlConfig only splits on the first colon (values may contain colons)', () => {
const cfg = parseYamlConfig(['secrets:', ' jwt_secret: a:b:c'].join('\n'))
assert.equal(cfg.secrets.jwt_secret, 'a:b:c')
})
test('parseYamlConfig tolerates CRLF and returns {} for non-string input', () => {
const cfg = parseYamlConfig('backend:\r\n http_port: 9090\r\n')
assert.equal(cfg.backend.http_port, '9090')
assert.deepEqual(parseYamlConfig(undefined), {})
assert.deepEqual(parseYamlConfig(null), {})
})
test('parseYamlConfig supports a top-level scalar (no section)', () => {
const cfg = parseYamlConfig('project_name: Acme ERP\n')
assert.equal(cfg.project_name, 'Acme ERP')
})