Guest publishes remain share-by-link but stay out of the catalog and sitemap, and their pages send noindex until claimed. The published-rule view now uses heading and list markup matching Markdown export, and top banners sit below the header so Share is not covered. Co-authored-by: Cursor <cursoragent@cursor.com>
55 lines
2.3 KiB
TypeScript
55 lines
2.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { getAllBlogPosts } from "../../lib/content";
|
|
import { buildPublicSitemap } from "../../lib/publicSitemap";
|
|
import { PRODUCTION_SITE_ORIGIN, sitemapUrl } from "../../lib/siteMetadata";
|
|
import { USE_CASE_DETAIL_SLUGS } from "../../lib/useCaseSyntheticPost";
|
|
|
|
describe("buildPublicSitemap", () => {
|
|
it("lists public marketing routes, blog posts, and use cases", () => {
|
|
const urls = buildPublicSitemap().map((entry) => entry.url);
|
|
|
|
expect(urls).toContain(PRODUCTION_SITE_ORIGIN);
|
|
expect(urls).toContain(sitemapUrl("/about"));
|
|
expect(urls).toContain(sitemapUrl("/learn"));
|
|
expect(urls).toContain(sitemapUrl("/templates"));
|
|
expect(urls).toContain(sitemapUrl("/blog"));
|
|
expect(urls).toContain(sitemapUrl("/use-cases"));
|
|
expect(urls).toContain(sitemapUrl("/how-it-works"));
|
|
expect(urls).toContain(sitemapUrl("/privacy"));
|
|
expect(urls).toContain(sitemapUrl("/terms"));
|
|
expect(urls).toContain(sitemapUrl("/cookies"));
|
|
|
|
for (const post of getAllBlogPosts()) {
|
|
expect(urls).toContain(sitemapUrl(`/blog/${post.slug}`));
|
|
}
|
|
for (const slug of USE_CASE_DETAIL_SLUGS) {
|
|
expect(urls).toContain(sitemapUrl(`/use-cases/${slug}`));
|
|
expect(urls).toContain(sitemapUrl(`/use-cases/${slug}/rule`));
|
|
}
|
|
});
|
|
|
|
it("omits signed-in, admin, and API routes", () => {
|
|
const urls = buildPublicSitemap().map((entry) => entry.url);
|
|
expect(urls.some((url) => url.includes("/login"))).toBe(false);
|
|
expect(urls.some((url) => url.includes("/profile"))).toBe(false);
|
|
expect(urls.some((url) => url.includes("/create"))).toBe(false);
|
|
expect(urls.some((url) => url.includes("/monitor"))).toBe(false);
|
|
expect(urls.some((url) => url.includes("/api/"))).toBe(false);
|
|
});
|
|
|
|
it("appends listed published-rule URLs and omits them when none are supplied", () => {
|
|
const withoutRules = buildPublicSitemap().map((entry) => entry.url);
|
|
expect(withoutRules.some((url) => url.includes("/rules/"))).toBe(false);
|
|
|
|
const updatedAt = new Date("2026-09-01T00:00:00.000Z");
|
|
const withRules = buildPublicSitemap([{ id: "rule-1", updatedAt }]);
|
|
const listed = withRules.find(
|
|
(entry) => entry.url === sitemapUrl("/rules/rule-1"),
|
|
);
|
|
expect(listed).toEqual({
|
|
url: sitemapUrl("/rules/rule-1"),
|
|
lastModified: updatedAt,
|
|
});
|
|
});
|
|
});
|