Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions tests/ingestion/test_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,35 @@ def _mock_sitemap_to_df(*, sitemap_url: str, request_headers: dict[str, str]):
]


def test_sitemap_source_adapter_normalizes_mixed_w3c_lastmod(
monkeypatch: pytest.MonkeyPatch,
) -> None:
adapter = SitemapSourceAdapter()
monkeypatch.setattr(
"wordlift_sdk.ingestion.sources.adv.sitemaps.sitemap_to_df",
lambda *, sitemap_url, request_headers: pd.DataFrame(
{
"loc": [
"https://example.com/date-only",
"https://example.com/full-timestamp",
],
"lastmod": ["2026-09-22", "2024-10-24T12:20:57+00:00"],
}
),
)

items = list(
adapter.iter_items(
_config(source_config={"sitemap_url": "https://example.com/sitemap.xml"})
)
)

assert [item.metadata["date_modified"] for item in items] == [
"2026-09-22T00:00:00+00:00",
"2024-10-24T12:20:57+00:00",
]


def test_sitemap_source_adapter_handles_missing_lastmod_and_failures(
monkeypatch: pytest.MonkeyPatch,
) -> None:
Expand Down
25 changes: 25 additions & 0 deletions tests/url_provider/test_sitemap_url_provider.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import logging
import re

import pandas as pd
import pytest

from wordlift_sdk.url_source import UrlSource, SitemapUrlSource
Expand Down Expand Up @@ -30,3 +31,27 @@ async def test(sitemap_url_provider: UrlSource) -> None:
urls.append(url)

assert len(urls) == 3565


@pytest.mark.asyncio
async def test_mixed_lastmod_formats(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(
"wordlift_sdk.url_source.sitemap_url_source.adv.sitemaps.sitemap_to_df",
lambda *, sitemap_url, request_headers: pd.DataFrame(
{
"loc": [
"https://example.com/date-only",
"https://example.com/full-timestamp",
],
"lastmod": ["2026-09-22", "2024-10-24T12:20:57+00:00"],
}
),
)
source = SitemapUrlSource("https://example.com/sitemap.xml")

urls = [url async for url in source.urls()]

assert [url.date_modified.isoformat() for url in urls if url.date_modified] == [
"2026-09-22T00:00:00+00:00",
"2024-10-24T12:20:57+00:00",
]
2 changes: 1 addition & 1 deletion wordlift_sdk/ingestion/sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def iter_items(self, config: ResolvedIngestionConfig) -> Iterator[SourceItem]:
if "lastmod" not in sitemap_df.columns:
sitemap_df["lastmod"] = None
sitemap_df["lastmod_as_datetime"] = pd.to_datetime(
sitemap_df["lastmod"], errors="coerce"
sitemap_df["lastmod"], errors="coerce", format="mixed", utc=True
)

for idx, row in sitemap_df.iterrows():
Expand Down
2 changes: 1 addition & 1 deletion wordlift_sdk/url_source/sitemap_url_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ async def urls(self) -> AsyncGenerator[Url, None]:
if "lastmod" not in sitemap_df.columns:
sitemap_df["lastmod"] = None
sitemap_df["lastmod_as_datetime"] = pd.to_datetime(
sitemap_df["lastmod"], errors="coerce"
sitemap_df["lastmod"], errors="coerce", format="mixed", utc=True
)

for _, row in sitemap_df.iterrows():
Expand Down
Loading