75 deterministic fixtures for scraper e2e tests. MOCKSRV::index::OK
Every fixture serves a sentinel MOCKSRV::<name>::OK — scrape the URL,
assert the sentinel. indirect means the sentinel is not in that response's own body;
after JS means it only exists once scripts have run, so a plain fetch cannot match it.
Same list as JSON: /manifest.json
| endpoint | what it does | sentinel |
|---|---|---|
/ | index page linking every fixture | MOCKSRV::index::OK |
/health | liveness probe | MOCKSRV::health::OK |
/manifest.json | this catalogue, as JSON | — |
| endpoint | what it does | sentinel |
|---|---|---|
/timeout?timeout=20 | responds after N seconds | MOCKSRV::timeout::OK |
/drip?chunks=10&duration=5 | body trickles over N seconds | MOCKSRV::drip::OK |
/hang | never responds (5min cap) | — |
/reset | connection dies mid-body | — |
| endpoint | what it does | sentinel |
|---|---|---|
/flaky/reset?key=a | clears one key, or all when omitted | — |
/status/404 | any status code | MOCKSRV::status::OK indirect |
/flaky?key=a&fail=2&code=503 | fails N times per key, then 200 | MOCKSRV::flaky::OK indirect |
| endpoint | what it does | sentinel |
|---|---|---|
/redirect/3 | N-hop redirect chain | — |
/redirect-to?url=/json | single redirect to any URL | — |
/redirect/loop | infinite redirect loop | — |
/meta-refresh?to=/html/article | meta-refresh redirect | — |
/redirect/preserve-307 | 307 — method and body preserved | — |
/redirect/preserve-308 | 308 — method and body preserved | — |
/redirect/relative | Location without a leading slash | — |
/redirect/offsite?to=https://example.com/ | Location on another origin | — |
/redirect/cookie-hop | resolves only once the cookie is echoed | MOCKSRV::redirect-cookie-hop::OK indirect |
| endpoint | what it does | sentinel |
|---|---|---|
/html/iframe-child | the frame /html/iframe embeds | MOCKSRV::html-iframe::OK |
/html/article | clean article, og + ld+json | MOCKSRV::html-article::OK |
/html/malformed | unclosed tags | MOCKSRV::html-malformed::OK |
/html/huge?kb=500 | large payload, sentinel at end | MOCKSRV::html-huge::OK |
/html/charset?declare=header | ISO-8859-9 bytes | MOCKSRV::html-charset::OK indirect |
/html/empty | 200 with empty body | — |
/html/iframe | content in a child frame | MOCKSRV::html-iframe::OK indirect |
/html/noscript | content only in <noscript> | MOCKSRV::html-noscript::OK |
/html/boilerplate | article buried in nav/aside/footer noise | MOCKSRV::html-boilerplate::OK |
/html/rich | tables, code, lists, images — markdown fidelity | MOCKSRV::html-rich::OK |
/html/unicode | emoji, CJK, RTL, combining marks, BOM | MOCKSRV::html-unicode::OK |
| endpoint | what it does | sentinel |
|---|---|---|
/js/csr?delay=500 | CSR — JS writes content after N ms | MOCKSRV::js-csr::OK after JS |
/js/fetch | content via fetch() after load | MOCKSRV::json::OK indirect |
/js/lazy | IntersectionObserver, needs scroll | MOCKSRV::js-lazy::OK after JS |
/js/infinite?pages=3 | infinite scroll, N pages | MOCKSRV::js-infinite::OK after JS |
/js/shadow | content inside a shadow root | MOCKSRV::js-shadow::OK after JS |
/js/redirect?to=/json | location.replace navigation | — |
/js/hydrate | SSR markup replaced on hydration | MOCKSRV::js-hydrate::OK after JS |
| endpoint | what it does | sentinel |
|---|---|---|
/wall/cookie | consent overlay over content | MOCKSRV::wall-cookie::OK |
/wall/cookie-gate | 403 unless cookie consent=1 | MOCKSRV::wall-cookie-gate::OK indirect |
/cookies/set?name=consent&value=1 | sets a cookie | MOCKSRV::cookies-set::OK |
/wall/paywall | truncated article + paywall | MOCKSRV::wall-paywall::OK |
/wall/login | 401 login form | — |
/wall/captcha | 403 captcha page | — |
/wall/bot | 403 unless UA looks like a browser | MOCKSRV::wall-bot::OK indirect |
| endpoint | what it does | sentinel |
|---|---|---|
/auth/basic?user=user&pass=pass | HTTP basic auth | MOCKSRV::auth-basic::OK indirect |
/auth/bearer?token=secret | bearer token auth | MOCKSRV::auth-bearer::OK indirect |
| endpoint | what it does | sentinel |
|---|---|---|
/json | application/json | MOCKSRV::json::OK |
/xml | application/xml | MOCKSRV::xml::OK |
/csv | text/csv | MOCKSRV::csv::OK |
/text | text/plain | MOCKSRV::text::OK |
/pdf | application/pdf | MOCKSRV::pdf::OK |
/gzip | gzip-encoded html | MOCKSRV::gzip::OK indirect |
/content-type?type=application/octet-stream | html served as any type | MOCKSRV::content-type::OK |
/bytes/1024 | exact N bytes | — |
/brotli | brotli-encoded html | MOCKSRV::brotli::OK indirect |
/deflate | deflate-encoded html | MOCKSRV::deflate::OK indirect |
| endpoint | what it does | sentinel |
|---|---|---|
/lie/gzip | declares gzip, sends plain text | MOCKSRV::lie-gzip::OK indirect |
/lie/charset | declares utf-8, sends latin5 | MOCKSRV::lie-charset::OK indirect |
/lie/length | content-length >> body, then socket drop | MOCKSRV::lie-length::OK indirect |
| endpoint | what it does | sentinel |
|---|---|---|
/cache/etag | ETag, 304 on If-None-Match | MOCKSRV::cache-etag::OK |
/cache/last-modified | Last-Modified, 304 on If-Modified-Since | MOCKSRV::cache-last-modified::OK |
/rate-limit | 429 + retry-after seconds + x-ratelimit-* | — |
/rate-limit/date | 503 + retry-after as an HTTP-date | — |
| endpoint | what it does | sentinel |
|---|---|---|
/robots.txt | disallows /blocked/ | — |
/sitemap.xml?n=10 | N urls | — |
/blocked/page | robots-disallowed page | MOCKSRV::blocked::OK |
/links?n=20 | page with N internal links | MOCKSRV::links::OK |
/deep/1 | each level links to the next | MOCKSRV::deep-1::OK |
/crawl/page/1 | leaf page, sitemap target | MOCKSRV::crawl-page::OK |
/html/base-href | <base href> rewrites relative links | MOCKSRV::html-base-href::OK |
/html/norobots | meta robots noindex,nofollow + rel=nofollow | MOCKSRV::html-norobots::OK |
/html/canonical | near-duplicate, canonical to /html/article | MOCKSRV::html-canonical::OK |
/html/paginated?page=1 | rel=next / rel=prev pagination | MOCKSRV::html-paginated::OK |
| endpoint | what it does | sentinel |
|---|---|---|
/headers | echoes request headers | MOCKSRV::headers::OK |
/echo | echoes method, headers, body | MOCKSRV::echo::OK |