import unittest from unittest.mock import MagicMock, patch import os import sys import csv # Add parent directory to path sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) # Add scripts directory to path to find shared module sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../scripts')) # Import the function to test (we need to import it from the script) from scripts.a1_to_a2_box_uploader import generate_and_upload_csv class TestBoxCSVUpload(unittest.TestCase): def setUp(self): self.mock_db = MagicMock() self.mock_box = MagicMock() self.mock_config = { 'box': { 'live_campaigns_folder_id': '123456789' } } def test_generate_and_upload_csv_success(self): # Mock DB response self.mock_db.get_all_live_campaigns.return_value = [ {'campaign_number': 'C001', 'campaign_name': 'Campaign 1'}, {'campaign_number': 'C002', 'campaign_name': 'Campaign 2'} ] # Mock Box upload response self.mock_box.upload_file.return_value = {'file_id': '999', 'url': 'http://box.com/file/999'} # Run function result = generate_and_upload_csv(self.mock_db, self.mock_box, self.mock_config) # Verify result self.assertTrue(result) # Verify DB called self.mock_db.get_all_live_campaigns.assert_called_once() # Verify Box upload called self.mock_box.upload_file.assert_called_once() # Check arguments passed to upload_file call_args = self.mock_box.upload_file.call_args self.assertEqual(call_args.kwargs['folder_id'], '123456789') self.assertTrue(call_args.kwargs['target_filename'].startswith('live_campaigns_')) self.assertTrue(call_args.kwargs['target_filename'].endswith('.csv')) # Verify CSV content (we can't easily check the file content since it's deleted, # but we can check if the file path passed to upload existed at some point) file_path = call_args.kwargs['file_path'] # Note: The file is deleted by the function, so we can't check if it exists now. def test_no_campaigns(self): # Mock DB response empty self.mock_db.get_all_live_campaigns.return_value = [] # Run function result = generate_and_upload_csv(self.mock_db, self.mock_box, self.mock_config) # Verify result False self.assertFalse(result) # Verify Box upload NOT called self.mock_box.upload_file.assert_not_called() def test_missing_config(self): # Mock DB response self.mock_db.get_all_live_campaigns.return_value = [{'campaign_number': 'C001', 'campaign_name': 'C1'}] # Config missing folder ID bad_config = {'box': {}} # Run function result = generate_and_upload_csv(self.mock_db, self.mock_box, bad_config) # Verify result False self.assertFalse(result) # Verify Box upload NOT called self.mock_box.upload_file.assert_not_called() if __name__ == '__main__': unittest.main()