const { between, regex, anyChar, many, choice } = require("arcsecond"); const _ = require('lodash'); const keyValLines = require('../src/key-val-lines'); const begin = regex(/^vars\s*\r?\n/); const end = regex(/^[\r?\n]*\/vars\s*[\r?\n]*/); const varsTag = between(begin)(end)(keyValLines).map(([variables]) => { return { variables }; }); const toJson = (fileContents) => { const parser = many(choice([ varsTag, anyChar ])); const parsed = parser .run(fileContents) .result .reduce((acc, item) => _.merge(acc, item), {}); const json = { variables: parsed.variables || [] }; return json; }; describe('bool-key-val', () => { it('should parse bool-key-val - case 1', () => { const file = ` vars 1 host https://www.google.com /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: 'host', value: 'https://www.google.com' }] }); }); it('should parse bool-key-val - case 2', () => { const file = ` vars 1 host https://www.google.com 1 auth jwt secret /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: 'host', value: 'https://www.google.com' }, { enabled: true, name: 'auth', value: 'jwt secret' }] }); }); // following test cases are for edge cases // one line with just enabled flag it('should parse bool-key-val - case 3', () => { const file = ` vars 1 /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: '', value: '' }] }); }); // one line with just enabled flag and a space it('should parse bool-key-val - case 4', () => { const file = ` vars 1 /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: '', value: '' }] }); }); // one line with just enabled flag and a space and a name it('should parse bool-key-val - case 5', () => { const file = ` vars 1 host /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: 'host', value: '' }] }); }); // one line with just enabled flag and a space and a name and a space it('should parse bool-key-val - case 6', () => { const file = ` vars 1 host /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: 'host', value: '' }] }); }); // three lines, second line with just enabled flag it('should parse bool-key-val - case 7', () => { const file = ` vars 1 host https://www.google.com 1 0 Content-type application/json /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: 'host', value: 'https://www.google.com' }, { enabled: true, name: '', value: '' }, { enabled: false, name: 'Content-type', value: 'application/json' }] }); }); // three lines, second line with just enabled flag and a space it('should parse bool-key-val - case 8', () => { const file = ` vars 1 host https://www.google.com 1 0 Content-type application/json /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: 'host', value: 'https://www.google.com' }, { enabled: true, name: '', value: '' }, { enabled: false, name: 'Content-type', value: 'application/json' }] }); }); // three lines, second line with just enabled flag and a space and a name it('should parse bool-key-val - case 9', () => { const file = ` vars 1 host https://www.google.com 1 auth 0 Content-type application/json /vars `; const result = toJson(file); expect(result).toEqual({ variables: [{ enabled: true, name: 'host', value: 'https://www.google.com' }, { enabled: true, name: 'auth', value: '' }, { enabled: false, name: 'Content-type', value: 'application/json' }] }); }); });