Model Citizen
Adam YoungJul 23, 2026
Data Engineering4 min read · Blog

If Your Pipeline Would Choke on Example.com, It'll Choke on Prod

Reference-link ingestion looks like a solved problem until the link is boring, permanent, and utterly unremarkable — which is exactly why it makes the best test case.

Somewhere in your stack is a job that pulls a URL, parses whatever comes back, and writes rows to a table. Nobody thinks about it until it breaks, and it breaks on the input everyone assumed was safe: the boring one. Not the malformed feed, not the API that renames a field mid-quarter. The plain HTML page that hasn't changed in a decade.

That's the case for testing against example.com. It's not a stand-in for a real vendor feed — it's a stand-in for the idea of a source: a URL, a fetch, a response body, a parse step. If your ingestion pipeline can't cleanly round-trip the simplest possible page, it has no business touching a source that actually matters to the business.

The test nobody writes on purpose

Most reference-link ingestion tests get written by accident. Someone hardcodes a real vendor URL in a unit test because it was open in a tab. Six months later the vendor redesigns their page, the test fails, and the failure has nothing to do with your code — it's a diff against a page that isn't yours to control.

example.com exists precisely so you don't do that. It's documented as stable, boring, and intentionally inert — a fixed point that lets you test the pipeline, not the content. If you're writing tests against live production sources for anything other than a smoke test, you've coupled your test suite's reliability to someone else's redesign schedule.

What a fetch step actually has to survive

A one-line "fetch this URL" step has more failure modes than the line count suggests:

  • Timeouts and retries. Does the job hang forever, or fail loud after a bounded wait?
  • Status codes that aren't 200. A redirect, a 404, a 503 from a rate limiter — each needs a decided behavior, not a default one.
  • Encoding assumptions. UTF-8 until it isn't. A page with a stray byte-order mark has ended more pipelines than anyone admits.
  • Parse-layer coupling. If your extraction logic is written against today's HTML structure, it's written against a structure that will change without notifying you.

Test each of these against something guaranteed not to move, so when the test fails, you know the failure is yours.

The 6am cron doesn't care that the source was "just a test"

I've watched a scraping job run clean in staging for months and then fail at 6am against production because nobody had ever fed it a page with no <article> tag, no canonical link, and a title nobody bothered to fill in. example.com is exactly that page — minimal to the point of being almost rude. It has a title, one paragraph, one outbound link. If your parser can't extract that without a null-pointer exception, it was never going to survive an actual content page with ads, tracking pixels, and three nested divs of marketing copy.

Treat minimal pages as a floor, not a corner case. The floor is where you find out your "robust" pipeline was actually built for one specific shape of input and generalized nothing.

Reference links are a category, not a one-off

The temptation is to treat link ingestion as a feature you ship once. It isn't. Every new source is a new contract you didn't get to negotiate: new failure modes, new edge cases in the HTML, new ways the response can be technically valid and semantically useless. Building a small, versioned test harness against a stable reference page turns "does the fetch-and-parse layer work" into a five-second answer instead of a production incident.

The teams that get burned here are the ones who only test against sources they already trust. Trust is the thing you're supposed to be verifying, not the thing you assume going in.

What to do before your next source onboarding

Before you plug in the next vendor feed, RSS source, or scraped page:

  • Write your fetch-and-parse test against example.com or an equally inert fixture first.
  • Assert on structure (status code, encoding, presence of expected elements), not on content that could change.
  • Add one deliberately malformed variant — a page with no title, a redirect chain, a slow response — and confirm your pipeline fails the way you designed it to, not the way it happens to.

Run that suite before your next planning cycle. If it's not there yet, that's the actual finding — not a bug in the source, a gap in what you were willing to test.

Keep going

More on Data Engineering

Have data that should be doing more?

Tell me about the pipeline that breaks, the metric nobody trusts, or the analysis stuck in a notebook. Let's operationalize it.