import pytest from fastapi.testclient import TestClient @pytest.fixture def client(tmp_path, monkeypatch): db = tmp_path / "t.sqlite3" monkeypatch.setenv("GOODNEWS_DB", str(db)) monkeypatch.setenv("GOODNEWS_PUBLIC_BASE_URL", "https://upbeatbytes.com") import importlib import goodnews.api as api importlib.reload(api) from goodnews.db import connect, init_db c = connect(str(db)); init_db(c) c.execute("INSERT INTO sources (id,name,feed_url,trust_score) VALUES (1,'BBC','http://s/f',5)") c.execute("INSERT INTO articles (id,source_id,canonical_url,title,url_hash,published_at) " "VALUES (1,1,'https://bbc.com/x','Bees are back','h1','2026-06-05T08:00:00')") c.execute("INSERT INTO article_scores (article_id,accepted,reason_text) VALUES (1,1,'Hopeful.')") c.execute("INSERT INTO article_summaries (article_id,summary) VALUES (1,'Bee numbers recovered after a restoration effort.')") c.execute("INSERT INTO daily_briefs (id,brief_date,title) VALUES (1,'2026-06-05','B')") c.execute("INSERT INTO daily_brief_items (brief_id,article_id,rank) VALUES (1,1,1)") c.commit(); c.close() return api.create_app() def test_today_digest(client): r = TestClient(client).get("/today") assert r.status_code == 200 html = r.text assert "Bees are back" in html assert "Bee numbers recovered" in html # our summary assert 'href="/a/1"' in html and "bbc.com/x" in html # summary + source links assert 'rel="canonical" href="https://upbeatbytes.com/today"' in html assert 'property="og:title"' in html def test_sitemap(client): r = TestClient(client).get("/sitemap.xml") assert r.status_code == 200 assert "application/xml" in r.headers["content-type"] xml = r.text assert "2026-06-05" in xml def test_sitemap_excludes_paywalled_and_restores_on_free(tmp_path, monkeypatch): db = tmp_path / "sm.sqlite3" monkeypatch.setenv("GOODNEWS_DB", str(db)) monkeypatch.setenv("GOODNEWS_PUBLIC_BASE_URL", "https://upbeatbytes.com") import importlib import goodnews.api as api importlib.reload(api) from goodnews.db import connect, init_db c = connect(str(db)); init_db(c) c.execute("INSERT INTO sources (id,name,feed_url,trust_score,content_visible) VALUES (1,'Free','http://f',5,1)") c.execute("INSERT INTO sources (id,name,feed_url,trust_score,content_visible,paywall_override) " "VALUES (2,'Pay','http://p',5,1,'paywalled')") for aid, sid in [(1, 1), (2, 2)]: c.execute("INSERT INTO articles (id,source_id,canonical_url,title,url_hash,published_at) VALUES (?,?,?,?,?,?)", (aid, sid, f"http://x/{aid}", f"t{aid}", f"h{aid}", "2026-06-05T08:00:00")) c.execute("INSERT INTO article_scores (article_id,accepted) VALUES (?,1)", (aid,)) c.execute("INSERT INTO article_summaries (article_id,summary) VALUES (?,?)", (aid, f"s{aid}")) # sitemap requires a summary c.commit() tc = TestClient(api.create_app()) xml = tc.get("/sitemap.xml").text assert "/a/1" in xml and "/a/2" not in xml # paywalled source omitted c.execute("UPDATE sources SET paywall_override='free' WHERE id=2"); c.commit() assert "/a/2" in tc.get("/sitemap.xml").text # restored under 'free' c.close()