import {
asyncRunSafe,
canFindTool,
correctModelProvider,
correctToolProvider,
fetchWithRetry,
getPurifyHref,
getTextWidthWithCanvas,
randomString,
removeSpecificQueryParam,
sleep,
} from './index'
describe('sleep', () => {
it('should wait for the specified time', async () => {
const timeVariance = 10
const sleepTime = 100
const start = Date.now()
await sleep(sleepTime)
const elapsed = Date.now() - start
expect(elapsed).toBeGreaterThanOrEqual(sleepTime - timeVariance)
})
})
describe('asyncRunSafe', () => {
it('should return [null, result] when promise resolves', async () => {
const result = await asyncRunSafe(Promise.resolve('success'))
expect(result).toEqual([null, 'success'])
})
it('should return [error] when promise rejects', async () => {
const error = new Error('test error')
const result = await asyncRunSafe(Promise.reject(error))
expect(result).toEqual([error])
})
it('should return [Error] when promise rejects with undefined', async () => {
// eslint-disable-next-line prefer-promise-reject-errors
const result = await asyncRunSafe(Promise.reject())
expect(result[0]).toBeInstanceOf(Error)
expect(result[0]?.message).toBe('unknown error')
})
})
describe('getTextWidthWithCanvas', () => {
let originalCreateElement: typeof document.createElement
beforeEach(() => {
// Store original implementation
originalCreateElement = document.createElement
// Mock canvas and context
const measureTextMock = jest.fn().mockReturnValue({ width: 100 })
const getContextMock = jest.fn().mockReturnValue({
measureText: measureTextMock,
font: '',
})
document.createElement = jest.fn().mockReturnValue({
getContext: getContextMock,
})
})
afterEach(() => {
// Restore original implementation
document.createElement = originalCreateElement
})
it('should return the width of text', () => {
const width = getTextWidthWithCanvas('test text')
expect(width).toBe(100)
})
it('should return 0 if context is not available', () => {
// Override mock for this test
document.createElement = jest.fn().mockReturnValue({
getContext: () => null,
})
const width = getTextWidthWithCanvas('test text')
expect(width).toBe(0)
})
})
describe('randomString', () => {
it('should generate string of specified length', () => {
const result = randomString(10)
expect(result.length).toBe(10)
})
it('should only contain valid characters', () => {
const result = randomString(100)
const validChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_'
for (const char of result)
expect(validChars).toContain(char)
})
it('should generate different strings on consecutive calls', () => {
const result1 = randomString(20)
const result2 = randomString(20)
expect(result1).not.toEqual(result2)
})
})
describe('getPurifyHref', () => {
it('should return empty string for falsy input', () => {
expect(getPurifyHref('')).toBe('')
expect(getPurifyHref(undefined as any)).toBe('')
})
it('should escape HTML characters', () => {
expect(getPurifyHref('')).not.toContain('