diff --git a/pms/templates/rooms.html b/pms/templates/rooms.html index c30929f1f..d004a8538 100644 --- a/pms/templates/rooms.html +++ b/pms/templates/rooms.html @@ -2,6 +2,21 @@ {% block content %}

Habitaciones del hotel

+ +
+
+ + + {% if search_query %} + Limpiar + {% endif %} +
+
+ +{% if rooms|length == 0 %} +
No se encontraron habitaciones.
+{% endif %} + {% for room in rooms%}
@@ -11,9 +26,9 @@

Habitaciones del hotel

Ver detalles
- +
- +
{% endfor %} {% endblock content%} diff --git a/pms/tests.py b/pms/tests.py index 7ce503c2d..fe51dd4ab 100644 --- a/pms/tests.py +++ b/pms/tests.py @@ -1,3 +1,45 @@ -from django.test import TestCase +from django.test import TestCase, Client +from django.urls import reverse -# Create your tests here. +from .models import Room, Room_type + + +class RoomsViewFilterTest(TestCase): + def setUp(self): + self.client = Client() + self.room_type = Room_type.objects.create(name="Individual", price=20, max_guests=1) + Room.objects.create(name="Room 1.1", room_type=self.room_type, description="") + Room.objects.create(name="Room 1.2", room_type=self.room_type, description="") + Room.objects.create(name="Room 2.1", room_type=self.room_type, description="") + + def test_rooms_list_shows_all_rooms(self): + response = self.client.get(reverse("rooms")) + self.assertEqual(response.status_code, 200) + self.assertEqual(len(response.context["rooms"]), 3) + + def test_filter_by_name_contains(self): + response = self.client.get(reverse("rooms"), {"name": "Room 1"}) + self.assertEqual(response.status_code, 200) + rooms = response.context["rooms"] + self.assertEqual(len(rooms), 2) + names = [r["name"] for r in rooms] + self.assertIn("Room 1.1", names) + self.assertIn("Room 1.2", names) + self.assertNotIn("Room 2.1", names) + + def test_filter_is_case_insensitive(self): + response = self.client.get(reverse("rooms"), {"name": "room 1"}) + self.assertEqual(len(response.context["rooms"]), 2) + + def test_filter_no_results(self): + response = self.client.get(reverse("rooms"), {"name": "Room 9"}) + self.assertEqual(response.status_code, 200) + self.assertEqual(len(response.context["rooms"]), 0) + + def test_empty_filter_returns_all(self): + response = self.client.get(reverse("rooms"), {"name": ""}) + self.assertEqual(len(response.context["rooms"]), 3) + + def test_search_query_in_context(self): + response = self.client.get(reverse("rooms"), {"name": "Room 1"}) + self.assertEqual(response.context["search_query"], "Room 1") diff --git a/pms/views.py b/pms/views.py index f38563933..9770ca880 100644 --- a/pms/views.py +++ b/pms/views.py @@ -238,9 +238,14 @@ 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") + # renders a list of rooms, optionally filtered by name + rooms = Room.objects.all() + query = request.GET.get("name", "").strip() + if query: + rooms = rooms.filter(name__icontains=query) + rooms = rooms.values("name", "room_type__name", "id") context = { - 'rooms': rooms + 'rooms': rooms, + 'search_query': query, } return render(request, "rooms.html", context)