from django.test import TestCase from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.contrib.gis.geos import Point from django.contrib.gis.measure import D from .models import Location from parks.models.companies import Operator from parks.models import Park class LocationModelTests(TestCase): def setUp(self): # Create test company self.operator = Operator.objects.create( name='Test Operator', website='http://example.com' ) # Create test park self.park = Park.objects.create( name='Test Park', owner=self.operator, status='OPERATING' ) # Create test location for company self.operator_location = Location.objects.create( content_type=ContentType.objects.get_for_model(Operator), object_id=self.operator.pk, name='Test Operator HQ', location_type='business', street_address='123 Operator St', city='Operator City', state='CS', country='Test Country', postal_code='12345', point=Point(-118.2437, 34.0522) # Los Angeles coordinates ) # Create test location for park self.park_location = Location.objects.create( content_type=ContentType.objects.get_for_model(Park), object_id=self.park.pk, name='Test Park Location', location_type='park', street_address='456 Park Ave', city='Park City', state='PC', country='Test Country', postal_code='67890', point=Point(-111.8910, 40.7608) # Park City coordinates ) def test_location_creation(self): """Test location instance creation and field values""" # Test company location self.assertEqual(self.operator_location.name, 'Test Operator HQ') self.assertEqual(self.operator_location.location_type, 'business') self.assertEqual(self.operator_location.street_address, '123 Operator St') self.assertEqual(self.operator_location.city, 'Operator City') self.assertEqual(self.operator_location.state, 'CS') self.assertEqual(self.operator_location.country, 'Test Country') self.assertEqual(self.operator_location.postal_code, '12345') self.assertIsNotNone(self.operator_location.point) # Test park location self.assertEqual(self.park_location.name, 'Test Park Location') self.assertEqual(self.park_location.location_type, 'park') self.assertEqual(self.park_location.street_address, '456 Park Ave') self.assertEqual(self.park_location.city, 'Park City') self.assertEqual(self.park_location.state, 'PC') self.assertEqual(self.park_location.country, 'Test Country') self.assertEqual(self.park_location.postal_code, '67890') self.assertIsNotNone(self.park_location.point) def test_location_str_representation(self): """Test string representation of location""" expected_company_str = 'Test Operator HQ (Operator City, Test Country)' self.assertEqual(str(self.operator_location), expected_company_str) expected_park_str = 'Test Park Location (Park City, Test Country)' self.assertEqual(str(self.park_location), expected_park_str) def test_get_formatted_address(self): """Test get_formatted_address method""" expected_address = '123 Operator St, Operator City, CS, 12345, Test Country' self.assertEqual(self.operator_location.get_formatted_address(), expected_address) def test_point_coordinates(self): """Test point coordinates""" # Test company location point self.assertIsNotNone(self.operator_location.point) self.assertAlmostEqual(self.operator_location.point.y, 34.0522, places=4) # latitude self.assertAlmostEqual(self.operator_location.point.x, -118.2437, places=4) # longitude # Test park location point self.assertIsNotNone(self.park_location.point) self.assertAlmostEqual(self.park_location.point.y, 40.7608, places=4) # latitude self.assertAlmostEqual(self.park_location.point.x, -111.8910, places=4) # longitude def test_coordinates_property(self): """Test coordinates property""" company_coords = self.operator_location.coordinates self.assertIsNotNone(company_coords) self.assertAlmostEqual(company_coords[0], 34.0522, places=4) # latitude self.assertAlmostEqual(company_coords[1], -118.2437, places=4) # longitude park_coords = self.park_location.coordinates self.assertIsNotNone(park_coords) self.assertAlmostEqual(park_coords[0], 40.7608, places=4) # latitude self.assertAlmostEqual(park_coords[1], -111.8910, places=4) # longitude def test_distance_calculation(self): """Test distance_to method""" distance = self.operator_location.distance_to(self.park_location) self.assertIsNotNone(distance) self.assertGreater(distance, 0) def test_nearby_locations(self): """Test nearby_locations method""" # Create another location near the company location nearby_location = Location.objects.create( content_type=ContentType.objects.get_for_model(Operator), object_id=self.operator.pk, name='Nearby Location', location_type='business', street_address='789 Nearby St', city='Operator City', country='Test Country', point=Point(-118.2438, 34.0523) # Very close to company location ) nearby = self.operator_location.nearby_locations(distance_km=1) self.assertEqual(nearby.count(), 1) self.assertEqual(nearby.first(), nearby_location) def test_content_type_relations(self): """Test generic relations work correctly""" # Test company location relation company_location = Location.objects.get( content_type=ContentType.objects.get_for_model(Operator), object_id=self.operator.pk ) self.assertEqual(company_location, self.operator_location) # Test park location relation park_location = Location.objects.get( content_type=ContentType.objects.get_for_model(Park), object_id=self.park.pk ) self.assertEqual(park_location, self.park_location) def test_location_updates(self): """Test location updates""" # Update company location self.operator_location.street_address = 'Updated Address' self.operator_location.city = 'Updated City' self.operator_location.save() updated_location = Location.objects.get(pk=self.operator_location.pk) self.assertEqual(updated_location.street_address, 'Updated Address') self.assertEqual(updated_location.city, 'Updated City') def test_point_sync_with_lat_lon(self): """Test point synchronization with latitude/longitude fields""" location = Location.objects.create( content_type=ContentType.objects.get_for_model(Operator), object_id=self.operator.pk, name='Test Sync Location', location_type='business', latitude=34.0522, longitude=-118.2437 ) self.assertIsNotNone(location.point) self.assertAlmostEqual(location.point.y, 34.0522, places=4) self.assertAlmostEqual(location.point.x, -118.2437, places=4)