From 13051200a637e8f032b1353338efa0670e4c49f8 Mon Sep 17 00:00:00 2001 From: Markus Graf Date: Fri, 17 Oct 2025 15:32:20 +0200 Subject: [PATCH] Add description field to Product model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue: The landing page template supported displaying product descriptions, but the Product model didn't load the description field from config.yaml files. Changes: - Added optional 'description' parameter to Product.__init__() - Updated Product.to_dict() to include description (if present) - Updated Product.from_dict() to load description from config - Added test to verify descriptions are displayed on landing page All 9 landing page tests passing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- app/models/product.py | 12 ++++++++--- tests/contract/test_landing_routes.py | 31 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/app/models/product.py b/app/models/product.py index 7fe4bc1..501f19b 100644 --- a/app/models/product.py +++ b/app/models/product.py @@ -14,16 +14,18 @@ class Product: owner_language: Preferred language for product owner assigned_owner_ids: List of product owner user IDs status: Product status ('active' or 'archived') + description: Optional product description for landing page """ def __init__(self, product_id, name, submission_url_slug, owner_language, - assigned_owner_ids, status='active'): + assigned_owner_ids, status='active', description=None): self.product_id = product_id self.name = name self.submission_url_slug = submission_url_slug self.owner_language = owner_language self.assigned_owner_ids = assigned_owner_ids or [] self.status = status + self.description = description def to_dict(self): """Convert product to dictionary @@ -31,7 +33,7 @@ class Product: Returns: dict: Product data """ - return { + data = { 'product_id': self.product_id, 'name': self.name, 'submission_url_slug': self.submission_url_slug, @@ -39,6 +41,9 @@ class Product: 'assigned_owner_ids': self.assigned_owner_ids, 'status': self.status } + if self.description: + data['description'] = self.description + return data @classmethod def from_dict(cls, data): @@ -56,7 +61,8 @@ class Product: submission_url_slug=data['submission_url_slug'], owner_language=data['owner_language'], assigned_owner_ids=data.get('assigned_owner_ids', []), - status=data.get('status', 'active') + status=data.get('status', 'active'), + description=data.get('description') ) @staticmethod diff --git a/tests/contract/test_landing_routes.py b/tests/contract/test_landing_routes.py index 57a1dc7..80710a7 100644 --- a/tests/contract/test_landing_routes.py +++ b/tests/contract/test_landing_routes.py @@ -180,3 +180,34 @@ def test_landing_page_with_authenticated_user_renders_correctly(client, test_pro # Should contain products (proving the page rendered successfully) assert b'Apple Product' in response.data assert b'Zebra Product' in response.data + + +@pytest.mark.contract +def test_landing_page_displays_product_descriptions(client, test_products): + """Test that product descriptions from config.yaml are displayed on landing page + + This test verifies that when a product has a description field in its config.yaml, + that description is properly loaded by the Product model and displayed on the landing page. + """ + response = client.get('/') + + assert response.status_code == 200 + + # Zebra Product has a description in the fixture + assert b'Zebra Product' in response.data + assert b'A product for testing' in response.data + + # Apple Product has no description - should not show any placeholder + assert b'Apple Product' in response.data + # No description text should appear for Apple Product + html = response.data.decode('utf-8') + + # Verify Zebra description is present + assert 'A product for testing' in html + + # Verify the description appears between the product name and the submit button + zebra_section_start = html.find('Zebra Product') + zebra_section_end = html.find('Submit Feedback', zebra_section_start) + zebra_section = html[zebra_section_start:zebra_section_end] + + assert 'A product for testing' in zebra_section