feat(examples): add comprehensive test suite covering all djinit features
New Features - Added extensive test file examples/test_all.py with full coverage of setup creator scenarios Enhancements - None Bug Fixes - None
This commit is contained in:
2 files changed
+470
No files matched your search
@@ -0,0 +1,294 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Comprehensive test for ALL djinit features and use cases.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
||||
|
||||
import shutil
|
||||
|
||||
from djinit.creators.setup import SetupCreator
|
||||
|
||||
|
||||
def create_project(name, metadata, structure="standard"):
|
||||
test_dir = "/tmp/djinit_full_test"
|
||||
os.makedirs(test_dir, exist_ok=True)
|
||||
original_cwd = os.getcwd()
|
||||
|
||||
try:
|
||||
os.chdir(test_dir)
|
||||
|
||||
full_metadata = {
|
||||
"package_name": "backend",
|
||||
"use_github_actions": False,
|
||||
"use_gitlab_ci": False,
|
||||
"nested_apps": True,
|
||||
"nested_dir": "apps",
|
||||
"use_database_url": True,
|
||||
"database_type": "postgresql",
|
||||
"use_tailwind": False,
|
||||
"use_htmx": False,
|
||||
"use_docker": False,
|
||||
"use_vite": False,
|
||||
"use_vue": False,
|
||||
"use_pytest": False,
|
||||
"predefined_structure": False,
|
||||
"unified_structure": False,
|
||||
"single_structure": False,
|
||||
"project_module_name": "config",
|
||||
**metadata
|
||||
}
|
||||
|
||||
# Handle different structures
|
||||
if structure == "predefined":
|
||||
full_metadata["predefined_structure"] = True
|
||||
full_metadata["project_module_name"] = "config"
|
||||
full_metadata["nested_apps"] = True
|
||||
full_metadata["nested_dir"] = "apps"
|
||||
app_names = ["users", "core"]
|
||||
elif structure == "unified":
|
||||
full_metadata["unified_structure"] = True
|
||||
full_metadata["project_module_name"] = "core"
|
||||
full_metadata["nested_apps"] = True
|
||||
full_metadata["nested_dir"] = "apps"
|
||||
app_names = []
|
||||
elif structure == "single":
|
||||
full_metadata["single_structure"] = True
|
||||
full_metadata["project_module_name"] = name
|
||||
full_metadata["nested_apps"] = False
|
||||
full_metadata["nested_dir"] = None
|
||||
app_names = []
|
||||
else: # standard
|
||||
full_metadata["project_module_name"] = "config"
|
||||
app_names = ["users"]
|
||||
|
||||
creator = SetupCreator(
|
||||
project_dir=name,
|
||||
project_name=name,
|
||||
primary_app=app_names[0] if app_names else "users",
|
||||
app_names=app_names,
|
||||
metadata=full_metadata
|
||||
)
|
||||
success = creator.create()
|
||||
return success, test_dir
|
||||
|
||||
except Exception as e:
|
||||
print(f" Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False, test_dir
|
||||
finally:
|
||||
os.chdir(original_cwd)
|
||||
|
||||
|
||||
def verify_file(path, content_contains=None):
|
||||
if not os.path.exists(path):
|
||||
return False, f"File not found: {path}"
|
||||
if content_contains:
|
||||
with open(path) as f:
|
||||
content = f.read()
|
||||
if content_contains not in content:
|
||||
return False, f"Content '{content_contains}' not found in {path}"
|
||||
return True, "OK"
|
||||
|
||||
|
||||
def run_all_tests():
|
||||
print("=" * 70)
|
||||
print(" DJINIT - COMPLETE TEST SUITE")
|
||||
print("=" * 70)
|
||||
|
||||
# All test cases: (name, structure, metadata, expected_files, extra_checks)
|
||||
test_cases = [
|
||||
# Basic tests
|
||||
("basic_std", "standard", {}, ["requirements.txt"], []),
|
||||
("basic_pre", "predefined", {}, ["requirements.txt"], []),
|
||||
("basic_uni", "unified", {}, ["requirements.txt"], []),
|
||||
("basic_sgl", "single", {}, ["requirements.txt"], []),
|
||||
|
||||
# Single features
|
||||
("docker", "standard", {"use_docker": True, "database_type": "postgresql"}, ["Dockerfile", "docker-compose.yml"], ["postgres"]),
|
||||
("docker_mysql", "standard", {"use_docker": True, "database_type": "mysql"}, ["Dockerfile", "docker-compose.yml"], ["mysql"]),
|
||||
("react", "standard", {"use_vite": True}, ["vite.config.js", "package.json"], ["react"]),
|
||||
("vue", "standard", {"use_vue": True}, ["vite.config.js", "package.json"], ["vue"]),
|
||||
("tailwind", "standard", {"use_tailwind": True}, ["requirements.txt"], ["tailwind"]),
|
||||
("htmx", "standard", {"use_htmx": True}, ["requirements.txt"], ["htmx"]),
|
||||
("pytest", "standard", {"use_pytest": True}, ["pytest.ini", "conftest.py"], ["pytest"]),
|
||||
|
||||
# Combinations
|
||||
("docker_react", "standard", {"use_docker": True, "use_vite": True, "database_type": "postgresql"}, ["Dockerfile", "vite.config.js"], ["postgres", "react"]),
|
||||
("docker_vue", "standard", {"use_docker": True, "use_vue": True, "database_type": "postgresql"}, ["Dockerfile", "vite.config.js"], ["postgres", "vue"]),
|
||||
("react_pytest", "standard", {"use_vite": True, "use_pytest": True}, ["vite.config.js", "pytest.ini"], ["react", "pytest"]),
|
||||
("vue_pytest", "standard", {"use_vue": True, "use_pytest": True}, ["vite.config.js", "pytest.ini"], ["vue", "pytest"]),
|
||||
("tailwind_htmx", "standard", {"use_tailwind": True, "use_htmx": True}, ["requirements.txt"], ["tailwind", "htmx"]),
|
||||
|
||||
# All features
|
||||
("all_postgres", "standard", {
|
||||
"use_docker": True, "use_vite": True, "use_tailwind": True,
|
||||
"use_htmx": True, "use_pytest": True, "database_type": "postgresql"
|
||||
}, ["Dockerfile", "vite.config.js", "pytest.ini"], ["postgres", "react", "pytest"]),
|
||||
|
||||
("all_mysql", "standard", {
|
||||
"use_docker": True, "use_vue": True, "use_tailwind": True,
|
||||
"use_pytest": True, "database_type": "mysql"
|
||||
}, ["Dockerfile", "vite.config.js", "pytest.ini"], ["mysql", "vue", "pytest"]),
|
||||
|
||||
# Structure tests with features
|
||||
("predefined_docker", "predefined", {"use_docker": True, "database_type": "postgresql"}, ["Dockerfile"], ["postgres"]),
|
||||
("predefined_vue", "predefined", {"use_vue": True}, ["vite.config.js"], ["vue"]),
|
||||
("unified_docker", "unified", {"use_docker": True, "database_type": "postgresql"}, ["Dockerfile"], ["postgres"]),
|
||||
("unified_vue", "unified", {"use_vue": True}, ["vite.config.js"], ["vue"]),
|
||||
("single_docker", "single", {"use_docker": True, "database_type": "postgresql"}, ["Dockerfile"], ["postgres"]),
|
||||
("single_vue", "single", {"use_vue": True}, ["vite.config.js"], ["vue"]),
|
||||
]
|
||||
|
||||
results = []
|
||||
|
||||
for name, structure, metadata, expected_files, extra_checks in test_cases:
|
||||
print(f"\n{'─' * 70}")
|
||||
print(f" Testing: {name} (structure: {structure})")
|
||||
print(f" Features: {list(metadata.keys()) if metadata else ['basic']}")
|
||||
|
||||
test_dir = "/tmp/djinit_full_test"
|
||||
if os.path.exists(test_dir):
|
||||
shutil.rmtree(test_dir)
|
||||
|
||||
success, _ = create_project(name, metadata, structure)
|
||||
|
||||
if not success:
|
||||
results.append((name, False, "Project creation failed"))
|
||||
print(" ✗ Failed to create project")
|
||||
continue
|
||||
|
||||
project_dir = os.path.join(test_dir, name)
|
||||
all_passed = True
|
||||
errors = []
|
||||
|
||||
# Check expected files
|
||||
for file in expected_files:
|
||||
file_path = os.path.join(project_dir, file)
|
||||
exists, msg = verify_file(file_path)
|
||||
if not exists:
|
||||
all_passed = False
|
||||
errors.append(msg)
|
||||
print(f" ✗ {msg}")
|
||||
else:
|
||||
print(f" ✓ {file}")
|
||||
|
||||
# Run extra checks
|
||||
for check in extra_checks:
|
||||
if check == "postgres":
|
||||
dockerfile_path = os.path.join(project_dir, "Dockerfile")
|
||||
exists, _ = verify_file(dockerfile_path, "libpq-dev")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ PostgreSQL client missing in Dockerfile")
|
||||
else:
|
||||
print(" ✓ PostgreSQL in Dockerfile")
|
||||
|
||||
elif check == "mysql":
|
||||
dockerfile_path = os.path.join(project_dir, "Dockerfile")
|
||||
exists, _ = verify_file(dockerfile_path, "default-libmysqlclient-dev")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ MySQL client missing in Dockerfile")
|
||||
else:
|
||||
print(" ✓ MySQL in Dockerfile")
|
||||
|
||||
elif check == "react":
|
||||
pkg_path = os.path.join(project_dir, "package.json")
|
||||
exists, _ = verify_file(pkg_path, "react")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ React not in package.json")
|
||||
else:
|
||||
print(" ✓ React in package.json")
|
||||
|
||||
elif check == "vue":
|
||||
pkg_path = os.path.join(project_dir, "package.json")
|
||||
exists, _ = verify_file(pkg_path, "vue")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ Vue not in package.json")
|
||||
else:
|
||||
print(" ✓ Vue in package.json")
|
||||
|
||||
vue_file = os.path.join(project_dir, "frontend/src/App.vue")
|
||||
exists, _ = verify_file(vue_file)
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ App.vue not found")
|
||||
else:
|
||||
print(" ✓ App.vue found")
|
||||
|
||||
elif check == "pytest":
|
||||
req_path = os.path.join(project_dir, "requirements.txt")
|
||||
exists, _ = verify_file(req_path, "pytest")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ pytest not in requirements")
|
||||
else:
|
||||
print(" ✓ pytest in requirements")
|
||||
|
||||
pytest_path = os.path.join(project_dir, "pytest.ini")
|
||||
exists, _ = verify_file(pytest_path, "DJANGO_SETTINGS_MODULE")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ pytest.ini incomplete")
|
||||
else:
|
||||
print(" ✓ pytest.ini configured")
|
||||
|
||||
elif check == "tailwind":
|
||||
req_path = os.path.join(project_dir, "requirements.txt")
|
||||
exists, _ = verify_file(req_path, "django-tailwind-cli")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ Tailwind not in requirements")
|
||||
else:
|
||||
print(" ✓ Tailwind in requirements")
|
||||
|
||||
elif check == "htmx":
|
||||
req_path = os.path.join(project_dir, "requirements.txt")
|
||||
exists, _ = verify_file(req_path, "django-htmx")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ HTMX not in requirements")
|
||||
else:
|
||||
print(" ✓ HTMX in requirements")
|
||||
|
||||
if all_passed:
|
||||
results.append((name, True, "All checks passed"))
|
||||
print(" ✓ ALL CHECKS PASSED")
|
||||
else:
|
||||
results.append((name, False, "; ".join(errors)))
|
||||
print(" ✗ SOME CHECKS FAILED")
|
||||
|
||||
# Summary
|
||||
print("\n" + "=" * 70)
|
||||
print(" FINAL SUMMARY")
|
||||
print("=" * 70)
|
||||
|
||||
passed = sum(1 for _, s, _ in results if s)
|
||||
total = len(results)
|
||||
|
||||
print(f"\nTotal Tests: {total}")
|
||||
print(f"Passed: {passed}")
|
||||
print(f"Failed: {total - passed}")
|
||||
print()
|
||||
|
||||
for name, success, _msg in results:
|
||||
status = "✓ PASS" if success else "✗ FAIL"
|
||||
print(f" {status}: {name}")
|
||||
|
||||
print("\n" + "=" * 70)
|
||||
if passed == total:
|
||||
print(" 🎉 ALL TESTS PASSED! 🎉")
|
||||
else:
|
||||
print(" ⚠️ SOME TESTS FAILED!")
|
||||
print("=" * 70)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_all_tests()
|
||||
@@ -0,0 +1,176 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Comprehensive test for all djinit features including Vue.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
||||
|
||||
from djinit.creators.setup import SetupCreator
|
||||
|
||||
|
||||
def create_project(name, metadata):
|
||||
test_dir = "/tmp/djinit_vue_test"
|
||||
os.makedirs(test_dir, exist_ok=True)
|
||||
original_cwd = os.getcwd()
|
||||
|
||||
try:
|
||||
os.chdir(test_dir)
|
||||
|
||||
full_metadata = {
|
||||
"package_name": "backend",
|
||||
"use_github_actions": False,
|
||||
"use_gitlab_ci": False,
|
||||
"nested_apps": True,
|
||||
"nested_dir": "apps",
|
||||
"use_database_url": True,
|
||||
"database_type": "postgresql",
|
||||
"use_tailwind": False,
|
||||
"use_htmx": False,
|
||||
"use_docker": False,
|
||||
"use_vite": False,
|
||||
"use_vue": False,
|
||||
"use_pytest": False,
|
||||
"predefined_structure": False,
|
||||
"unified_structure": False,
|
||||
"single_structure": False,
|
||||
"project_module_name": "config",
|
||||
**metadata
|
||||
}
|
||||
|
||||
creator = SetupCreator(
|
||||
project_dir=name,
|
||||
project_name=name,
|
||||
primary_app="users",
|
||||
app_names=["users"],
|
||||
metadata=full_metadata
|
||||
)
|
||||
success = creator.create()
|
||||
return success, test_dir
|
||||
|
||||
except Exception as e:
|
||||
print(f" Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False, test_dir
|
||||
finally:
|
||||
os.chdir(original_cwd)
|
||||
|
||||
|
||||
def verify_file(path, content_contains=None):
|
||||
if not os.path.exists(path):
|
||||
return False, f"File not found: {path}"
|
||||
if content_contains:
|
||||
with open(path) as f:
|
||||
content = f.read()
|
||||
if content_contains not in content:
|
||||
return False, f"Content '{content_contains}' not found in {path}"
|
||||
return True, "OK"
|
||||
|
||||
|
||||
def run_tests():
|
||||
print("=" * 70)
|
||||
print(" DJINIT COMPREHENSIVE TESTS (WITH VUE)")
|
||||
print("=" * 70)
|
||||
|
||||
test_cases = [
|
||||
("basic", {}, ["requirements.txt"]),
|
||||
("docker", {"use_docker": True}, ["Dockerfile"]),
|
||||
("react", {"use_vite": True}, ["vite.config.js", "package.json"]),
|
||||
("vue", {"use_vue": True}, ["vite.config.js", "package.json"]),
|
||||
("pytest", {"use_pytest": True}, ["pytest.ini"]),
|
||||
("all_react", {"use_docker": True, "use_vite": True, "use_pytest": True}, ["Dockerfile", "vite.config.js"]),
|
||||
("all_vue", {"use_docker": True, "use_vue": True, "use_pytest": True}, ["Dockerfile", "vite.config.js"]),
|
||||
]
|
||||
|
||||
results = []
|
||||
|
||||
for name, metadata, expected_files in test_cases:
|
||||
print(f"\n{'─' * 70}")
|
||||
print(f" Testing: {name}")
|
||||
print(f" Metadata: {metadata}")
|
||||
|
||||
import shutil
|
||||
test_dir = "/tmp/djinit_vue_test"
|
||||
if os.path.exists(test_dir):
|
||||
shutil.rmtree(test_dir)
|
||||
|
||||
success, _ = create_project(name, metadata)
|
||||
|
||||
if not success:
|
||||
results.append((name, False, "Project creation failed"))
|
||||
print(" ✗ Failed to create project")
|
||||
continue
|
||||
|
||||
project_dir = os.path.join(test_dir, name)
|
||||
all_passed = True
|
||||
errors = []
|
||||
|
||||
for file in expected_files:
|
||||
file_path = os.path.join(project_dir, file)
|
||||
exists, msg = verify_file(file_path)
|
||||
if not exists:
|
||||
all_passed = False
|
||||
errors.append(msg)
|
||||
print(f" ✗ {msg}")
|
||||
else:
|
||||
print(f" ✓ {file}")
|
||||
|
||||
# Special checks for React
|
||||
if metadata.get("use_vite"):
|
||||
pkg_path = os.path.join(project_dir, "package.json")
|
||||
exists, msg = verify_file(pkg_path, "react")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ React not in package.json")
|
||||
else:
|
||||
print(" ✓ React in package.json")
|
||||
|
||||
# Special checks for Vue
|
||||
if metadata.get("use_vue"):
|
||||
pkg_path = os.path.join(project_dir, "package.json")
|
||||
exists, msg = verify_file(pkg_path, "vue")
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ Vue not in package.json")
|
||||
else:
|
||||
print(" ✓ Vue in package.json")
|
||||
|
||||
vue_app = os.path.join(project_dir, "frontend/src/App.vue")
|
||||
exists, msg = verify_file(vue_app)
|
||||
if not exists:
|
||||
all_passed = False
|
||||
print(" ✗ App.vue not found")
|
||||
else:
|
||||
print(" ✓ App.vue found")
|
||||
|
||||
if all_passed:
|
||||
results.append((name, True, "All checks passed"))
|
||||
print(" ✓ ALL CHECKS PASSED")
|
||||
else:
|
||||
results.append((name, False, "; ".join(errors)))
|
||||
print(" ✗ SOME CHECKS FAILED")
|
||||
|
||||
print("\n" + "=" * 70)
|
||||
print(" SUMMARY")
|
||||
print("=" * 70)
|
||||
|
||||
passed = sum(1 for _, s, _ in results if s)
|
||||
total = len(results)
|
||||
|
||||
for name, success, msg in results:
|
||||
status = "✓ PASS" if success else "✗ FAIL"
|
||||
print(f" {status}: {name} - {msg}")
|
||||
|
||||
print(f"\n Total: {passed}/{total} passed")
|
||||
|
||||
if passed == total:
|
||||
print("\n 🎉 ALL TESTS PASSED!")
|
||||
else:
|
||||
print("\n ⚠️ SOME TESTS FAILED!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_tests()
|
||||
Reference in new issue
Block a user