#!/usr/bin/env python import os import sys import django from django.conf import settings from django.test.runner import DiscoverRunner import coverage # type: ignore def setup_django(): """Set up Django test environment""" # Add the project root directory to Python path project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, project_root) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.django.test") django.setup() # Use PostGIS for GeoDjango support settings.DATABASES = { "default": { "ENGINE": "django.contrib.gis.db.backends.postgis", "NAME": "test_thrillwiki", "USER": "postgres", "PASSWORD": "postgres", "HOST": "localhost", "PORT": "5432", "TEST": { "NAME": "test_thrillwiki", }, } } settings.DEBUG = False # Skip problematic migrations during tests settings.MIGRATION_MODULES = { "parks": None, "operators": None, "property_owners": None, "location": None, "rides": None, "reviews": None, } class CustomTestRunner(DiscoverRunner): def __init__(self, *args, **kwargs): self.cov = coverage.Coverage( source=[ "parks", "operators", "property_owners", "location", "rides", "reviews", ], omit=[ "*/migrations/*", "*/management/*", "*/admin.py", "*/apps.py", "manage.py", ], ) self.cov.start() super().__init__(*args, **kwargs) def setup_databases(self, **kwargs): """Set up databases and ensure content types are created""" old_config = super().setup_databases(**kwargs) # Create necessary content types from django.contrib.contenttypes.models import ContentType ContentType.objects.get_or_create(app_label="parks", model="park") return old_config def run_suite(self, suite, **kwargs): results = super().run_suite(suite, **kwargs) self.cov.stop() self.cov.save() # Print coverage report print("\nCoverage Report:") self.cov.report() # Generate HTML coverage report html_dir = os.path.join("tests", "coverage_html") self.cov.html_report(directory=html_dir) print(f"\nDetailed HTML coverage report generated in: {html_dir}") return results def run_tests(): # Set up Django setup_django() # Initialize test runner test_runner = CustomTestRunner(verbosity=2, interactive=True, keepdb=True) # Define test labels for discovery test_labels = [ "parks.tests", "operators.tests", "property_owners.tests", "location.tests", "rides.tests", "reviews.tests", ] # Run tests and collect results failures = test_runner.run_tests(test_labels) return failures if __name__ == "__main__": # Create tests directory if it doesn't exist os.makedirs("tests", exist_ok=True) os.makedirs(os.path.join("tests", "coverage_html"), exist_ok=True) # Run tests and exit with appropriate status code failures = run_tests() sys.exit(bool(failures))