const testPackage = require('../../helpers/test-package'); const Dgeni = require('dgeni'); describe('processCliCommands processor', () => { let dgeni, injector, processor, createDocMessage; const navigationStub = { docType: 'navigation-json', data: { SideNav: [{ children: [{'url': 'cli'}] }] } }; beforeEach(() => { dgeni = new Dgeni([testPackage('cli-docs-package')]); injector = dgeni.configureInjector(); processor = injector.get('processCliCommands'); createDocMessage = injector.get('createDocMessage'); }); it('should be available on the injector', () => { expect(processor.$process).toBeDefined(); }); it('should run after the correct processor', () => { expect(processor.$runAfter).toEqual(['extra-docs-added']); }); it('should run before the correct processor', () => { expect(processor.$runBefore).toEqual(['rendering-docs']); }); it('should collect the names (name + aliases)', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: ['alias1', 'alias2'], options: [], }; processor.$process([doc, navigationStub]); expect(doc.names).toEqual(['name', 'alias1', 'alias2']); }); describe('options', () => { it('should remove the hidden options', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: [], options: [ { name: 'option1' }, { name: 'option2', hidden: true }, { name: 'option3' }, { name: 'option4', hidden: true }, ], }; processor.$process([doc, navigationStub]); expect(doc.namedOptions).toEqual([ jasmine.objectContaining({ name: 'option1' }), jasmine.objectContaining({ name: 'option3' }), ]); }); it('should collect the non-hidden positional and named options', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: [], options: [ { name: 'named1' }, { name: 'positional1', positional: 0}, { name: 'named2', hidden: true }, { name: 'positional2', hidden: true, positional: 1}, ], }; processor.$process([doc, navigationStub]); expect(doc.positionalOptions).toEqual([ jasmine.objectContaining({ name: 'positional1', positional: 0}), ]); expect(doc.namedOptions).toEqual([ jasmine.objectContaining({ name: 'named1' }), ]); }); it('should sort the named options into order by name', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: [], options: [ { name: 'c' }, { name: 'a' }, { name: 'b' }, ], }; processor.$process([doc, navigationStub]); expect(doc.namedOptions).toEqual([ jasmine.objectContaining({ name: 'a' }), jasmine.objectContaining({ name: 'b' }), jasmine.objectContaining({ name: 'c' }), ]); }); }); describe('subcommands', () => { it('should convert subcommands hash into a collection', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: [], options: [{ name: 'supercommand', subcommands: { subcommand1: { name: 'subcommand1', options: [ { name: 'subcommand1-option1' }, { name: 'subcommand1-option2' }, ], }, subcommand2: { name: 'subcommand2', options: [ { name: 'subcommand2-option1' }, { name: 'subcommand2-option2' }, ], } }, }], }; processor.$process([doc, navigationStub]); expect(doc.options[0].subcommands).toEqual([ jasmine.objectContaining({ name: 'subcommand1' }), jasmine.objectContaining({ name: 'subcommand2' }), ]); }); it('should remove the hidden subcommand options', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: [], options: [{ name: 'supercommand', subcommands: { subcommand1: { name: 'subcommand1', options: [ { name: 'subcommand1-option1' }, { name: 'subcommand1-option2', hidden: true }, ], }, subcommand2: { name: 'subcommand2', options: [ { name: 'subcommand2-option1', hidden: true }, { name: 'subcommand2-option2' }, ], } }, }], }; processor.$process([doc, navigationStub]); expect(doc.options[0].subcommands[0].namedOptions).toEqual([ jasmine.objectContaining({ name: 'subcommand1-option1' }), ]); expect(doc.options[0].subcommands[1].namedOptions).toEqual([ jasmine.objectContaining({ name: 'subcommand2-option2' }), ]); }); it('should collect the non-hidden positional arguments and named options', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: [], options: [{ name: 'supercommand', subcommands: { subcommand1: { name: 'subcommand1', options: [ { name: 'subcommand1-option1' }, { name: 'subcommand1-option2', positional: 0 }, ], }, subcommand2: { name: 'subcommand2', options: [ { name: 'subcommand2-option1', hidden: true }, { name: 'subcommand2-option2', hidden: true, positional: 1 }, ], } }, }], }; processor.$process([doc, navigationStub]); expect(doc.options[0].subcommands[0].positionalOptions).toEqual([ jasmine.objectContaining({ name: 'subcommand1-option2', positional: 0}), ]); expect(doc.options[0].subcommands[0].namedOptions).toEqual([ jasmine.objectContaining({ name: 'subcommand1-option1' }), ]); expect(doc.options[0].subcommands[1].positionalOptions).toEqual([]); expect(doc.options[0].subcommands[1].namedOptions).toEqual([]); }); it('should sort the named subcommand options into order by name', () => { const doc = { docType: 'cli-command', name: 'name', commandAliases: [], options: [{ name: 'supercommand', subcommands: { subcommand1: { name: 'subcommand1', options: [ { name: 'c' }, { name: 'a' }, { name: 'b' }, ] } } }], }; processor.$process([doc, navigationStub]); expect(doc.options[0].subcommands[0].namedOptions).toEqual([ jasmine.objectContaining({ name: 'a' }), jasmine.objectContaining({ name: 'b' }), jasmine.objectContaining({ name: 'c' }), ]); }); }); it('should add the command to the CLI node in the navigation doc if there is a first child node with a `cli` url', () => { const command = { docType: 'cli-command', name: 'command1', commandAliases: ['alias1', 'alias2'], options: [], path: 'cli/command1', }; const navigation = { docType: 'navigation-json', data: { SideNav: [ { url: 'some/page', title: 'Some Page' }, { title: 'CLI Commands', tooltip: 'Angular CLI command reference', children: [ { 'title': 'Overview', 'url': 'cli' } ] }, { url: 'other/page', title: 'Other Page' } ] } }; processor.$process([command, navigation]); expect(navigation.data.SideNav[1].title).toEqual('CLI Commands'); expect(navigation.data.SideNav[1].children).toEqual([ { url: 'cli', title: 'Overview' }, { url: 'cli/command1', title: 'ng command1' }, ]); }); it('should complain if there is no child with `cli` url', () => { const command = { docType: 'cli-command', name: 'command1', commandAliases: ['alias1', 'alias2'], options: [], path: 'cli/command1', }; const navigation = { docType: 'navigation-json', data: { SideNav: [ { url: 'some/page', title: 'Some Page' }, { title: 'CLI Commands', tooltip: 'Angular CLI command reference', children: [ { 'title': 'Overview', 'url': 'client' } ] }, { url: 'other/page', title: 'Other Page' } ] } }; expect(() => processor.$process([command, navigation])).toThrowError(createDocMessage('Missing `cli` url - CLI Commands must include a first child node with url set at `cli`', navigation)); }); });