ytptube/ui/tests/composables/usePresets.test.ts
2026-05-04 22:23:19 +03:00

310 lines
8 KiB
TypeScript

import { describe, it, expect, beforeEach, mock, spyOn } from 'bun:test'
const successMock = mock(() => {})
const errorMock = mock(() => {})
globalThis.useNotificationStore = () => ({
add: () => 'test-id',
markRead: () => {},
}) as any
mock.module('~/composables/useNotification', () => ({
useNotification: () => ({ success: successMock, error: errorMock }),
default: () => ({ success: successMock, error: errorMock }),
}))
mock.module('~/stores/notification', () => ({
useNotificationStore: () => ({
add: () => 'test-id',
markRead: () => {},
}),
}))
// eslint-disable-next-line import/first
import * as utils from '~/utils/index'
// eslint-disable-next-line import/first
import { usePresets } from '~/composables/usePresets'
// eslint-disable-next-line import/first
import type { Preset, PresetRequest } from '~/types/presets'
// eslint-disable-next-line import/first
import type { Pagination } from '~/types/responses'
const mockPreset: Preset = {
id: 1,
name: 'Test Preset',
description: 'Test description',
folder: 'Downloads',
template: '%(title)s.%(ext)s',
cookies: 'cookie=value',
cli: '--format best',
default: false,
priority: 10,
}
const mockPagination: Pagination = {
page: 1,
per_page: 50,
total: 1,
total_pages: 1,
has_next: false,
has_prev: false,
}
function createMockResponse({ ok, status, jsonData }: { ok: boolean; status: number; jsonData: any }) {
return {
ok,
status,
headers: new Headers(),
redirected: false,
statusText: '',
type: 'basic',
url: '',
body: null,
bodyUsed: false,
clone() {
return this
},
async json() {
return jsonData
},
text: async () => JSON.stringify(jsonData),
arrayBuffer: async () => new ArrayBuffer(0),
blob: async () => new Blob(),
formData: async () => new FormData(),
} as Response
}
describe('usePresets', () => {
beforeEach(() => {
successMock.mockClear()
errorMock.mockClear()
})
describe('loadPresets', () => {
it('load_presets', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: {
items: [mockPreset],
pagination: mockPagination,
},
}),
)
const presets = usePresets()
await presets.loadPresets()
expect(presets.presets.value).toHaveLength(1)
expect(presets.presets.value[0]).toEqual(mockPreset)
expect(presets.pagination.value).toEqual(mockPagination)
expect(presets.lastError.value).toBeNull()
requestSpy.mockRestore()
})
it('exclude_defaults', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: {
items: [mockPreset],
pagination: mockPagination,
},
}),
)
const presets = usePresets()
await presets.loadPresets(2, 25, { excludeDefaults: true })
expect(requestSpy).toHaveBeenCalledWith('/api/presets/?page=2&per_page=25&exclude_defaults=true')
requestSpy.mockRestore()
})
it('sort_priority', async () => {
const items = [
{ ...mockPreset, id: 1, name: 'B', priority: 2 },
{ ...mockPreset, id: 2, name: 'A', priority: 2 },
{ ...mockPreset, id: 3, name: 'C', priority: 1 },
]
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: {
items,
pagination: mockPagination,
},
}),
)
const presets = usePresets()
await presets.loadPresets()
const sorted = presets.presets.value
expect(sorted[0]!.priority).toBe(2)
expect(sorted[0]!.name).toBe('A')
expect(sorted[1]!.priority).toBe(2)
expect(sorted[1]!.name).toBe('B')
expect(sorted[2]!.priority).toBe(1)
expect(sorted[2]!.name).toBe('C')
requestSpy.mockRestore()
})
})
describe('getPreset', () => {
it('get_preset', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: mockPreset,
}),
)
const presets = usePresets()
const result = await presets.getPreset(1)
expect(result).toEqual(mockPreset)
expect(presets.lastError.value).toBeNull()
requestSpy.mockRestore()
})
})
describe('createPreset', () => {
it('create_preset', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: mockPreset,
}),
)
const presets = usePresets()
const initialTotal = presets.pagination.value.total
const newPreset: PresetRequest = {
name: 'New Preset',
description: 'Desc',
cli: '--format best',
}
const result = await presets.createPreset(newPreset)
expect(result).toEqual(mockPreset)
expect(presets.presets.value).toContainEqual(mockPreset)
expect(presets.pagination.value.total).toBeGreaterThanOrEqual(initialTotal)
requestSpy.mockRestore()
})
})
describe('updatePreset', () => {
it('update_preset', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: mockPreset,
}),
)
const presets = usePresets()
const result = await presets.updatePreset(1, mockPreset)
expect(result).toEqual(mockPreset)
requestSpy.mockRestore()
})
it('strip_update_id', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: mockPreset,
}),
)
const presets = usePresets()
await presets.updatePreset(1, { ...mockPreset, default: true })
const requestBody = JSON.parse((requestSpy.mock.calls[0]![1] as any).body)
expect('id' in requestBody).toBe(false)
expect(requestBody.default).toBe(false)
requestSpy.mockRestore()
})
})
describe('patchPreset', () => {
it('patch_preset', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: { ...mockPreset, priority: 20 },
}),
)
const presets = usePresets()
const result = await presets.patchPreset(1, { priority: 20 })
expect(result?.priority).toBe(20)
requestSpy.mockRestore()
})
it('sanitize_patch', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: mockPreset,
}),
)
const presets = usePresets()
await presets.patchPreset(1, { id: 10, default: true })
const requestBody = JSON.parse((requestSpy.mock.calls[0]![1] as any).body)
expect('id' in requestBody).toBe(false)
expect(requestBody.default).toBe(false)
requestSpy.mockRestore()
})
})
describe('deletePreset', () => {
it('delete_preset', async () => {
const requestSpy = spyOn(utils, 'request')
requestSpy.mockResolvedValueOnce(
createMockResponse({
ok: true,
status: 200,
jsonData: mockPreset,
}),
)
const presets = usePresets()
const initialTotal = presets.pagination.value.total
const result = await presets.deletePreset(mockPreset.id!)
expect(result).toBe(true)
expect(presets.pagination.value.total).toBe(Math.max(0, initialTotal - 1))
requestSpy.mockRestore()
})
})
})