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 booking.models import Booking from equipment.models import EquipmentCategory, EquipmentItem User = get_user_model() class EquipmentApiTests(APITestCase): def setUp(self): self.vendor_user = User.objects.create_user( email="vendor@example.com", password="Pass123456!", is_vendor=True, is_customer=False, ) self.vendor_profile = VendorProfile.objects.create(user=self.vendor_user, business_name="Blue Boats") self.customer_user = User.objects.create_user( email="customer@example.com", password="Pass123456!", is_vendor=False, is_customer=True, ) self.category = EquipmentCategory.objects.create(name="Boat", slug="boat") self.item = EquipmentItem.objects.create( vendor=self.vendor_profile, category=self.category, title="Speed Boat", public_id="speed-001", location="Miami", price_per_day="200.00", is_active=True, ) def test_public_equipment_list_detail_and_filter(self): list_res = self.client.get("/api/v1/equipment/items/") self.assertEqual(list_res.status_code, status.HTTP_200_OK) self.assertEqual(len(list_res.data), 1) filter_res = self.client.get("/api/v1/equipment/items/?location=miami&category=boat") self.assertEqual(filter_res.status_code, status.HTTP_200_OK) self.assertEqual(len(filter_res.data), 1) detail_res = self.client.get("/api/v1/equipment/items/speed-001/") self.assertEqual(detail_res.status_code, status.HTTP_200_OK) self.assertEqual(detail_res.data["public_id"], "speed-001") def test_vendor_crud_access_control(self): unauth_create = self.client.post( "/api/v1/equipment/vendor/items/", { "public_id": "unauth-1", "title": "No Access", "price_per_day": "10.00", "category_id": self.category.id, }, format="json", ) self.assertEqual(unauth_create.status_code, status.HTTP_401_UNAUTHORIZED) self.client.force_authenticate(self.customer_user) customer_create = self.client.post( "/api/v1/equipment/vendor/items/", { "public_id": "cust-1", "title": "Customer Create", "price_per_day": "10.00", "category_id": self.category.id, }, format="json", ) self.assertEqual(customer_create.status_code, status.HTTP_403_FORBIDDEN) self.client.force_authenticate(self.vendor_user) vendor_create = self.client.post( "/api/v1/equipment/vendor/items/", { "public_id": "vendor-1", "title": "Vendor Create", "price_per_day": "150.00", "category_id": self.category.id, "location": "Miami Beach", }, format="json", ) self.assertEqual(vendor_create.status_code, status.HTTP_201_CREATED) self.assertEqual(vendor_create.data["vendor_slug"], self.vendor_profile.slug) def test_public_list_excludes_unavailable_range(self): starts = timezone.now() + timedelta(days=2) ends = starts + timedelta(days=1) Booking.objects.create( customer=self.customer_user, vendor=self.vendor_profile, equipment_item=self.item, starts_at=starts, ends_at=ends, status=Booking.Status.REQUESTED, total_price="200.00", ) res = self.client.get( f"/api/v1/equipment/items/?available_from={starts.isoformat()}&available_to={ends.isoformat()}" ) self.assertEqual(res.status_code, status.HTTP_200_OK) self.assertEqual(len(res.data), 0)