mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 15:13:07 +00:00
87 lines
3.5 KiB
TypeScript
87 lines
3.5 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import { jingleDownloadFilename, splitJingleTitle, toJingleViewModel } from '@/lib/jingle'
|
|
|
|
describe('jingleDownloadFilename', () => {
|
|
it.each([
|
|
['axe', 'Jorge Solla 1313 - Axé.mp3', 'jorge-solla-1313-axe.mp3'],
|
|
['forro', 'JORGE SOLLA 1313 - FORRO.MP3', 'jorge-solla-1313-forro.mp3'],
|
|
['Pagodão', 'Jorge Solla 1313 - Pagodão.wav', 'jorge-solla-1313-pagodao.wav'],
|
|
['axe-2026', 'audio.mp3', 'jorge-solla-1313-axe-2026.mp3'],
|
|
])('derives %s → %s', (slug, filename, expected) => {
|
|
expect(jingleDownloadFilename(slug, filename)).toBe(expected)
|
|
})
|
|
|
|
it('falls back to the generic base when the slug normalizes to nothing', () => {
|
|
expect(jingleDownloadFilename('---', 'audio.mp3')).toBe('jorge-solla-1313-jingle.mp3')
|
|
expect(jingleDownloadFilename(null, null)).toBe('jorge-solla-1313-jingle.mp3')
|
|
})
|
|
|
|
it('falls back to mp3 when the stored filename has no usable extension', () => {
|
|
expect(jingleDownloadFilename('axe', 'Jorge Solla 1313 - Axé')).toBe('jorge-solla-1313-axe.mp3')
|
|
expect(jingleDownloadFilename('axe', 'audio.')).toBe('jorge-solla-1313-axe.mp3')
|
|
expect(jingleDownloadFilename('axe', 'audio')).toBe('jorge-solla-1313-axe.mp3')
|
|
})
|
|
})
|
|
|
|
describe('splitJingleTitle', () => {
|
|
it.each([
|
|
['Jorge Solla 1313 (feat. Felipe Forrozeiro)', 'Jorge Solla 1313', 'feat. Felipe Forrozeiro'],
|
|
['Jorge Solla 1313 (feat. Nagib Barroso)', 'Jorge Solla 1313', 'feat. Nagib Barroso'],
|
|
['Jorge Solla 1313 (feat. É O MT)', 'Jorge Solla 1313', 'feat. É O MT'],
|
|
['Jorge Solla 1313 (FEAT. É O MT)', 'Jorge Solla 1313', 'feat. É O MT'],
|
|
['Jorge Solla 1313 ( feat. É O MT )', 'Jorge Solla 1313', 'feat. É O MT'],
|
|
['Jorge Solla 1313 (feat. Felipe Forrozeiro) ', 'Jorge Solla 1313', 'feat. Felipe Forrozeiro'],
|
|
['Jorge Solla 1313 (feat. A) (feat. B)', 'Jorge Solla 1313 (feat. A)', 'feat. B'],
|
|
])('splits %s', (title, base, credit) => {
|
|
expect(splitJingleTitle(title)).toEqual({ base, credit })
|
|
})
|
|
|
|
it.each([
|
|
'Axé',
|
|
'Forró',
|
|
'Jorge Solla 1313 (ao vivo)',
|
|
'Jorge Solla 1313 (feat. )',
|
|
'(feat. Felipe Forrozeiro)',
|
|
'Jorge Solla 1313 (feat. X) ao vivo',
|
|
])('keeps %s verbatim without a credit line', (title) => {
|
|
expect(splitJingleTitle(title)).toEqual({ base: title, credit: null })
|
|
})
|
|
})
|
|
|
|
describe('toJingleViewModel', () => {
|
|
const jingle = { id: 7, title: 'Axé', slug: 'axe' }
|
|
|
|
it('fails closed without a readable cover or audio', () => {
|
|
expect(toJingleViewModel({ jingle, cover: null, audio: { url: '/a.mp3' } })).toBeNull()
|
|
expect(toJingleViewModel({ jingle, cover: { url: '/c.jpg' }, audio: null })).toBeNull()
|
|
expect(toJingleViewModel({ jingle, cover: { url: null }, audio: { url: '/a.mp3' } })).toBeNull()
|
|
})
|
|
|
|
it('maps the card and derives the download name', () => {
|
|
expect(
|
|
toJingleViewModel({
|
|
jingle,
|
|
cover: { url: '/capa.jpg', alt: 'Capa oficial' },
|
|
audio: { url: '/axe.mp3', filename: 'Jorge Solla 1313 - Axé.mp3' },
|
|
}),
|
|
).toEqual({
|
|
id: 7,
|
|
title: 'Axé',
|
|
coverUrl: '/capa.jpg',
|
|
coverAlt: 'Capa oficial',
|
|
audioUrl: '/axe.mp3',
|
|
downloadFilename: 'jorge-solla-1313-axe.mp3',
|
|
})
|
|
})
|
|
|
|
it('falls back to a readable cover alt', () => {
|
|
expect(
|
|
toJingleViewModel({
|
|
jingle,
|
|
cover: { url: '/capa.jpg', alt: ' ' },
|
|
audio: { url: '/axe.mp3' },
|
|
})?.coverAlt,
|
|
).toBe('Capa do jingle Axé de Jorge Solla 1313')
|
|
})
|
|
})
|