import unittest import hashlib from minicoin import Blockchain, GenesisData, TransactionData class TestBlockchain(unittest.TestCase): def setUp(self): """Executa antes de cada teste.""" # --- CORREÇÃO AQUI --- # 1. Cria a blockchain vazia self.bc = Blockchain() # 2. Adiciona o Bloco Gênesis, que será usado por todos os testes self.bc.createGenesisBlock(acc_owner="Alice", amount=1000) # --- FIM DA CORREÇÃO --- def test_genesis_block_creation(self): """Testa se o bloco gênesis criado no setUp() está correto.""" # Não precisa criar o bloco, o setUp() já fez isso. self.assertEqual(len(self.bc.chain), 1) block = self.bc.chain[0] # Pega o bloco criado no setUp() self.assertIsInstance(block.data, GenesisData) self.assertEqual(block.data.acc_owner, "Alice") self.assertEqual(block.data.amount, 1000) def test_add_block(self): """Testa se um novo bloco é adicionado após o gênesis.""" # Não precisa criar o bloco, o setUp() já fez isso. prev_hash = self.bc.chain[-1].hash # Pega o hash do bloco gênesis new_block = self.bc.addBlock(200, operation="withdraw") self.assertEqual(len(self.bc.chain), 2) self.assertIsInstance(new_block.data, TransactionData) self.assertEqual(new_block.previousHash, prev_hash) def test_chain_valid_after_multiple_blocks(self): """Verifica se a blockchain é válida após adicionar vários blocos.""" # Não precisa criar o bloco, o setUp() já fez isso. self.bc.addBlock(1000, "deposit") self.bc.addBlock(200, "withdraw") self.assertTrue(self.bc.isValid()) def test_chain_invalid_if_data_tampered(self): """Verifica se a blockchain detecta adulteração de dados.""" # Não precisa criar o bloco, o setUp() já fez isso. self.bc.addBlock(1000, "deposit") # adulteração: altera a quantia do segundo bloco self.bc.chain[1].data.amount = 99999 self.assertFalse(self.bc.isValid()) def test_chain_invalid_if_previous_hash_modified(self): """Verifica se a blockchain detecta quebra no encadeamento.""" # Não precisa criar o bloco, o setUp() já fez isso. self.bc.addBlock(1000, "deposit") # adulteração: modifica o previousHash self.bc.chain[1].previousHash = "1234567890abcdef" self.assertFalse(self.bc.isValid()) def test_block_hash_consistency(self): """Testa se o hash calculado é o mesmo armazenado.""" # Não precisa criar o bloco, o setUp() já fez isso. block = self.bc.chain[0] expected_hash = hashlib.sha256(f"{block.previousHash}{block.data}".encode("utf-8")).hexdigest() self.assertEqual(block.hash, expected_hash) if __name__ == "__main__": unittest.main()