mirror of
https://github.com/A6-9V/MQL5-Google-Onedrive.git
synced 2026-04-11 12:20:57 +00:00
166 lines
4.7 KiB
Python
166 lines
4.7 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""
|
||
|
|
Integration test for automation scripts.
|
||
|
|
Run this to verify all scripts are working correctly.
|
||
|
|
"""
|
||
|
|
|
||
|
|
import json
|
||
|
|
import subprocess
|
||
|
|
import sys
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
|
||
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
||
|
|
SCRIPTS_DIR = REPO_ROOT / "scripts"
|
||
|
|
CONFIG_DIR = REPO_ROOT / "config"
|
||
|
|
|
||
|
|
|
||
|
|
def test_python_orchestrator():
|
||
|
|
"""Test Python orchestrator."""
|
||
|
|
print("Testing Python orchestrator...")
|
||
|
|
|
||
|
|
# Test help
|
||
|
|
result = subprocess.run(
|
||
|
|
[sys.executable, str(SCRIPTS_DIR / "startup_orchestrator.py"), "--help"],
|
||
|
|
capture_output=True,
|
||
|
|
text=True
|
||
|
|
)
|
||
|
|
assert result.returncode == 0, "Orchestrator help failed"
|
||
|
|
assert "usage:" in result.stdout.lower(), "Help output missing"
|
||
|
|
|
||
|
|
# Test dry-run
|
||
|
|
result = subprocess.run(
|
||
|
|
[sys.executable, str(SCRIPTS_DIR / "startup_orchestrator.py"), "--dry-run"],
|
||
|
|
capture_output=True,
|
||
|
|
text=True
|
||
|
|
)
|
||
|
|
assert result.returncode == 0, "Dry-run failed"
|
||
|
|
assert "DRY RUN" in result.stdout or "dry run" in result.stdout.lower(), "Dry-run not executed"
|
||
|
|
|
||
|
|
print("✓ Python orchestrator OK")
|
||
|
|
|
||
|
|
|
||
|
|
def test_example_script():
|
||
|
|
"""Test example custom script."""
|
||
|
|
print("Testing example custom script...")
|
||
|
|
|
||
|
|
result = subprocess.run(
|
||
|
|
[sys.executable, str(SCRIPTS_DIR / "example_custom_script.py"), "--help"],
|
||
|
|
capture_output=True,
|
||
|
|
text=True
|
||
|
|
)
|
||
|
|
assert result.returncode == 0, "Example script help failed"
|
||
|
|
|
||
|
|
result = subprocess.run(
|
||
|
|
[sys.executable, str(SCRIPTS_DIR / "example_custom_script.py")],
|
||
|
|
capture_output=True,
|
||
|
|
text=True
|
||
|
|
)
|
||
|
|
assert result.returncode == 0, "Example script execution failed"
|
||
|
|
# Check both stdout and stderr since logging can go to either
|
||
|
|
output = (result.stdout + result.stderr).lower()
|
||
|
|
assert "script completed" in output or "completed successfully" in output, "Script didn't complete"
|
||
|
|
|
||
|
|
print("✓ Example script OK")
|
||
|
|
|
||
|
|
|
||
|
|
def test_config_file():
|
||
|
|
"""Test configuration file."""
|
||
|
|
print("Testing configuration file...")
|
||
|
|
|
||
|
|
config_file = CONFIG_DIR / "startup_config.json"
|
||
|
|
assert config_file.exists(), f"Config file not found: {config_file}"
|
||
|
|
|
||
|
|
with open(config_file, 'r') as f:
|
||
|
|
config = json.load(f)
|
||
|
|
|
||
|
|
assert "components" in config, "Config missing 'components' key"
|
||
|
|
assert isinstance(config["components"], list), "Components must be a list"
|
||
|
|
assert len(config["components"]) > 0, "No components defined"
|
||
|
|
|
||
|
|
for comp in config["components"]:
|
||
|
|
assert "name" in comp, "Component missing 'name'"
|
||
|
|
assert "executable" in comp, "Component missing 'executable'"
|
||
|
|
assert "args" in comp, "Component missing 'args'"
|
||
|
|
|
||
|
|
print("✓ Configuration file OK")
|
||
|
|
|
||
|
|
|
||
|
|
def test_shell_script():
|
||
|
|
"""Test shell script syntax."""
|
||
|
|
print("Testing shell script...")
|
||
|
|
|
||
|
|
script = SCRIPTS_DIR / "startup.sh"
|
||
|
|
assert script.exists(), f"Shell script not found: {script}"
|
||
|
|
|
||
|
|
# Check syntax
|
||
|
|
result = subprocess.run(
|
||
|
|
["bash", "-n", str(script)],
|
||
|
|
capture_output=True,
|
||
|
|
text=True
|
||
|
|
)
|
||
|
|
assert result.returncode == 0, f"Shell script syntax error: {result.stderr}"
|
||
|
|
|
||
|
|
# Check executable
|
||
|
|
assert script.stat().st_mode & 0o111, "Shell script not executable"
|
||
|
|
|
||
|
|
print("✓ Shell script OK")
|
||
|
|
|
||
|
|
|
||
|
|
def test_validator():
|
||
|
|
"""Test repository validator."""
|
||
|
|
print("Testing repository validator...")
|
||
|
|
|
||
|
|
result = subprocess.run(
|
||
|
|
[sys.executable, str(SCRIPTS_DIR / "ci_validate_repo.py")],
|
||
|
|
capture_output=True,
|
||
|
|
text=True
|
||
|
|
)
|
||
|
|
assert result.returncode == 0, f"Validator failed: {result.stderr}"
|
||
|
|
assert "OK:" in result.stdout, "Validator output unexpected"
|
||
|
|
|
||
|
|
print("✓ Repository validator OK")
|
||
|
|
|
||
|
|
|
||
|
|
def main():
|
||
|
|
"""Run all tests."""
|
||
|
|
print("=" * 60)
|
||
|
|
print("Running Integration Tests")
|
||
|
|
print("=" * 60)
|
||
|
|
print()
|
||
|
|
|
||
|
|
tests = [
|
||
|
|
test_config_file,
|
||
|
|
test_python_orchestrator,
|
||
|
|
test_example_script,
|
||
|
|
test_shell_script,
|
||
|
|
test_validator,
|
||
|
|
]
|
||
|
|
|
||
|
|
failed = []
|
||
|
|
for test in tests:
|
||
|
|
try:
|
||
|
|
test()
|
||
|
|
except AssertionError as e:
|
||
|
|
print(f"✗ {test.__name__} FAILED: {e}")
|
||
|
|
failed.append((test.__name__, str(e)))
|
||
|
|
except Exception as e:
|
||
|
|
print(f"✗ {test.__name__} ERROR: {e}")
|
||
|
|
failed.append((test.__name__, str(e)))
|
||
|
|
print()
|
||
|
|
|
||
|
|
print("=" * 60)
|
||
|
|
if not failed:
|
||
|
|
print("All tests passed! ✓")
|
||
|
|
print("=" * 60)
|
||
|
|
return 0
|
||
|
|
else:
|
||
|
|
print(f"{len(failed)} test(s) failed:")
|
||
|
|
for name, error in failed:
|
||
|
|
print(f" - {name}: {error}")
|
||
|
|
print("=" * 60)
|
||
|
|
return 1
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
sys.exit(main())
|