diff --git a/tests/test_processors.py b/tests/test_processors.py index dbda616e..e1a9a315 100644 --- a/tests/test_processors.py +++ b/tests/test_processors.py @@ -1,3 +1,5 @@ +from typing import Type + import pytest from lxml.html import fromstring from parsel import Selector, SelectorList @@ -16,12 +18,15 @@ Image, ProductPage, ) +from zyte_common_items.components.metadata import Metadata +from zyte_common_items.items.product import ProductMetadata from zyte_common_items.processors import ( _format_price, brand_processor, breadcrumbs_processor, gtin_processor, images_processor, + metadata_processor, price_processor, rating_processor, ) @@ -415,3 +420,20 @@ def price(self): page = PricePage(base_url) # type: ignore[arg-type] assert page.price == expected_value + + +@pytest.mark.parametrize( + "input_value,BasePage,expected_value", + [ + (None, ProductPage, None), + (Metadata(), ProductPage, ProductMetadata()), + ], +) +def test_metadata(input_value, BasePage: Type, expected_value): + class CustomPage(BasePage): + @field(out=[metadata_processor]) + def metadata(self): + return input_value + + page = CustomPage(base_url) # type: ignore[arg-type] + assert page.metadata == expected_value diff --git a/zyte_common_items/processors.py b/zyte_common_items/processors.py index d803f5e1..ca36d389 100644 --- a/zyte_common_items/processors.py +++ b/zyte_common_items/processors.py @@ -402,9 +402,9 @@ def probability_request_list_processor( return [request.cast(ProbabilityRequest) for request in request_list] -def metadata_processor(metadata: BaseMetadata, page): +def metadata_processor(metadata: Optional[BaseMetadata], page): """Processor for a metadata field that ensures that the output metadata object uses the metadata class declared by *page*.""" - if page.metadata_cls is None: + if metadata is None or page.metadata_cls is None: return None return metadata.cast(page.metadata_cls)