fix(web): CI E2E — resilient blog/RSS without Supabase + update stale test

The dynamic /blog/rss.xml returned 500 in CI (no Supabase env) and the E2E
still asserted the old static feed's hand-written items.

- /blog, /blog/[slug], and /blog/rss.xml now degrade gracefully (empty feed/
  list, HTTP 200) when Supabase is unavailable, instead of throwing.
- E2E: assert the always-present channel <title>LogicSRC Blog</title> and a
  looser xml content-type, dropping the removed static post titles.

Verified with `next dev` and no Supabase env (CI conditions): rss/blog/sitemap
all return 200.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-06-08 13:00:51 +00:00
parent 74abf8985f
commit e47616bf9d
4 changed files with 42 additions and 26 deletions

View file

@ -24,16 +24,22 @@ function escapeXml(value: string): string {
}
// GET /blog/rss.xml — RSS 2.0 feed generated from published blog_posts.
// Degrades to an empty (but valid) feed when Supabase is unavailable.
export async function GET(): Promise<Response> {
const base = baseUrl();
const supabase = publicClient();
const { data } = await supabase
.from("blog_posts")
.select("slug, title, excerpt, published_at")
.eq("status", "published")
.order("published_at", { ascending: false })
.limit(50);
const posts = (data ?? []) as PostRow[];
let posts: PostRow[] = [];
try {
const supabase = publicClient();
const { data } = await supabase
.from("blog_posts")
.select("slug, title, excerpt, published_at")
.eq("status", "published")
.order("published_at", { ascending: false })
.limit(50);
posts = (data ?? []) as PostRow[];
} catch {
posts = [];
}
const items = posts
.map((post) => {