153 lines
5.1 KiB
TypeScript
153 lines
5.1 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest'
|
|
import { resolveImageUrls, portableImageUrls } from './vaultImages'
|
|
|
|
let tauriMode = false
|
|
|
|
vi.mock('@tauri-apps/api/core', () => ({
|
|
convertFileSrc: vi.fn((path: string) => `asset://localhost/${encodeURIComponent(path)}`),
|
|
}))
|
|
|
|
vi.mock('../mock-tauri', () => ({
|
|
isTauri: () => tauriMode,
|
|
}))
|
|
|
|
function assetUrl(path: string): string {
|
|
return `asset://localhost/${encodeURIComponent(path)}`
|
|
}
|
|
|
|
describe('resolveImageUrls', () => {
|
|
it('is a no-op outside Tauri', () => {
|
|
tauriMode = false
|
|
const markdown = ''
|
|
|
|
expect(resolveImageUrls(markdown, '/vault')).toBe(markdown)
|
|
})
|
|
|
|
it('is a no-op when vaultPath is empty', () => {
|
|
tauriMode = true
|
|
const markdown = ''
|
|
|
|
expect(resolveImageUrls(markdown, '')).toBe(markdown)
|
|
})
|
|
|
|
it('converts relative attachment paths to asset URLs', () => {
|
|
tauriMode = true
|
|
const markdown = ''
|
|
|
|
expect(resolveImageUrls(markdown, '/vault')).toBe(
|
|
`})`,
|
|
)
|
|
})
|
|
|
|
it('leaves already-correct asset URLs unchanged', () => {
|
|
tauriMode = true
|
|
const url = assetUrl('/vault/attachments/file.png')
|
|
const markdown = ``
|
|
|
|
expect(resolveImageUrls(markdown, '/vault')).toBe(markdown)
|
|
})
|
|
|
|
it('rewrites legacy asset URLs from a different vault', () => {
|
|
tauriMode = true
|
|
const legacyUrl = assetUrl('/Users/luca/Workspace/tolaria-getting-started/attachments/CleanShot.png')
|
|
const markdown = ``
|
|
|
|
expect(resolveImageUrls(markdown, '/Users/john/Documents/Getting Started')).toBe(
|
|
`})`,
|
|
)
|
|
})
|
|
|
|
it('leaves external URLs unchanged', () => {
|
|
tauriMode = true
|
|
const httpImage = ''
|
|
const dataImage = ''
|
|
|
|
expect(resolveImageUrls(httpImage, '/vault')).toBe(httpImage)
|
|
expect(resolveImageUrls(dataImage, '/vault')).toBe(dataImage)
|
|
})
|
|
|
|
it('handles multiple images in one document', () => {
|
|
tauriMode = true
|
|
const markdown = `})\n\n`
|
|
|
|
const result = resolveImageUrls(markdown, '/vault')
|
|
|
|
expect(result).toContain(`})`)
|
|
expect(result).toContain(`})`)
|
|
})
|
|
|
|
it('preserves alt text and title attributes', () => {
|
|
tauriMode = true
|
|
const markdown = ''
|
|
|
|
expect(resolveImageUrls(markdown, '/vault')).toBe(
|
|
`} "starter vault")`,
|
|
)
|
|
})
|
|
|
|
it('skips unknown asset URLs without an attachments segment', () => {
|
|
tauriMode = true
|
|
const url = assetUrl('/some/other/path/file.png')
|
|
const markdown = ``
|
|
|
|
expect(resolveImageUrls(markdown, '/vault')).toBe(markdown)
|
|
})
|
|
})
|
|
|
|
describe('portableImageUrls', () => {
|
|
it('converts vault attachment asset URLs to relative paths', () => {
|
|
const url = assetUrl('/vault/attachments/1776369786040-CleanShot.png')
|
|
const markdown = ``
|
|
|
|
expect(portableImageUrls(markdown, '/vault')).toBe(
|
|
'',
|
|
)
|
|
})
|
|
|
|
it('is a no-op when vaultPath is empty', () => {
|
|
const url = assetUrl('/vault/attachments/file.png')
|
|
const markdown = ``
|
|
|
|
expect(portableImageUrls(markdown, '')).toBe(markdown)
|
|
})
|
|
|
|
it('leaves asset URLs from other vaults unchanged', () => {
|
|
const url = assetUrl('/other-vault/attachments/file.png')
|
|
const markdown = ``
|
|
|
|
expect(portableImageUrls(markdown, '/vault')).toBe(markdown)
|
|
})
|
|
|
|
it('leaves relative and external paths unchanged', () => {
|
|
const relativeImage = ''
|
|
const httpImage = ''
|
|
|
|
expect(portableImageUrls(relativeImage, '/vault')).toBe(relativeImage)
|
|
expect(portableImageUrls(httpImage, '/vault')).toBe(httpImage)
|
|
})
|
|
|
|
it('handles multiple images', () => {
|
|
const markdown = `})\n\n})`
|
|
|
|
const result = portableImageUrls(markdown, '/vault')
|
|
|
|
expect(result).toContain('')
|
|
expect(result).toContain('')
|
|
})
|
|
|
|
it('preserves title attributes when converting to portable paths', () => {
|
|
const markdown = `} "starter vault")`
|
|
|
|
expect(portableImageUrls(markdown, '/vault')).toBe('')
|
|
})
|
|
})
|
|
|
|
describe('resolveImageUrls / portableImageUrls round-trip', () => {
|
|
it('keeps relative attachment markdown stable', () => {
|
|
tauriMode = true
|
|
const markdown = ''
|
|
|
|
expect(portableImageUrls(resolveImageUrls(markdown, '/vault'), '/vault')).toBe(markdown)
|
|
})
|
|
})
|