← back to Open Seo
e2e/fixtures/keyword-research-fixtures.ts
74 lines
import type { KeywordResearchRow } from "@/types/keywords";
import type { ResolvedResearchKeywordsInput } from "@/types/schemas/keywords";
const MONTHLY_SEARCHES = [
{ year: 2025, month: 4, searchVolume: 1200 },
{ year: 2025, month: 5, searchVolume: 1600 },
{ year: 2025, month: 6, searchVolume: 2400 },
{ year: 2025, month: 7, searchVolume: 3200 },
{ year: 2025, month: 8, searchVolume: 4200 },
{ year: 2025, month: 9, searchVolume: 3600 },
{ year: 2025, month: 10, searchVolume: 3000 },
{ year: 2025, month: 11, searchVolume: 2600 },
{ year: 2025, month: 12, searchVolume: 2200 },
{ year: 2026, month: 1, searchVolume: 2100 },
{ year: 2026, month: 2, searchVolume: 2300 },
{ year: 2026, month: 3, searchVolume: 2800 },
];
function makeRow(
keyword: string,
index: number,
overrides: Partial<KeywordResearchRow> = {},
): KeywordResearchRow {
return {
keyword,
searchVolume: 20_000 - index * 750,
trend: MONTHLY_SEARCHES,
keywordDifficulty: 40 + (index % 40),
cpc: Number((1.25 + index * 0.15).toFixed(2)),
competition: Number((0.05 + (index % 10) * 0.04).toFixed(2)),
intent: index % 3 === 0 ? "commercial" : "informational",
...overrides,
};
}
export function getKeywordResearchFixture(data: ResolvedResearchKeywordsInput) {
const seedKeyword = data.keywords[0] ?? "keyword research";
const rows = [
makeRow(seedKeyword, 0, {
searchVolume: 288_431,
keywordDifficulty: 78,
cpc: 11.93,
competition: 0.07,
intent: "informational",
}),
makeRow(`${seedKeyword} tools`, 1),
makeRow(`${seedKeyword} software`, 2),
makeRow(`${seedKeyword} checklist`, 3),
makeRow(`${seedKeyword} template`, 4),
makeRow(`${seedKeyword} examples`, 5),
makeRow(`${seedKeyword} guide`, 6),
makeRow(`${seedKeyword} strategy`, 7),
makeRow(`${seedKeyword} platform`, 8),
makeRow(`${seedKeyword} generator`, 9),
];
return {
rows,
source: "related" as const,
usedFallback: false,
diagnostics: {
requestedMode: data.mode,
threshold: 3,
sourceAttempts: [
{
source: "related" as const,
rowCount: rows.length,
nonSeedCount: rows.length - 1,
},
],
},
};
}