You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

126 lines
4.8 KiB

import { describe, expect, it } from 'vitest'
import {
gutenbergCoverCandidateUrls,
gutenbergCoverImageUrl,
gutenbergEbookPageUrl,
gutenbergLibraryCoverImageUrl,
normalizeGutenbergCoverImageUrl,
parseGutenbergEbookId,
parseGutenbergEbookIdFromDTag,
resolveGutenbergCoverImageUrl
} from '@/lib/gutenberg-cover'
describe('gutenberg-cover', () => {
it('parses ebook id from gutenberg.org URLs', () => {
expect(parseGutenbergEbookId('https://www.gutenberg.org/ebooks/58363')).toBe('58363')
expect(parseGutenbergEbookId('https://www.gutenberg.org/ebooks/58363/')).toBe('58363')
expect(parseGutenbergEbookId('https://www.gutenberg.org/files/21020/21020-h/21020-h.htm')).toBe(
'21020'
)
expect(
parseGutenbergEbookId('https://www.gutenberg.org/cache/epub/16702/pg16702.cover.medium.jpg')
).toBe('16702')
})
it('parses ebook id from pg-prefixed cover filenames on third-party hosts', () => {
expect(
parseGutenbergEbookId(
'https://api.nostr.build/v2/upload/67104/p/33358/pg33358.cover.medium.jpg'
)
).toBe('33358')
expect(parseGutenbergEbookId('https://cdn.example.com/pg292405.jpg')).toBe('292405')
})
it('builds medium cover URL by default', () => {
expect(gutenbergCoverImageUrl('58363')).toBe(
'https://www.gutenberg.org/cache/epub/58363/pg58363.cover.medium.jpg'
)
expect(gutenbergCoverImageUrl('58363', 'small')).toBe(
'https://www.gutenberg.org/cache/epub/58363/pg58363.cover.small.jpg'
)
})
it('gutenbergLibraryCoverImageUrl prefers small covers for library grids', () => {
expect(
gutenbergLibraryCoverImageUrl(
'https://www.gutenberg.org/cache/epub/58363/pg58363.cover.medium.jpg'
)
).toBe('https://www.gutenberg.org/cache/epub/58363/pg58363.cover.small.jpg')
expect(gutenbergLibraryCoverImageUrl('https://example.com/cover.jpg')).toBe(
'https://example.com/cover.jpg'
)
})
it('resolveGutenbergCoverImageUrl requires gutenberg source', () => {
expect(
resolveGutenbergCoverImageUrl('https://www.gutenberg.org/ebooks/58363')
).toBe('https://www.gutenberg.org/cache/epub/58363/pg58363.cover.medium.jpg')
expect(resolveGutenbergCoverImageUrl('https://example.com/book')).toBeUndefined()
})
it('parses ebook id from legacy pg-prefixed d-tags', () => {
expect(parseGutenbergEbookIdFromDTag('pg28217-dante-et-goethe-dialogues')).toBe('28217')
expect(parseGutenbergEbookIdFromDTag('pg28217')).toBe('28217')
expect(parseGutenbergEbookIdFromDTag('jane-eyre')).toBeNull()
})
it('builds gutenberg.org ebook page URL', () => {
expect(gutenbergEbookPageUrl('28217')).toBe('https://www.gutenberg.org/ebooks/28217')
})
it('gutenbergCoverCandidateUrls tries medium first, then small in library mode', () => {
expect(
gutenbergCoverCandidateUrls(
'https://www.gutenberg.org/cache/epub/11/pg11.cover.medium.jpg',
true
)
).toEqual([
'https://www.gutenberg.org/cache/epub/11/pg11.cover.medium.jpg',
'https://www.gutenberg.org/cache/epub/11/pg11.cover.small.jpg'
])
expect(
gutenbergCoverCandidateUrls(
'https://www.gutenberg.org/cache/epub/11/pg11.cover.medium.jpg',
false
)
).toEqual(['https://www.gutenberg.org/cache/epub/11/pg11.cover.medium.jpg'])
expect(gutenbergCoverCandidateUrls('https://example.com/cover.jpg', true)).toEqual([
'https://example.com/cover.jpg'
])
})
it('gutenbergCoverCandidateUrls falls back to gutenberg.org for PG mirror URLs', () => {
expect(
gutenbergCoverCandidateUrls(
'https://api.nostr.build/v2/upload/67104/p/33358/pg33358.cover.medium.jpg',
true
)
).toEqual([
'https://api.nostr.build/v2/upload/67104/p/33358/pg33358.cover.medium.jpg',
'https://www.gutenberg.org/cache/epub/33358/pg33358.cover.medium.jpg',
'https://www.gutenberg.org/cache/epub/33358/pg33358.cover.small.jpg'
])
})
it('normalizeGutenbergCoverImageUrl rewrites PG mirror filenames to gutenberg.org', () => {
expect(
normalizeGutenbergCoverImageUrl(
'https://api.nostr.build/v2/upload/67104/p/33358/pg33358.cover.medium.jpg'
)
).toBe('https://www.gutenberg.org/cache/epub/33358/pg33358.cover.medium.jpg')
})
it('normalizeGutenbergCoverImageUrl converts ebook pages to cover JPG', () => {
expect(normalizeGutenbergCoverImageUrl('https://www.gutenberg.org/ebooks/16702')).toBe(
'https://www.gutenberg.org/cache/epub/16702/pg16702.cover.medium.jpg'
)
expect(
normalizeGutenbergCoverImageUrl(
'https://www.gutenberg.org/cache/epub/16702/pg16702.cover.medium.jpg'
)
).toBe('https://www.gutenberg.org/cache/epub/16702/pg16702.cover.medium.jpg')
expect(normalizeGutenbergCoverImageUrl('https://example.com/cover.jpg')).toBe(
'https://example.com/cover.jpg'
)
})
})