pulsar/spec/config-file-spec.js

132 lines
3.2 KiB
JavaScript

const fs = require('fs-plus')
const path = require('path')
const temp = require('temp').track()
const dedent = require('dedent')
const ConfigFile = require('../src/config-file')
describe('ConfigFile', () => {
let filePath, configFile, subscription
beforeEach(async () => {
jasmine.useRealClock()
const tempDir = fs.realpathSync(temp.mkdirSync())
filePath = path.join(tempDir, 'the-config.cson')
})
afterEach(() => {
subscription.dispose()
})
describe('when the file does not exist', () => {
it('returns an empty object from .get()', async () => {
configFile = new ConfigFile(filePath)
subscription = await configFile.watch()
expect(configFile.get()).toEqual({})
})
})
describe('when the file is empty', () => {
it('returns an empty object from .get()', async () => {
writeFileSync(filePath, '')
configFile = new ConfigFile(filePath)
subscription = await configFile.watch()
expect(configFile.get()).toEqual({})
})
})
describe('when the file is updated with valid CSON', () => {
it('notifies onDidChange observers with the data', async () => {
configFile = new ConfigFile(filePath)
subscription = await configFile.watch()
const event = new Promise(resolve => configFile.onDidChange(resolve))
writeFileSync(
filePath,
dedent`
'*':
foo: 'bar'
'javascript':
foo: 'baz'
`
)
expect(await event).toEqual({
'*': { foo: 'bar' },
javascript: { foo: 'baz' }
})
expect(configFile.get()).toEqual({
'*': { foo: 'bar' },
javascript: { foo: 'baz' }
})
})
})
describe('when the file is updated with invalid CSON', () => {
it('notifies onDidError observers', async () => {
configFile = new ConfigFile(filePath)
subscription = await configFile.watch()
const message = new Promise(resolve => configFile.onDidError(resolve))
writeFileSync(
filePath,
dedent`
um what?
`,
2
)
expect(await message).toContain('Failed to load `the-config.cson`')
const event = new Promise(resolve => configFile.onDidChange(resolve))
writeFileSync(
filePath,
dedent`
'*':
foo: 'bar'
'javascript':
foo: 'baz'
`,
4
)
expect(await event).toEqual({
'*': { foo: 'bar' },
javascript: { foo: 'baz' }
})
})
})
describe('ConfigFile.at()', () => {
let path0, path1
beforeEach(() => {
path0 = filePath
path1 = path.join(fs.realpathSync(temp.mkdirSync()), 'the-config.cson')
configFile = ConfigFile.at(path0)
})
it('returns an existing ConfigFile', () => {
const cf = ConfigFile.at(path0)
expect(cf).toEqual(configFile)
})
it('creates a new ConfigFile for unrecognized paths', () => {
const cf = ConfigFile.at(path1)
expect(cf).not.toEqual(configFile)
})
})
})
function writeFileSync (filePath, content, seconds = 2) {
const utime = Date.now() / 1000 + seconds
fs.writeFileSync(filePath, content)
fs.utimesSync(filePath, utime, utime)
}