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
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' |
|
) |
|
}) |
|
})
|
|
|