Extract custom hooks for reusable logic

This commit is contained in:
adilallo
2026-01-26 12:51:27 -07:00
parent f513aecacc
commit 86d7cff5d4
21 changed files with 1590 additions and 141 deletions
+118
View File
@@ -0,0 +1,118 @@
import { renderHook } from "@testing-library/react";
import { describe, test, expect } from "vitest";
import { useSchemaData } from "../../../app/hooks/useSchemaData";
describe("useSchemaData", () => {
test("generates Organization schema", () => {
const { result } = renderHook(() =>
useSchemaData({
type: "Organization",
name: "Test Org",
url: "https://example.com",
email: "test@example.com",
sameAs: ["https://twitter.com/test"],
}),
);
expect(result.current).toEqual({
"@context": "https://schema.org",
"@type": "Organization",
name: "Test Org",
url: "https://example.com",
email: "test@example.com",
sameAs: ["https://twitter.com/test"],
});
});
test("generates WebSite schema", () => {
const { result } = renderHook(() =>
useSchemaData({
type: "WebSite",
name: "Test Site",
url: "https://example.com",
potentialAction: {
target: "https://example.com/search?q={search_term_string}",
"query-input": "required name=search_term_string",
},
}),
);
expect(result.current).toEqual({
"@context": "https://schema.org",
"@type": "WebSite",
name: "Test Site",
url: "https://example.com",
potentialAction: {
"@type": "SearchAction",
target: "https://example.com/search?q={search_term_string}",
"query-input": "required name=search_term_string",
},
});
});
test("generates HowTo schema", () => {
const { result } = renderHook(() =>
useSchemaData({
type: "HowTo",
name: "How to test",
description: "Test description",
steps: [
{ name: "Step 1", text: "Do this" },
{ name: "Step 2", text: "Do that" },
],
}),
);
expect(result.current).toEqual({
"@context": "https://schema.org",
"@type": "HowTo",
name: "How to test",
description: "Test description",
step: [
{
"@type": "HowToStep",
position: 1,
name: "Step 1",
text: "Do this",
},
{
"@type": "HowToStep",
position: 2,
name: "Step 2",
text: "Do that",
},
],
});
});
test("generates BreadcrumbList schema", () => {
const { result } = renderHook(() =>
useSchemaData({
type: "BreadcrumbList",
items: [
{ name: "Home", url: "https://example.com" },
{ name: "Page", url: "https://example.com/page" },
],
}),
);
expect(result.current).toEqual({
"@context": "https://schema.org",
"@type": "BreadcrumbList",
itemListElement: [
{
"@type": "ListItem",
position: 1,
name: "Home",
item: "https://example.com",
},
{
"@type": "ListItem",
position: 2,
name: "Page",
item: "https://example.com/page",
},
],
});
});
});