yaml-config.test.mjs 2.89 KB
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')
})