113 lines
4.6 KiB
Python
113 lines
4.6 KiB
Python
|
|
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()
|