🏡 index : quine-global/webdriverio.git

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', () => {
        // Simulate existing commands.json file
        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', () => {
        // Mock storing data
        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()
        // Check if the correct data is being written to the file
        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('') // Expect empty string as fallback
    })

    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) // Called for first adn second paths
        expect(writableDir).toBe(process.cwd()) // Should return the second path
    })
})