120 lines
4.5 KiB
Python
120 lines
4.5 KiB
Python
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_categories_list(self):
|
|
res = self.client.get("/api/v1/equipment/categories/")
|
|
self.assertEqual(res.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(len(res.data), 1)
|
|
self.assertEqual(res.data[0]["id"], self.category.id)
|
|
self.assertEqual(res.data[0]["name"], "Boat")
|
|
self.assertEqual(res.data[0]["slug"], "boat")
|
|
|
|
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)
|