zuplo 6.67.32 → 6.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/docs/_index.md +44 -0
- package/docs/ai-gateway/apps.mdx +28 -0
- package/docs/ai-gateway/custom-providers.mdx +54 -0
- package/docs/ai-gateway/getting-started.mdx +224 -0
- package/docs/ai-gateway/guardrails.mdx +65 -0
- package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
- package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
- package/docs/ai-gateway/integrations/codex.mdx +78 -0
- package/docs/ai-gateway/integrations/goose.mdx +104 -0
- package/docs/ai-gateway/integrations/langchain.mdx +66 -0
- package/docs/ai-gateway/integrations/openai.mdx +99 -0
- package/docs/ai-gateway/introduction.mdx +85 -0
- package/docs/ai-gateway/managing-apps.mdx +46 -0
- package/docs/ai-gateway/managing-providers.mdx +66 -0
- package/docs/ai-gateway/managing-teams.mdx +63 -0
- package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
- package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
- package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
- package/docs/ai-gateway/providers.mdx +32 -0
- package/docs/ai-gateway/teams.mdx +38 -0
- package/docs/ai-gateway/universal-api.mdx +43 -0
- package/docs/ai-gateway/usage-limits.mdx +89 -0
- package/docs/api-management/introduction.md +127 -0
- package/docs/articles/accounts/audit-logs.mdx +227 -0
- package/docs/articles/accounts/billing.mdx +25 -0
- package/docs/articles/accounts/default-api-key.mdx +30 -0
- package/docs/articles/accounts/delete-account.mdx +36 -0
- package/docs/articles/accounts/enterprise-sso.mdx +116 -0
- package/docs/articles/accounts/managing-account-members.mdx +45 -0
- package/docs/articles/accounts/managing-project-members.mdx +37 -0
- package/docs/articles/accounts/members-and-roles.mdx +21 -0
- package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
- package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
- package/docs/articles/add-api-to-backstage.mdx +216 -0
- package/docs/articles/advanced-path-matching.mdx +139 -0
- package/docs/articles/api-key-administration.mdx +47 -0
- package/docs/articles/api-key-api.mdx +220 -0
- package/docs/articles/api-key-authentication.mdx +195 -0
- package/docs/articles/api-key-buckets.mdx +61 -0
- package/docs/articles/api-key-end-users.mdx +52 -0
- package/docs/articles/api-key-leak-detection.mdx +75 -0
- package/docs/articles/api-key-management.mdx +100 -0
- package/docs/articles/api-key-react-component.mdx +90 -0
- package/docs/articles/api-key-service-limits.mdx +14 -0
- package/docs/articles/archiving-requests-to-storage.mdx +119 -0
- package/docs/articles/branch-based-deployments.mdx +184 -0
- package/docs/articles/bypass-policy-for-testing.mdx +117 -0
- package/docs/articles/check-ip-address.mdx +17 -0
- package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
- package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
- package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
- package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
- package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
- package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
- package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
- package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
- package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
- package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
- package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
- package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
- package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
- package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
- package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
- package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
- package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
- package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
- package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
- package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
- package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
- package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
- package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
- package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
- package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
- package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
- package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
- package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
- package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
- package/docs/articles/composite-policy-reference.mdx +284 -0
- package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
- package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
- package/docs/articles/convert-urls-to-openapi.mdx +62 -0
- package/docs/articles/cors.mdx +447 -0
- package/docs/articles/custom-audit-log-policy.mdx +95 -0
- package/docs/articles/custom-ci-cd-azure.mdx +81 -0
- package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
- package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
- package/docs/articles/custom-ci-cd-github.mdx +99 -0
- package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
- package/docs/articles/custom-ci-cd.mdx +82 -0
- package/docs/articles/custom-code-patterns.md +418 -0
- package/docs/articles/custom-domains.mdx +258 -0
- package/docs/articles/custom-logging-example.mdx +139 -0
- package/docs/articles/ddos-protection.mdx +138 -0
- package/docs/articles/development-options.mdx +49 -0
- package/docs/articles/environment-variables.mdx +134 -0
- package/docs/articles/environments.mdx +143 -0
- package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
- package/docs/articles/github-deployment-testing.mdx +101 -0
- package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
- package/docs/articles/graphql-security.mdx +180 -0
- package/docs/articles/handling-form-data.mdx +61 -0
- package/docs/articles/health-checks.mdx +109 -0
- package/docs/articles/hosting-options.mdx +70 -0
- package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
- package/docs/articles/limits.mdx +98 -0
- package/docs/articles/local-development-debugging.mdx +44 -0
- package/docs/articles/local-development-env-variables.mdx +23 -0
- package/docs/articles/local-development-installing-packages.mdx +23 -0
- package/docs/articles/local-development-routes-designer.mdx +27 -0
- package/docs/articles/local-development-services.mdx +40 -0
- package/docs/articles/local-development-troubleshooting.mdx +56 -0
- package/docs/articles/local-development.mdx +81 -0
- package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
- package/docs/articles/log-plugin-datadog.mdx +84 -0
- package/docs/articles/log-plugin-dynatrace.mdx +75 -0
- package/docs/articles/log-plugin-gcp.mdx +75 -0
- package/docs/articles/log-plugin-loki.mdx +136 -0
- package/docs/articles/log-plugin-new-relic.mdx +84 -0
- package/docs/articles/log-plugin-splunk.mdx +104 -0
- package/docs/articles/log-plugin-sumo.mdx +73 -0
- package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
- package/docs/articles/log-request-response-data.mdx +398 -0
- package/docs/articles/logging.mdx +115 -0
- package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
- package/docs/articles/mcp-quickstart.mdx +135 -0
- package/docs/articles/metrics-plugins.mdx +371 -0
- package/docs/articles/migrate-from-apigee.md +408 -0
- package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
- package/docs/articles/migrate-from-azure-apim.md +292 -0
- package/docs/articles/migrate-from-kong.md +300 -0
- package/docs/articles/migration-overview.md +81 -0
- package/docs/articles/monetization/api-access.mdx +69 -0
- package/docs/articles/monetization/billing-models.md +520 -0
- package/docs/articles/monetization/developer-portal.md +167 -0
- package/docs/articles/monetization/features.mdx +98 -0
- package/docs/articles/monetization/index.mdx +113 -0
- package/docs/articles/monetization/meters.mdx +135 -0
- package/docs/articles/monetization/monetization-policy.md +314 -0
- package/docs/articles/monetization/plan-examples.mdx +366 -0
- package/docs/articles/monetization/plans.mdx +266 -0
- package/docs/articles/monetization/pricing-models.mdx +225 -0
- package/docs/articles/monetization/private-plans.md +154 -0
- package/docs/articles/monetization/quickstart.md +355 -0
- package/docs/articles/monetization/rate-cards.mdx +171 -0
- package/docs/articles/monetization/stripe-integration.md +195 -0
- package/docs/articles/monetization/subscription-lifecycle.md +298 -0
- package/docs/articles/monetization/tax-collection.md +166 -0
- package/docs/articles/monetization/troubleshooting.md +272 -0
- package/docs/articles/monetization-custom.mdx +71 -0
- package/docs/articles/monetization-integrations.mdx +104 -0
- package/docs/articles/monitoring-your-gateway.mdx +53 -0
- package/docs/articles/monorepo-deployment.mdx +350 -0
- package/docs/articles/multiple-auth-policies.mdx +81 -0
- package/docs/articles/non-standard-ports.mdx +30 -0
- package/docs/articles/oauth-authentication.mdx +54 -0
- package/docs/articles/openapi-server-urls.mdx +60 -0
- package/docs/articles/openapi.mdx +130 -0
- package/docs/articles/opentelemetry.mdx +250 -0
- package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
- package/docs/articles/performance-testing.mdx +304 -0
- package/docs/articles/plugin-akamai-api-security.mdx +76 -0
- package/docs/articles/plugin-azure-blob.mdx +73 -0
- package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
- package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
- package/docs/articles/policies.mdx +33 -0
- package/docs/articles/rename-or-move-project.mdx +39 -0
- package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
- package/docs/articles/routing.mdx +193 -0
- package/docs/articles/s3-signed-url-uploads.mdx +521 -0
- package/docs/articles/secure-tunnel.mdx +84 -0
- package/docs/articles/securing-backend-mtls.mdx +268 -0
- package/docs/articles/securing-your-backend.mdx +148 -0
- package/docs/articles/security.mdx +105 -0
- package/docs/articles/sharing-code-across-projects.mdx +412 -0
- package/docs/articles/source-control-setup-azure.mdx +13 -0
- package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
- package/docs/articles/source-control-setup-github.mdx +172 -0
- package/docs/articles/source-control-setup-gitlab.mdx +12 -0
- package/docs/articles/source-control.mdx +80 -0
- package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
- package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
- package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
- package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
- package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
- package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
- package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
- package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
- package/docs/articles/support.mdx +144 -0
- package/docs/articles/terraform.mdx +114 -0
- package/docs/articles/testing-graphql.mdx +34 -0
- package/docs/articles/testing.mdx +522 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
- package/docs/articles/troubleshooting.md +302 -0
- package/docs/articles/tsconfig.mdx +105 -0
- package/docs/articles/tunnel-setup.mdx +195 -0
- package/docs/articles/tunnel-troubleshooting.mdx +50 -0
- package/docs/articles/update-zup-in-github-action.mdx +110 -0
- package/docs/articles/use-openapi-extension-data.mdx +79 -0
- package/docs/articles/users/multifactor-authentication.mdx +64 -0
- package/docs/articles/users/profile.mdx +13 -0
- package/docs/articles/versioning-on-zuplo.mdx +89 -0
- package/docs/articles/waf-ddos-akamai.md +133 -0
- package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
- package/docs/articles/waf-ddos-fastly.mdx +251 -0
- package/docs/articles/waf-ddos.mdx +140 -0
- package/docs/articles/zuplo-waf.mdx +156 -0
- package/docs/ask.mdx +3 -0
- package/docs/cli/authentication.mdx +56 -0
- package/docs/cli/connectivity.mdx +38 -0
- package/docs/cli/create-zuplo-api.mdx +80 -0
- package/docs/cli/delete.mdx +79 -0
- package/docs/cli/deploy.mdx +156 -0
- package/docs/cli/deploy.partial.mdx +46 -0
- package/docs/cli/dev.mdx +115 -0
- package/docs/cli/docs.mdx +66 -0
- package/docs/cli/editor.mdx +50 -0
- package/docs/cli/global-options.mdx +19 -0
- package/docs/cli/init.mdx +74 -0
- package/docs/cli/link.mdx +74 -0
- package/docs/cli/list.mdx +55 -0
- package/docs/cli/mtls-certificate-create.mdx +94 -0
- package/docs/cli/mtls-certificate-delete.mdx +55 -0
- package/docs/cli/mtls-certificate-describe.mdx +55 -0
- package/docs/cli/mtls-certificate-disable.mdx +55 -0
- package/docs/cli/mtls-certificate-list.mdx +47 -0
- package/docs/cli/mtls-certificate-update.mdx +72 -0
- package/docs/cli/openapi-convert.mdx +111 -0
- package/docs/cli/openapi-merge.mdx +138 -0
- package/docs/cli/openapi-merge.partial.mdx +29 -0
- package/docs/cli/openapi-overlay.mdx +123 -0
- package/docs/cli/overview.mdx +78 -0
- package/docs/cli/project-create.mdx +43 -0
- package/docs/cli/source-migrate.mdx +18 -0
- package/docs/cli/source-upgrade.mdx +41 -0
- package/docs/cli/test.mdx +70 -0
- package/docs/cli/test.partial.mdx +7 -0
- package/docs/cli/tunnel-create.mdx +53 -0
- package/docs/cli/tunnel-create.partial.mdx +9 -0
- package/docs/cli/tunnel-delete.mdx +35 -0
- package/docs/cli/tunnel-delete.partial.mdx +9 -0
- package/docs/cli/tunnel-describe.mdx +45 -0
- package/docs/cli/tunnel-describe.partial.mdx +5 -0
- package/docs/cli/tunnel-list.mdx +35 -0
- package/docs/cli/tunnel-list.partial.mdx +9 -0
- package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
- package/docs/cli/tunnel-rotate-token.mdx +39 -0
- package/docs/cli/tunnel-services-describe.mdx +45 -0
- package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
- package/docs/cli/tunnel-services-update.mdx +48 -0
- package/docs/cli/variable-create.mdx +91 -0
- package/docs/cli/variable-create.partial.mdx +5 -0
- package/docs/cli/variable-update.mdx +75 -0
- package/docs/cli/variable-update.partial.mdx +5 -0
- package/docs/concepts/api-keys.md +146 -0
- package/docs/concepts/authentication.mdx +109 -0
- package/docs/concepts/how-zuplo-works.mdx +120 -0
- package/docs/concepts/project-structure.mdx +174 -0
- package/docs/concepts/rate-limiting.md +246 -0
- package/docs/concepts/request-lifecycle.mdx +56 -0
- package/docs/concepts/source-control-and-deployment.mdx +229 -0
- package/docs/conferences/conference-prize-terms.mdx +80 -0
- package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
- package/docs/dedicated/akamai/architecture.mdx +280 -0
- package/docs/dedicated/akamai/caching.mdx +212 -0
- package/docs/dedicated/akamai/cdn.mdx +156 -0
- package/docs/dedicated/architecture.mdx +208 -0
- package/docs/dedicated/custom-domains.mdx +31 -0
- package/docs/dedicated/federated-gateways.mdx +80 -0
- package/docs/dedicated/networking.mdx +69 -0
- package/docs/dedicated/overview.mdx +80 -0
- package/docs/dedicated/source-control.mdx +63 -0
- package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
- package/docs/dev-portal/introduction.mdx +65 -0
- package/docs/dev-portal/local-development.mdx +72 -0
- package/docs/dev-portal/migration.mdx +526 -0
- package/docs/dev-portal/node-modules.mdx +45 -0
- package/docs/dev-portal/updating.mdx +28 -0
- package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
- package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
- package/docs/dev-portal/zudoku/components/button.mdx +132 -0
- package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
- package/docs/dev-portal/zudoku/components/card.mdx +104 -0
- package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
- package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
- package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
- package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
- package/docs/dev-portal/zudoku/components/head.mdx +199 -0
- package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
- package/docs/dev-portal/zudoku/components/input.mdx +96 -0
- package/docs/dev-portal/zudoku/components/label.mdx +86 -0
- package/docs/dev-portal/zudoku/components/link.mdx +242 -0
- package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
- package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
- package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
- package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
- package/docs/dev-portal/zudoku/components/select.mdx +176 -0
- package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
- package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
- package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
- package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
- package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
- package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
- package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
- package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
- package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
- package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
- package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
- package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
- package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
- package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
- package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
- package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
- package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
- package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
- package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
- package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
- package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
- package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
- package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
- package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
- package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
- package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
- package/docs/dev-portal/zudoku/configuration/search.md +169 -0
- package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
- package/docs/dev-portal/zudoku/configuration/site.md +124 -0
- package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
- package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
- package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
- package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
- package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
- package/docs/dev-portal/zudoku/extending/events.md +124 -0
- package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
- package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
- package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
- package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
- package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
- package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
- package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
- package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
- package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
- package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
- package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
- package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
- package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
- package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
- package/docs/dev-portal/zudoku/plugins.md +5 -0
- package/docs/dev-portal/zudoku/writing.mdx +72 -0
- package/docs/errors/bad-request.mdx +39 -0
- package/docs/errors/build-error.mdx +45 -0
- package/docs/errors/fatal-project-error.mdx +39 -0
- package/docs/errors/gateway-timeout.mdx +33 -0
- package/docs/errors/get-head-body-error.mdx +41 -0
- package/docs/errors/main-mod-error.mdx +40 -0
- package/docs/errors/no-project-set.mdx +41 -0
- package/docs/errors/not-found.mdx +43 -0
- package/docs/errors/rate-limit-exceeded.mdx +31 -0
- package/docs/errors/schema-validation-failed.mdx +51 -0
- package/docs/errors/system-configuration-error.mdx +44 -0
- package/docs/errors/unauthorized.mdx +50 -0
- package/docs/errors/unknown-error.mdx +42 -0
- package/docs/errors.mdx +14 -0
- package/docs/guides/canary-routing-for-employees.mdx +385 -0
- package/docs/guides/geolocation-backend-routing.mdx +404 -0
- package/docs/guides/modify-openapi-paths.mdx +371 -0
- package/docs/guides/openapi-overlays.mdx +492 -0
- package/docs/guides/overview.mdx +12 -0
- package/docs/guides/user-based-backend-routing.mdx +437 -0
- package/docs/handlers/aws-lambda.mdx +201 -0
- package/docs/handlers/custom-handler.mdx +112 -0
- package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
- package/docs/handlers/mcp-server.mdx +730 -0
- package/docs/handlers/openapi.mdx +78 -0
- package/docs/handlers/redirect.mdx +115 -0
- package/docs/handlers/system-handlers.mdx +41 -0
- package/docs/handlers/url-forward.mdx +204 -0
- package/docs/handlers/url-rewrite.mdx +224 -0
- package/docs/handlers/websocket-handler.mdx +154 -0
- package/docs/home.mdx +6 -0
- package/docs/managed-edge/overview.md +78 -0
- package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
- package/docs/mcp-server/custom-tools.mdx +487 -0
- package/docs/mcp-server/graphql.mdx +241 -0
- package/docs/mcp-server/introduction.mdx +122 -0
- package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
- package/docs/mcp-server/prompts.mdx +283 -0
- package/docs/mcp-server/resources.mdx +288 -0
- package/docs/mcp-server/testing.mdx +53 -0
- package/docs/mcp-server/tools.mdx +306 -0
- package/docs/policies/_index.md +92 -0
- package/docs/policies/ab-test-inbound/intro.md +8 -0
- package/docs/policies/ab-test-inbound/policy.ts +14 -0
- package/docs/policies/ab-test-inbound/schema.json +27 -0
- package/docs/policies/ab-test-outbound/intro.md +8 -0
- package/docs/policies/ab-test-outbound/policy.ts +26 -0
- package/docs/policies/ab-test-outbound/schema.json +27 -0
- package/docs/policies/acl-policy-inbound/intro.md +5 -0
- package/docs/policies/acl-policy-inbound/policy.ts +32 -0
- package/docs/policies/acl-policy-inbound/schema.json +52 -0
- package/docs/policies/akamai-ai-firewall/schema.json +98 -0
- package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
- package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
- package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
- package/docs/policies/api-key-inbound/doc.md +77 -0
- package/docs/policies/api-key-inbound/intro.md +30 -0
- package/docs/policies/api-key-inbound/schema.json +84 -0
- package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
- package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
- package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
- package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
- package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
- package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
- package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
- package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
- package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
- package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
- package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
- package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
- package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
- package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
- package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
- package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
- package/docs/policies/audit-log-inbound/doc.md +78 -0
- package/docs/policies/audit-log-inbound/intro.md +10 -0
- package/docs/policies/audit-log-inbound/schema.json +81 -0
- package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
- package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
- package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/authzen-inbound/doc.md +24 -0
- package/docs/policies/authzen-inbound/intro.md +31 -0
- package/docs/policies/authzen-inbound/schema.json +126 -0
- package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
- package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
- package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
- package/docs/policies/basic-auth-inbound/intro.md +9 -0
- package/docs/policies/basic-auth-inbound/schema.json +99 -0
- package/docs/policies/bot-detection-inbound/intro.md +4 -0
- package/docs/policies/bot-detection-inbound/schema.json +56 -0
- package/docs/policies/brownout-inbound/doc.md +55 -0
- package/docs/policies/brownout-inbound/intro.md +12 -0
- package/docs/policies/brownout-inbound/schema.json +115 -0
- package/docs/policies/caching-inbound/doc.md +209 -0
- package/docs/policies/caching-inbound/intro.md +23 -0
- package/docs/policies/caching-inbound/schema.json +98 -0
- package/docs/policies/change-method-inbound/schema.json +56 -0
- package/docs/policies/clear-headers-inbound/schema.json +59 -0
- package/docs/policies/clear-headers-outbound/schema.json +59 -0
- package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
- package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
- package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
- package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
- package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
- package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
- package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
- package/docs/policies/composite-inbound/doc.md +69 -0
- package/docs/policies/composite-inbound/intro.md +15 -0
- package/docs/policies/composite-inbound/schema.json +59 -0
- package/docs/policies/composite-outbound/intro.md +6 -0
- package/docs/policies/composite-outbound/schema.json +59 -0
- package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
- package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
- package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
- package/docs/policies/custom-code-inbound/doc.md +267 -0
- package/docs/policies/custom-code-inbound/intro.md +2 -0
- package/docs/policies/custom-code-inbound/schema.json +48 -0
- package/docs/policies/custom-code-outbound/doc.md +235 -0
- package/docs/policies/custom-code-outbound/intro.md +2 -0
- package/docs/policies/custom-code-outbound/schema.json +43 -0
- package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
- package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
- package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
- package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
- package/docs/policies/geo-filter-inbound/doc.md +33 -0
- package/docs/policies/geo-filter-inbound/schema.json +108 -0
- package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
- package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
- package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
- package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
- package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
- package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
- package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
- package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
- package/docs/policies/hmac-auth-inbound/doc.md +30 -0
- package/docs/policies/hmac-auth-inbound/intro.md +10 -0
- package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
- package/docs/policies/hmac-auth-inbound/schema.json +53 -0
- package/docs/policies/http-deprecation-outbound/doc.md +73 -0
- package/docs/policies/http-deprecation-outbound/schema.json +83 -0
- package/docs/policies/ip-restriction-inbound/intro.md +8 -0
- package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
- package/docs/policies/ip-restriction-inbound/schema.json +58 -0
- package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
- package/docs/policies/ldap-auth-inbound/schema.json +56 -0
- package/docs/policies/mock-api-inbound/schema.json +72 -0
- package/docs/policies/moesif-inbound/doc.md +44 -0
- package/docs/policies/moesif-inbound/intro.md +6 -0
- package/docs/policies/moesif-inbound/schema.json +68 -0
- package/docs/policies/monetization-inbound/doc.md +87 -0
- package/docs/policies/monetization-inbound/intro.md +6 -0
- package/docs/policies/monetization-inbound/schema.json +102 -0
- package/docs/policies/mtls-auth-inbound/intro.md +6 -0
- package/docs/policies/mtls-auth-inbound/schema.json +68 -0
- package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
- package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
- package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
- package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
- package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
- package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
- package/docs/policies/openfga-authz-inbound/doc.md +207 -0
- package/docs/policies/openfga-authz-inbound/intro.md +17 -0
- package/docs/policies/openfga-authz-inbound/schema.json +191 -0
- package/docs/policies/openmeter-inbound/doc.md +163 -0
- package/docs/policies/openmeter-inbound/intro.md +18 -0
- package/docs/policies/openmeter-inbound/schema.json +183 -0
- package/docs/policies/prompt-injection-outbound/doc.md +106 -0
- package/docs/policies/prompt-injection-outbound/intro.md +4 -0
- package/docs/policies/prompt-injection-outbound/schema.json +74 -0
- package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
- package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
- package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
- package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
- package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
- package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
- package/docs/policies/quota-inbound/doc.md +235 -0
- package/docs/policies/quota-inbound/intro.md +7 -0
- package/docs/policies/quota-inbound/schema.json +133 -0
- package/docs/policies/rate-limit-inbound/doc.md +78 -0
- package/docs/policies/rate-limit-inbound/intro.md +30 -0
- package/docs/policies/rate-limit-inbound/schema.json +134 -0
- package/docs/policies/rbac-policy-inbound/intro.md +3 -0
- package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
- package/docs/policies/rbac-policy-inbound/schema.json +52 -0
- package/docs/policies/readme-metrics-inbound/doc.md +1 -0
- package/docs/policies/readme-metrics-inbound/intro.md +3 -0
- package/docs/policies/readme-metrics-inbound/schema.json +84 -0
- package/docs/policies/remove-headers-inbound/schema.json +59 -0
- package/docs/policies/remove-headers-outbound/schema.json +59 -0
- package/docs/policies/remove-query-params-inbound/schema.json +59 -0
- package/docs/policies/replace-string-outbound/schema.json +69 -0
- package/docs/policies/request-size-limit-inbound/schema.json +60 -0
- package/docs/policies/request-validation-inbound/doc.md +72 -0
- package/docs/policies/request-validation-inbound/intro.md +24 -0
- package/docs/policies/request-validation-inbound/schema.json +98 -0
- package/docs/policies/require-origin-inbound/intro.md +12 -0
- package/docs/policies/require-origin-inbound/schema.json +65 -0
- package/docs/policies/secret-masking-outbound/doc.md +41 -0
- package/docs/policies/secret-masking-outbound/intro.md +13 -0
- package/docs/policies/secret-masking-outbound/schema.json +65 -0
- package/docs/policies/semantic-cache-inbound/doc.md +63 -0
- package/docs/policies/semantic-cache-inbound/intro.md +4 -0
- package/docs/policies/semantic-cache-inbound/schema.json +179 -0
- package/docs/policies/set-body-inbound/intro.md +7 -0
- package/docs/policies/set-body-inbound/schema.json +56 -0
- package/docs/policies/set-headers-inbound/doc.md +41 -0
- package/docs/policies/set-headers-inbound/intro.md +2 -0
- package/docs/policies/set-headers-inbound/schema.json +83 -0
- package/docs/policies/set-headers-outbound/schema.json +83 -0
- package/docs/policies/set-query-params-inbound/schema.json +83 -0
- package/docs/policies/set-status-outbound/schema.json +62 -0
- package/docs/policies/sleep-inbound/schema.json +56 -0
- package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
- package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
- package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
- package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
- package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
- package/docs/policies/transform-body-inbound/intro.md +8 -0
- package/docs/policies/transform-body-inbound/policy.ts +16 -0
- package/docs/policies/transform-body-inbound/schema.json +27 -0
- package/docs/policies/transform-body-outbound/intro.md +8 -0
- package/docs/policies/transform-body-outbound/policy.ts +19 -0
- package/docs/policies/transform-body-outbound/schema.json +27 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
- package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
- package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
- package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
- package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
- package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
- package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
- package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
- package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
- package/docs/policies/xml-to-json-outbound/doc.md +71 -0
- package/docs/policies/xml-to-json-outbound/intro.md +4 -0
- package/docs/policies/xml-to-json-outbound/schema.json +117 -0
- package/docs/programmable-api/audit-log.mdx +74 -0
- package/docs/programmable-api/background-dispatcher.mdx +124 -0
- package/docs/programmable-api/background-loader.mdx +104 -0
- package/docs/programmable-api/cache.mdx +186 -0
- package/docs/programmable-api/compatibility-dates.mdx +201 -0
- package/docs/programmable-api/console-logging.mdx +48 -0
- package/docs/programmable-api/context-data.mdx +127 -0
- package/docs/programmable-api/custom-cors-policy.mdx +64 -0
- package/docs/programmable-api/environment.mdx +328 -0
- package/docs/programmable-api/hooks.mdx +569 -0
- package/docs/programmable-api/http-problems.mdx +385 -0
- package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
- package/docs/programmable-api/logger.mdx +223 -0
- package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
- package/docs/programmable-api/node-modules.mdx +67 -0
- package/docs/programmable-api/not-found-handler.mdx +47 -0
- package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
- package/docs/programmable-api/overview.mdx +213 -0
- package/docs/programmable-api/problem-response-formatter.mdx +183 -0
- package/docs/programmable-api/request-user.mdx +289 -0
- package/docs/programmable-api/reusing-code.mdx +26 -0
- package/docs/programmable-api/route-raw.mdx +55 -0
- package/docs/programmable-api/runtime-behaviors.mdx +25 -0
- package/docs/programmable-api/runtime-errors.mdx +246 -0
- package/docs/programmable-api/runtime-extensions.mdx +340 -0
- package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
- package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
- package/docs/programmable-api/web-crypto-apis.mdx +219 -0
- package/docs/programmable-api/web-standard-apis.mdx +109 -0
- package/docs/programmable-api/zone-cache.mdx +131 -0
- package/docs/programmable-api/zp-body-removed.mdx +32 -0
- package/docs/programmable-api/zuplo-context.mdx +414 -0
- package/docs/programmable-api/zuplo-id-token.mdx +90 -0
- package/docs/programmable-api/zuplo-json.mdx +91 -0
- package/docs/programmable-api/zuplo-request.mdx +200 -0
- package/docs/sample-apis.mdx +78 -0
- package/docs/self-hosted/overview.md +60 -0
- package/package.json +6 -5
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Testing Your API
|
|
3
|
+
sidebar_label: Testing
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Zuplo provides multiple ways to test your API gateway at every stage of
|
|
7
|
+
development. Whether you are iterating locally, reviewing a pull request in a
|
|
8
|
+
preview environment, or gating production deployments in CI/CD, the
|
|
9
|
+
[`zuplo test`](../cli/test.mdx) command and the `@zuplo/test` library give you a
|
|
10
|
+
consistent testing experience.
|
|
11
|
+
|
|
12
|
+
## Testing strategies overview
|
|
13
|
+
|
|
14
|
+
| Strategy | When to use | Endpoint target |
|
|
15
|
+
| ---------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------ |
|
|
16
|
+
| [Local testing](#local-testing) | Fast feedback while developing | `http://localhost:9000` |
|
|
17
|
+
| [Preview environments](#preview-environments) | Validate changes on a real deployment before merging | `https://<branch>-<id>.zuplo.app` |
|
|
18
|
+
| [CI/CD integration](#cicd-integration-testing) | Automated gate that blocks broken changes from reaching production | Deployment URL from your CI provider |
|
|
19
|
+
|
|
20
|
+
All three strategies use the same test files and the same `zuplo test` command.
|
|
21
|
+
The only thing that changes is the `--endpoint` value.
|
|
22
|
+
|
|
23
|
+
## Local testing
|
|
24
|
+
|
|
25
|
+
Running tests against a local development server gives the fastest feedback
|
|
26
|
+
loop. Start the server with [`zuplo dev`](../cli/dev.mdx), then run your test
|
|
27
|
+
suite against it.
|
|
28
|
+
|
|
29
|
+
### Starting the local server
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx zuplo dev
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The API gateway starts on `http://localhost:9000` by default. You can change the
|
|
36
|
+
port with the `--port` flag. See the [`zuplo dev` reference](../cli/dev.mdx) for
|
|
37
|
+
all available options.
|
|
38
|
+
|
|
39
|
+
### Running tests locally
|
|
40
|
+
|
|
41
|
+
With the dev server running, open a second terminal and run:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx zuplo test --endpoint http://localhost:9000
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The command discovers every `*.test.ts` file under the `tests/` folder and
|
|
48
|
+
executes them against the provided endpoint.
|
|
49
|
+
|
|
50
|
+
:::tip
|
|
51
|
+
|
|
52
|
+
You can filter which tests run with the `--filter` flag. For example,
|
|
53
|
+
`npx zuplo test --endpoint http://localhost:9000 --filter 'auth'` runs only
|
|
54
|
+
tests whose name contains "auth".
|
|
55
|
+
|
|
56
|
+
:::
|
|
57
|
+
|
|
58
|
+
### Testing with Zuplo services locally
|
|
59
|
+
|
|
60
|
+
Some features, such as API key authentication and rate limiting, require a
|
|
61
|
+
connection to Zuplo cloud services. To use these features in local development,
|
|
62
|
+
link your local project to an existing Zuplo project with
|
|
63
|
+
[`zuplo link`](../cli/link.mdx):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx zuplo link
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Follow the prompts to select your account, project, and environment. This
|
|
70
|
+
creates a `.env.zuplo` file that the dev server reads automatically. For local
|
|
71
|
+
development, selecting the **development** environment is recommended.
|
|
72
|
+
|
|
73
|
+
:::warning
|
|
74
|
+
|
|
75
|
+
The `.env.zuplo` file can contain sensitive information. Add it to your
|
|
76
|
+
`.gitignore` file so it is not committed to source control.
|
|
77
|
+
|
|
78
|
+
:::
|
|
79
|
+
|
|
80
|
+
Once linked, services like the API Key Authentication policy work locally using
|
|
81
|
+
the same API key bucket as the linked environment. You can create API key
|
|
82
|
+
consumers in the [Zuplo Portal](https://portal.zuplo.com) under **Services > API
|
|
83
|
+
Key Service**, then call your local gateway with the generated key:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
curl http://localhost:9000/your-route \
|
|
87
|
+
-H "Authorization: Bearer YOUR_API_KEY"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
For more details see
|
|
91
|
+
[Connecting to Zuplo Services Locally](./local-development-services.mdx).
|
|
92
|
+
|
|
93
|
+
### Setting environment variables locally
|
|
94
|
+
|
|
95
|
+
Your local dev server does not have access to the environment variables
|
|
96
|
+
configured in the Zuplo Portal. Instead, create a `.env` file in your project
|
|
97
|
+
root:
|
|
98
|
+
|
|
99
|
+
```text title=".env"
|
|
100
|
+
MY_BACKEND_URL=https://api.example.com
|
|
101
|
+
MY_SECRET=supersecret
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The Zuplo CLI loads these variables automatically when you run `npx zuplo dev`.
|
|
105
|
+
See
|
|
106
|
+
[Configuring Environment Variables Locally](./local-development-env-variables.mdx)
|
|
107
|
+
for more information.
|
|
108
|
+
|
|
109
|
+
## Preview environments
|
|
110
|
+
|
|
111
|
+
Every branch pushed to your connected source control provider can create an
|
|
112
|
+
isolated [preview environment](./environments.mdx). Preview environments are
|
|
113
|
+
full Zuplo deployments that behave the same as production, making them ideal for
|
|
114
|
+
testing pull requests before merging.
|
|
115
|
+
|
|
116
|
+
### Running tests against a preview environment
|
|
117
|
+
|
|
118
|
+
Pass the preview environment URL as the endpoint:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
npx zuplo test --endpoint https://your-branch-abc123.zuplo.app
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Because preview environments run the full Zuplo runtime, including edge
|
|
125
|
+
deployment, policies, and connected services, tests that pass here give high
|
|
126
|
+
confidence that the changes work in production.
|
|
127
|
+
|
|
128
|
+
### Combining local and remote testing
|
|
129
|
+
|
|
130
|
+
For maximum coverage, test locally first for fast iteration, then run the same
|
|
131
|
+
test suite against the deployed preview environment:
|
|
132
|
+
|
|
133
|
+
1. Start local development and run tests against `http://localhost:9000`.
|
|
134
|
+
2. Push your branch. Zuplo deploys a preview environment automatically.
|
|
135
|
+
3. Run `npx zuplo test --endpoint <preview-url>` to verify behavior on the real
|
|
136
|
+
edge deployment.
|
|
137
|
+
|
|
138
|
+
## CI/CD integration testing
|
|
139
|
+
|
|
140
|
+
Automated tests in your CI/CD pipeline ensure that every deployment is validated
|
|
141
|
+
before changes reach production. The `zuplo test` command works with any CI
|
|
142
|
+
system.
|
|
143
|
+
|
|
144
|
+
:::tip
|
|
145
|
+
|
|
146
|
+
The examples below use the Zuplo GitHub integration. If you prefer setting up
|
|
147
|
+
your own CI/CD for more fine-grained control, see
|
|
148
|
+
[Custom CI/CD](./custom-ci-cd.mdx).
|
|
149
|
+
|
|
150
|
+
:::
|
|
151
|
+
|
|
152
|
+
### Testing after deployment with GitHub Actions
|
|
153
|
+
|
|
154
|
+
Using the Zuplo GitHub integration, tests can run after a deployment and block
|
|
155
|
+
pull requests from being merged. The Zuplo Git Integration sets
|
|
156
|
+
[Deployments](https://docs.github.com/en/rest/deployments/deployments) and
|
|
157
|
+
[Deployment Statuses](https://docs.github.com/en/rest/deployments/statuses) for
|
|
158
|
+
any push to a GitHub branch.
|
|
159
|
+
|
|
160
|
+
Here is a simple GitHub Action that uses the Zuplo CLI to run the tests after
|
|
161
|
+
the deployment is successful. Notice how the property
|
|
162
|
+
`github.event.deployment_status.environment_url` is set to the `API_URL`
|
|
163
|
+
environment variable. This is one way you can pass the URL where the preview
|
|
164
|
+
environment is deployed into your tests.
|
|
165
|
+
|
|
166
|
+
```yaml title="/.github/workflows/main.yaml"
|
|
167
|
+
name: Main
|
|
168
|
+
on: [deployment_status]
|
|
169
|
+
|
|
170
|
+
jobs:
|
|
171
|
+
test:
|
|
172
|
+
name: Test API Gateway
|
|
173
|
+
runs-on: ubuntu-latest
|
|
174
|
+
|
|
175
|
+
steps:
|
|
176
|
+
- uses: actions/checkout@v4
|
|
177
|
+
- name: Use Node.js
|
|
178
|
+
uses: actions/setup-node@v4
|
|
179
|
+
with:
|
|
180
|
+
node-version-file: ".nvmrc"
|
|
181
|
+
|
|
182
|
+
- name: Run Tests
|
|
183
|
+
# Useful properties 'environment', 'state', and 'environment_url'
|
|
184
|
+
run:
|
|
185
|
+
API_URL=${{ toJson(github.event.deployment_status.environment_url) }}
|
|
186
|
+
npx zuplo test --endpoint $API_URL
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Requiring status checks
|
|
190
|
+
|
|
191
|
+
[GitHub Branch protection](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/about-protected-branches)
|
|
192
|
+
can be set in order to enforce policies on when a Pull Request can be merged.
|
|
193
|
+
The example below sets the "Zuplo Deployment" and "Test API Gateway" as required
|
|
194
|
+
status that must pass.
|
|
195
|
+
|
|
196
|
+

|
|
197
|
+
|
|
198
|
+
When a developer tries to merge their pull request, they will see that the tests
|
|
199
|
+
haven't passed and the pull request can't be merged.
|
|
200
|
+
|
|
201
|
+

|
|
202
|
+
|
|
203
|
+
### Local testing in CI
|
|
204
|
+
|
|
205
|
+
You can also run tests against a local Zuplo server inside your CI pipeline
|
|
206
|
+
before deploying anywhere. This catches issues earlier and avoids deploying
|
|
207
|
+
broken changes.
|
|
208
|
+
|
|
209
|
+
```yaml title="/.github/workflows/local-test-then-deploy.yaml"
|
|
210
|
+
name: Local Test Then Deploy
|
|
211
|
+
on:
|
|
212
|
+
push:
|
|
213
|
+
branches:
|
|
214
|
+
- main
|
|
215
|
+
pull_request:
|
|
216
|
+
|
|
217
|
+
jobs:
|
|
218
|
+
local-test:
|
|
219
|
+
runs-on: ubuntu-latest
|
|
220
|
+
steps:
|
|
221
|
+
- uses: actions/checkout@v4
|
|
222
|
+
- uses: actions/setup-node@v4
|
|
223
|
+
with:
|
|
224
|
+
node-version: 20
|
|
225
|
+
- name: Install dependencies
|
|
226
|
+
run: npm install
|
|
227
|
+
- name: Start local server and run tests
|
|
228
|
+
run: |
|
|
229
|
+
npx zuplo dev &
|
|
230
|
+
DEV_PID=$!
|
|
231
|
+
echo "Waiting for local server to start..."
|
|
232
|
+
sleep 10
|
|
233
|
+
npx zuplo test --endpoint http://localhost:9000
|
|
234
|
+
kill $DEV_PID
|
|
235
|
+
|
|
236
|
+
deploy:
|
|
237
|
+
needs: local-test
|
|
238
|
+
runs-on: ubuntu-latest
|
|
239
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
240
|
+
env:
|
|
241
|
+
ZUPLO_API_KEY: ${{ secrets.ZUPLO_API_KEY }}
|
|
242
|
+
steps:
|
|
243
|
+
- uses: actions/checkout@v4
|
|
244
|
+
- uses: actions/setup-node@v4
|
|
245
|
+
with:
|
|
246
|
+
node-version: 20
|
|
247
|
+
- name: Install dependencies
|
|
248
|
+
run: npm install
|
|
249
|
+
- name: Deploy to Zuplo
|
|
250
|
+
run: npx zuplo deploy --api-key "$ZUPLO_API_KEY"
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
For CI/CD examples with other providers, see
|
|
254
|
+
[Custom GitHub Actions](./custom-ci-cd-github.mdx),
|
|
255
|
+
[GitLab CI/CD](./custom-ci-cd-gitlab.mdx), and
|
|
256
|
+
[CircleCI](./custom-ci-cd-circleci.mdx).
|
|
257
|
+
|
|
258
|
+
## Writing tests
|
|
259
|
+
|
|
260
|
+
Using Node.js 18 and the Zuplo CLI, it's very easy to write tests that make
|
|
261
|
+
requests to your API using `fetch` and then validate expectations with `expect`
|
|
262
|
+
from [chai](https://www.chaijs.com/api/bdd/).
|
|
263
|
+
|
|
264
|
+
```js title="/tests/my-test.test.ts"
|
|
265
|
+
import { describe, it, TestHelper } from "@zuplo/test";
|
|
266
|
+
import { expect } from "chai";
|
|
267
|
+
|
|
268
|
+
describe("API", () => {
|
|
269
|
+
it("should have a body", async () => {
|
|
270
|
+
const response = await fetch(TestHelper.TEST_URL);
|
|
271
|
+
const result = await response.text();
|
|
272
|
+
expect(result).to.equal(JSON.stringify("What zup?"));
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Check out our
|
|
278
|
+
[other sample tests](https://github.com/zuplo/zup-cli-example-project/tree/main/tests)
|
|
279
|
+
to find one that matches your use-case.
|
|
280
|
+
|
|
281
|
+
:::tip
|
|
282
|
+
|
|
283
|
+
Your test files need to be under the `tests` folder and end with `.test.ts` to
|
|
284
|
+
be picked up by the Zuplo CLI.
|
|
285
|
+
|
|
286
|
+
:::
|
|
287
|
+
|
|
288
|
+
## Tips for writing tests
|
|
289
|
+
|
|
290
|
+
This section highlights some of the features of the Zuplo CLI that can help you
|
|
291
|
+
write and structure your tests. Check out our
|
|
292
|
+
[other sample tests](https://github.com/zuplo/zup-cli-example-project/tree/main/tests)
|
|
293
|
+
to find one that matches your use-case.
|
|
294
|
+
|
|
295
|
+
### Ignoring tests
|
|
296
|
+
|
|
297
|
+
You can use `.ignore` and `.only` to ignore or run only specific test. The full
|
|
298
|
+
example is at
|
|
299
|
+
[ignore-only.test.ts](https://github.com/zuplo/zup-cli-example-project/blob/main/tests/ignore-only.test.ts)
|
|
300
|
+
|
|
301
|
+
```js title="/tests/ignore-only.test.ts"
|
|
302
|
+
import { describe, it } from "@zuplo/test";
|
|
303
|
+
import { expect } from "chai";
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* This example how to use ignore and only.
|
|
307
|
+
*/
|
|
308
|
+
describe("Ignore and only test example", () => {
|
|
309
|
+
it.ignore("This is a failing test but it's been ignored", () => {
|
|
310
|
+
expect(1 + 4).to.equals(6);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// it.only("This is the only test that would run if it weren't commented out", () => {
|
|
314
|
+
// expect(1 + 4).to.equals(5);
|
|
315
|
+
// });
|
|
316
|
+
});
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Filtering tests
|
|
320
|
+
|
|
321
|
+
You can use the CLI to filter tests by name or regex. The full example is at
|
|
322
|
+
[filter.test.ts](https://github.com/zuplo/zup-cli-example-project/blob/main/tests/filter.test.ts)
|
|
323
|
+
|
|
324
|
+
```js title="/tests/filter.test.ts"
|
|
325
|
+
import { describe, it } from "@zuplo/test";
|
|
326
|
+
import { expect } from "chai";
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* This example shows how to filter the test by the name in the describe() function.
|
|
330
|
+
* You can run `zuplo test --filter '#labelA'`
|
|
331
|
+
* If you want to use regex, you can do `zuplo test --filter '/#label[Aa]/'`
|
|
332
|
+
*/
|
|
333
|
+
describe("[#labelA #labelB] Addition", () => {
|
|
334
|
+
it("should add positive numbers", () => {
|
|
335
|
+
expect(1 + 4).to.equals(5);
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Using environment variables in tests
|
|
341
|
+
|
|
342
|
+
You can pass environment variables to your tests by setting them before the
|
|
343
|
+
`zuplo test` command. Inside your test files, access them with `process.env`:
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
MY_API_KEY=zpka_abc123 npx zuplo test --endpoint http://localhost:9000
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
```ts title="/tests/auth.test.ts"
|
|
350
|
+
import { describe, it, TestHelper } from "@zuplo/test";
|
|
351
|
+
import { expect } from "chai";
|
|
352
|
+
|
|
353
|
+
describe("Authentication", () => {
|
|
354
|
+
it("should reject requests without an API key", async () => {
|
|
355
|
+
const response = await fetch(`${TestHelper.TEST_URL}/my-route`);
|
|
356
|
+
expect(response.status).to.equal(401);
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it("should accept requests with a valid API key", async () => {
|
|
360
|
+
const response = await fetch(`${TestHelper.TEST_URL}/my-route`, {
|
|
361
|
+
headers: {
|
|
362
|
+
Authorization: `Bearer ${process.env.MY_API_KEY}`,
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
expect(response.status).to.equal(200);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## Writing integration tests
|
|
371
|
+
|
|
372
|
+
Integration tests verify that your API gateway behaves correctly end-to-end,
|
|
373
|
+
including routing, policies, and backend connectivity. Because `zuplo test` runs
|
|
374
|
+
against a live endpoint (local or deployed), every test is inherently an
|
|
375
|
+
integration test.
|
|
376
|
+
|
|
377
|
+
### Testing response status and headers
|
|
378
|
+
|
|
379
|
+
```ts title="/tests/headers.test.ts"
|
|
380
|
+
import { describe, it, TestHelper } from "@zuplo/test";
|
|
381
|
+
import { expect } from "chai";
|
|
382
|
+
|
|
383
|
+
describe("Response headers", () => {
|
|
384
|
+
it("should include CORS headers", async () => {
|
|
385
|
+
const response = await fetch(`${TestHelper.TEST_URL}/my-route`, {
|
|
386
|
+
method: "OPTIONS",
|
|
387
|
+
headers: {
|
|
388
|
+
Origin: "https://example.com",
|
|
389
|
+
"Access-Control-Request-Method": "GET",
|
|
390
|
+
},
|
|
391
|
+
});
|
|
392
|
+
expect(response.headers.get("access-control-allow-origin")).to.exist;
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
it("should return JSON content type", async () => {
|
|
396
|
+
const response = await fetch(`${TestHelper.TEST_URL}/my-route`);
|
|
397
|
+
expect(response.headers.get("content-type")).to.include("application/json");
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Testing rate limiting
|
|
403
|
+
|
|
404
|
+
```ts title="/tests/rate-limit.test.ts"
|
|
405
|
+
import { describe, it, TestHelper } from "@zuplo/test";
|
|
406
|
+
import { expect } from "chai";
|
|
407
|
+
|
|
408
|
+
describe("Rate limiting", () => {
|
|
409
|
+
it("should include rate limit headers", async () => {
|
|
410
|
+
const response = await fetch(`${TestHelper.TEST_URL}/my-route`, {
|
|
411
|
+
headers: {
|
|
412
|
+
Authorization: `Bearer ${process.env.MY_API_KEY}`,
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
expect(response.headers.get("ratelimit-limit")).to.exist;
|
|
416
|
+
expect(response.headers.get("ratelimit-remaining")).to.exist;
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Testing request validation
|
|
422
|
+
|
|
423
|
+
```ts title="/tests/validation.test.ts"
|
|
424
|
+
import { describe, it, TestHelper } from "@zuplo/test";
|
|
425
|
+
import { expect } from "chai";
|
|
426
|
+
|
|
427
|
+
describe("Request validation", () => {
|
|
428
|
+
it("should reject invalid request bodies", async () => {
|
|
429
|
+
const response = await fetch(`${TestHelper.TEST_URL}/my-route`, {
|
|
430
|
+
method: "POST",
|
|
431
|
+
headers: { "Content-Type": "application/json" },
|
|
432
|
+
body: JSON.stringify({ invalid: "data" }),
|
|
433
|
+
});
|
|
434
|
+
expect(response.status).to.equal(400);
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
it("should accept valid request bodies", async () => {
|
|
438
|
+
const response = await fetch(`${TestHelper.TEST_URL}/my-route`, {
|
|
439
|
+
method: "POST",
|
|
440
|
+
headers: { "Content-Type": "application/json" },
|
|
441
|
+
body: JSON.stringify({ name: "Test", email: "test@example.com" }),
|
|
442
|
+
});
|
|
443
|
+
expect(response.status).to.equal(200);
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## Unit Tests & Mocking
|
|
449
|
+
|
|
450
|
+
:::caution{title="Advanced"}
|
|
451
|
+
|
|
452
|
+
Custom testing can be complicated and is best used only to test your own logic
|
|
453
|
+
rather than trying to mock large portions of your API Gateway.
|
|
454
|
+
|
|
455
|
+
:::
|
|
456
|
+
|
|
457
|
+
It's usually possible to use test frameworks like
|
|
458
|
+
[Mocha](https://github.com/zuplo/zuplo/tree/main/examples/test-mocks) and
|
|
459
|
+
mocking tools like [Sinon](https://sinonjs.org/) to unit tests handlers,
|
|
460
|
+
policies, or other modules. To see an example of how that works see this sample
|
|
461
|
+
on GitHub: https://github.com/zuplo/zuplo/tree/main/examples/test-mocks
|
|
462
|
+
|
|
463
|
+
Do note though that not everything in the Zuplo runtime can be mocked.
|
|
464
|
+
Additionally, internal implementation changes might cause mocking behavior to
|
|
465
|
+
change or break without notice. Unlike our public API we don't guarantee that
|
|
466
|
+
mocking will remain stable between versions.
|
|
467
|
+
|
|
468
|
+
Generally speaking, if you must write unit tests, it's best to test your logic
|
|
469
|
+
separately from the Zuplo runtime. For example, write modules and functions that
|
|
470
|
+
take all the arguments as input and return a result, but don't depend on any
|
|
471
|
+
Zuplo runtime code.
|
|
472
|
+
|
|
473
|
+
For example, if you have a function that uses an environment variable and want
|
|
474
|
+
to unit test it.
|
|
475
|
+
|
|
476
|
+
Don't do this:
|
|
477
|
+
|
|
478
|
+
```ts
|
|
479
|
+
import { environment } from "@zuplo/runtime";
|
|
480
|
+
|
|
481
|
+
export function myFunction() {
|
|
482
|
+
const myVar = environment.MY_ENV_VAR;
|
|
483
|
+
return `Hello ${myVar}`;
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Instead do this:
|
|
488
|
+
|
|
489
|
+
```ts
|
|
490
|
+
export function myFunction(myVar: string) {
|
|
491
|
+
return `Hello ${myVar}`;
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
Then write your test like this:
|
|
496
|
+
|
|
497
|
+
```ts
|
|
498
|
+
import { myFunction } from "./myFunction";
|
|
499
|
+
|
|
500
|
+
describe("myFunction", () => {
|
|
501
|
+
it("should return Hello World", () => {
|
|
502
|
+
expect(myFunction("World")).to.equal("Hello World");
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### Polyfills
|
|
508
|
+
|
|
509
|
+
If you are running unit tests in a Node.js environment, you may need to polyfill
|
|
510
|
+
some globals. Zuplo itself doesn't run on Node.js, but because Zuplo is built on
|
|
511
|
+
standard API, testing in Node.js is possible.
|
|
512
|
+
|
|
513
|
+
If you are running on Node.js 20 or later, you can use the `webcrypto` module to
|
|
514
|
+
polyfill the `crypto` global. You must register this polyfill before any Zuplo
|
|
515
|
+
code runs.
|
|
516
|
+
|
|
517
|
+
```js
|
|
518
|
+
import { webcrypto } from "node:crypto";
|
|
519
|
+
if (typeof crypto === "undefined") {
|
|
520
|
+
globalThis.crypto = webcrypto;
|
|
521
|
+
}
|
|
522
|
+
```
|