🏡 index : quine-global/webdriverio.git

import { expect, vi, it, describe, beforeEach, afterEach } from 'vitest'
import * as DataStore from '../../src/data-store.js'
import fs from 'node:fs'

vi.mock('../../src/bstackLogger.js', () => ({
    BStackLogger: {
        debug: vi.fn(),
    },
}))

describe('DataStore', () => {
    let mockFs: any
    beforeEach(() => {
        vi.mock('fs', () => ({
            default: {
                readdirSync: vi.fn(),
                existsSync: vi.fn(),
                readFileSync: vi.fn(),
                rmSync: vi.fn(),
                mkdirSync: vi.fn(),
                writeFileSync: vi.fn()
            }
        }))
        mockFs = vi.mocked(fs)
    })

    afterEach(() => {
        vi.clearAllMocks()
    })

    it('getDataFromWorkers - reads files and returns data when directory exists', async () => {
        const mockFiles = ['worker-data-1.json', 'worker-data-2.json']
        const mockFileData1 = { data1: 'value1' }
        const mockFileData2 = { data2: 'value2' }

        // Mock fs methods
        mockFs.existsSync.mockReturnValueOnce(true)
        mockFs.readdirSync.mockReturnValueOnce(mockFiles as any)
        mockFs.readFileSync.mockImplementation((filePath) => {
            if (filePath.includes(mockFiles[0])) {
                return JSON.stringify(mockFileData1)
            } else if (filePath.includes(mockFiles[1])) {
                return JSON.stringify(mockFileData2)
            }
            throw new Error(`Unexpected file access: ${filePath}`)
        })

        const workerData = DataStore.getDataFromWorkers()

        expect(workerData).toEqual([mockFileData1, mockFileData2])

        // Verify fs method calls
        expect(mockFs.existsSync).toHaveBeenCalledOnce()
        expect(mockFs.readdirSync).toHaveBeenCalledOnce()
        expect(mockFs.readFileSync).toHaveBeenCalledTimes(2)
        expect(mockFs.rmSync).toHaveBeenCalledTimes(1)
    })

    it('getDataFromWorkers - returns empty array when directory does not exist', () => {
        // Mock fs.existsSync to return false
        mockFs.existsSync.mockReturnValueOnce(false)

        const workerData = DataStore.getDataFromWorkers()
        expect(workerData).toEqual([])
    })

    it('saveWorkerData - saves data to a file (mocked)', () => {
        const testData = { test: 'value' }

        // Mock fs.writeFileSync
        mockFs.writeFileSync.mockImplementationOnce(() => {
        })

        DataStore.saveWorkerData(testData)

        // Verify fs method calls with arguments
        expect(mockFs.writeFileSync).toHaveBeenCalledOnce()
        const expectedFileName = 'worker-data-' + process.pid + '.json'
        expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining(expectedFileName), JSON.stringify(testData))
    })
})