mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 17:11:09 -05:00
430 lines
18 KiB
Python
430 lines
18 KiB
Python
from django.test import TestCase, Client
|
|
from django.urls import reverse
|
|
from django.core.exceptions import ValidationError
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.contrib.gis.geos import Point
|
|
from django.contrib.auth import get_user_model
|
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
from django.http import HttpResponse
|
|
from typing import cast, Tuple, Optional
|
|
from .models import Company, Manufacturer
|
|
from location.models import Location
|
|
from moderation.models import EditSubmission, PhotoSubmission
|
|
from media.models import Photo
|
|
|
|
User = get_user_model()
|
|
|
|
class CompanyModelTests(TestCase):
|
|
def setUp(self) -> None:
|
|
self.company = Company.objects.create(
|
|
name='Test Company',
|
|
website='http://example.com',
|
|
headquarters='Test HQ',
|
|
description='Test Description',
|
|
total_parks=5,
|
|
total_rides=100
|
|
)
|
|
|
|
self.location = Location.objects.create(
|
|
content_type=ContentType.objects.get_for_model(Company),
|
|
object_id=self.company.pk,
|
|
name='Test Company HQ',
|
|
location_type='business',
|
|
street_address='123 Company St',
|
|
city='Company City',
|
|
state='CS',
|
|
country='Test Country',
|
|
postal_code='12345',
|
|
point=Point(-118.2437, 34.0522)
|
|
)
|
|
|
|
def test_company_creation(self) -> None:
|
|
"""Test company instance creation and field values"""
|
|
self.assertEqual(self.company.name, 'Test Company')
|
|
self.assertEqual(self.company.website, 'http://example.com')
|
|
self.assertEqual(self.company.headquarters, 'Test HQ')
|
|
self.assertEqual(self.company.description, 'Test Description')
|
|
self.assertEqual(self.company.total_parks, 5)
|
|
self.assertEqual(self.company.total_rides, 100)
|
|
self.assertTrue(self.company.slug)
|
|
|
|
def test_company_str_representation(self) -> None:
|
|
"""Test string representation of company"""
|
|
self.assertEqual(str(self.company), 'Test Company')
|
|
|
|
def test_company_get_by_slug(self) -> None:
|
|
"""Test get_by_slug class method"""
|
|
company, is_historical = Company.get_by_slug(self.company.slug)
|
|
self.assertEqual(company, self.company)
|
|
self.assertFalse(is_historical)
|
|
|
|
def test_company_get_by_invalid_slug(self) -> None:
|
|
"""Test get_by_slug with invalid slug"""
|
|
with self.assertRaises(Company.DoesNotExist):
|
|
Company.get_by_slug('invalid-slug')
|
|
|
|
def test_company_stats(self) -> None:
|
|
"""Test company statistics fields"""
|
|
self.company.total_parks = 10
|
|
self.company.total_rides = 200
|
|
self.company.save()
|
|
|
|
company = Company.objects.get(pk=self.company.pk)
|
|
self.assertEqual(company.total_parks, 10)
|
|
self.assertEqual(company.total_rides, 200)
|
|
|
|
class ManufacturerModelTests(TestCase):
|
|
def setUp(self) -> None:
|
|
self.manufacturer = Manufacturer.objects.create(
|
|
name='Test Manufacturer',
|
|
website='http://example.com',
|
|
headquarters='Test HQ',
|
|
description='Test Description',
|
|
total_rides=50,
|
|
total_roller_coasters=20
|
|
)
|
|
|
|
self.location = Location.objects.create(
|
|
content_type=ContentType.objects.get_for_model(Manufacturer),
|
|
object_id=self.manufacturer.pk,
|
|
name='Test Manufacturer HQ',
|
|
location_type='business',
|
|
street_address='123 Manufacturer St',
|
|
city='Manufacturer City',
|
|
state='MS',
|
|
country='Test Country',
|
|
postal_code='12345',
|
|
point=Point(-118.2437, 34.0522)
|
|
)
|
|
|
|
def test_manufacturer_creation(self) -> None:
|
|
"""Test manufacturer instance creation and field values"""
|
|
self.assertEqual(self.manufacturer.name, 'Test Manufacturer')
|
|
self.assertEqual(self.manufacturer.website, 'http://example.com')
|
|
self.assertEqual(self.manufacturer.headquarters, 'Test HQ')
|
|
self.assertEqual(self.manufacturer.description, 'Test Description')
|
|
self.assertEqual(self.manufacturer.total_rides, 50)
|
|
self.assertEqual(self.manufacturer.total_roller_coasters, 20)
|
|
self.assertTrue(self.manufacturer.slug)
|
|
|
|
def test_manufacturer_str_representation(self) -> None:
|
|
"""Test string representation of manufacturer"""
|
|
self.assertEqual(str(self.manufacturer), 'Test Manufacturer')
|
|
|
|
def test_manufacturer_get_by_slug(self) -> None:
|
|
"""Test get_by_slug class method"""
|
|
manufacturer, is_historical = Manufacturer.get_by_slug(self.manufacturer.slug)
|
|
self.assertEqual(manufacturer, self.manufacturer)
|
|
self.assertFalse(is_historical)
|
|
|
|
def test_manufacturer_get_by_invalid_slug(self) -> None:
|
|
"""Test get_by_slug with invalid slug"""
|
|
with self.assertRaises(Manufacturer.DoesNotExist):
|
|
Manufacturer.get_by_slug('invalid-slug')
|
|
|
|
def test_manufacturer_stats(self) -> None:
|
|
"""Test manufacturer statistics fields"""
|
|
self.manufacturer.total_rides = 100
|
|
self.manufacturer.total_roller_coasters = 40
|
|
self.manufacturer.save()
|
|
|
|
manufacturer = Manufacturer.objects.get(pk=self.manufacturer.pk)
|
|
self.assertEqual(manufacturer.total_rides, 100)
|
|
self.assertEqual(manufacturer.total_roller_coasters, 40)
|
|
|
|
class CompanyViewTests(TestCase):
|
|
def setUp(self) -> None:
|
|
self.client = Client()
|
|
self.user = User.objects.create_user(
|
|
username='testuser',
|
|
email='test@example.com',
|
|
password='testpass123'
|
|
)
|
|
self.moderator = User.objects.create_user(
|
|
username='moderator',
|
|
email='moderator@example.com',
|
|
password='modpass123',
|
|
role='MODERATOR'
|
|
)
|
|
self.company = Company.objects.create(
|
|
name='Test Company',
|
|
website='http://example.com',
|
|
headquarters='Test HQ',
|
|
description='Test Description'
|
|
)
|
|
|
|
self.location = Location.objects.create(
|
|
content_type=ContentType.objects.get_for_model(Company),
|
|
object_id=self.company.pk,
|
|
name='Test Company HQ',
|
|
location_type='business',
|
|
street_address='123 Company St',
|
|
city='Company City',
|
|
state='CS',
|
|
country='Test Country',
|
|
postal_code='12345',
|
|
point=Point(-118.2437, 34.0522)
|
|
)
|
|
|
|
def test_company_list_view(self) -> None:
|
|
"""Test company list view"""
|
|
response = self.client.get(reverse('companies:company_list'))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.company.name)
|
|
|
|
def test_company_list_view_with_search(self) -> None:
|
|
"""Test company list view with search"""
|
|
response = self.client.get(reverse('companies:company_list') + '?search=Test')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.company.name)
|
|
|
|
response = self.client.get(reverse('companies:company_list') + '?search=NonExistent')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertNotContains(response, self.company.name)
|
|
|
|
def test_company_list_view_with_country_filter(self) -> None:
|
|
"""Test company list view with country filter"""
|
|
response = self.client.get(reverse('companies:company_list') + '?country=Test Country')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.company.name)
|
|
|
|
response = self.client.get(reverse('companies:company_list') + '?country=NonExistent')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertNotContains(response, self.company.name)
|
|
|
|
def test_company_detail_view(self) -> None:
|
|
"""Test company detail view"""
|
|
response = self.client.get(
|
|
reverse('companies:company_detail', kwargs={'slug': self.company.slug})
|
|
)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.company.name)
|
|
self.assertContains(response, self.company.website)
|
|
self.assertContains(response, self.company.headquarters)
|
|
|
|
def test_company_detail_view_invalid_slug(self) -> None:
|
|
"""Test company detail view with invalid slug"""
|
|
response = self.client.get(
|
|
reverse('companies:company_detail', kwargs={'slug': 'invalid-slug'})
|
|
)
|
|
self.assertEqual(response.status_code, 404)
|
|
|
|
def test_company_create_view_unauthenticated(self) -> None:
|
|
"""Test company create view when not logged in"""
|
|
response = self.client.get(reverse('companies:company_create'))
|
|
self.assertEqual(response.status_code, 302) # Redirects to login
|
|
|
|
def test_company_create_view_authenticated(self) -> None:
|
|
"""Test company create view when logged in"""
|
|
self.client.login(username='testuser', password='testpass123')
|
|
response = self.client.get(reverse('companies:company_create'))
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
def test_company_create_submission_regular_user(self) -> None:
|
|
"""Test creating a company submission as regular user"""
|
|
self.client.login(username='testuser', password='testpass123')
|
|
data = {
|
|
'name': 'New Company',
|
|
'website': 'http://newcompany.com',
|
|
'headquarters': 'New HQ',
|
|
'description': 'New Description',
|
|
'reason': 'Adding new company',
|
|
'source': 'Company website'
|
|
}
|
|
response = self.client.post(reverse('companies:company_create'), data)
|
|
self.assertEqual(response.status_code, 302) # Redirects after submission
|
|
self.assertTrue(EditSubmission.objects.filter(
|
|
submission_type='CREATE',
|
|
changes__name='New Company',
|
|
status='NEW'
|
|
).exists())
|
|
|
|
def test_company_create_submission_moderator(self) -> None:
|
|
"""Test creating a company submission as moderator"""
|
|
self.client.login(username='moderator', password='modpass123')
|
|
data = {
|
|
'name': 'New Company',
|
|
'website': 'http://newcompany.com',
|
|
'headquarters': 'New HQ',
|
|
'description': 'New Description',
|
|
'reason': 'Adding new company',
|
|
'source': 'Company website'
|
|
}
|
|
response = self.client.post(reverse('companies:company_create'), data)
|
|
self.assertEqual(response.status_code, 302) # Redirects after submission
|
|
submission = EditSubmission.objects.get(
|
|
submission_type='CREATE',
|
|
changes__name='New Company'
|
|
)
|
|
self.assertEqual(submission.status, 'APPROVED')
|
|
self.assertEqual(submission.handled_by, self.moderator)
|
|
|
|
def test_company_photo_submission(self) -> None:
|
|
"""Test photo submission for company"""
|
|
self.client.login(username='testuser', password='testpass123')
|
|
image_content = b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;'
|
|
image = SimpleUploadedFile('test.gif', image_content, content_type='image/gif')
|
|
data = {
|
|
'photo': image,
|
|
'caption': 'Test Photo',
|
|
'date_taken': '2024-01-01'
|
|
}
|
|
response = cast(HttpResponse, self.client.post(
|
|
reverse('companies:company_detail', kwargs={'slug': self.company.slug}),
|
|
data,
|
|
HTTP_X_REQUESTED_WITH='XMLHttpRequest' # Simulate AJAX request
|
|
))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertTrue(PhotoSubmission.objects.filter(
|
|
content_type=ContentType.objects.get_for_model(Company),
|
|
object_id=self.company.pk
|
|
).exists())
|
|
|
|
class ManufacturerViewTests(TestCase):
|
|
def setUp(self) -> None:
|
|
self.client = Client()
|
|
self.user = User.objects.create_user(
|
|
username='testuser',
|
|
email='test@example.com',
|
|
password='testpass123'
|
|
)
|
|
self.moderator = User.objects.create_user(
|
|
username='moderator',
|
|
email='moderator@example.com',
|
|
password='modpass123',
|
|
role='MODERATOR'
|
|
)
|
|
self.manufacturer = Manufacturer.objects.create(
|
|
name='Test Manufacturer',
|
|
website='http://example.com',
|
|
headquarters='Test HQ',
|
|
description='Test Description'
|
|
)
|
|
|
|
self.location = Location.objects.create(
|
|
content_type=ContentType.objects.get_for_model(Manufacturer),
|
|
object_id=self.manufacturer.pk,
|
|
name='Test Manufacturer HQ',
|
|
location_type='business',
|
|
street_address='123 Manufacturer St',
|
|
city='Manufacturer City',
|
|
state='MS',
|
|
country='Test Country',
|
|
postal_code='12345',
|
|
point=Point(-118.2437, 34.0522)
|
|
)
|
|
|
|
def test_manufacturer_list_view(self) -> None:
|
|
"""Test manufacturer list view"""
|
|
response = self.client.get(reverse('companies:manufacturer_list'))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.manufacturer.name)
|
|
|
|
def test_manufacturer_list_view_with_search(self) -> None:
|
|
"""Test manufacturer list view with search"""
|
|
response = self.client.get(reverse('companies:manufacturer_list') + '?search=Test')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.manufacturer.name)
|
|
|
|
response = self.client.get(reverse('companies:manufacturer_list') + '?search=NonExistent')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertNotContains(response, self.manufacturer.name)
|
|
|
|
def test_manufacturer_list_view_with_country_filter(self) -> None:
|
|
"""Test manufacturer list view with country filter"""
|
|
response = self.client.get(reverse('companies:manufacturer_list') + '?country=Test Country')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.manufacturer.name)
|
|
|
|
response = self.client.get(reverse('companies:manufacturer_list') + '?country=NonExistent')
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertNotContains(response, self.manufacturer.name)
|
|
|
|
def test_manufacturer_detail_view(self) -> None:
|
|
"""Test manufacturer detail view"""
|
|
response = self.client.get(
|
|
reverse('companies:manufacturer_detail', kwargs={'slug': self.manufacturer.slug})
|
|
)
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertContains(response, self.manufacturer.name)
|
|
self.assertContains(response, self.manufacturer.website)
|
|
self.assertContains(response, self.manufacturer.headquarters)
|
|
|
|
def test_manufacturer_detail_view_invalid_slug(self) -> None:
|
|
"""Test manufacturer detail view with invalid slug"""
|
|
response = self.client.get(
|
|
reverse('companies:manufacturer_detail', kwargs={'slug': 'invalid-slug'})
|
|
)
|
|
self.assertEqual(response.status_code, 404)
|
|
|
|
def test_manufacturer_create_view_unauthenticated(self) -> None:
|
|
"""Test manufacturer create view when not logged in"""
|
|
response = self.client.get(reverse('companies:manufacturer_create'))
|
|
self.assertEqual(response.status_code, 302) # Redirects to login
|
|
|
|
def test_manufacturer_create_view_authenticated(self) -> None:
|
|
"""Test manufacturer create view when logged in"""
|
|
self.client.login(username='testuser', password='testpass123')
|
|
response = self.client.get(reverse('companies:manufacturer_create'))
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
def test_manufacturer_create_submission_regular_user(self) -> None:
|
|
"""Test creating a manufacturer submission as regular user"""
|
|
self.client.login(username='testuser', password='testpass123')
|
|
data = {
|
|
'name': 'New Manufacturer',
|
|
'website': 'http://newmanufacturer.com',
|
|
'headquarters': 'New HQ',
|
|
'description': 'New Description',
|
|
'reason': 'Adding new manufacturer',
|
|
'source': 'Manufacturer website'
|
|
}
|
|
response = self.client.post(reverse('companies:manufacturer_create'), data)
|
|
self.assertEqual(response.status_code, 302) # Redirects after submission
|
|
self.assertTrue(EditSubmission.objects.filter(
|
|
submission_type='CREATE',
|
|
changes__name='New Manufacturer',
|
|
status='NEW'
|
|
).exists())
|
|
|
|
def test_manufacturer_create_submission_moderator(self) -> None:
|
|
"""Test creating a manufacturer submission as moderator"""
|
|
self.client.login(username='moderator', password='modpass123')
|
|
data = {
|
|
'name': 'New Manufacturer',
|
|
'website': 'http://newmanufacturer.com',
|
|
'headquarters': 'New HQ',
|
|
'description': 'New Description',
|
|
'reason': 'Adding new manufacturer',
|
|
'source': 'Manufacturer website'
|
|
}
|
|
response = self.client.post(reverse('companies:manufacturer_create'), data)
|
|
self.assertEqual(response.status_code, 302) # Redirects after submission
|
|
submission = EditSubmission.objects.get(
|
|
submission_type='CREATE',
|
|
changes__name='New Manufacturer'
|
|
)
|
|
self.assertEqual(submission.status, 'APPROVED')
|
|
self.assertEqual(submission.handled_by, self.moderator)
|
|
|
|
def test_manufacturer_photo_submission(self) -> None:
|
|
"""Test photo submission for manufacturer"""
|
|
self.client.login(username='testuser', password='testpass123')
|
|
image_content = b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;'
|
|
image = SimpleUploadedFile('test.gif', image_content, content_type='image/gif')
|
|
data = {
|
|
'photo': image,
|
|
'caption': 'Test Photo',
|
|
'date_taken': '2024-01-01'
|
|
}
|
|
response = cast(HttpResponse, self.client.post(
|
|
reverse('companies:manufacturer_detail', kwargs={'slug': self.manufacturer.slug}),
|
|
data,
|
|
HTTP_X_REQUESTED_WITH='XMLHttpRequest' # Simulate AJAX request
|
|
))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertTrue(PhotoSubmission.objects.filter(
|
|
content_type=ContentType.objects.get_for_model(Manufacturer),
|
|
object_id=self.manufacturer.pk
|
|
).exists())
|