Files
wehub-resource-sync d18ada4ee7
Docker Publish / docker (web, apps/web/Dockerfile, web) (push) Failing after 0s
Docker Publish / docker (api, apps/api/Dockerfile, api) (push) Failing after 1s
Publish Extension / detect-version (push) Has been skipped
Publish Extension / submit (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:24:41 +08:00

91 lines
2.7 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { buildForwardedInput } from '../src/download/build-input'
import type { Flags } from '../src/parser'
const baseFlags: Flags = {
local: false,
json: true,
pretty: false,
wait: false,
detach: false,
noRetry: false,
noAutostart: false
}
describe('buildForwardedInput (§6.2)', () => {
it('preserves rawArgs and emits sanitizedArgs in options', () => {
const r = buildForwardedInput({
argv: ['--password', 'shh', '-f', 'best', 'https://x'],
flags: baseFlags
})
expect(r.input.kind).toBe('yt-dlp-forward')
expect(r.input.rawArgs).toEqual(['--password', 'shh', '-f', 'best', 'https://x'])
const opts = r.input.options as { sanitizedArgs: string[] }
expect(opts.sanitizedArgs[1]).toBe('<redacted>')
expect(r.redacted).toBe(true)
})
it('extracts URL from argv (last bare URL positional)', () => {
const r = buildForwardedInput({
argv: ['-f', 'best', 'https://a.com', 'https://b.com'],
flags: baseFlags
})
expect(r.input.url).toBe('https://b.com')
})
it('does not pick up URL-shaped value of a value-consuming flag', () => {
const r = buildForwardedInput({
argv: ['--cookies', '/tmp/c.txt', 'https://x'],
flags: baseFlags
})
expect(r.input.url).toBe('https://x')
})
it('parses output hints from -o / --paths / -o -', () => {
const r1 = buildForwardedInput({
argv: ['-j', '-o', '-', 'https://x'],
flags: baseFlags
})
expect((r1.input.options as { outputHints: { stdoutMode: boolean } }).outputHints.stdoutMode).toBe(
true
)
const r2 = buildForwardedInput({
argv: ['-o', 'video.mp4', 'https://x'],
flags: baseFlags
})
expect(
(r2.input.options as { outputHints: { outputTemplate: string } }).outputHints.outputTemplate
).toBe('video.mp4')
const r3 = buildForwardedInput({
argv: ['-P', '/tmp', 'https://x'],
flags: baseFlags
})
expect((r3.input.options as { outputHints: { paths: string[] } }).outputHints.paths).toEqual([
'/tmp'
])
})
it('packs vidbee.* metadata when flags are set', () => {
const r = buildForwardedInput({
argv: ['https://x'],
flags: { ...baseFlags, wait: true, priority: 'subscription', maxAttempts: 2 }
})
expect((r.input.options as { vidbee: { wait: boolean; priority: string; maxAttempts: number } }).vidbee).toEqual({
wait: true,
priority: 'subscription',
maxAttempts: 2
})
})
it('quotes whitespace tokens in command preview', () => {
const r = buildForwardedInput({
argv: ['-o', 'has space.mp4', 'https://x'],
flags: baseFlags
})
expect(r.commandPreview).toContain("'has space.mp4'")
})
})