Músicas — Casos de Borda
Gerado pelo Writer (Reversa) em 2026-05-11
doc_level: detalhado
EC-01 — Busca FTS5 com caracteres especiais ou só acentos
Descrição: O usuário digita um termo composto apenas por caracteres não-alfanuméricos (ex.: "!!!", "@#$") ou por acentos que após normalização NFKD resultam em string vazia.
Comportamento esperado: A normalização produz string vazia após remoção dos não-alfanuméricos → cai na estratégia semTermo (listagem completa sem filtro), sem erro.
Risco: 🟡 Não confirmado se a implementação trata esse edge case explicitamente ou se o FTS5 receberia uma query inválida, gerando erro de banco.
Rastreabilidade: src/repository/musicas/MusicasRepository.ts — getDetalhesTermoBusca
EC-02 — Busca FTS5 com termo de uma única letra
Descrição: O usuário digita "a" — após normalização: "a*". O FTS5 pode retornar um volume muito grande de resultados (todas as músicas com palavras começando em "a").
Comportamento esperado: Query válida; paginação limita a exibição; UX pode ser lenta dependendo do tamanho do catálogo.
Risco: 🟡 Performance pode degradar. Não há validação mínima de comprimento do termo.
Rastreabilidade: src/repository/musicas/MusicasRepository.ts
EC-03 — Índice alfanumérico (ex.: "23a") interpretado como busca textual
Descrição: A estratégia porIndice usa parseInt(termo) — portanto "23a" não é reconhecido como índice e cai na busca textual FTS5. Alguns hinários têm índices alfanuméricos.
Comportamento esperado: 🟡 A música de índice "23a" não é encontrada pela busca por índice; pode ou não aparecer na busca textual dependendo do conteúdo da letra/título.
Risco: 🟡 Usuários com hinários de índices alfanuméricos não conseguem encontrar músicas por índice.
Rastreabilidade: src/repository/musicas/MusicasRepository.ts — BuscaStrategies.porIndice + parseInt
EC-04 — Música sem nenhum livro associado
Descrição: Uma música pode existir na tabela musica sem entradas em cantico_livro (ex.: obra incompleta ou música legada).
Comportamento esperado: findById retorna InformacoesDetalhadasMusica com indices: []; a tela de letra exibe a música normalmente sem a seção de índices.
Risco: 🟢 Tratado pelo JOIN LEFT implícito; não gera erro.
Rastreabilidade: src/repository/musicas/MusicasRepository.ts — findById JOIN
EC-05 — Música com campo midias.YouTube preenchido e YouTubes vazio
Descrição: Músicas antigas têm apenas o campo deprecated YouTube (singular). O campo YouTubes pode estar ausente ou null.
Comportamento esperado: O código deve ler YouTube como fallback e tratar como array de tamanho 1 para compatibilidade com o componente que espera YouTubes[].
Risco: 🟡 Não confirmado se o fallback está implementado em todos os pontos de consumo da UI.
Rastreabilidade: src/model/Musica.ts — Midias.YouTube (deprecated) + YouTubes
EC-06 — Favoritar música sem conexão / banco indisponível
Descrição: O usuário tenta favoritar uma música enquanto o banco SQLite local está com problema de I/O (raro, mas possível em dispositivos com armazenamento quase cheio).
Comportamento esperado: Toast de erro exibido; operação não é registrada; o ícone de favorito pode ficar em estado inconsistente até a próxima carga do store.
Risco: 🔴 Estado inconsistente do ícone de favorito não é tratado explicitamente — requer validação.
Rastreabilidade: src/store/Musicas/Musicas.action.ts — setFavorita handler de erro
EC-07 — Keep Awake não desativado em saída abrupta
Descrição: O usuário sai da tela de letra via gesture de back do sistema operacional, notificação, ou deep link externo, em vez de navegar pelo fluxo normal do app.
Comportamento esperado: deactivateKeepAwake() deve ser chamado no useEffect cleanup da tela de letra.
Risco: 🔴 Não confirmado se todos os caminhos de saída disparam o cleanup — tela de outra aplicação pode permanecer com wake lock ativo.
Rastreabilidade: Múltiplos commits fix: keep awake
EC-08 — Paginação no final do catálogo (última página)
Descrição: Ao chegar na última página, o LIMIT n+1 retorna exatamente n ou menos resultados.
Comportamento esperado: hasNextPage = false; o botão/trigger de carregar mais não aparece ou fica desabilitado.
Risco: 🟢 Lógica confirmada no findAllBy.
Rastreabilidade: src/repository/musicas/MusicasRepository.ts — cálculo de hasNextPage
EC-09 — Snippet FTS5 com marcadores || no meio de palavra
Descrição: O FTS5 pode gerar snippets onde os marcadores || quebram no meio de uma palavra se o token coincidir parcialmente.
Comportamento esperado: A UI renderiza o destaque visual corretamente mesmo em quebras parciais; nenhum caractere | aparece cru para o usuário.
Risco: 🟡 Depende da implementação do componente de destaque na UI.
Rastreabilidade: src/repository/musicas/MusicasRepository.ts — snippet(musica_busca, 0, '||', '||', '...', TOTAL_TOKENS)
EC-10 — Catálogo vazio (banco recém-instalado sem obras)
Descrição: Em cenário de primeiro acesso sem obras baixadas, o catálogo pode estar vazio ou conter apenas as músicas do banco embarcado.
Comportamento esperado: Lista exibe estado vazio com mensagem orientando o usuário a baixar obras na Biblioteca.
Risco: 🟡 Banco embarcado (cantaIgreja.db) contém músicas por padrão — catálogo vazio só ocorre se o banco não for copiado corretamente.
Rastreabilidade: src/arch/persistence/AssetBanco.ts — cópia do banco embarcado