pulsar/spec/config-file-spec.js
2019-05-31 18:33:56 +02:00

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);
}