UNPKG

a11yanalyze

Version:

A command-line tool for developers and QA engineers to test web pages and websites for WCAG 2.2 AA accessibility compliance

380 lines (317 loc) 12.5 kB
/** * HelpManager unit tests * Tests comprehensive help system with topic navigation and search */ // Mock console methods let logOutput: string[] = []; let errorOutput: string[] = []; const originalLog = console.log; const originalError = console.error; console.log = (...args: any[]) => { logOutput.push(args.join(' ')); originalLog(...args); }; console.error = (...args: any[]) => { errorOutput.push(args.join(' ')); originalError(...args); }; // Mock chalk for testing jest.mock('chalk', () => { const mockFn = (text: any) => text; const mockChainableFn = Object.assign(mockFn, { cyan: mockFn, yellow: mockFn, green: mockFn, magenta: mockFn, blue: mockFn, white: mockFn, gray: mockFn, red: mockFn, dim: mockFn, bold: mockFn }); return { default: mockChainableFn, bold: mockChainableFn, gray: mockFn, blue: mockFn, yellow: mockFn, red: mockFn, green: mockFn, magenta: mockFn, cyan: mockFn, white: mockFn, dim: mockFn, }; }); import { HelpManager, HelpCategory } from './help-manager'; beforeAll(() => { // Removed jest.spyOn(console, 'log').mockImplementation((...args) => { // logOutput.push(args.join(' ')); // originalLog(...args); // }); // Removed jest.spyOn(console, 'error').mockImplementation((...args) => { // errorOutput.push(args.join(' ')); // originalError(...args); // }); }); afterAll(() => { (console.log as any) = originalLog; (console.error as any) = originalError; }); beforeEach(() => { logOutput = []; errorOutput = []; // Removed jest.clearAllMocks() to preserve mock implementations }); // Helper to check if any console.log call contains a substring function logContains(substring: string) { return logOutput.some(line => line.includes(substring)); } describe('HelpManager', () => { describe('Topic Help Display', () => { it('should display getting-started help', () => { HelpManager.showHelp('getting-started'); expect(logOutput.join('\n')).toMatch(/Getting Started/i); }); it('should display scanning help', () => { HelpManager.showHelp('scanning'); expect(logOutput.join('\n')).toMatch(/Single Page Scanning/i); }); it('should display crawling help', () => { HelpManager.showHelp('crawling'); expect(logOutput.join('\n')).toMatch(/Website Crawling/i); }); it('should display configuration help', () => { HelpManager.showHelp('configuration'); expect(logOutput.join('\n')).toMatch(/Configuration Guide/i); }); it('should display scoring help', () => { HelpManager.showHelp('scoring'); expect(logOutput.join('\n')).toMatch(/Scoring System/i); }); it('should display reporting help', () => { HelpManager.showHelp('reporting'); expect(logOutput.join('\n')).toMatch(/Reports and Output/i); }); it('should display troubleshooting help', () => { HelpManager.showHelp('troubleshooting'); expect(logOutput.join('\n')).toMatch(/Troubleshooting/i); }); it('should display best-practices help', () => { HelpManager.showHelp('best-practices'); expect(logOutput.join('\n')).toMatch(/Best Practices/i); }); it('should display examples help', () => { HelpManager.showHelp('examples'); expect(logOutput.join('\n')).toMatch(/Practical Examples/i); }); it('should display api help', () => { HelpManager.showHelp('api'); expect(logOutput.join('\n')).toMatch(/Integration & API/i); }); it('should handle invalid help topic gracefully', () => { HelpManager.showHelp('invalid-topic' as HelpCategory); expect(errorOutput.join('\n')).toMatch(/Help topic 'invalid-topic' not found/); }); }); describe('Topic Menu Display', () => { it('should display help topic menu', () => { HelpManager.showTopicMenu(); const output = logOutput.join('\n'); expect(output).toMatch(/A11Y Analyze Help Topics/i); expect(output).toMatch(/getting-started/); expect(output).toMatch(/scanning/); expect(output).toMatch(/crawling/); }); it('should show usage examples in topic menu', () => { HelpManager.showTopicMenu(); const output = logOutput.join('\n'); expect(output).toMatch(/Usage:/); expect(output).toMatch(/a11yanalyze help <topic>/); expect(output).toMatch(/Examples:/); }); }); describe('Quick Tips', () => { it('should show general tips by default', () => { HelpManager.showQuickTips(); const output = logOutput.join('\n'); expect(output).toMatch(/Quick Tips:/); expect(output).toMatch(/Get started:/); }); it('should show scan-specific tips', () => { HelpManager.showQuickTips('scan'); const output = logOutput.join('\n'); expect(output).toMatch(/Quick Tips:/); expect(output).toMatch(/Start with:/); }); it('should show crawl-specific tips', () => { HelpManager.showQuickTips('crawl'); const output = logOutput.join('\n'); expect(output).toMatch(/Basic crawl:/); }); it('should handle unknown command gracefully', () => { HelpManager.showQuickTips('unknown-command'); expect(logOutput.join('\n')).toMatch(/No tips available/); }); }); describe('Help Search', () => { it('should search help content for keywords', () => { HelpManager.searchHelp('scanning'); expect(logOutput.join('\n')).toMatch(/Search Results for "scanning"/); }); it('should find multiple matching topics', () => { HelpManager.searchHelp('configuration'); expect(logOutput.join('\n')).toMatch(/configuration/i); }); it('should handle no search results', () => { HelpManager.searchHelp('nonexistentterm12345'); expect(logOutput.join('\n')).toMatch(/No help topics found/); }); it('should search case-insensitively', () => { HelpManager.searchHelp('CRAWLING'); expect(logOutput.join('\n')).toMatch(/Search Results/i); }); it('should search in examples and descriptions', () => { HelpManager.searchHelp('example.com'); expect(logOutput.join('\n')).toMatch(/example.com/); }); }); describe('Configuration Template Generation', () => { it('should generate JSON configuration template', () => { const jsonConfig = HelpManager.generateConfigTemplate('json'); expect(jsonConfig).toBeDefined(); expect(() => JSON.parse(jsonConfig)).not.toThrow(); const parsed = JSON.parse(jsonConfig); expect(parsed.scanning).toBeDefined(); expect(parsed.browser).toBeDefined(); expect(parsed.output).toBeDefined(); }); it('should generate JavaScript configuration template', () => { const jsConfig = HelpManager.generateConfigTemplate('js'); expect(jsConfig).toBeDefined(); expect(jsConfig).toContain('module.exports = {'); expect(jsConfig).toContain('scanning'); expect(jsConfig).toContain('Configuration options:'); }); it('should include schema in JSON template', () => { const jsonConfig = HelpManager.generateConfigTemplate('json'); const parsed = JSON.parse(jsonConfig); expect(parsed.$schema).toBeDefined(); expect(parsed.$schema).toContain('schemas.a11yanalyze.dev'); }); it('should include helpful comments in JS template', () => { const jsConfig = HelpManager.generateConfigTemplate('js'); expect(jsConfig).toContain('// A11Y Analyze Configuration'); expect(jsConfig).toContain('// Configuration options:'); expect(jsConfig).toContain('// - scanning:'); expect(jsConfig).toContain('// - browser:'); }); }); describe('Help Content Structure', () => { it('should include code blocks in help topics', () => { HelpManager.showHelp('scanning'); // Should show formatted code examples expect(logOutput.join('\n')).toMatch(/a11yanalyze scan/); }); it('should include tips and warnings', () => { HelpManager.showHelp('troubleshooting'); // Should display tips for troubleshooting expect(logOutput.join('\n')).toMatch(/Tips:/); }); it('should include see-also references', () => { HelpManager.showHelp('scanning'); // Should include see-also section expect(logOutput.join('\n')).toMatch(/See Also:/); }); it('should include practical examples', () => { HelpManager.showHelp('examples'); expect(logOutput.join('\n')).toMatch(/E-commerce/); }); it('should format different code languages differently', () => { // Test that different language code blocks are handled HelpManager.showHelp('configuration'); const output = logOutput.join('\n'); expect(output).toMatch(/bash/); expect(output).toMatch(/json/); expect(output).toMatch(/js/); expect(output).toMatch(/yaml/); }); }); describe('Interactive Features', () => { it('should handle process stdout columns for formatting', () => { const originalColumns = process.stdout.columns; process.stdout.columns = 120; HelpManager.showTopicMenu(); expect(logOutput.length).toBeGreaterThan(0); process.stdout.columns = originalColumns; }); it('should handle missing process stdout columns', () => { const originalColumns = process.stdout.columns; delete (process.stdout as any).columns; expect(() => HelpManager.showTopicMenu()).not.toThrow(); (process.stdout as any).columns = originalColumns; }); }); describe('Error Handling', () => { it('should handle malformed help content gracefully', () => { // This tests the robustness of the help system expect(() => HelpManager.showHelp('getting-started')).not.toThrow(); }); it('should handle empty search queries', () => { HelpManager.searchHelp(''); expect(logOutput.join('\n')).toMatch(/No help topics found/); }); it('should handle special characters in search', () => { expect(() => HelpManager.searchHelp('test@#$%')).not.toThrow(); }); }); describe('Content Quality', () => { it('should provide comprehensive getting-started content', () => { HelpManager.showHelp('getting-started'); let allOutput = logOutput.join(' ').replace(/\s+/g, ' ').trim(); expect(allOutput.toLowerCase()).toContain('quick start'); expect(allOutput.toLowerCase()).toContain('scan'); }); it('should provide practical examples', () => { HelpManager.showHelp('examples'); let allOutput = logOutput.join(' ').replace(/\s+/g, ' ').trim(); expect(allOutput.toLowerCase()).toContain('e-commerce'); expect(allOutput.toLowerCase()).toContain('mobile'); expect(allOutput.toLowerCase()).toContain('government'); }); it('should provide troubleshooting guidance', () => { HelpManager.showHelp('troubleshooting'); let allOutput = logOutput.join(' ').replace(/\s+/g, ' ').trim(); expect(allOutput.toLowerCase()).toContain('timeout'); expect(allOutput.toLowerCase()).toContain('error'); expect(allOutput.toLowerCase()).toContain('debug'); }); it('should include comprehensive API documentation', () => { HelpManager.showHelp('api'); let allOutput = logOutput.join(' ').replace(/\s+/g, ' ').trim(); expect(allOutput.toLowerCase()).toContain('exit code'); expect(allOutput.toLowerCase()).toContain('json'); expect(allOutput.toLowerCase()).toContain('environment'); }); }); describe('Cross-References', () => { it('should reference related topics appropriately', () => { HelpManager.showHelp('scanning'); let allOutput = logOutput.join(' ').replace(/\s+/g, ' ').trim(); expect(allOutput.toLowerCase()).toContain('crawling'); expect(allOutput.toLowerCase()).toContain('configuration'); expect(allOutput.toLowerCase()).toContain('scoring'); }); it('should maintain consistency across topics', () => { // Test that command examples are consistent const topics: HelpCategory[] = ['scanning', 'crawling', 'configuration']; topics.forEach(topic => { logOutput = []; HelpManager.showHelp(topic); let allOutput = logOutput.join(' ').replace(/\s+/g, ' ').trim(); expect(allOutput.toLowerCase()).toContain('a11yanalyze'); }); }); }); });