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