| """ |
| 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 |
|
|
| |
| 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() |
|
|
| |
| toolbox.initialize_workers() |
|
|
| |
| |
|
|
|
|
| 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() |
|
|
| |
| assert isinstance(result, bool) |
|
|
| def test_verify_connections_missing_env_vars(self, monkeypatch): |
| """Test verification with missing env vars""" |
| |
| for var in ["GOOGLE_SHEETS_CREDENTIALS", "RCLONE_CONFIG_DATA", "HF_TOKEN"]: |
| monkeypatch.delenv(var, raising=False) |
|
|
| toolbox = AppsScriptToolbox() |
|
|
| result = toolbox.verify_connections() |
|
|
| |
| 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() |
|
|
| |
| 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() |
| 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 = 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() |
| 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() |
|
|
| |
| 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 = 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 |
|
|
| |
| 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() |
| 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 |
|
|
| |
| 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_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 |
|
|
| |
| assert toolbox.verify_connections() == True |
| assert toolbox.run_identity_strike() == True |
|
|