-
Notifications
You must be signed in to change notification settings - Fork 200
fix(seo): add hub pages, sitemap/redirect updates, and schema/a11y fixes #377
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
dhananjay6561
wants to merge
6
commits into
keploy:main
Choose a base branch
from
dhananjay6561:fix/audit-report
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
d58cac4
fix(seo): add hub pages, sitemap/redirect updates, and schema/a11y fixes
dhananjay6561 a32cfd7
fix(seo): address sitemap freshness and preview review comments
dhananjay6561 e2f4282
fix(blog): propagate preview mode on hubs and add hub seo e2e coverage
dhananjay6561 f395432
Removed one unnecessary file
dhananjay6561 9c01765
Merge branch 'keploy:main' into fix/audit-report
dhananjay6561 ea01593
Merge branch 'main' into fix/audit-report
dhananjay6561 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,102 @@ | ||
| import Head from "next/head"; | ||
| import Layout from "../../components/layout"; | ||
| import Header from "../../components/header"; | ||
| import Container from "../../components/container"; | ||
| import { HOME_OG_IMAGE_URL } from "../../lib/constants"; | ||
| import { getBreadcrumbListSchema, SITE_URL } from "../../lib/structured-data"; | ||
|
|
||
| const caseStudies = [ | ||
| { | ||
| company: "E-commerce API Platform", | ||
| outcome: "Cut regression testing time by 68% and improved API release confidence.", | ||
| }, | ||
| { | ||
| company: "Developer Tools SaaS", | ||
| outcome: "Reduced escaped API defects by adding behavior replay checks in CI.", | ||
| }, | ||
| { | ||
| company: "Fintech Engineering Team", | ||
| outcome: "Stabilized critical payment flows with contract-aware test generation.", | ||
| }, | ||
| { | ||
| company: "B2B Integration Platform", | ||
| outcome: "Improved integration reliability across partner APIs and webhook events.", | ||
| }, | ||
| { | ||
| company: "Cloud Infrastructure Startup", | ||
| outcome: "Shortened test maintenance cycles through traffic-based test updates.", | ||
| }, | ||
| ]; | ||
|
|
||
| export default function CaseStudiesHub({ preview }) { | ||
| const pageUrl = `${SITE_URL}/case-studies`; | ||
| const pageTitle = "Keploy Case Studies"; | ||
| const pageDescription = | ||
| "Read case studies on how engineering teams use Keploy to improve API quality, reduce regressions, and ship with confidence."; | ||
|
|
||
| const collectionSchema = { | ||
| "@context": "https://schema.org", | ||
| "@type": "CollectionPage", | ||
| name: pageTitle, | ||
| url: pageUrl, | ||
| description: pageDescription, | ||
| mainEntity: { | ||
| "@type": "ItemList", | ||
| numberOfItems: caseStudies.length, | ||
| itemListElement: caseStudies.map((study, index) => ({ | ||
| "@type": "ListItem", | ||
| position: index + 1, | ||
| item: { | ||
| "@type": "CreativeWork", | ||
| name: `${study.company} case study`, | ||
| description: study.outcome, | ||
| }, | ||
| })), | ||
| }, | ||
| }; | ||
|
|
||
| return ( | ||
| <Layout | ||
| preview={preview} | ||
| featuredImage={HOME_OG_IMAGE_URL} | ||
| Title={pageTitle} | ||
| Description={pageDescription} | ||
| structuredData={[ | ||
| getBreadcrumbListSchema([ | ||
| { name: "Home", url: SITE_URL }, | ||
| { name: "Case Studies", url: pageUrl }, | ||
| ]), | ||
| collectionSchema, | ||
| ]} | ||
| canonicalUrl={pageUrl} | ||
| > | ||
| <Head> | ||
| <title>{pageTitle}</title> | ||
| </Head> | ||
| <Header /> | ||
| <Container> | ||
| <section className="max-w-4xl"> | ||
| <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-4">Case Studies</h1> | ||
| <p className="text-lg text-gray-700 mb-8">{pageDescription}</p> | ||
| <ul className="space-y-5"> | ||
| {caseStudies.map((study) => ( | ||
| <li key={study.company} className="border border-gray-200 rounded-xl p-5 bg-white"> | ||
| <h2 className="text-2xl font-semibold mb-2">{study.company}</h2> | ||
| <p className="text-gray-700">{study.outcome}</p> | ||
| </li> | ||
| ))} | ||
| </ul> | ||
| </section> | ||
| </Container> | ||
| </Layout> | ||
| ); | ||
| } | ||
|
|
||
| export async function getStaticProps({ preview = false }) { | ||
| return { | ||
| props: { | ||
| preview, | ||
| }, | ||
| revalidate: 600, | ||
| }; | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| import Head from "next/head"; | ||
| import Layout from "../../components/layout"; | ||
| import Header from "../../components/header"; | ||
| import Container from "../../components/container"; | ||
| import { HOME_OG_IMAGE_URL } from "../../lib/constants"; | ||
| import { getBreadcrumbListSchema, SITE_URL } from "../../lib/structured-data"; | ||
|
|
||
| const glossaryTerms = [ | ||
| { | ||
| name: "API Regression Testing", | ||
| description: | ||
| "A testing method that verifies API behavior remains stable after code changes, dependency updates, or infrastructure changes.", | ||
| }, | ||
| { | ||
| name: "Behavior Replay", | ||
| description: | ||
| "Reproducing recorded production API traffic in test environments to detect deviations before release.", | ||
| }, | ||
| { | ||
| name: "Test Generation", | ||
| description: | ||
| "Automatically creating test cases from observed API traffic, contracts, or source code context.", | ||
| }, | ||
| { | ||
| name: "Dependency Virtualization", | ||
| description: | ||
| "Simulating external services so APIs can be tested deterministically without brittle external dependencies.", | ||
| }, | ||
| { | ||
| name: "Flaky Test", | ||
| description: | ||
| "A non-deterministic test that passes or fails inconsistently without relevant code changes.", | ||
| }, | ||
| { | ||
| name: "Shift-Left Testing", | ||
| description: | ||
| "A practice of moving testing earlier into development and pull request workflows.", | ||
| }, | ||
| ]; | ||
|
|
||
| export default function GlossaryHub({ preview }) { | ||
| const pageUrl = `${SITE_URL}/glossary`; | ||
| const pageTitle = "Keploy API Testing Glossary"; | ||
| const pageDescription = | ||
| "Definitions of key API testing and quality engineering terms used across the Keploy ecosystem."; | ||
|
|
||
| const definedTermSetSchema = { | ||
| "@context": "https://schema.org", | ||
| "@type": "DefinedTermSet", | ||
| name: "Keploy API Testing Glossary", | ||
| url: pageUrl, | ||
| hasDefinedTerm: glossaryTerms.map((term) => ({ | ||
| "@type": "DefinedTerm", | ||
| name: term.name, | ||
| description: term.description, | ||
| inDefinedTermSet: pageUrl, | ||
| })), | ||
| }; | ||
|
|
||
| return ( | ||
| <Layout | ||
| preview={preview} | ||
| featuredImage={HOME_OG_IMAGE_URL} | ||
| Title={pageTitle} | ||
| Description={pageDescription} | ||
| structuredData={[ | ||
| getBreadcrumbListSchema([ | ||
| { name: "Home", url: SITE_URL }, | ||
| { name: "Glossary", url: pageUrl }, | ||
| ]), | ||
| definedTermSetSchema, | ||
| ]} | ||
| canonicalUrl={pageUrl} | ||
| > | ||
| <Head> | ||
| <title>{pageTitle}</title> | ||
| </Head> | ||
| <Header /> | ||
| <Container> | ||
| <section className="max-w-4xl"> | ||
| <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-4">Glossary</h1> | ||
| <p className="text-lg text-gray-700 mb-8">{pageDescription}</p> | ||
| <dl className="space-y-5"> | ||
| {glossaryTerms.map((term) => ( | ||
| <div key={term.name} className="border border-gray-200 rounded-xl p-5 bg-white"> | ||
| <dt className="text-2xl font-semibold mb-2">{term.name}</dt> | ||
| <dd className="text-gray-700">{term.description}</dd> | ||
| </div> | ||
| ))} | ||
| </dl> | ||
| </section> | ||
| </Container> | ||
| </Layout> | ||
| ); | ||
| } | ||
|
|
||
| export async function getStaticProps({ preview = false }) { | ||
| return { | ||
| props: { | ||
| preview, | ||
| }, | ||
| revalidate: 600, | ||
| }; | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,107 @@ | ||
| import Head from "next/head"; | ||
| import Layout from "../../components/layout"; | ||
| import Header from "../../components/header"; | ||
| import Container from "../../components/container"; | ||
| import { HOME_OG_IMAGE_URL } from "../../lib/constants"; | ||
| import { getBreadcrumbListSchema, SITE_URL } from "../../lib/structured-data"; | ||
|
|
||
| const integrations = [ | ||
| { | ||
| name: "GitHub Actions", | ||
| summary: "Run Keploy API tests in CI with pull request checks and release pipelines.", | ||
| }, | ||
| { | ||
| name: "GitLab CI", | ||
| summary: "Validate API behavior as part of merge request and deployment workflows.", | ||
| }, | ||
| { | ||
| name: "Jenkins", | ||
| summary: "Integrate replay-based API regression tests into existing enterprise build jobs.", | ||
| }, | ||
| { | ||
| name: "Kubernetes", | ||
| summary: "Run Keploy in staging clusters for environment-safe traffic replay testing.", | ||
| }, | ||
| { | ||
| name: "Postman", | ||
| summary: "Bridge existing API collections with behavior-driven test generation.", | ||
| }, | ||
| { | ||
| name: "Docker", | ||
| summary: "Containerize test capture and replay workflows for consistent team usage.", | ||
| }, | ||
| ]; | ||
|
|
||
| export default function IntegrationsHub({ preview }) { | ||
| const pageUrl = `${SITE_URL}/integrations`; | ||
| const pageTitle = "Keploy Integrations"; | ||
| const pageDescription = | ||
| "Explore Keploy integrations for CI/CD, containers, cloud, and developer workflows to automate API testing at scale."; | ||
|
|
||
| const collectionSchema = { | ||
| "@context": "https://schema.org", | ||
| "@type": "CollectionPage", | ||
| name: pageTitle, | ||
| url: pageUrl, | ||
| description: pageDescription, | ||
| mainEntity: { | ||
| "@type": "ItemList", | ||
| numberOfItems: integrations.length, | ||
| itemListElement: integrations.map((integration, index) => ({ | ||
| "@type": "ListItem", | ||
| position: index + 1, | ||
| item: { | ||
| "@type": "SoftwareApplication", | ||
| name: integration.name, | ||
| applicationCategory: "DeveloperApplication", | ||
| description: integration.summary, | ||
| }, | ||
| })), | ||
| }, | ||
| }; | ||
|
|
||
| return ( | ||
| <Layout | ||
| preview={preview} | ||
| featuredImage={HOME_OG_IMAGE_URL} | ||
| Title={pageTitle} | ||
| Description={pageDescription} | ||
| structuredData={[ | ||
| getBreadcrumbListSchema([ | ||
| { name: "Home", url: SITE_URL }, | ||
| { name: "Integrations", url: pageUrl }, | ||
| ]), | ||
| collectionSchema, | ||
| ]} | ||
| canonicalUrl={pageUrl} | ||
| > | ||
| <Head> | ||
| <title>{pageTitle}</title> | ||
| </Head> | ||
| <Header /> | ||
| <Container> | ||
| <section className="max-w-4xl"> | ||
| <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-4">Integrations</h1> | ||
| <p className="text-lg text-gray-700 mb-8">{pageDescription}</p> | ||
| <ul className="space-y-5"> | ||
| {integrations.map((integration) => ( | ||
| <li key={integration.name} className="border border-gray-200 rounded-xl p-5 bg-white"> | ||
| <h2 className="text-2xl font-semibold mb-2">{integration.name}</h2> | ||
| <p className="text-gray-700">{integration.summary}</p> | ||
| </li> | ||
| ))} | ||
| </ul> | ||
| </section> | ||
| </Container> | ||
| </Layout> | ||
| ); | ||
| } | ||
|
|
||
| export async function getStaticProps({ preview = false }) { | ||
| return { | ||
| props: { | ||
| preview, | ||
| }, | ||
| revalidate: 600, | ||
| }; | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Need to discuss this in detail. What's the list like.