Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion components/subscribe-newsletter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,10 @@ export default function SubscribeNewsletter(props: { isSmallScreen: Boolean }) {
return (
<div className="flex flex-col" ref={bunnyRef}>
<div className="hidden lg:block ">
<Image src={newsletterBunny} alt="Subscribe to Keploy newsletter" />
<Image
src={newsletterBunny}
alt="Cartoon bunny mascot holding a letter near the Keploy newsletter signup form"
/>
</div>
<div className="overflow-x-hidden mt-2 lg:-mt-7 shadow-md border-b-primary-300 border-b-2 py-6 px-4 sticky ml-0 sm:ml-10 md:ml-0 w-full" ref={myComponent}>
<div
Expand Down
10 changes: 10 additions & 0 deletions next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,16 @@ module.exports = {
destination: '/community/codium-vs-copilot-which-ai-coding-assistant-is-best-for-you',
permanent: true,
},
{
source: '/unit-test-generat',
destination: '/community/revolutionising-unit-test-generation-with-llms',
permanent: true,
},
{
source: '/test-case-generation',
destination: '/community/how-to-generate-test-cases-with-automation-tools',
permanent: true,
},
]
},
}
102 changes: 102 additions & 0 deletions pages/case-studies/index.tsx
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 = [
Copy link
Copy Markdown
Member

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.

{
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,
};
}
104 changes: 104 additions & 0 deletions pages/glossary/index.tsx
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,
};
}
107 changes: 107 additions & 0 deletions pages/integrations/index.tsx
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,
};
}
Loading
Loading