Files
jhonny-editor/code/engine/testes/test_leitura_semantica_do_plano.py
T
João Henrique 9edde2df37 feat: aprimorada a edição por voz com validação de frases, margens
- aprimorada a edição por voz com validação de frases, margens seguras e backup único antes da timeline.
- adicionada consulta expansível dos detalhes de cada trilha diretamente do banco

Resumo:
- 23 arquivos alterados
- 5 novos
- 18 modificados
- 0 removidos

 18 files changed, 321 insertions(+), 216 deletions(-)

Arquivos:
  - .gitignore
  - .jhonny/analises.db
  - code/cep-plugin/index.html
  - code/cep-plugin/main.js
  - code/cep-plugin/styles.css
  - code/engine/analisar_trilhas.py
  - code/engine/aplicar_plano_de_edicao.py
  - code/engine/editor/__init__.py
  - code/engine/editor/backup_de_sequencia.py
  - code/engine/persistencia/__init__.py
  - code/engine/testes/test_aplicar_plano_de_edicao.py
  - code/plugins/premiere-pro/skills/edit-video-by-voice/SKILL.md
  - code/plugins/premiere-pro/skills/editar-por-voz/SKILL.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/05-zoom.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/06-texto-corte-marcador.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/08-formato-de-saida.md
  - code/plugins/premiere-pro/skills/editar-por-voz/criterios/10-revisao-humana.md
  - code/plugins/premiere-pro/skills/transcript-to-edit-actions/SKILL.md
  - code/engine/consultar_detalhes_de_trilha.py
  - code/engine/editor/validacao_semantica.py
  - code/engine/persistencia/leitura_semantica_do_plano.py
  - code/engine/testes/test_leitura_semantica_do_plano.py
  - code/engine/testes/test_validador_semantico_de_plano.py
2026-09-10 14:38:42 -04:00

69 lines
2.9 KiB
Python

"""Testes da leitura de falas usada antes da aplicação de um plano."""
import tempfile
import unittest
from pathlib import Path
from engine.editor import ErroDePlanoInvalido
from engine.persistencia import LeitorDeTranscricaoDoPlano, abrir_banco
class TesteLeitorDeTranscricaoDoPlano(unittest.TestCase):
"""Valida vínculo do plano e conversão de timeline para mídia original."""
def setUp(self) -> None:
"""Cria um banco isolado com um clipe deslocado na timeline."""
self._pasta_temporaria = tempfile.TemporaryDirectory()
self.addCleanup(self._pasta_temporaria.cleanup)
caminho_do_banco = Path(self._pasta_temporaria.name) / "analises.db"
self.conexao = abrir_banco(caminho_do_banco)
self.addCleanup(self.conexao.close)
with self.conexao:
self.conexao.execute(
"INSERT INTO videos (id, nome, duracao) VALUES ('video-1', 'Vídeo', 40.0)"
)
self.conexao.execute(
"""INSERT INTO faixas (id, video_id, nome, tipo, indice)
VALUES ('audio-1', 'video-1', 'A1', 'audio', 0)"""
)
self.conexao.execute(
"""INSERT INTO clipes
(id, video_id, faixa_id, nome, inicio_na_timeline, fim_na_timeline,
inicio_na_origem, fim_na_origem, arquivo, offline, metadados)
VALUES ('clipe-1', 'video-1', 'audio-1', 'Clipe', 10.0, 30.0,
2.0, 22.0, '/video.mp4', 0, '{}')"""
)
segmento = self.conexao.execute(
"""INSERT INTO segmentos_de_transcricao
(video_id, clipe_id, inicio, fim, texto)
VALUES ('video-1', 'clipe-1', 12.0, 14.0, 'Frase completa.')"""
)
self.conexao.execute(
"""INSERT INTO palavras_de_transcricao
(segmento_id, ordem, texto, inicio, fim)
VALUES (?, 0, 'Frase', 12.0, 12.5)""",
(segmento.lastrowid,),
)
self.conexao.execute(
"""INSERT INTO planos_de_edicao (video_id, origem)
VALUES ('video-1', '/video.mp4')"""
)
def test_converte_tempos_para_a_origem_do_clipe(self) -> None:
"""Subtrai a posição da timeline e soma o início na mídia original."""
falas = LeitorDeTranscricaoDoPlano(self.conexao).carregar(1)
self.assertEqual(falas[0].inicio, 4.0)
self.assertEqual(falas[0].fim, 6.0)
self.assertEqual(falas[0].palavras[0].inicio, 4.0)
self.assertEqual(falas[0].palavras[0].fim, 4.5)
def test_rejeita_plano_inexistente(self) -> None:
"""Evita validar uma transcrição que não pertence ao plano solicitado."""
with self.assertRaisesRegex(ErroDePlanoInvalido, "não existe"):
LeitorDeTranscricaoDoPlano(self.conexao).carregar(999)
if __name__ == "__main__":
unittest.main()