run-tests.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env -S uv run --script
  2. # /// script
  3. # requires-python = ">=3.10"
  4. # dependencies = ["pyyaml", "pillow", "websocket-client==1.9.0"]
  5. # ///
  6. """Run the proving-it-works-with-a-movie regression suites portably."""
  7. import argparse
  8. import sys
  9. import unittest
  10. from pathlib import Path
  11. IMPLEMENTED_SUITES = {
  12. "assembly": "test_assembly.py",
  13. "browser": "test_browser.py",
  14. "checker": "test_checker.py",
  15. "contracts": "test_*contract*.py",
  16. "narration": "test_narration.py",
  17. "paths": "test_paths.py",
  18. "subtitles": "test_subtitles.py",
  19. "terminal": "test_terminal.py",
  20. }
  21. def parse_args() -> argparse.Namespace:
  22. parser = argparse.ArgumentParser()
  23. parser.add_argument(
  24. "--suite",
  25. required=True,
  26. choices=[*IMPLEMENTED_SUITES, "all"],
  27. )
  28. parser.add_argument("--require-capabilities", action="store_true")
  29. return parser.parse_args()
  30. def main() -> int:
  31. args = parse_args()
  32. patterns = (
  33. list(IMPLEMENTED_SUITES.values())
  34. if args.suite == "all"
  35. else [IMPLEMENTED_SUITES[args.suite]]
  36. )
  37. test_directory = Path(__file__).resolve().parent
  38. loader = unittest.TestLoader()
  39. suite = unittest.TestSuite(
  40. loader.discover(
  41. str(test_directory),
  42. pattern=pattern,
  43. top_level_dir=str(test_directory),
  44. )
  45. for pattern in patterns
  46. )
  47. result = unittest.TextTestRunner(verbosity=2).run(suite)
  48. if args.require_capabilities and result.skipped:
  49. print(
  50. f"required capabilities unavailable: {len(result.skipped)} "
  51. "selected test(s) skipped",
  52. file=sys.stderr,
  53. )
  54. return 1
  55. return 0 if result.wasSuccessful() else 1
  56. if __name__ == "__main__":
  57. raise SystemExit(main())