import json import tempfile import unittest from pathlib import Path from deploy_tool.scanner import scan_project class ScannerTests(unittest.TestCase): def test_prunes_generated_and_dependency_directories(self): with tempfile.TemporaryDirectory() as tmp: root = Path(tmp) frontend = root / "web" frontend.mkdir() (frontend / "package.json").write_text( json.dumps( { "dependencies": {"vue": "^3.4.0"}, "scripts": {"dev": "vite", "build": "vite build"}, } ), encoding="utf-8", ) ignored_package = frontend / "node_modules" / "fake" / "package.json" ignored_package.parent.mkdir(parents=True) ignored_package.write_text( json.dumps({"dependencies": {"vue": "^3.4.0"}, "scripts": {"dev": "vite"}}), encoding="utf-8", ) ignored_sql = frontend / "dist" / "bundled.sql" ignored_sql.parent.mkdir() ignored_sql.write_text("select 1;", encoding="utf-8") result = scan_project(root) self.assertEqual([item.path for item in result.detected_frontends], [frontend]) self.assertEqual(result.sql_files, []) def test_detects_user_and_admin_frontends_with_ports_and_backend_context(self): with tempfile.TemporaryDirectory() as tmp: root = Path(tmp) backend = root / "server" client = root / "前端" / "client_code" admin = root / "前端" / "manage_code" (backend / "src" / "main" / "java").mkdir(parents=True) resources = backend / "src" / "main" / "resources" resources.mkdir(parents=True) (backend / "pom.xml").write_text("spring-boot", encoding="utf-8") (resources / "application.yml").write_text( "server:\n servlet:\n context-path: /movies\n", encoding="utf-8" ) for frontend, port in ((client, 8082), (admin, 8081)): frontend.mkdir(parents=True) (frontend / "package.json").write_text( json.dumps( { "dependencies": {"vue": "^3.4.0"}, "scripts": {"build": "vue-cli-service build", "serve": "vue-cli-service serve"}, } ), encoding="utf-8", ) (frontend / "vue.config.js").write_text( f"module.exports = {{ devServer: {{ port: {port} }} }}", encoding="utf-8" ) result = scan_project(root) self.assertEqual([item.path for item in result.detected_frontends], [client, admin]) self.assertEqual([item.metadata["role"] for item in result.detected_frontends], ["user", "admin"]) self.assertEqual([item.metadata["port"] for item in result.detected_frontends], ["8082", "8081"]) self.assertEqual(result.backend.metadata["context_path"], "/movies") def test_detects_spring_boot_vue_and_sql(self): with tempfile.TemporaryDirectory() as tmp: root = Path(tmp) backend = root / "server" frontend = root / "web" sql_dir = root / "db" (backend / "src" / "main" / "java").mkdir(parents=True) (backend / "pom.xml").write_text( "spring-boot-starter-web", encoding="utf-8", ) frontend.mkdir() (frontend / "package.json").write_text( json.dumps({"dependencies": {"vue": "^3.4.0"}, "scripts": {"build": "vite build"}}), encoding="utf-8", ) sql_dir.mkdir() (sql_dir / "schema.sql").write_text("create table demo(id int);", encoding="utf-8") result = scan_project(root) self.assertEqual(result.backend.path, backend) self.assertEqual(result.frontend.path, frontend) self.assertEqual(result.sql_files, [sql_dir / "schema.sql"]) def test_empty_folder_reports_missing_parts(self): with tempfile.TemporaryDirectory() as tmp: result = scan_project(Path(tmp)) self.assertIsNone(result.backend) self.assertIsNone(result.frontend) self.assertEqual(result.sql_files, []) if __name__ == "__main__": unittest.main()