Skip to content

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.tsgetDetalhesTermoBusca


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.tsBuscaStrategies.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.tsfindById 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.tsMidias.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.tssetFavorita 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.tssnippet(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