39818-vm/core/tests.py
2026-04-26 16:42:14 +00:00

83 lines
3.5 KiB
Python

from django.contrib.auth.models import User
from django.test import TestCase
from django.urls import reverse
from rest_framework.test import APIClient
from .models import Order, Product, Table, UserRole
class PosWorkflowTests(TestCase):
def setUp(self):
self.table = Table.objects.create(name="Mesa 1", seats=4)
self.product = Product.objects.create(name="Burger clásica", category="Cocina", price="12.50")
self.waiter = User.objects.create_user(username="mesero", password="clave12345")
UserRole.objects.filter(user=self.waiter).update(role=UserRole.Role.WAITER)
self.kitchen = User.objects.create_user(username="cocina", password="clave12345")
UserRole.objects.filter(user=self.kitchen).update(role=UserRole.Role.KITCHEN)
def test_home_requires_login(self):
response = self.client.get(reverse("home"))
self.assertEqual(response.status_code, 302)
self.assertIn(reverse("login"), response.url)
def test_add_item_creates_active_order_and_marks_table_occupied(self):
self.client.login(username="mesero", password="clave12345")
response = self.client.post(
reverse("table_detail", args=[self.table.pk]),
{"product": self.product.pk, "quantity": 2, "note": "sin cebolla"},
follow=True,
)
self.table.refresh_from_db()
order = Order.objects.get(table=self.table)
self.assertEqual(response.status_code, 200)
self.assertEqual(order.status, Order.Status.OPEN)
self.assertEqual(order.items.count(), 1)
self.assertEqual(self.table.status, Table.Status.OCCUPIED)
def test_mark_paid_frees_table(self):
self.client.login(username="mesero", password="clave12345")
order = Order.objects.create(table=self.table, status=Order.Status.READY)
self.table.status = Table.Status.OCCUPIED
self.table.save(update_fields=["status", "updated_at"])
response = self.client.post(
reverse("order_detail", args=[order.pk]),
{"status": Order.Status.PAID},
follow=True,
)
order.refresh_from_db()
self.table.refresh_from_db()
self.assertEqual(response.status_code, 200)
self.assertEqual(order.status, Order.Status.PAID)
self.assertEqual(self.table.status, Table.Status.FREE)
def test_kitchen_screen_blocks_waiter_role(self):
self.client.login(username="mesero", password="clave12345")
response = self.client.get(reverse("kitchen_board"), follow=True)
self.assertEqual(response.status_code, 200)
self.assertRedirects(response, reverse("home"))
def test_kitchen_role_can_open_kds(self):
self.client.login(username="cocina", password="clave12345")
response = self.client.get(reverse("kitchen_board"))
self.assertEqual(response.status_code, 200)
def test_jwt_login_and_me_endpoint(self):
api_client = APIClient()
token_response = api_client.post(
reverse("token_obtain_pair"),
{"username": "mesero", "password": "clave12345"},
format="json",
)
self.assertEqual(token_response.status_code, 200)
self.assertIn("access", token_response.data)
api_client.credentials(HTTP_AUTHORIZATION=f"Bearer {token_response.data['access']}")
me_response = api_client.get(reverse("current_user_api"))
self.assertEqual(me_response.status_code, 200)
self.assertEqual(me_response.data["role"], UserRole.Role.WAITER)