import unittest import tempfile import shutil import os import json import sys from pathlib import Path # Add api directory to path api_dir = Path(__file__).parent.parent / 'api' sys.path.insert(0, str(api_dir)) from peer_registry import PeerRegistry class TestPeerRegistry(unittest.TestCase): def setUp(self): # Use a temp directory for the peers file self.test_dir = tempfile.mkdtemp() self.registry = PeerRegistry(data_dir=self.test_dir, config_dir=self.test_dir) def tearDown(self): shutil.rmtree(self.test_dir) def test_initialization_and_empty(self): self.assertEqual(self.registry.list_peers(), []) def test_add_and_get_peer(self): peer = {'peer': 'peer1', 'ip': '10.0.0.2'} result = self.registry.add_peer(peer) self.assertTrue(result) self.assertEqual(self.registry.get_peer('peer1'), peer) # Adding duplicate should fail result = self.registry.add_peer(peer) self.assertFalse(result) # Defensive: check peer_obj is not None peer_obj = self.registry.get_peer('peer1') self.assertIsNotNone(peer_obj) self.assertEqual(peer_obj['ip'], '10.0.0.2') def test_remove_peer(self): peer = {'peer': 'peer1', 'ip': '10.0.0.2'} self.registry.add_peer(peer) result = self.registry.remove_peer('peer1') self.assertTrue(result) self.assertIsNone(self.registry.get_peer('peer1')) # Removing non-existent peer should return False result = self.registry.remove_peer('peer1') self.assertFalse(result) def test_update_peer_ip(self): peer = {'peer': 'peer1', 'ip': '10.0.0.2'} self.registry.add_peer(peer) result = self.registry.update_peer_ip('peer1', '10.0.0.3') self.assertTrue(result) peer_obj = self.registry.get_peer('peer1') self.assertIsNotNone(peer_obj) self.assertEqual(peer_obj['ip'], '10.0.0.3') # Updating non-existent peer should return False result = self.registry.update_peer_ip('peer2', '10.0.0.4') self.assertFalse(result) def test_persistence(self): peer = {'peer': 'peer1', 'ip': '10.0.0.2'} self.registry.add_peer(peer) # Create a new registry instance to test loading from file new_registry = PeerRegistry(data_dir=self.test_dir, config_dir=self.test_dir) peer_obj = new_registry.get_peer('peer1') self.assertIsNotNone(peer_obj) self.assertEqual(peer_obj['ip'], '10.0.0.2') def test_corrupt_file_handling(self): # Write corrupt JSON to the peers file peers_file = os.path.join(self.test_dir, 'peers.json') with open(peers_file, 'w') as f: f.write('{bad json') # Should not raise, should load as empty registry = PeerRegistry(data_dir=self.test_dir, config_dir=self.test_dir) self.assertEqual(registry.list_peers(), []) if __name__ == '__main__': unittest.main()