from django.contrib.auth.models import User from django.test import TestCase from django.utils import timezone from rides.models import Fahrgast, Profile, Ride, RideStatus, Role class RideLifecycleTests(TestCase): def setUp(self): self.pilot = User.objects.create_user("pilot") Profile.objects.create(user=self.pilot, role=Role.PILOT) self.fahrgast = Fahrgast.objects.create(name="Frau M.") self.ride = Ride.objects.create( fahrgast=self.fahrgast, scheduled_at=timezone.now(), pickup_label="A", pickup_lat=49.25, pickup_lng=6.96, dest_label="B", dest_lat=49.23, dest_lng=6.99, ) def test_claim_sets_pilot_and_status(self): self.ride.claim(self.pilot) self.assertEqual(self.ride.status, RideStatus.CLAIMED) self.assertEqual(self.ride.assigned_pilot, self.pilot) def test_cannot_finish_unclaimed_ride(self): with self.assertRaises(ValueError): self.ride.mark_done() def test_claim_then_done(self): self.ride.claim(self.pilot) self.ride.mark_done() self.assertEqual(self.ride.status, RideStatus.DONE) def test_cannot_claim_done_ride(self): self.ride.claim(self.pilot) self.ride.mark_done() with self.assertRaises(ValueError): self.ride.claim(self.pilot) def test_cannot_cancel_done_ride(self): self.ride.claim(self.pilot) self.ride.mark_done() with self.assertRaises(ValueError): self.ride.cancel() def test_open_for_pilots_excludes_claimed(self): self.assertIn(self.ride, Ride.objects.open_for_pilots()) self.ride.claim(self.pilot) self.assertNotIn(self.ride, Ride.objects.open_for_pilots())