Initial commit: add AutoDeploy project

This commit is contained in:
wangpeng
2026-07-14 16:30:36 +08:00
commit 2d7b6216ba
23 changed files with 3615 additions and 0 deletions

112
tests/test_scanner.py Normal file
View File

@@ -0,0 +1,112 @@
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("<project>spring-boot</project>", 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(
"<project><dependencies><dependency>spring-boot-starter-web</dependency></dependencies></project>",
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()