Refactor test utilities and enhance ASGI settings

- Cleaned up and standardized assertions in ApiTestMixin for API response validation.
- Updated ASGI settings to use os.environ for setting the DJANGO_SETTINGS_MODULE.
- Removed unused imports and improved formatting in settings.py.
- Refactored URL patterns in urls.py for better readability and organization.
- Enhanced view functions in views.py for consistency and clarity.
- Added .flake8 configuration for linting and style enforcement.
- Introduced type stubs for django-environ to improve type checking with Pylance.
This commit is contained in:
pacnpal
2025-08-20 19:51:59 -04:00
parent 69c07d1381
commit 66ed4347a9
230 changed files with 15094 additions and 11578 deletions

View File

@@ -4,62 +4,63 @@ import sys
import django
from django.conf import settings
from django.test.runner import DiscoverRunner
import coverage # type: ignore
import unittest
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***REMOVED***iron.setdefault('DJANGO_SETTINGS_MODULE', 'config.django.test')
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',
}
"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
"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'
"parks",
"operators",
"property_owners",
"location",
"rides",
"reviews",
],
omit=[
'*/migrations/*',
'*/management/*',
'*/admin.py',
'*/apps.py',
'manage.py'
]
"*/migrations/*",
"*/management/*",
"*/admin.py",
"*/apps.py",
"manage.py",
],
)
self.cov.start()
super().__init__(*args, **kwargs)
@@ -67,65 +68,59 @@ class CustomTestRunner(DiscoverRunner):
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
from parks.models import Park
ContentType.objects.get_or_create(
app_label='parks',
model='park'
)
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:')
print("\nCoverage Report:")
self.cov.report()
# Generate HTML coverage report
html_dir = os.path.join('tests', 'coverage_html')
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}')
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
)
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'
"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__':
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)
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))