| | import { describe, expect, test } from 'vitest' |
| |
|
| | interface TocItem { |
| | title: string |
| | intro: string |
| | fullPath?: string |
| | } |
| |
|
| | interface SpotlightItem { |
| | article: string |
| | image: string |
| | } |
| |
|
| | interface ProcessedSpotlightItem { |
| | article: string |
| | title: string |
| | description: string |
| | url: string |
| | image: string |
| | } |
| |
|
| | |
| | const mockTocItems: TocItem[] = [ |
| | { |
| | title: 'Test Debug Article', |
| | intro: 'A test article for debugging functionality.', |
| | fullPath: '/en/category/debugging-errors/test-debug-article', |
| | }, |
| | { |
| | title: 'Test Refactor Article', |
| | intro: 'A test article for refactoring functionality.', |
| | fullPath: '/en/category/refactoring-code/test-refactor-article', |
| | }, |
| | { |
| | title: 'Test Unit Article', |
| | intro: 'A test article for unit testing functionality.', |
| | fullPath: '/en/category/testing-code/test-unit-article', |
| | }, |
| | ] |
| |
|
| | |
| | function processSpotlight( |
| | spotlight: SpotlightItem[] | undefined, |
| | tocItems: TocItem[], |
| | ): ProcessedSpotlightItem[] { |
| | const findArticleData = (articlePath: string): TocItem | undefined => { |
| | const cleanPath: string = articlePath.startsWith('/') ? articlePath.slice(1) : articlePath |
| | return tocItems.find( |
| | (item: TocItem) => |
| | item.fullPath?.endsWith(cleanPath) || |
| | item.fullPath?.includes(cleanPath.split('/').pop() || ''), |
| | ) |
| | } |
| |
|
| | return ( |
| | spotlight?.map((spotlightItem: SpotlightItem): ProcessedSpotlightItem => { |
| | const articleData: TocItem | undefined = findArticleData(spotlightItem.article) |
| | return { |
| | article: spotlightItem.article, |
| | title: articleData?.title || 'Unknown Article', |
| | description: articleData?.intro || '', |
| | url: articleData?.fullPath || spotlightItem.article, |
| | image: spotlightItem.image, |
| | } |
| | }) || [] |
| | ) |
| | } |
| |
|
| | describe('spotlight processing logic', () => { |
| | test('processes spotlight object items correctly', () => { |
| | const spotlight: SpotlightItem[] = [ |
| | { |
| | article: '/debugging-errors/test-debug-article', |
| | image: '/assets/images/test-debugging.png', |
| | }, |
| | { |
| | article: '/refactoring-code/test-refactor-article', |
| | image: '/assets/images/test-refactoring.png', |
| | }, |
| | ] |
| |
|
| | const result: ProcessedSpotlightItem[] = processSpotlight(spotlight, mockTocItems) |
| |
|
| | expect(result).toHaveLength(2) |
| | expect(result[0]).toEqual({ |
| | article: '/debugging-errors/test-debug-article', |
| | title: 'Test Debug Article', |
| | description: 'A test article for debugging functionality.', |
| | url: '/en/category/debugging-errors/test-debug-article', |
| | image: '/assets/images/test-debugging.png', |
| | }) |
| | expect(result[1]).toEqual({ |
| | article: '/refactoring-code/test-refactor-article', |
| | title: 'Test Refactor Article', |
| | description: 'A test article for refactoring functionality.', |
| | url: '/en/category/refactoring-code/test-refactor-article', |
| | image: '/assets/images/test-refactoring.png', |
| | }) |
| | }) |
| |
|
| | test('processes multiple spotlight items with different images', () => { |
| | const spotlight: SpotlightItem[] = [ |
| | { |
| | article: '/debugging-errors/test-debug-article', |
| | image: '/assets/images/debugging.png', |
| | }, |
| | { |
| | article: '/refactoring-code/test-refactor-article', |
| | image: '/assets/images/refactoring.png', |
| | }, |
| | { |
| | article: '/testing-code/test-unit-article', |
| | image: '/assets/images/testing.png', |
| | }, |
| | ] |
| |
|
| | const result: ProcessedSpotlightItem[] = processSpotlight(spotlight, mockTocItems) |
| |
|
| | expect(result).toHaveLength(3) |
| | expect(result[0].image).toBe('/assets/images/debugging.png') |
| | expect(result[1].image).toBe('/assets/images/refactoring.png') |
| | expect(result[2].image).toBe('/assets/images/testing.png') |
| | expect(result[2].title).toBe('Test Unit Article') |
| | }) |
| |
|
| | test('finds articles by filename when full path does not match', () => { |
| | const spotlight: SpotlightItem[] = [ |
| | { |
| | article: 'test-debug-article', |
| | image: '/assets/images/debug.png', |
| | }, |
| | ] |
| | const result: ProcessedSpotlightItem[] = processSpotlight(spotlight, mockTocItems) |
| |
|
| | expect(result[0].title).toBe('Test Debug Article') |
| | expect(result[0].url).toBe('/en/category/debugging-errors/test-debug-article') |
| | expect(result[0].image).toBe('/assets/images/debug.png') |
| | }) |
| |
|
| | test('handles articles not found in tocItems', () => { |
| | const spotlight: SpotlightItem[] = [ |
| | { |
| | article: '/completely/nonexistent/path', |
| | image: '/assets/images/missing1.png', |
| | }, |
| | { |
| | article: '/another/totally-missing-article', |
| | image: '/assets/images/missing2.png', |
| | }, |
| | ] |
| |
|
| | const result: ProcessedSpotlightItem[] = processSpotlight(spotlight, mockTocItems) |
| |
|
| | expect(result).toHaveLength(2) |
| | expect(result[0]).toEqual({ |
| | article: '/completely/nonexistent/path', |
| | title: 'Unknown Article', |
| | description: '', |
| | url: '/completely/nonexistent/path', |
| | image: '/assets/images/missing1.png', |
| | }) |
| | expect(result[1]).toEqual({ |
| | article: '/another/totally-missing-article', |
| | title: 'Unknown Article', |
| | description: '', |
| | url: '/another/totally-missing-article', |
| | image: '/assets/images/missing2.png', |
| | }) |
| | }) |
| |
|
| | test('handles empty spotlight array', () => { |
| | const spotlight: SpotlightItem[] = [] |
| | const result: ProcessedSpotlightItem[] = processSpotlight(spotlight, mockTocItems) |
| | expect(result).toEqual([]) |
| | }) |
| |
|
| | test('handles undefined spotlight', () => { |
| | const result: ProcessedSpotlightItem[] = processSpotlight(undefined, mockTocItems) |
| | expect(result).toEqual([]) |
| | }) |
| | }) |
| |
|