# SSR expectations against the acme fixtures (testing/fixtures/acme). # Grammar: STATUS PATH [contains=TEXT] [notcontains=TEXT] [count=TEXT:N] # [type=PREFIX] [header=NAME: VALUE] [noheader=NAME]; resolves PATH N # The consumer enables en (default, no prefix) and pl (/pl prefix). The # fixture SEO API (fixtures/acme/seo) answers the site URL https://acme.test. # The post page on the shared SEO layer: exactly one H1 in both Journal H1 # modes, one canonical and one JSON-LD script (UI-SPEC L6, D-97). 200 /blog/heading-on count=Body heading one notcontains=

Body heading one # The CMS head wins: its title, no second title. 200 /blog/heading-on contains=Heading On Sample | Acme Blog count=:1 # Without a CMS answer the post's own title and description are the fallback. 200 /blog/uncategorised-note contains=<title>Uncategorised Note contains=Uncategorised Note: a short summary. # og:type article and the article times on every post page, with a CMS # answer (heading-on) and without one (uncategorised-note): the CMS head # never carries them (L4 WR-02). 200 /blog/heading-on count=property="og:type":1 contains= contains= contains= 200 /blog/uncategorised-note count=property="og:type":1 contains= contains= # Single post 200 /blog/hello-acme contains=Hello Acme 200 /blog/hello-acme contains=https://www.youtube-nocookie.com/embed/dQw4w9WgXcQ 404 /blog/missing-post 200 /blog/unsafe-sample contains=

Before

After

notcontains=alert( 404 /blog/draft-note # Post index and pagination (9 per page, 13 published posts: 2 pages) 200 /blog contains=Hello Acme 200 /blog?page=2 404 /blog?page=3 404 /blog?page=abc 404 /blog?page=0 200 /pl/blog contains=Najnowsze wpisy # Categories (include_empty=1; content renders above the list) 200 /blog/category/news contains=Acme news marker 200 /blog/category/quiet contains=There are no posts in this category yet. 404 /blog/category/nope # Related posts fall back to the latest posts for a post without a category 200 /blog/uncategorised-note contains=Hello Acme # Author (slug and login resolve) and tag pages 200 /blog/author/jane-doe contains=Jane Doe 200 /blog/author/jdoe contains= 200 /blog/hello-acme contains=og:title 200 /blog/hello-acme contains=Acme says hello and introduces its blog. # Search (the playground sets journal.routes.search: '/search'). 11 posts # match "acme": 2 pages of 9. Not route-cached (the playground caches /**) # and noindex, follow. 200 /search?q=acme contains=Hello Acme 200 /search?q=acme contains=11 results 200 /search?q=acme contains=noindex, follow header=x-robots-tag: noindex, follow 200 /search?q=acme&page=2 contains=Acme Note 12 404 /search?q=acme&page=3 404 /search?q=acme&page=abc 200 /search?q=unsafe contains=Unsafe Sample notcontains=Hello Acme 200 /search?q=unsafe contains=1 result 200 /search?q=zzzzzz contains=Nothing found for “zzzzzz”. 200 /search?q=ac contains=Type at least 3 characters. 200 /search contains=Type what you are looking for. # The term is text everywhere it is rendered (attributes may keep a bare <). 200 /search?q=%3Cscript%3Ealert(1)%3C%2Fscript%3E contains=Search results: <script>alert(1) notcontains=>Search results: