claude-code-best/src/utils/__tests__/hyperlink.test.ts
2026-05-01 21:39:30 +08:00

100 lines
3.7 KiB
TypeScript

import { describe, expect, test } from 'bun:test'
import { createHyperlink, OSC8_START, OSC8_END } from '../hyperlink'
// ─── OSC8 constants ────────────────────────────────────────────────────
describe('OSC8 constants', () => {
test('OSC8_START is the correct escape sequence', () => {
expect(OSC8_START).toBe('\x1b]8;;')
})
test('OSC8_END is the BEL character', () => {
expect(OSC8_END).toBe('\x07')
})
})
// ─── createHyperlink ───────────────────────────────────────────────────
describe('createHyperlink', () => {
test('supported + no content: wraps URL in OSC 8 with URL as display text', () => {
const url = 'https://example.com'
const result = createHyperlink(url, undefined, { supportsHyperlinks: true })
expect(result).toContain(OSC8_START)
expect(result).toContain(OSC8_END)
// Structure: OSC8_START + url + OSC8_END + coloredText + OSC8_START + OSC8_END
expect(result).toStartWith(`${OSC8_START}${url}${OSC8_END}`)
expect(result).toEndWith(`${OSC8_START}${OSC8_END}`)
})
test('supported + content: shows content as link text', () => {
const url = 'https://example.com'
const content = 'click here'
const result = createHyperlink(url, content, { supportsHyperlinks: true })
expect(result).toStartWith(`${OSC8_START}${url}${OSC8_END}`)
expect(result).toContain('click here')
expect(result).toEndWith(`${OSC8_START}${OSC8_END}`)
})
test('not supported: returns plain URL regardless of content', () => {
const url = 'https://example.com'
const result = createHyperlink(url, 'some content', {
supportsHyperlinks: false,
})
expect(result).toBe(url)
})
test('not supported + no content: returns plain URL', () => {
const url = 'https://example.com/path?q=1'
const result = createHyperlink(url, undefined, {
supportsHyperlinks: false,
})
expect(result).toBe(url)
})
test('URL with special characters works when supported', () => {
const url = 'https://example.com/path?a=1&b=2#section'
const result = createHyperlink(url, undefined, { supportsHyperlinks: true })
expect(result).toStartWith(`${OSC8_START}${url}${OSC8_END}`)
expect(result).toEndWith(`${OSC8_START}${OSC8_END}`)
})
test('URL with special characters works when not supported', () => {
const url = 'https://example.com/path?a=1&b=2#section'
const result = createHyperlink(url, undefined, {
supportsHyperlinks: false,
})
expect(result).toBe(url)
})
test('supported link text contains the display content', () => {
const result = createHyperlink('https://example.com', 'text', {
supportsHyperlinks: true,
})
// The colored text portion is between the two OSC8 sequences
const inner = result.slice(
`${OSC8_START}https://example.com${OSC8_END}`.length,
result.length - `${OSC8_START}${OSC8_END}`.length,
)
// chalk.blue may or may not emit ANSI depending on environment,
// but the display text must always be present
expect(inner).toContain('text')
})
test('empty content string is treated as display text when supported', () => {
const url = 'https://example.com'
const result = createHyperlink(url, '', { supportsHyperlinks: true })
// Empty string is falsy, so displayText falls back to url
// Actually: content ?? url — "" is not null/undefined, so "" is used
expect(result).toStartWith(`${OSC8_START}${url}${OSC8_END}`)
expect(result).toEndWith(`${OSC8_START}${OSC8_END}`)
})
})