import unittest from unittest.mock import patch, MagicMock import sys import os # Add src to python path to import tracker sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'src')) import tracker class TestTrueNASStorageTracker(unittest.TestCase): def setUp(self): self.mock_pool_data = [ { "name": "tank", "size": 10995116277760, # 10 TB "allocated": 5497558138880, # 5 TB "free": 5497558138880 # 5 TB }, { "name": "boot-pool", "size": 256000000000, # 256 GB "allocated": 64000000000, # 64 GB "free": 192000000000 # 192 GB } ] @patch('tracker.requests.get') @patch('tracker.os.getenv') def test_fetch_pool_data_success(self, mock_getenv, mock_get): # Configure mocks mock_getenv.side_effect = lambda key: { 'TRUENAS_API_URL': 'http://mock-url', 'TRUENAS_API_KEY': 'mock-key' }.get(key) mock_response = MagicMock() mock_response.json.return_value = self.mock_pool_data mock_response.raise_for_status.return_value = None mock_get.return_value = mock_response # Call function data = tracker.fetch_pool_data() # Assertions self.assertEqual(data, self.mock_pool_data) mock_get.assert_called_once() def test_process_pool_data(self): processed = tracker.process_pool_data(self.mock_pool_data) self.assertEqual(len(processed), 2) # Check first pool self.assertEqual(processed[0]['pool_name'], "tank") self.assertEqual(processed[0]['total_size_bytes'], 10995116277760) self.assertEqual(processed[0]['percent_used'], 50.0) # Check second pool self.assertEqual(processed[1]['pool_name'], "boot-pool") self.assertEqual(processed[1]['percent_used'], 25.0) @patch('tracker.os.getenv') def test_missing_env_vars(self, mock_getenv): mock_getenv.return_value = None with self.assertRaises(ValueError): tracker.fetch_pool_data() if __name__ == '__main__': unittest.main()