Skip to main content
Glama
normaliser.test.ts3.25 kB
import { describe, it, expect } from 'vitest'; import { Normaliser } from '../../src/services/normalisation/normaliser.js'; import type { AxeResult, LighthouseResult, WaveResult } from '../../src/types/audit.js'; import { readFileSync } from 'fs'; import { join } from 'path'; const axeFixture = JSON.parse(readFileSync(join(__dirname, '../fixtures/axe-result.json'), 'utf-8')); const lighthouseFixture = JSON.parse(readFileSync(join(__dirname, '../fixtures/lighthouse-result.json'), 'utf-8')); const waveFixture = JSON.parse(readFileSync(join(__dirname, '../fixtures/wave-result.json'), 'utf-8')); describe('Normaliser', () => { const normaliser = new Normaliser(); describe('normaliseAxeResult', () => { it('should normalise axe violations to NormalisedResult', () => { const result = normaliser.normaliseAxeResult(axeFixture as AxeResult); expect(result.tool).toBe('axe'); expect(result.url).toBe('https://example.com'); expect(result.results).toHaveLength(1); expect(result.results[0]).toMatchObject({ rule_id: 'image-alt', outcome: 'fail', severity: 'critical', wcag_ref: expect.arrayContaining(['WCAG2.1:1.1.1']), }); }); it('should include selector and DOM context', () => { const result = normaliser.normaliseAxeResult(axeFixture as AxeResult); expect(result.results[0].selector).toBeTruthy(); expect(result.results[0].dom_context).toBeTruthy(); }); it('should generate summary statistics', () => { const result = normaliser.normaliseAxeResult(axeFixture as AxeResult); expect(result.summary.total).toBe(1); expect(result.summary.fail).toBe(1); expect(result.summary.pass).toBe(0); expect(result.summary.by_severity.critical).toBe(1); }); }); describe('normaliseLighthouseResult', () => { it('should normalise Lighthouse audits to NormalisedResult', () => { const result = normaliser.normaliseLighthouseResult(lighthouseFixture as LighthouseResult); expect(result.tool).toBe('lighthouse'); expect(result.url).toBe('https://example.com'); expect(result.results.length).toBeGreaterThan(0); }); it('should map scores to outcomes', () => { const result = normaliser.normaliseLighthouseResult(lighthouseFixture as LighthouseResult); const imageAltResult = result.results.find((r) => r.rule_id === 'image-alt'); expect(imageAltResult?.outcome).toBe('fail'); }); }); describe('normaliseWaveResult', () => { it('should normalise WAVE errors to NormalisedResult', () => { const result = normaliser.normaliseWaveResult(waveFixture as WaveResult); expect(result.tool).toBe('wave'); expect(result.url).toBe('https://example.com'); expect(result.results).toHaveLength(1); expect(result.results[0]).toMatchObject({ rule_id: 'error_alt_missing', outcome: 'fail', wcag_ref: expect.arrayContaining(['WCAG2.1:1.1.1']), }); }); it('should generate summary statistics', () => { const result = normaliser.normaliseWaveResult(waveFixture as WaveResult); expect(result.summary.total).toBe(1); expect(result.summary.fail).toBe(1); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Duds/accessibility-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server