import pytest from uuid import uuid4 from datetime import datetime, timedelta, timezone from tests.conftest import BASE_URL, assert_share_copies from devplacepy.database import get_table from devplacepy.utils import make_combined_slug def _seed_news_paginated(count): news_table = get_table("news") base = datetime.now(timezone.utc) marker = uuid4().hex[:8] titles = [] for i in range(count): uid = str(uuid4()) title = f"Pag News {marker} {i:02d}" titles.append(title) news_table.insert({ "uid": uid, "slug": make_combined_slug(title, uid), "title": title, "external_id": f"pag_{marker}_{i}", "grade": 10, "status": "published", "show_on_landing": 0, "source_name": "PagSource", "url": "https://example.com", "description": "paginated news", "synced_at": (base - timedelta(seconds=i)).isoformat(), }) return titles def test_news_detail_share_button(page, news_article): slug = news_article.get("slug") or news_article["uid"] page.goto(f"{BASE_URL}/news/{slug}", wait_until="domcontentloaded") assert_share_copies(page, "/news/") def seed_news(): news_table = get_table("news") for i in range(3): eid = f"test_news_{i}" if news_table.find_one(external_id=eid): continue uid = str(uuid4()) title = f"News Test Article {i}" slug = make_combined_slug(title, uid) news_table.insert({ "uid": uid, "slug": slug, "title": title, "external_id": eid, "grade": 8 + i, "status": "published", "show_on_landing": 1, "source_name": "TestSource", "synced_at": datetime.now(timezone.utc).isoformat(), "description": f"Description for test article {i}.", }) @pytest.fixture def news_article(app_server): seed_news() article = get_table("news").find_one(external_id="test_news_0") return article def test_news_listing_loads(page, app_server): seed_news() page.goto(f"{BASE_URL}/news", wait_until="domcontentloaded") assert page.is_visible("text=Developer News") assert page.is_visible("text=News Test Article") def test_news_listing_authenticated(alice): page, _ = alice seed_news() page.goto(f"{BASE_URL}/news", wait_until="domcontentloaded") assert page.is_visible("text=Developer News") def test_news_detail_loads(page, news_article): slug = news_article.get("slug") or news_article["uid"] page.goto(f"{BASE_URL}/news/{slug}", wait_until="domcontentloaded") assert page.is_visible("text=News Test Article") assert page.is_visible("text=Comments") def test_news_detail_404(page, app_server): page.goto(f"{BASE_URL}/news/nonexistent-article", wait_until="domcontentloaded") assert page.is_visible("text=not found", timeout=5000) def test_news_comment(alice, news_article): page, _ = alice slug = news_article.get("slug") or news_article["uid"] page.goto(f"{BASE_URL}/news/{slug}", wait_until="domcontentloaded") page.fill("textarea[name='content']", "Test comment on news article") page.click("button:has-text('Post')") page.wait_for_url(f"{BASE_URL}/news/{slug}**", wait_until="domcontentloaded") assert page.is_visible("text=Test comment on news article") def test_news_pagination_first_page(page, app_server): _seed_news_paginated(30) page.goto(f"{BASE_URL}/news", wait_until="domcontentloaded") assert page.locator(".news-card").count() == 25 assert page.is_visible(".load-more-wrap") def test_news_pagination_load_more(page, app_server): titles = _seed_news_paginated(30) page.goto(f"{BASE_URL}/news", wait_until="domcontentloaded") newest = titles[0] assert page.is_visible(f".news-card-title:has-text('{newest}')") page.click(".load-more-wrap a") page.wait_for_url(lambda url: "before=" in url, wait_until="domcontentloaded") assert not page.is_visible(f".news-card-title:has-text('{newest}')") assert page.locator(".news-card").count() >= 1 def test_news_detail_guest(page, news_article): slug = news_article.get("slug") or news_article["uid"] page.goto(f"{BASE_URL}/news/{slug}", wait_until="domcontentloaded") assert page.is_visible("text=News Test Article") assert page.is_visible("text=Comments") assert page.is_visible("text=Read on TestSource")