import unittest,tempfile,sqlite3,json from pathlib import Path from treinamento import Treinamento,validar_receita class BibliotecaTest(unittest.TestCase): def test_criar_editar_excluir_desfazer_persistente(self): with tempfile.TemporaryDirectory() as d: p=Path(d)/'treino.db';t=Treinamento(p,iniciar=False) t.alterar_reacao('criar',dados=dict(nome='Ideia',motivo='Uma ideia',caractere='💡',local='olhos')) row=t.status()['reacoes'][0];ident=row['id'] t.alterar_reacao('editar',ident,dict(nome='Treino',motivo='Musculação',caractere='💪',local='olhos')) self.assertEqual(t.status()['reacoes'][0]['receita']['emoji']['caractere'],'💪') t=Treinamento(p,iniciar=False);t.alterar_reacao('desfazer') self.assertEqual(t.status()['reacoes'][0]['receita']['nome'],'Ideia') t.alterar_reacao('ativar',ident,dict(ativa=False));self.assertFalse(t.status()['reacoes'][0]['ativa']) t.alterar_reacao('desfazer');self.assertTrue(t.status()['reacoes'][0]['ativa']) t.alterar_reacao('feedback',ident,dict(valor=-1));self.assertEqual(t.status()['reacoes'][0]['feedback'],-1) t.alterar_reacao('desfazer');self.assertEqual(t.status()['reacoes'][0]['feedback'],0) t.alterar_reacao('duplicar',ident);self.assertEqual(len(t.status()['reacoes']),2) t.alterar_reacao('desfazer');self.assertEqual(len(t.status()['reacoes']),1) t.alterar_reacao('excluir',ident);self.assertEqual(t.status()['reacoes'],[]) t.alterar_reacao('desfazer');self.assertEqual(t.status()['reacoes'][0]['id'],ident) def test_migracao_preserva_svg(self): with tempfile.TemporaryDirectory() as d: p=Path(d)/'treino.db' recipe=dict(nome='Desenho',motivo='Original',simbolo='nenhum',legenda='',passos=[dict(olhos='aberto',boca='sorriso',cor='#5cd6ff',dx=0,dy=0,escala=1,duracao=2)],figurinha=dict(nome='SVG',local='olhos',formas=[dict(caminho='M 10 10 L 90 90 Z',cor='#123456')])) with sqlite3.connect(p) as db: db.execute('CREATE TABLE reacoes(id INTEGER PRIMARY KEY,horario REAL,receita TEXT,feedback INTEGER DEFAULT 0)');db.execute('INSERT INTO reacoes VALUES (1,0,?,1)',(json.dumps(recipe),)) db.close() t=Treinamento(p,iniciar=False);self.assertEqual(t.status()['reacoes'][0]['receita'],recipe) t.alterar_reacao('editar',1,dict(nome='Emoji',motivo='Mudança',caractere='💡',local='olhos')) t.alterar_reacao('desfazer');self.assertEqual(t.status()['reacoes'][0]['receita'],recipe) def test_edicao_invalida_nao_modifica(self): with tempfile.TemporaryDirectory() as d: t=Treinamento(Path(d)/'treino.db',iniciar=False) with self.assertRaises(ValueError):t.alterar_reacao('criar',dados=dict(nome='Teste',motivo='Teste',caractere='