100 lines
3.7 KiB
TypeScript
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}`)
|
|
})
|
|
})
|