35% front tests
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import {
|
||||
isApiError,
|
||||
getApiErrorMessage,
|
||||
getApiErrorStatus,
|
||||
} from '@/utils/errorHandlers'
|
||||
|
||||
describe('errorHandlers', () => {
|
||||
describe('isApiError', () => {
|
||||
it('должен возвращать true для API ошибки с response', () => {
|
||||
const error = { response: { status: 400, data: { message: 'Error' } } }
|
||||
expect(isApiError(error)).toBe(true)
|
||||
})
|
||||
|
||||
it('должен возвращать true для API ошибки без response.data', () => {
|
||||
const error = { response: {} }
|
||||
expect(isApiError(error)).toBe(true)
|
||||
})
|
||||
|
||||
it('должен возвращать false для null', () => {
|
||||
expect(isApiError(null)).toBe(false)
|
||||
})
|
||||
|
||||
it('должен возвращать false для строки', () => {
|
||||
expect(isApiError('error')).toBe(false)
|
||||
})
|
||||
|
||||
it('должен возвращать false для объекта без response', () => {
|
||||
expect(isApiError({ message: 'Error' })).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('getApiErrorMessage', () => {
|
||||
it('должен извлекать строковое сообщение из ошибки', () => {
|
||||
const error = { response: { data: { message: 'Custom error' } } }
|
||||
expect(getApiErrorMessage(error)).toBe('Custom error')
|
||||
})
|
||||
|
||||
it('должен извлекать массив сообщений и объединять через точку с запятой', () => {
|
||||
const error = { response: { data: { message: ['Error 1', 'Error 2'] } } }
|
||||
expect(getApiErrorMessage(error)).toBe('Error 1; Error 2')
|
||||
})
|
||||
|
||||
it('должен возвращать сообщение по умолчанию для обычной ошибки', () => {
|
||||
expect(getApiErrorMessage('string error')).toBe('Произошла ошибка')
|
||||
})
|
||||
|
||||
it('должен извлекать message из Error объекта', () => {
|
||||
const error = new Error('Native error')
|
||||
expect(getApiErrorMessage(error)).toBe('Native error')
|
||||
})
|
||||
|
||||
it('должен использовать кастомное сообщение по умолчанию', () => {
|
||||
expect(getApiErrorMessage(null, 'Custom default')).toBe('Custom default')
|
||||
})
|
||||
|
||||
it('должен возвращать undefined message как сообщение по умолчанию', () => {
|
||||
const error = { response: { data: { message: undefined } } }
|
||||
expect(getApiErrorMessage(error)).toBe('Произошла ошибка')
|
||||
})
|
||||
})
|
||||
|
||||
describe('getApiErrorStatus', () => {
|
||||
it('должен извлекать status код из ошибки', () => {
|
||||
const error = { response: { status: 404 } }
|
||||
expect(getApiErrorStatus(error)).toBe(404)
|
||||
})
|
||||
|
||||
it('должен возвращать undefined для ошибки без status', () => {
|
||||
const error = { response: {} }
|
||||
expect(getApiErrorStatus(error)).toBeUndefined()
|
||||
})
|
||||
|
||||
it('должен возвращать undefined для не API ошибки', () => {
|
||||
expect(getApiErrorStatus('error')).toBeUndefined()
|
||||
})
|
||||
|
||||
it('должен возвращать undefined для null', () => {
|
||||
expect(getApiErrorStatus(null)).toBeUndefined()
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,119 @@
|
||||
import { describe, it, expect, vi } from 'vitest'
|
||||
import { Logger } from '@/utils/logger'
|
||||
|
||||
describe('Logger', () => {
|
||||
describe('Logger.error', () => {
|
||||
it('должен вызывать console.error с правильным форматом', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
|
||||
Logger.error('Test error', 'TestModule')
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test error', '')
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен вызывать console.error с данными', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
|
||||
const data = { code: 500, message: 'Internal error' }
|
||||
Logger.error('Test error', 'TestModule', data)
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test error', data)
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен использовать модуль по умолчанию "App"', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {})
|
||||
Logger.error('Test error')
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[App] Test error', '')
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Logger.warn', () => {
|
||||
it('должен вызывать console.warn с правильным форматом', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
||||
Logger.warn('Test warning', 'TestModule')
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test warning', '')
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен вызывать console.warn с данными', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
||||
const data = { code: 400, field: 'email' }
|
||||
Logger.warn('Test warning', 'TestModule', data)
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test warning', data)
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Logger.info', () => {
|
||||
it('должен вызывать console.info с правильным форматом', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'info').mockImplementation(() => {})
|
||||
Logger.info('Test info', 'TestModule')
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test info', '')
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен вызывать console.info с данными', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'info').mockImplementation(() => {})
|
||||
const data = { user: 'admin', action: 'login' }
|
||||
Logger.info('Test info', 'TestModule', data)
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test info', data)
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Logger.debug', () => {
|
||||
it('должен вызывать console.log с правильным форматом', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {})
|
||||
Logger.debug('Test debug', 'TestModule')
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test debug', '')
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен вызывать console.log с данными', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {})
|
||||
const data = { state: 'loading', progress: 50 }
|
||||
Logger.debug('Test debug', 'TestModule', data)
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test debug', data)
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
})
|
||||
|
||||
describe('Logger.verbose', () => {
|
||||
it('должен вызывать console.log с правильным форматом', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {})
|
||||
Logger.verbose('Test verbose', 'TestModule')
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test verbose', '')
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен вызывать console.log с данными', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {})
|
||||
const data = { detailed: 'trace', step: 3 }
|
||||
Logger.verbose('Test verbose', 'TestModule', data)
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[TestModule] Test verbose', data)
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
})
|
||||
|
||||
describe('formatMessage', () => {
|
||||
it('должен форматировать сообщение без данных', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'info').mockImplementation(() => {})
|
||||
Logger.info('Simple message', 'Module')
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[Module] Simple message', '')
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен форматировать сообщение с объектом данных', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'info').mockImplementation(() => {})
|
||||
Logger.info('Message with data', 'Module', { key: 'value' })
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[Module] Message with data', { key: 'value' })
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('должен форматировать сообщение с массивом данных', () => {
|
||||
const consoleSpy = vi.spyOn(console, 'info').mockImplementation(() => {})
|
||||
Logger.info('Message with array', 'Module', [1, 2, 3])
|
||||
expect(consoleSpy).toHaveBeenCalledWith('[Module] Message with array', [1, 2, 3])
|
||||
consoleSpy.mockRestore()
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,19 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { APP_VERSION } from '@/utils/version'
|
||||
|
||||
describe('version', () => {
|
||||
describe('APP_VERSION', () => {
|
||||
it('должен быть строкой', () => {
|
||||
expect(typeof APP_VERSION).toBe('string')
|
||||
})
|
||||
|
||||
it('должен соответствовать формату семантического версионирования', () => {
|
||||
const semverRegex = /^\d+\.\d+\.\d+$/
|
||||
expect(APP_VERSION).toMatch(semverRegex)
|
||||
})
|
||||
|
||||
it('должен быть непустой строкой', () => {
|
||||
expect(APP_VERSION.length).toBeGreaterThan(0)
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user