""" Comprehensive tests for apps_script_toolbox.py Tests cover: - AppsScriptToolbox initialization - Worker initialization - Connection verification - Identity strike report - Full audit functionality """ import pytest import json from pathlib import Path from unittest.mock import Mock, patch, MagicMock import sys # Add parent directory to path sys.path.insert(0, str(Path(__file__).parent.parent)) from workers.apps_script_toolbox import AppsScriptToolbox class TestAppsScriptToolboxInit: """Test AppsScriptToolbox initialization""" def test_init_default_values(self): """Test that AppsScriptToolbox initializes correctly""" toolbox = AppsScriptToolbox() assert toolbox.reporter is None assert toolbox.archivist is None assert toolbox.repo_root is not None def test_init_repo_root_path(self): """Test that repo_root is a valid path""" toolbox = AppsScriptToolbox() assert isinstance(toolbox.repo_root, Path) class TestAppsScriptToolboxWorkerInit: """Test worker initialization""" def test_initialize_workers_without_modules(self): """Test worker initialization when modules not available""" toolbox = AppsScriptToolbox() # Should not raise error even if workers not available toolbox.initialize_workers() # Workers should remain None if modules not available # (actual behavior depends on import success) class TestAppsScriptToolboxVerifyConnections: """Test connection verification""" def test_verify_connections_all_present(self, mock_env_vars): """Test verification when all connections present""" toolbox = AppsScriptToolbox() result = toolbox.verify_connections() # Should have some checks assert isinstance(result, bool) def test_verify_connections_missing_env_vars(self, monkeypatch): """Test verification with missing env vars""" # Clear environment variables for var in ["GOOGLE_SHEETS_CREDENTIALS", "RCLONE_CONFIG_DATA", "HF_TOKEN"]: monkeypatch.delenv(var, raising=False) toolbox = AppsScriptToolbox() result = toolbox.verify_connections() # Should return False when connections missing assert result == False def test_verify_connections_partial_env_vars(self, monkeypatch): """Test verification with some env vars present""" monkeypatch.setenv("HF_TOKEN", "test_token") monkeypatch.delenv("GOOGLE_SHEETS_CREDENTIALS", raising=False) monkeypatch.delenv("RCLONE_CONFIG_DATA", raising=False) toolbox = AppsScriptToolbox() result = toolbox.verify_connections() # Should return False when not all connections present assert result == False class TestAppsScriptToolboxIdentityStrike: """Test identity strike report""" def test_run_identity_strike_no_reporter(self): """Test identity strike when reporter not available""" toolbox = AppsScriptToolbox() toolbox.reporter = None result = toolbox.run_identity_strike() assert result == False def test_run_identity_strike_with_reporter(self): """Test identity strike with mock reporter""" toolbox = AppsScriptToolbox() # Mock reporter mock_reporter = Mock() mock_reporter.create_identity_strike_report = Mock(return_value="success") toolbox.reporter = mock_reporter result = toolbox.run_identity_strike() assert result == True mock_reporter.create_identity_strike_report.assert_called_once() def test_run_identity_strike_reporter_error(self): """Test identity strike when reporter raises error""" toolbox = AppsScriptToolbox() # Mock reporter that raises error mock_reporter = Mock() mock_reporter.create_identity_strike_report = Mock(side_effect=Exception("Error")) toolbox.reporter = mock_reporter result = toolbox.run_identity_strike() assert result == False class TestAppsScriptToolboxFullAudit: """Test full audit functionality""" def test_run_full_audit_no_archivist(self): """Test full audit when archivist not available""" toolbox = AppsScriptToolbox() toolbox.archivist = None result = toolbox.run_full_audit() assert result == False def test_run_full_audit_with_archivist(self, temp_dir): """Test full audit with mock archivist""" toolbox = AppsScriptToolbox() toolbox.repo_root = temp_dir # Mock archivist mock_archivist = Mock() mock_archivist.process_cargo_bay = Mock() mock_archivist._save_archive_index = Mock() mock_archivist.files_processed = 10 toolbox.archivist = mock_archivist result = toolbox.run_full_audit() # Should attempt to save archive index mock_archivist._save_archive_index.assert_called() def test_run_full_audit_archivist_error(self, temp_dir): """Test full audit when archivist raises error""" toolbox = AppsScriptToolbox() toolbox.repo_root = temp_dir # Mock archivist that raises error mock_archivist = Mock() mock_archivist.process_cargo_bay = Mock(side_effect=Exception("Error")) toolbox.archivist = mock_archivist result = toolbox.run_full_audit() assert result == False class TestAppsScriptToolboxWorkerStatus: """Test worker status dashboard""" def test_update_worker_status_no_file(self, temp_dir): """Test status update when worker_status.json not found""" toolbox = AppsScriptToolbox() toolbox.repo_root = temp_dir result = toolbox.update_worker_status_dashboard() assert result == False def test_update_worker_status_with_file(self, temp_dir): """Test status update with valid worker_status.json""" toolbox = AppsScriptToolbox() toolbox.repo_root = temp_dir # Create worker status file status_file = temp_dir / "worker_status.json" status_data = { "last_updated": "2026-04-14", "sync_status": { "gdrive_last_sync": "2026-04-14" } } status_file.write_text(json.dumps(status_data)) # Mock reporter mock_reporter = Mock() mock_reporter.update_worker_status_sheet = Mock() toolbox.reporter = mock_reporter result = toolbox.update_worker_status_dashboard() assert result == True mock_reporter.update_worker_status_sheet.assert_called_once() def test_update_worker_status_invalid_json(self, temp_dir): """Test status update with invalid JSON""" toolbox = AppsScriptToolbox() toolbox.repo_root = temp_dir # Create invalid JSON file status_file = temp_dir / "worker_status.json" status_file.write_text("invalid json {]}") result = toolbox.update_worker_status_dashboard() assert result == False class TestAppsScriptToolboxIntegration: """Integration tests for AppsScriptToolbox""" def test_full_workflow_mock(self, temp_dir, mock_env_vars): """Test complete workflow with mocked workers""" toolbox = AppsScriptToolbox() toolbox.repo_root = temp_dir # Mock both workers mock_reporter = Mock() mock_reporter.create_identity_strike_report = Mock(return_value="success") mock_reporter.update_worker_status_sheet = Mock() mock_archivist = Mock() mock_archivist.process_cargo_bay = Mock() mock_archivist._save_archive_index = Mock() mock_archivist.files_processed = 5 toolbox.reporter = mock_reporter toolbox.archivist = mock_archivist # Test all operations assert toolbox.verify_connections() == True assert toolbox.run_identity_strike() == True