from datetime import timedelta from django.contrib.auth import get_user_model from django.utils import timezone from rest_framework import status from rest_framework.test import APITestCase from accounts.models import VendorProfile from adventrues.models import AdventureCategory, AdventureOffering from booking.models import Booking User = get_user_model() class AdventureApiTests(APITestCase): def setUp(self): self.vendor_user = User.objects.create_user( email="vendor2@example.com", password="Pass123456!", is_vendor=True, is_customer=False, ) self.vendor_profile = VendorProfile.objects.create(user=self.vendor_user, business_name="Kayak Co") self.customer_user = User.objects.create_user( email="customer2@example.com", password="Pass123456!", is_vendor=False, is_customer=True, ) self.category = AdventureCategory.objects.create(name="Kayak", slug="kayak") self.offering = AdventureOffering.objects.create( vendor=self.vendor_profile, category=self.category, title="Sunset Kayak", public_id="kayak-001", meeting_point="Biscayne Bay", duration_minutes=120, capacity=8, price_per_person="75.00", is_active=True, ) def test_public_adventure_list_detail_and_filter(self): list_res = self.client.get("/api/v1/adventrues/offerings/") self.assertEqual(list_res.status_code, status.HTTP_200_OK) self.assertEqual(len(list_res.data), 1) filter_res = self.client.get("/api/v1/adventrues/offerings/?category=kayak&location=biscayne") self.assertEqual(filter_res.status_code, status.HTTP_200_OK) self.assertEqual(len(filter_res.data), 1) detail_res = self.client.get("/api/v1/adventrues/offerings/kayak-001/") self.assertEqual(detail_res.status_code, status.HTTP_200_OK) self.assertEqual(detail_res.data["public_id"], "kayak-001") def test_vendor_adventure_crud_access_control(self): self.client.force_authenticate(self.customer_user) forbidden = self.client.post( "/api/v1/adventrues/vendor/offerings/", { "public_id": "cust-adv", "title": "No Access", "duration_minutes": 90, "capacity": 3, "price_per_person": "20.00", "category_id": self.category.id, }, format="json", ) self.assertEqual(forbidden.status_code, status.HTTP_403_FORBIDDEN) self.client.force_authenticate(self.vendor_user) created = self.client.post( "/api/v1/adventrues/vendor/offerings/", { "public_id": "vendor-adv", "title": "Vendor Adventure", "duration_minutes": 90, "capacity": 5, "price_per_person": "55.00", "category_id": self.category.id, "meeting_point": "Harbor", }, format="json", ) self.assertEqual(created.status_code, status.HTTP_201_CREATED) def test_public_adventure_list_excludes_unavailable_range(self): starts = timezone.now() + timedelta(days=4) ends = starts + timedelta(hours=2) Booking.objects.create( customer=self.customer_user, vendor=self.vendor_profile, adventure_offering=self.offering, starts_at=starts, ends_at=ends, status=Booking.Status.APPROVED, total_price="150.00", ) res = self.client.get( f"/api/v1/adventrues/offerings/?available_from={starts.isoformat()}&available_to={ends.isoformat()}" ) self.assertEqual(res.status_code, status.HTTP_200_OK) self.assertEqual(len(res.data), 0)