import fs from 'node:fs'
import { describe, expect, it, vi, afterAll, beforeAll, beforeEach } from 'vitest'
import AccessibilityScripts from '../src/scripts/accessibility-scripts.js'
vi.mock('node:fs', () => ({
default: {
readFileSync: vi.fn().mockReturnValue('{"scripts": {"scan": "scan", "getResults": "getResults", "getResultsSummary": "getResultsSummary", "saveResults": "saveResults"}, "commands": [{"command": "command1"}, {"command": "command2"}], "nonBStackInfraA11yChromeOptions": {"extension": ["extension1"]}}'),
writeFileSync: vi.fn(),
existsSync: vi.fn().mockReturnValue(true),
mkdirSync: vi.fn(),
accessSync: vi.fn()
}
}))
describe('AccessibilityScripts', () => {
let accessibilityScripts: typeof AccessibilityScripts
beforeAll(() => {
accessibilityScripts = AccessibilityScripts
})
afterAll(() => {
accessibilityScripts.store()
})
it('should read from existing file if it exists', () => {
accessibilityScripts.readFromExistingFile()
expect(accessibilityScripts.performScan).to.equal('scan')
expect(accessibilityScripts.getResults).to.equal('getResults')
expect(accessibilityScripts.getResultsSummary).to.equal('getResultsSummary')
expect(accessibilityScripts.saveTestResults).to.equal('saveResults')
expect(accessibilityScripts.commandsToWrap).to.deep.equal([{ command: 'command1' }, { command: 'command2' }])
expect(accessibilityScripts.ChromeExtension).to.deep.equal({ extension: ['extension1'] })
})
it('should update data', () => {
const data = {
commands: [{ command: 'command1' }, { command: 'command2' }],
scripts: {
scan: 'scan',
getResults: 'getResults',
getResultsSummary: 'getResultsSummary',
saveResults: 'saveResults',
},
nonBStackInfraA11yChromeOptions: { extension: ['extension1'] }
} as unknown
accessibilityScripts.update(data as { commands: [any]; scripts: { scan: null; getResults: null; getResultsSummary: null; saveResults: null }; nonBStackInfraA11yChromeOptions:{} })
expect(accessibilityScripts.performScan).to.equal('scan')
expect(accessibilityScripts.getResults).to.equal('getResults')
expect(accessibilityScripts.getResultsSummary).to.equal('getResultsSummary')
expect(accessibilityScripts.saveTestResults).to.equal('saveResults')
expect(accessibilityScripts.commandsToWrap).to.deep.equal([{ command: 'command1' }, { command: 'command2' }])
expect(accessibilityScripts.ChromeExtension).to.deep.equal({ extension: ['extension1'] })
})
it('should store data to file', () => {
accessibilityScripts.performScan = 'scan'
accessibilityScripts.getResults = 'getResults'
accessibilityScripts.getResultsSummary = 'getResultsSummary'
accessibilityScripts.saveTestResults = 'saveResults'
accessibilityScripts.commandsToWrap = [{ command: 'command1' }, { command: 'command2' }]
accessibilityScripts.ChromeExtension = { extension: ['extension1'] }
const writeFileSyncStub = vi.spyOn(fs, 'writeFileSync')
accessibilityScripts.store()
expect(writeFileSyncStub).toHaveBeenCalledWith(
accessibilityScripts.commandsPath,
JSON.stringify({
commands: accessibilityScripts.commandsToWrap,
scripts: {
scan: accessibilityScripts.performScan,
getResults: accessibilityScripts.getResults,
getResultsSummary: accessibilityScripts.getResultsSummary,
saveResults: accessibilityScripts.saveTestResults,
},
nonBStackInfraA11yChromeOptions: accessibilityScripts.ChromeExtension,
})
)
})
})
describe('getWritableDir', () => {
const accessibilityScripts: typeof AccessibilityScripts = AccessibilityScripts
const existsSyncStub: any = vi.spyOn(fs, 'existsSync')
const accessSyncStub: any = vi.spyOn(fs, 'accessSync')
const mkdirSyncStub: any = vi.spyOn(fs, 'mkdirSync')
let writableDir: string
beforeEach(() => {
existsSyncStub.mockReset()
accessSyncStub.mockReset()
mkdirSyncStub.mockReset()
})
it('should return a path when directory is present', () => {
existsSyncStub.mockReturnValue(true)
writableDir = accessibilityScripts.getWritableDir()
expect(existsSyncStub).toHaveBeenCalled()
expect(accessSyncStub).toHaveBeenCalled()
expect(writableDir).toBeTruthy()
})
it('should create the directory and return the path when it is not present', () => {
existsSyncStub.mockReturnValue(false)
writableDir = accessibilityScripts.getWritableDir()
expect(existsSyncStub).toHaveBeenCalled()
expect(mkdirSyncStub).toHaveBeenCalledWith(expect.any(String), { recursive: true })
expect(writableDir).toBeTruthy()
})
it('should return an empty string when mkdirSync throws an exception', () => {
existsSyncStub.mockReturnValue(false)
mkdirSyncStub.mockImplementation(() => {
throw new Error('Failed to create directory')
})
writableDir = accessibilityScripts.getWritableDir()
expect(existsSyncStub).toHaveBeenCalled()
expect(mkdirSyncStub).toHaveBeenCalled()
expect(writableDir).toBe('')
})
it('should skip the first path if mkdirSync throws and succeed for the second path', () => {
let callCount = 0
existsSyncStub.mockImplementation(() => false)
mkdirSyncStub.mockImplementation(() => {
if (callCount === 0) {
callCount++
throw new Error('Failed to create first directory')
}
})
writableDir = accessibilityScripts.getWritableDir()
expect(existsSyncStub).toHaveBeenCalledTimes(2)
expect(mkdirSyncStub).toHaveBeenCalledTimes(2)
expect(writableDir).toBe(process.cwd())
})
})