teqo-backup/tests/unit/jingle.unit.spec.ts

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