53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { mergePartialConfig, prepareBodyPayload, resolveBodyArgs } from '../src/core/body-utils.js'
|
|
import type { TypedFetchConfig } from '../src/types/config.js'
|
|
|
|
describe('body utils', () => {
|
|
it('serializes plain objects and preserves samples', () => {
|
|
const payload = { id: 1, name: 'Ada' }
|
|
const prepared = prepareBodyPayload(payload)
|
|
expect(prepared.bodyInit).toBe(JSON.stringify(payload))
|
|
expect(prepared.sample).toEqual(payload)
|
|
})
|
|
|
|
it('merges nested config objects deeply', () => {
|
|
const base: TypedFetchConfig = {
|
|
request: { headers: { Authorization: 'token' } }
|
|
}
|
|
const override: TypedFetchConfig = {
|
|
request: { headers: { 'X-Test': '1' } },
|
|
cache: { ttl: 42 }
|
|
}
|
|
|
|
const merged = mergePartialConfig(base, override)
|
|
expect(merged.request?.headers).toEqual({ 'X-Test': '1' })
|
|
expect(merged.cache?.ttl).toBe(42)
|
|
})
|
|
|
|
it('normalizes fetch-style init objects and plucks body', () => {
|
|
const init: RequestInit = {
|
|
body: JSON.stringify({ id: 1 }),
|
|
headers: { 'X-Custom': '1' }
|
|
}
|
|
|
|
const resolved = resolveBodyArgs(init)
|
|
expect(resolved.body).toEqual(JSON.stringify({ id: 1 }))
|
|
expect(resolved.init).toEqual({ headers: { 'X-Custom': '1' } })
|
|
})
|
|
|
|
it('treats plain payloads as body values', () => {
|
|
const payload = { title: 'Hello' }
|
|
const resolved = resolveBodyArgs(payload)
|
|
expect(resolved.body).toBe(payload)
|
|
expect(resolved.init).toEqual({})
|
|
})
|
|
|
|
it('copies the third argument when body is separate', () => {
|
|
const payload = { title: 'Hello' }
|
|
const init: RequestInit = { headers: { Accept: 'application/json' } }
|
|
const resolved = resolveBodyArgs(payload, init)
|
|
expect(resolved.body).toBe(payload)
|
|
expect(resolved.init).not.toBe(init)
|
|
expect(resolved.init).toEqual({ headers: { Accept: 'application/json' } })
|
|
})
|
|
})
|