diff --git a/plants/templates/plants/partials/plant_list_results.html b/plants/templates/plants/partials/plant_list_results.html
new file mode 100644
index 0000000..4caa2a9
--- /dev/null
+++ b/plants/templates/plants/partials/plant_list_results.html
@@ -0,0 +1,24 @@
+{% for plant in plants %}
+
+
+ {% elif plant.species and plant.species.api_image_url %}
+
+ {% else %}
+
No plants found.
+{% endfor %} diff --git a/plants/templates/plants/plant_list.html b/plants/templates/plants/plant_list.html new file mode 100644 index 0000000..7172eae --- /dev/null +++ b/plants/templates/plants/plant_list.html @@ -0,0 +1,27 @@ +{% extends "plants/base.html" %} +{% block title %}Plants โ PlantDB{% endblock %} +{% block content %} +Pruning calendar coming soon.
{% endblock %} diff --git a/plants/tests/test_views.py b/plants/tests/test_views.py index 5aa9252..dee8134 100644 --- a/plants/tests/test_views.py +++ b/plants/tests/test_views.py @@ -31,3 +31,39 @@ class TestDashboard: ) resp = client.get(reverse('dashboard')) assert plant in resp.context['due_this_month'] + + +@pytest.mark.django_db +class TestPlantList: + def test_returns_200(self, client): + resp = client.get(reverse('plant_list')) + assert resp.status_code == 200 + + def test_lists_plants(self, client): + Plant.objects.create(name='Monstera', location='Living room') + resp = client.get(reverse('plant_list')) + assert 'Monstera' in resp.content.decode() + + def test_search_filters_by_name(self, client): + Plant.objects.create(name='Monstera', location='Living room') + Plant.objects.create(name='Rose', location='Garden') + resp = client.get(reverse('plant_list') + '?q=Rose') + content = resp.content.decode() + assert 'Rose' in content + assert 'Monstera' not in content + + def test_htmx_search_uses_partial_template(self, client): + resp = client.get( + reverse('plant_list') + '?q=rose', + HTTP_HX_REQUEST='true', + ) + assert resp.status_code == 200 + assert resp.templates[0].name == 'plants/partials/plant_list_results.html' + + def test_indoor_filter(self, client): + Plant.objects.create(name='Fern', location='Office', is_indoor=True) + Plant.objects.create(name='Rose', location='Garden', is_indoor=False) + resp = client.get(reverse('plant_list') + '?filter=indoor') + content = resp.content.decode() + assert 'Fern' in content + assert 'Rose' not in content diff --git a/plants/urls.py b/plants/urls.py index 3a3dc2f..4a0611f 100644 --- a/plants/urls.py +++ b/plants/urls.py @@ -1,18 +1,13 @@ from django.urls import path -from plants.views import dashboard - -# Stub views for URLs referenced in templates โ replaced in later tasks -from django.http import HttpResponse - - -def _stub(request, *args, **kwargs): - return HttpResponse('stub') - +from plants.views import dashboard, plants, pruning urlpatterns = [ path('', dashboard.dashboard, name='dashboard'), - path('plants/', _stub, name='plant_list'), - path('plants/add/', _stub, name='plant_add'), - path('plants/