diff --git a/pms/templates/rooms.html b/pms/templates/rooms.html index c30929f1f..5d85b90c7 100644 --- a/pms/templates/rooms.html +++ b/pms/templates/rooms.html @@ -1,19 +1,53 @@ {% extends "main.html"%} {% block content %} -

Habitaciones del hotel

-{% for room in rooms%} +
+

Habitaciones del hotel

+
+ +
+
+ + + {% if query %} + Limpiar + {% endif %} +
+
+ +{% if query %} +

+ {% if rooms %} + {{ rooms|length }} resultado{{ rooms|length|pluralize:"s" }} para "{{ query }}" + {% else %} + No se encontraron habitaciones para "{{ query }}". + {% endif %} +

+{% endif %} + +{% for room in rooms %}
-
- {{room.name}} ({{room.room_type__name}}) -
+
{{ room.name }} ({{ room.room_type__name }})
- Ver detalles + Ver detalles
-
-
+{% empty %} +{% if not query %} +

No hay habitaciones registradas.

+{% endif %} {% endfor %} -{% endblock content%} +{% endblock content %} + diff --git a/pms/tests.py b/pms/tests.py index 7ce503c2d..0acc411d3 100644 --- a/pms/tests.py +++ b/pms/tests.py @@ -1,3 +1,90 @@ -from django.test import TestCase +from django.test import TestCase, Client +from django.urls import reverse + +from .models import Room, Room_type + + +class RoomsViewSearchTest(TestCase): + """Tests for the room list search filter (GET ?q=).""" + + @classmethod + def setUpTestData(cls): + room_type = Room_type.objects.create(name="Estándar", price=80.0, max_guests=2) + Room.objects.create(name="Habitación 101", description="Vista al jardín", room_type=room_type) + Room.objects.create(name="Habitación 202", description="Vista a la piscina", room_type=room_type) + Room.objects.create(name="Suite Presidencial", description="Planta ática", room_type=room_type) + + def setUp(self): + self.client = Client() + self.url = reverse("rooms") + + # --- baseline --- + + def test_returns_200(self): + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + + def test_no_query_returns_all_rooms(self): + response = self.client.get(self.url) + self.assertEqual(len(response.context["rooms"]), 3) + + def test_empty_query_string_returns_all_rooms(self): + response = self.client.get(self.url, {"q": ""}) + self.assertEqual(len(response.context["rooms"]), 3) + + def test_whitespace_only_query_returns_all_rooms(self): + """Strips whitespace so ' ' is treated as no query.""" + response = self.client.get(self.url, {"q": " "}) + self.assertEqual(len(response.context["rooms"]), 3) + + # --- filtering --- + + def test_search_returns_matching_rooms(self): + response = self.client.get(self.url, {"q": "Habitación"}) + rooms = list(response.context["rooms"]) + self.assertEqual(len(rooms), 2) + self.assertTrue(all("Habitación" in r["name"] for r in rooms)) + + def test_search_partial_match(self): + response = self.client.get(self.url, {"q": "101"}) + rooms = list(response.context["rooms"]) + self.assertEqual(len(rooms), 1) + self.assertEqual(rooms[0]["name"], "Habitación 101") + + def test_search_no_results(self): + response = self.client.get(self.url, {"q": "xyzabc"}) + rooms = list(response.context["rooms"]) + self.assertEqual(len(rooms), 0) + + # --- case insensitivity --- + + def test_search_is_case_insensitive_lowercase(self): + response = self.client.get(self.url, {"q": "suite"}) + rooms = list(response.context["rooms"]) + self.assertEqual(len(rooms), 1) + self.assertEqual(rooms[0]["name"], "Suite Presidencial") + + def test_search_is_case_insensitive_uppercase_ascii(self): + # SQLite's LIKE only case-folds ASCII characters; use an ASCII-safe term. + response = self.client.get(self.url, {"q": "SUITE"}) + rooms = list(response.context["rooms"]) + self.assertEqual(len(rooms), 1) + self.assertEqual(rooms[0]["name"], "Suite Presidencial") + + # --- context --- + + def test_query_term_preserved_in_context(self): + response = self.client.get(self.url, {"q": "Suite"}) + self.assertEqual(response.context["query"], "Suite") + + def test_empty_query_context_is_empty_string(self): + response = self.client.get(self.url) + self.assertEqual(response.context["query"], "") + + # --- ordering --- + + def test_results_ordered_by_name(self): + response = self.client.get(self.url) + names = [r["name"] for r in response.context["rooms"]] + self.assertEqual(names, sorted(names)) -# Create your tests here. diff --git a/pms/views.py b/pms/views.py index f38563933..a1f9ca755 100644 --- a/pms/views.py +++ b/pms/views.py @@ -238,9 +238,16 @@ def get(self, request, pk): class RoomsView(View): def get(self, request): - # renders a list of rooms - rooms = Room.objects.all().values("name", "room_type__name", "id") + query = request.GET.get("q", "").strip() + rooms = Room.objects.select_related("room_type").values("name", "room_type__name", "id") + + if query: + rooms = rooms.filter(name__icontains=query) + + rooms = rooms.order_by("name") + context = { - 'rooms': rooms + "rooms": rooms, + "query": query, } return render(request, "rooms.html", context)