diff --git a/.github/workflows/restheart-mongo.yml b/.github/workflows/restheart-mongo.yml new file mode 100644 index 00000000..918aad5e --- /dev/null +++ b/.github/workflows/restheart-mongo.yml @@ -0,0 +1,195 @@ +# restheart-mongo sample CI — keploy-independent end-to-end smoke + +# coverage gate. +# +# Triggers ONLY on changes under restheart-mongo/ (or this workflow +# file). Other samples in this repo have their own orthogonal CI; +# gating the whole repo on every restheart change would slow them +# all down for no benefit. +# +# What it gates: +# * `release-coverage` — checks out the PR's base branch (main) +# and runs the sample end-to-end: docker compose up, bootstrap +# the admin db + collections, drive flow.sh record-traffic with +# the per-call audit log enabled, capture the route-coverage +# percentage from `flow.sh coverage`. This is the baseline. +# * `build-coverage` — same end-to-end against the PR's HEAD ref. +# * `coverage-gate` — fails the PR if `build`'s coverage drops +# more than COVERAGE_THRESHOLD percentage points below +# `release`. Default threshold is 1.0pp; override via repo +# variable `RESTHEART_COVERAGE_THRESHOLD` for a tighter or +# looser bar. +# +# On push to main, only `build-coverage` runs (no baseline to +# compare against — main IS the baseline). +# +# Standards-aligned choices: +# * `paths:` filter on both push and pull_request triggers — the +# canonical GH Actions way to scope a workflow to one +# subdirectory. +# * Job outputs (steps..outputs.coverage → needs..outputs) +# to thread the captured percentage between jobs. +# * `concurrency:` cancel-in-progress on the same ref so a stale +# run doesn't waste runner minutes. +# * actions/upload-artifact for the human-readable +# coverage_report.txt — reviewers can inspect missing routes +# directly from the PR's "checks" tab. +# * marocchino/sticky-pull-request-comment for the PR-side diff +# comment. Pinned-by-header so successive runs update the same +# comment instead of fanning out. +# * The compare step is plain bash + python3 (no external +# coverage service). The sample's coverage is route-based +# (single percentage), so the gate is a 3-line subtraction. +# +# Sample is genuinely keploy-independent here: the workflow uses +# flow.sh's $RESTHEART_FIRED_ROUTES_FILE per-call audit log as its +# numerator source, not a keploy recording. The lane scripts in +# keploy/integrations and keploy/enterprise consume the same +# flow.sh, but use the keploy/test-set-*/tests/*.yaml tree as +# their numerator (authoritative — only calls keploy actually +# CAPTURED count). Both modes are wired into +# `flow.sh::restheart_list_recorded_routes`. +name: restheart-mongo sample + +on: + pull_request: + paths: + - 'restheart-mongo/**' + - '.github/workflows/restheart-mongo.yml' + push: + branches: [main] + paths: + - 'restheart-mongo/**' + - '.github/workflows/restheart-mongo.yml' + workflow_dispatch: {} + +concurrency: + group: restheart-mongo-${{ github.ref }} + cancel-in-progress: true + +env: + COVERAGE_THRESHOLD: ${{ vars.RESTHEART_COVERAGE_THRESHOLD || '1.0' }} + +jobs: + build-coverage: + name: build (current ref) coverage + runs-on: ubuntu-latest + timeout-minutes: 20 + outputs: + coverage: ${{ steps.measure.outputs.coverage }} + steps: + - uses: actions/checkout@v4 + - id: measure + name: Run sample end-to-end + measure coverage + working-directory: restheart-mongo + env: + RESTHEART_FIRED_ROUTES_FILE: ${{ runner.temp }}/fired-routes-build.log + RESTHEART_PHASE: ci-build + run: ../.github/workflows/scripts/run-and-measure.sh + + - name: Upload coverage report + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-build + path: restheart-mongo/coverage_report.txt + if-no-files-found: warn + + release-coverage: + if: github.event_name == 'pull_request' + name: release (base ref) coverage + runs-on: ubuntu-latest + timeout-minutes: 20 + outputs: + coverage: ${{ steps.measure.outputs.coverage || steps.empty-baseline.outputs.coverage }} + sample-existed: ${{ steps.detect.outputs.sample-existed }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.base.ref }} + + # First-PR bootstrap escape hatch: the very PR that + # introduces the restheart-mongo/ sample has no baseline + # (restheart-mongo/ doesn't exist on the base ref). Detect + # that and short-circuit to coverage=0; the gate then + # treats build's coverage as the new baseline and trivially + # passes for any percentage > 0. After the introducing PR + # merges, every subsequent PR has a real baseline to diff + # against. + - id: detect + name: Detect baseline presence + run: | + if [ -d restheart-mongo ] && [ -x restheart-mongo/flow.sh ]; then + echo "sample-existed=true" >>"$GITHUB_OUTPUT" + echo "Sample exists on base ref — running full measurement." + else + echo "sample-existed=false" >>"$GITHUB_OUTPUT" + echo "No restheart-mongo/ on base ref — first-PR bootstrap; baseline coverage treated as 0%." + fi + + - id: measure + name: Run sample end-to-end + measure coverage + if: steps.detect.outputs.sample-existed == 'true' + working-directory: restheart-mongo + env: + RESTHEART_FIRED_ROUTES_FILE: ${{ runner.temp }}/fired-routes-release.log + RESTHEART_PHASE: ci-release + run: ../.github/workflows/scripts/run-and-measure.sh + + - id: empty-baseline + name: Emit zero baseline (first-PR bootstrap) + if: steps.detect.outputs.sample-existed != 'true' + run: echo "coverage=0.0" >>"$GITHUB_OUTPUT" + + - name: Upload coverage report + if: always() && steps.detect.outputs.sample-existed == 'true' + uses: actions/upload-artifact@v4 + with: + name: coverage-release + path: restheart-mongo/coverage_report.txt + if-no-files-found: warn + + coverage-gate: + if: github.event_name == 'pull_request' + name: coverage gate + needs: [build-coverage, release-coverage] + runs-on: ubuntu-latest + steps: + - name: Compare build vs release + env: + BUILD: ${{ needs.build-coverage.outputs.coverage }} + RELEASE: ${{ needs.release-coverage.outputs.coverage }} + THRESHOLD: ${{ env.COVERAGE_THRESHOLD }} + BASE_REF: ${{ github.event.pull_request.base.ref }} + run: | + set -Eeuo pipefail + if [ -z "${BUILD:-}" ] || [ -z "${RELEASE:-}" ]; then + echo "::error::missing coverage outputs — build='${BUILD:-}' release='${RELEASE:-}'" + exit 1 + fi + drop=$(python3 -c "print(round(${RELEASE} - ${BUILD}, 2))") + echo "Release (${BASE_REF}): ${RELEASE}%" + echo "Build (this PR): ${BUILD}%" + echo "Drop: ${drop}pp (threshold ${THRESHOLD}pp)" + if python3 -c "import sys; sys.exit(0 if (${RELEASE} - ${BUILD}) > ${THRESHOLD} else 1)"; then + echo "::error::restheart-mongo coverage dropped from ${RELEASE}% → ${BUILD}% (-${drop}pp), exceeding the ${THRESHOLD}pp threshold." + echo "Suggested actions:" + echo " * Add curl(s) to flow.sh::restheart_record_traffic that exercise the routes you changed/touched." + echo " * If the route(s) was intentionally retired, drop it from restheart-mongo/flow.sh::restheart_list_routes' SCOPE_PATHS too so it's removed from the denominator." + exit 1 + fi + echo "OK — coverage delta within ${THRESHOLD}pp threshold." + + - name: Sticky PR comment + if: ${{ !cancelled() }} + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: restheart-mongo-coverage + message: | + ### restheart-mongo sample coverage + + | ref | coverage | + |---|---| + | base (`${{ github.event.pull_request.base.ref }}`) | **${{ needs.release-coverage.outputs.coverage }}%** | + | this PR | **${{ needs.build-coverage.outputs.coverage }}%** | + + Threshold: PR may not drop coverage by more than **${{ env.COVERAGE_THRESHOLD }}pp**. Override per-repo via the `RESTHEART_COVERAGE_THRESHOLD` actions variable. diff --git a/.github/workflows/scripts/run-and-measure.sh b/.github/workflows/scripts/run-and-measure.sh new file mode 100755 index 00000000..741ddcf3 --- /dev/null +++ b/.github/workflows/scripts/run-and-measure.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# +# run-and-measure.sh — bring restheart-mongo up under the +# coverage overlay (JaCoCo agent attached via JAVA_TOOL_OPTIONS), +# run flow.sh bootstrap + record-traffic, dump JaCoCo execution +# data over the agent's TCP server, render a Java line-coverage +# report, and emit `coverage=PCT` onto $GITHUB_OUTPUT for the +# downstream coverage-gate job. +# +# Coverage isolation contract: +# * Base `Dockerfile` and `docker-compose.yml` are untouched. +# * The overlay `Dockerfile.coverage` + `docker-compose.coverage.yml` +# attach JaCoCo and expose its TCP server. ONLY this script +# applies the overlay; keploy/integrations and keploy/enterprise +# CI lanes consume the base compose and pay zero JVM-instrument +# cost (jacocoagent adds ~5-10% per-call overhead). +# +# Inputs (from the workflow env): +# RESTHEART_PHASE — label for log diffing. +# GITHUB_OUTPUT — standard GH Actions sink for step outputs. +set -Eeuo pipefail + +export RESTHEART_APP_CONTAINER="${RESTHEART_APP_CONTAINER:-restheart_app}" +export RESTHEART_MONGO_CONTAINER="${RESTHEART_MONGO_CONTAINER:-restheart_mongo}" +export RESTHEART_APP_PORT="${RESTHEART_APP_PORT:-8080}" +export RESTHEART_MONGO_IP="${RESTHEART_MONGO_IP:-172.36.0.10}" +export RESTHEART_NETWORK_SUBNET="${RESTHEART_NETWORK_SUBNET:-172.36.0.0/24}" +export RESTHEART_ADMIN_AUTH="${RESTHEART_ADMIN_AUTH:-Basic YWRtaW46c2VjcmV0}" + +mkdir -p coverage +chmod 777 coverage +sudo rm -rf coverage/jacoco.exec coverage/report.xml coverage/coverage_report.txt 2>/dev/null \ + || rm -rf coverage/jacoco.exec coverage/report.xml coverage/coverage_report.txt 2>/dev/null \ + || true + +COMPOSE=(docker compose -f docker-compose.yml -f docker-compose.coverage.yml) + +"${COMPOSE[@]}" up -d --build + +# Both 200 and 401 are success signals. +for i in $(seq 1 120); do + code=$(curl -sS -o /dev/null -w '%{http_code}' \ + "http://127.0.0.1:${RESTHEART_APP_PORT}/" 2>/dev/null || echo "") + if [ "$code" = "200" ] || [ "$code" = "401" ]; then break; fi + sleep 2 +done + +if [ "$code" != "200" ] && [ "$code" != "401" ]; then + echo "::error::restheart did not bind on port ${RESTHEART_APP_PORT} within 240s (last code: ${code:-empty})" + echo "----- restheart container logs -----" + docker logs "${RESTHEART_APP_CONTAINER}" --tail 200 2>&1 || true + echo "----- mongo container logs -----" + docker logs "${RESTHEART_MONGO_CONTAINER}" --tail 100 2>&1 || true + "${COMPOSE[@]}" down -v --remove-orphans || true + exit 1 +fi + +bash flow.sh bootstrap 240 +bash flow.sh record-traffic + +# JaCoCo TCP-dump + report (no JVM stop needed). +COVERAGE_REPORT_FILE="$PWD/coverage_report.txt" bash flow.sh coverage + +if [ ! -f coverage_report.txt ]; then + echo "::error::flow.sh coverage produced no coverage_report.txt" + exit 1 +fi + +pct=$(grep -oE '\([0-9]+\.[0-9]+%\)' coverage_report.txt | head -1 | tr -d '()%') +if [ -z "$pct" ]; then + echo "::error::Could not parse coverage percentage from coverage_report.txt" + cat coverage_report.txt || true + exit 1 +fi +echo "coverage=${pct}" >>"$GITHUB_OUTPUT" +echo "coverage: ${pct}% (Java line coverage via JaCoCo)" + +"${COMPOSE[@]}" down -v --remove-orphans diff --git a/.github/workflows/spring-boot-product-catalog.yml b/.github/workflows/spring-boot-product-catalog.yml new file mode 100644 index 00000000..f7ec871b --- /dev/null +++ b/.github/workflows/spring-boot-product-catalog.yml @@ -0,0 +1,82 @@ +# spring-boot-product-catalog sample CI — build + end-to-end smoke test. +# +# Scoped with `paths:` to this sample only, so unrelated samples don't pay for +# it (same convention as restheart-mongo.yml). Deliberately Keploy-independent: +# record/replay needs eBPF privileges that are awkward on hosted runners, so CI +# proves the app builds and serves the traffic the recorded suite was captured +# from. The committed test set under keploy/products-crud/ is the regression +# gate, exercised locally and in the Keploy pipelines. +name: spring-boot-product-catalog sample + +on: + pull_request: + paths: + - 'spring-boot-product-catalog/**' + - '.github/workflows/spring-boot-product-catalog.yml' + push: + branches: [main] + paths: + - 'spring-boot-product-catalog/**' + - '.github/workflows/spring-boot-product-catalog.yml' + workflow_dispatch: {} + +concurrency: + group: spring-boot-product-catalog-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: build (JDK 21) + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: maven + + - name: Build with Maven + working-directory: spring-boot-product-catalog + run: ./mvnw -B -DskipTests clean package + + smoke: + name: end-to-end smoke test + needs: build + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + + - name: Start app + Postgres + working-directory: spring-boot-product-catalog + run: docker compose up -d --build --wait + + - name: Drive the recorded workload + working-directory: spring-boot-product-catalog + run: ./seed.sh + + - name: Assert the catalog responds + working-directory: spring-boot-product-catalog + run: | + set -Eeuo pipefail + curl -fsS http://localhost:8080/api/products >/dev/null + curl -fsS http://localhost:8080/api/products/summary >/dev/null + # The 404 path must stay a clean 404, not a 500 — the recorded suite + # asserts the structured error body. + code=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/api/products/99999) + [ "$code" = "404" ] || { echo "::error::expected 404 for a missing product, got $code"; exit 1; } + echo "OK — catalog, summary, and not-found paths all behave." + + - name: Dump app logs on failure + if: failure() + working-directory: spring-boot-product-catalog + run: docker compose logs --no-color app + + - name: Tear down + if: always() + working-directory: spring-boot-product-catalog + run: docker compose down -v diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 71368298..71271ea5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,7 +2,7 @@ Thank you for your interest in Keploy and for taking the time to contribute to this project. 🙌 Keploy is a project by developers for developers and there are a lot of ways you can contribute. -If you don't know where to start contributing, ask us on our [Slack channel](https://join.slack.com/t/keploy/shared_invite/zt-357qqm9b5-PbZRVu3Yt2rJIa6ofrwWNg). +If you don't know where to start contributing, ask us on our [Slack channel](https://keploy.io/slack). ## Code of conduct diff --git a/README.md b/README.md index 6c2e78f2..0a271aff 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ - + @@ -22,6 +22,12 @@ This repo contains the sample for [Keploy's](https://keploy.io) Java Application 3. [User Manager](https://github.com/keploy/samples-java/tree/main/user-manager) - A sample User-Manager app to test Keploy integration capabilities using SpringBoot and MongoDB. 4. [Springboot Postgres GraphQL](https://github.com/keploy/samples-java/tree/main/spring-boot-postgres-graphql) - This is a Spring Boot application implementing a GraphQL service to handle requests related to books and authors. 5. [Springboot PetClinic](https://github.com/keploy/samples-java/tree/main/spring-petclinic) - This is a Pet Clinic app where you can record testcases and mocks by interacting with the UI, and then test them using Keploy. +6. [SAP Demo (Customer 360)](https://github.com/keploy/samples-java/tree/main/sap-demo-java) - A Spring Boot "Customer 360" API that fronts SAP S/4HANA Cloud (Business Partner + Sales Order OData) and a local PostgreSQL store. Includes docker-compose, a kind-based k8s deploy, and Tosca-style flow scripts suitable for recording end-to-end Keploy testcases against PostgreSQL + outbound SAP HTTPS. +7. [Java Dynamic Deduplication](https://github.com/keploy/samples-java/tree/main/java-dedup) - A Spring Boot sample used by CI to validate Enterprise Java dynamic dedup in native, Docker, and restricted Docker replay runs. CI uses checked-in fixtures and does not record this sample in the pipeline. +8. [Dropwizard Dynamic Deduplication](https://github.com/keploy/samples-java/tree/main/dropwizard-dedup) - A Dropwizard/Jersey sample used by Enterprise CI to validate that Java dynamic dedup works outside Spring Boot with the runtime Java agent, checked-in HTTP fixtures, native launch, classpath launch, Docker, distroless, and restricted Docker. +9. [Simple Java Dynamic Deduplication](https://github.com/keploy/samples-java/tree/main/simple-java-dedup) - A minimal plain-Java HTTP server used to smoke-test Java dynamic dedup on Java 8 and Java 17 in native and Docker launch modes. +10. [MySQL CRUD](https://github.com/keploy/samples-java/tree/main/mysql-crud) - A minimal Spring Boot + JDBC CRUD app used by Enterprise CI to validate the self-hosted cloud-replay pipeline's JDBC secret-obfuscation and object-storage mock upload/download paths against a real MySQL 8 backend. +11. [Springboot Product Catalog](https://github.com/keploy/samples-java/tree/main/spring-boot-product-catalog) - A Spring Boot + PostgreSQL product-catalog REST API shipping a committed 57-case Keploy test set and 190 Postgres mocks. Includes an app-only docker-compose with no database service at all, so the whole suite replays green with Postgres absent. ## Community Support ❤️ @@ -29,7 +35,7 @@ This repo contains the sample for [Keploy's](https://keploy.io) Java Application Reach out to us. We're here to help! -[![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://join.slack.com/t/keploy/shared_invite/zt-357qqm9b5-PbZRVu3Yt2rJIa6ofrwWNg) +[![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://keploy.io/slack) [![LinkedIn](https://img.shields.io/badge/linkedin-%230077B5.svg?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/company/keploy/) [![YouTube](https://img.shields.io/badge/YouTube-%23FF0000.svg?style=for-the-badge&logo=YouTube&logoColor=white)](https://www.youtube.com/channel/UC6OTg7F4o0WkmNtSoob34lg) [![Twitter](https://img.shields.io/badge/Twitter-%231DA1F2.svg?style=for-the-badge&logo=Twitter&logoColor=white)](https://twitter.com/Keployio) diff --git a/async-config-poll/.gitignore b/async-config-poll/.gitignore new file mode 100644 index 00000000..673052ec --- /dev/null +++ b/async-config-poll/.gitignore @@ -0,0 +1,5 @@ +target/ +keploy/ +.local-logs/ +config-stub/config-stub +*.log diff --git a/async-config-poll/README.md b/async-config-poll/README.md new file mode 100644 index 00000000..85bfcf91 --- /dev/null +++ b/async-config-poll/README.md @@ -0,0 +1,78 @@ +# async-config-poll + +A Spring Boot 1.5 / Java 8 rule-engine sample that demonstrates Keploy's +**async-egress engine**. + +The app has two HTTP endpoints backed by MySQL, and it depends on a central +config service in two different ways: + +| Interaction | When | Keploy treats it as | +|-------------|------|---------------------| +| `GET /v1/buckets/app-common`, `app-features`, `app-config?watch=false` | once, at boot (blocking) | ordinary synchronous mocks — the app cannot boot without them | +| `GET /v1/buckets/app-config?watch=true&version=N` | forever, from a background daemon thread | **async egress** — fires on the app's own schedule, not tied to any ingress testcase | +| `SELECT ...` on MySQL | per request | ordinary synchronous mocks | + +The background watch poll is the interesting part. Because it runs on a timer in +its own thread, it does not line up one-to-one with the recorded testcases. A +naive replay would fail: the app polls at replay time too, and the request +(`?version=17`, `?version=18`, …) never matches a recorded one exactly. + +Keploy's async-egress engine handles this. The lane declared in `keploy.yml` +tells Keploy that this endpoint is async: + +```yaml +async: + lanes: + - name: config-watch + type: http + match: + pathRegex: "^/v1/buckets/app-config$" + matchQuery: + watch: "true" # only the background watch polls, not the boot call + volatileParams: ["version"] # the version query param varies every poll — treat as noise +``` + +At replay the engine serves the recorded watch responses back to the poller +independently of testcase ordering, treats the changing `version` param as +shape-noise, and keep-alives the poller when there is nothing left to serve — so +the app stays happy and the ingress tests still pass. At the end of replay Keploy +prints an `async egress verdict` line (served / shape_flags / not_exercised). + +## Endpoints + +- `GET /health` — small health payload; runs `SELECT 1` against MySQL. +- `GET /rules/{useCase}` — ordered rules for `(useCase, tenant)` read from MySQL. + Requires headers `X-Tenant-Id` and `X-Agent-Id`. + Example: `GET /rules/ORDER_FLOW` with `X-Tenant-Id: ACME`, `X-Agent-Id: 957`. + +## Run it locally + +Prerequisites: JDK 8, Maven, Docker, Go (for the config stub), and a Keploy +build that includes the async-egress engine. + +```bash +# 1. dependencies +docker compose up -d # MySQL 5.7 seeded from init.sql +go run ./config-stub & # config service stub on :9100 + +# 2. build the app +mvn -B clean package -Dmaven.test.skip=true + +# 3. record +sudo -E keploy record -c "java -jar target/async-config-poll.jar" +# drive traffic, then Ctrl-C keploy: +curl localhost:8080/health +curl -H "X-Tenant-Id: ACME" -H "X-Agent-Id: 957" localhost:8080/rules/ORDER_FLOW + +# 4. replay (deps down — Keploy serves everything from mocks) +docker compose down +sudo keploy test -c "java -jar target/async-config-poll.jar" --delay 20 +``` + +To make a watch poll land in the *middle* of a testcase at replay (so the async +lane is actively exercised rather than drained between tests), lower the poll +interval and widen the request window: + +```bash +WATCH_INTERVAL_MS=150 RULES_DELAY_MS=800 sudo -E keploy record -c "java -jar target/async-config-poll.jar" +``` diff --git a/async-config-poll/config-stub/go.mod b/async-config-poll/config-stub/go.mod new file mode 100644 index 00000000..8c9ffb36 --- /dev/null +++ b/async-config-poll/config-stub/go.mod @@ -0,0 +1,3 @@ +module config-stub + +go 1.21 diff --git a/async-config-poll/config-stub/main.go b/async-config-poll/config-stub/main.go new file mode 100644 index 00000000..4157bb72 --- /dev/null +++ b/async-config-poll/config-stub/main.go @@ -0,0 +1,72 @@ +// Command config-stub is a stand-in for a central config service. It backs the +// app's boot-blocking config fetch and its background watch long-poll: +// +// - GET /v1/buckets/{name} -> current config (version 1) +// - GET /v1/buckets/app-config?watch=true&version=N -> long-poll: returns the +// NEXT version (N+1), simulating a config change on each watch poll. +// +// By default a watch poll returns immediately (the periodic-poller scenario). +// Set POLL_HOLD_SECONDS>0 to model a real long-poll with a server timeout: the +// watch=true request is HELD open that long before delivering the next version +// (the httpPoll scenario), so Keploy records its open-duration as pollDurationMs. +// +// It is hit only during `keploy record`. At replay time Keploy serves the +// recorded responses instead, so this stub does not need to be running. +package main + +import ( + "encoding/json" + "log" + "net/http" + "os" + "strconv" + "strings" + "time" +) + +// pollHold is the long-poll server timeout: a watch=true request is held open +// this long before delivering the next version. Default 0 (respond +// immediately); override with POLL_HOLD_SECONDS. +func pollHold() time.Duration { + if s := os.Getenv("POLL_HOLD_SECONDS"); s != "" { + if n, err := strconv.Atoi(s); err == nil { + return time.Duration(n) * time.Second + } + } + return 0 +} + +func main() { + hold := pollHold() + http.HandleFunc("/v1/buckets/", func(w http.ResponseWriter, r *http.Request) { + name := strings.TrimPrefix(r.URL.Path, "/v1/buckets/") + q := r.URL.Query() + + version := 1 + if q.Get("watch") == "true" { + cur, _ := strconv.Atoi(q.Get("version")) + if hold > 0 { + // Long-poll: hold the connection open until the server timeout, + // then deliver the next version. Abort if the client disconnects. + select { + case <-time.After(hold): + case <-r.Context().Done(): + return + } + } + version = cur + 1 // deliver the next version -> a "change" per poll + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _ = json.NewEncoder(w).Encode(map[string]interface{}{ + "name": name, + "version": version, + "keys": map[string]string{ + "feature.enabled": "true", + }, + }) + }) + log.Println("config-stub listening on :9100") + log.Fatal(http.ListenAndServe(":9100", nil)) +} diff --git a/async-config-poll/docker-compose.yml b/async-config-poll/docker-compose.yml new file mode 100644 index 00000000..c99afaa1 --- /dev/null +++ b/async-config-poll/docker-compose.yml @@ -0,0 +1,21 @@ +services: + mysql: + # MySQL 5.7 (not 8.x): Spring Boot 1.5 manages MySQL Connector/J to 5.1.x, + # which cannot speak MySQL 8's default caching_sha2_password auth plugin. + image: mysql:5.7 + command: --default-authentication-plugin=mysql_native_password + environment: + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_DATABASE: ruledb + MYSQL_USER: app + MYSQL_PASSWORD: app + ports: + - "3306:3306" + volumes: + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + # mysql:5.7 can trip an fd-limit config check on some Docker hosts; pin a + # sane nofile limit so mysqld starts and stays up under connection load. + ulimits: + nofile: + soft: 65535 + hard: 65535 diff --git a/async-config-poll/init.sql b/async-config-poll/init.sql new file mode 100644 index 00000000..a23e2a81 --- /dev/null +++ b/async-config-poll/init.sql @@ -0,0 +1,39 @@ +-- Rule-engine schema + seed for the (ORDER_FLOW, ACME) use case. +-- The app reads these rows over the MySQL wire; Keploy captures that traffic +-- as mocks and serves it back on replay. +CREATE DATABASE IF NOT EXISTS ruledb; +USE ruledb; + +CREATE TABLE IF NOT EXISTS rules ( + rule_id BIGINT PRIMARY KEY, + use_case VARCHAR(64) NOT NULL, + tenant VARCHAR(64) NOT NULL, + constraint_expr TEXT NOT NULL, + rule_type VARCHAR(16) NOT NULL, + INDEX idx_uc_tenant (use_case, tenant) +); + +CREATE TABLE IF NOT EXISTS rule_actions ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + rule_id BIGINT NOT NULL, + basic_action VARCHAR(255) NOT NULL, + action_details TEXT NOT NULL, + seq INT NOT NULL, + INDEX idx_rule (rule_id) +); + +INSERT INTO rules (rule_id, use_case, tenant, constraint_expr, rule_type) VALUES + (14,'ORDER_FLOW','ACME','status == "COMPLETED" && type.equals("CHECKOUT")','POST'), + (15,'ORDER_FLOW','ACME','status == "COMPLETED" && type.equals("PAYMENT")','POST'), + (16,'ORDER_FLOW','ACME','status == "COMPLETED" && type.equals("SHIPMENT")','POST'), + (17,'ORDER_FLOW','ACME','status == "IN_PROGRESS" && type.equals("REFUND")','POST'), + (18,'ORDER_FLOW','ACME','status == "COMPLETED" && type.equals("FULFILLMENT")','PRE'); + +INSERT INTO rule_actions (rule_id, basic_action, action_details, seq) VALUES + (14,'com.example.rules.handlers.ForceSyncHandler','{}',1), + (15,'com.example.rules.handlers.PaymentTaskHandler','{}',1), + (15,'com.example.rules.handlers.NotifyHandler','{"optional":"true","channel":"email"}',2), + (16,'com.example.rules.handlers.ValidateHandler','{"optional":"true"}',1), + (16,'com.example.rules.handlers.ShipmentHandler','{}',2), + (17,'com.example.rules.handlers.RefundHandler','{}',1), + (18,'com.example.rules.handlers.ImageSyncHandler','{"optional":"true"}',1); diff --git a/async-config-poll/keploy-httppoll.yml b/async-config-poll/keploy-httppoll.yml new file mode 100644 index 00000000..7e9a98e1 --- /dev/null +++ b/async-config-poll/keploy-httppoll.yml @@ -0,0 +1,26 @@ +# Keploy config for the async-config-poll sample — httpPoll scenario. +# +# Identical to keploy.yml except the async lane's type is `httpPoll` instead of +# `http`. `httpPoll` marks the config-watch egress as a long-poll: at record +# Keploy stamps the mock kind `HttpPoll` and captures its open-duration +# (pollDurationMs); at replay the async engine HOLDS the poll until its resolve +# testcase and then serves it (verdict `held`), instead of serving it as soon as +# the request arrives. Paired with POLL_HOLD_SECONDS on the config-stub and +# WATCH_ONCE on the app so the recording holds a single server-timeout long-poll. +# +# Lane "config-watch": +# - match.pathRegex : only the /v1/buckets/app-config endpoint +# - matchQuery.watch : "true" -> only the background watch polls (the +# one-time boot "get current version" call uses +# watch=false and stays an ordinary blocking mock) +# - volatileParams : ["version"] -> the version query param changes every +# poll, so it is treated as shape-noise, not a mismatch +async: + lanes: + - name: config-watch + type: httpPoll + match: + pathRegex: "^/v1/buckets/app-config$" + matchQuery: + watch: "true" + volatileParams: ["version"] diff --git a/async-config-poll/keploy.yml b/async-config-poll/keploy.yml new file mode 100644 index 00000000..b3dad905 --- /dev/null +++ b/async-config-poll/keploy.yml @@ -0,0 +1,22 @@ +# Keploy config for the async-config-poll sample. +# +# The only non-default section is `async.lanes`. It declares the config-service +# watch long-poll as async egress, so Keploy's async-egress engine records and +# replays it independently of the ingress testcase ordering. +# +# Lane "config-watch": +# - match.pathRegex : only the /v1/buckets/app-config endpoint +# - matchQuery.watch : "true" -> only the background watch polls (the +# one-time boot "get current version" call uses +# watch=false and stays an ordinary blocking mock) +# - volatileParams : ["version"] -> the version query param changes every +# poll, so it is treated as shape-noise, not a mismatch +async: + lanes: + - name: config-watch + type: http + match: + pathRegex: "^/v1/buckets/app-config$" + matchQuery: + watch: "true" + volatileParams: ["version"] diff --git a/async-config-poll/pom.xml b/async-config-poll/pom.xml new file mode 100644 index 00000000..b471347d --- /dev/null +++ b/async-config-poll/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + + + com.example + async-config-poll + 1.0.0 + jar + + + org.springframework.boot + spring-boot-starter-parent + 1.5.22.RELEASE + + + + + 1.8 + UTF-8 + com.example.asyncconfig.Application + + + + + + org.springframework.boot + spring-boot-starter-jersey + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-jetty + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + + + + + async-config-poll + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/Application.java b/async-config-poll/src/main/java/com/example/asyncconfig/Application.java new file mode 100644 index 00000000..cbd3b4c3 --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/Application.java @@ -0,0 +1,17 @@ +package com.example.asyncconfig; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * async-config-poll — a small rule engine that serves /health and + * /rules/{useCase} on port 8080 (backed by MySQL), fetches boot-blocking + * config at startup, and then long-polls a config service in the background + * for version changes (see {@link com.example.asyncconfig.config.ConfigWatchService}). + */ +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/config/ConfigWatchService.java b/async-config-poll/src/main/java/com/example/asyncconfig/config/ConfigWatchService.java new file mode 100644 index 00000000..609c0329 --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/config/ConfigWatchService.java @@ -0,0 +1,163 @@ +package com.example.asyncconfig.config; + +import java.util.Map; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +/** + * Talks to a central config service in two distinct ways: + * + * 1. BOOT (blocking, one-time): on startup it fetches the required config + * buckets and the current app-config version + * (GET /v1/buckets/app-config?watch=false). If any of these fails the bean + * throws, so the Spring context fails to start — i.e. these are + * boot-blocking dependencies. Keploy records them as ordinary (synchronous) + * mocks and must serve them for the app to boot on replay. + * + * 2. WATCH (background long-poll): after boot, a daemon thread repeatedly + * long-polls the SAME endpoint with ?watch=true (carrying the last version) + * to pick up config changes. This egress fires from a background thread on + * its own schedule — i.e. it is async relative to the ingress testcases — + * so Keploy records and replays it through the async-egress engine (lane + * "config-watch", matched on watch=true; see keploy.yml). + */ +@Service +public class ConfigWatchService { + + private static final Logger log = LoggerFactory.getLogger(ConfigWatchService.class); + + private final String baseUrl; + private final long watchIntervalMs; + private final RestTemplate rt = new RestTemplate(); + + private volatile boolean featuresEnabled; + private volatile int appConfigVersion; + private volatile boolean watching = true; + + public ConfigWatchService(@Value("${app.config.baseUrl}") String baseUrl, + @Value("${app.config.watchIntervalMs:700}") long watchIntervalMs) { + this.baseUrl = baseUrl; + this.watchIntervalMs = watchIntervalMs; + } + + @PostConstruct + public void init() { + // (1) Boot-blocking, one-time. + fetchBucket("app-common"); + Map features = fetchBucket("app-features"); + Map appConfig = fetchBucket("app-config?watch=false"); // get current version + this.appConfigVersion = intFrom(appConfig, "version", 0); + // The config bucket carries flags under a nested "keys" map (see config-stub). + this.featuresEnabled = boolFromKeys(features, "feature.enabled", true); + log.info("ConfigWatchService initialized; featuresEnabled={} appConfigVersion={}", + featuresEnabled, appConfigVersion); + + // (2) Config watch. BLOCK_BOOT_ON_WATCH (replay-only) makes boot BLOCK + // synchronously on a watch=true long-poll — the Flipkart shape. With the + // old anchor-hold async engine this poll is parked at replay (its + // delivery anchored past the reachable window), so the app never becomes + // ready = boot deadlock; the value-epoch engine serves the startup epoch + // immediately so boot proceeds. When unset (the record path), the watch + // runs on a background daemon and does not block boot. + if ("true".equalsIgnoreCase(System.getenv("BLOCK_BOOT_ON_WATCH"))) { + String url = baseUrl + "/v1/buckets/app-config?watch=true&version=" + appConfigVersion; + log.info("BLOCK_BOOT_ON_WATCH: blocking boot on synchronous config watch {}", url); + @SuppressWarnings("unchecked") + Map resp = rt.getForObject(url, Map.class); + log.info("BLOCK_BOOT_ON_WATCH: synchronous config watch returned (version now {}); boot continues", + intFrom(resp, "version", appConfigVersion)); + } else { + // Background watch long-poll (record path). + startWatchPoller(); + } + } + + private void startWatchPoller() { + // WATCH_ONCE opens exactly ONE watch poll then stops the daemon. The + // httpPoll scenario uses it so the whole recording holds a single long + // poll (a server-timeout long-poll) rather than a stream of them; the + // default (unset) keeps the periodic-poller behavior. + final boolean watchOnce = "true".equalsIgnoreCase(System.getenv("WATCH_ONCE")); + Thread t = new Thread(() -> { + while (watching) { + try { + Thread.sleep(watchIntervalMs); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + return; + } + try { + String url = baseUrl + "/v1/buckets/app-config?watch=true&version=" + appConfigVersion; + @SuppressWarnings("unchecked") + Map resp = rt.getForObject(url, Map.class); + int v = intFrom(resp, "version", appConfigVersion); + if (v > appConfigVersion) { + appConfigVersion = v; + // Debug, not info: the poller runs forever and the version + // can advance on every poll, so info would flood normal runs. + log.debug("config watch: app-config advanced to version {}", v); + } + } catch (Exception e) { + // At replay the async engine keep-alives when nothing is + // armed; a failed poll is non-fatal to the running app. Pass + // the exception so a stack trace is available under DEBUG. + log.debug("config watch poll failed", e); + } + if (watchOnce) { + break; // single long-poll connection for the httpPoll scenario + } + } + }, "config-watch-poller"); + t.setDaemon(true); + t.start(); + } + + @PreDestroy + public void stop() { + watching = false; + } + + @SuppressWarnings("unchecked") + private Map fetchBucket(String name) { + String url = baseUrl + "/v1/buckets/" + name; + try { + return rt.getForObject(url, Map.class); + } catch (Exception e) { + throw new IllegalStateException( + "ConfigWatchService: failed to fetch config bucket '" + name + "' from " + url + + " — application cannot boot. Ensure the config service is reachable and " + + "that app.config.baseUrl points at it.", e); + } + } + + private static int intFrom(Map m, String key, int dflt) { + if (m == null || m.get(key) == null) { + return dflt; + } + try { + return Integer.parseInt(String.valueOf(m.get(key))); + } catch (NumberFormatException e) { + return dflt; + } + } + + /** Reads a boolean flag from the bucket's nested "keys" map (its real shape). */ + @SuppressWarnings("unchecked") + private static boolean boolFromKeys(Map bucket, String key, boolean dflt) { + if (bucket == null || !(bucket.get("keys") instanceof Map)) { + return dflt; + } + Object v = ((Map) bucket.get("keys")).get(key); + return v == null ? dflt : Boolean.parseBoolean(String.valueOf(v)); + } + + public boolean isFeaturesEnabled() { + return featuresEnabled; + } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/rest/JerseyConfig.java b/async-config-poll/src/main/java/com/example/asyncconfig/rest/JerseyConfig.java new file mode 100644 index 00000000..cda80bd7 --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/rest/JerseyConfig.java @@ -0,0 +1,18 @@ +package com.example.asyncconfig.rest; + +import com.example.asyncconfig.rules.HealthResource; +import com.example.asyncconfig.rules.RulesResource; +import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.stereotype.Component; + +/** + * Registers the JAX-RS resources with Jersey (the app's REST layer). Both + * /health and /rules are served here. + */ +@Component +public class JerseyConfig extends ResourceConfig { + public JerseyConfig() { + register(HealthResource.class); + register(RulesResource.class); + } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/rules/HealthResource.java b/async-config-poll/src/main/java/com/example/asyncconfig/rules/HealthResource.java new file mode 100644 index 00000000..af814812 --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/rules/HealthResource.java @@ -0,0 +1,52 @@ +package com.example.asyncconfig.rules; + +import java.util.LinkedHashMap; +import java.util.Map; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +/** + * /health — a small, deterministic health payload that also runs a real MySQL + * SELECT so the datastore is exercised (and mocked) on this endpoint too. It is + * served as a Jersey resource rather than via live actuator so the body is + * stable across record/replay (actuator's diskSpace.free changes between runs + * and would break replay matching). + */ +@Component +@Path("/health") +public class HealthResource { + + private final JdbcTemplate jdbc; + private final ObjectMapper mapper; + + @Autowired + public HealthResource(JdbcTemplate jdbc, ObjectMapper mapper) { + this.jdbc = jdbc; + this.mapper = mapper; + } + + @GET + @Produces("application/json;charset=UTF-8") + public Response health() throws Exception { + Integer hello = jdbc.queryForObject("SELECT 1", Integer.class); // exercises MySQL + + Map db = new LinkedHashMap<>(); + db.put("status", "UP"); + db.put("database", "MySQL"); + db.put("hello", hello); + + Map body = new LinkedHashMap<>(); + body.put("status", "UP"); + body.put("db", db); + + return Response.ok(mapper.writeValueAsString(body)).build(); + } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/rules/Rule.java b/async-config-poll/src/main/java/com/example/asyncconfig/rules/Rule.java new file mode 100644 index 00000000..beb64fef --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/rules/Rule.java @@ -0,0 +1,27 @@ +package com.example.asyncconfig.rules; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** A single rule: constraint expression + ordered action handlers. */ +public class Rule { + @JsonProperty("rule_id") + private long ruleId; + private String constraints; + private List actions; + @JsonProperty("rule_type") + private String ruleType; + + public Rule(long ruleId, String constraints, List actions, String ruleType) { + this.ruleId = ruleId; + this.constraints = constraints; + this.actions = actions; + this.ruleType = ruleType; + } + + public long getRuleId() { return ruleId; } + public String getConstraints() { return constraints; } + public List getActions() { return actions; } + public String getRuleType() { return ruleType; } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/rules/RuleAction.java b/async-config-poll/src/main/java/com/example/asyncconfig/rules/RuleAction.java new file mode 100644 index 00000000..e434d3b1 --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/rules/RuleAction.java @@ -0,0 +1,22 @@ +package com.example.asyncconfig.rules; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** One action handler within a rule (handler class + details + order). */ +public class RuleAction { + @JsonProperty("basic_action") + private String basicAction; + @JsonProperty("action_details") + private String actionDetails; + private int sequence; + + public RuleAction(String basicAction, String actionDetails, int sequence) { + this.basicAction = basicAction; + this.actionDetails = actionDetails; + this.sequence = sequence; + } + + public String getBasicAction() { return basicAction; } + public String getActionDetails() { return actionDetails; } + public int getSequence() { return sequence; } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/rules/RuleDao.java b/async-config-poll/src/main/java/com/example/asyncconfig/rules/RuleDao.java new file mode 100644 index 00000000..69204dc2 --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/rules/RuleDao.java @@ -0,0 +1,52 @@ +package com.example.asyncconfig.rules; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +/** + * Reads rules + their action handlers from MySQL for a (useCase, tenant). This + * is the primary datastore read the app performs — Keploy captures the MySQL + * wire traffic as mocks. + */ +@Repository +public class RuleDao { + + private final JdbcTemplate jdbc; + + public RuleDao(JdbcTemplate jdbc) { + this.jdbc = jdbc; + } + + /** Returns a single (use_case, tenant) group, or empty if none match. */ + public List rulesFor(String useCase, String tenant) { + List rules = jdbc.query( + "SELECT rule_id, constraint_expr AS constraints, rule_type FROM rules " + + "WHERE use_case = ? AND tenant = ? ORDER BY rule_id", + (rs, i) -> { + long ruleId = rs.getLong("rule_id"); + return new Rule(ruleId, rs.getString("constraints"), + actionsFor(ruleId), rs.getString("rule_type")); + }, + useCase, tenant); + + if (rules.isEmpty()) { + return Collections.emptyList(); + } + List out = new ArrayList<>(1); + out.add(new UseCaseRules(useCase, tenant, rules)); + return out; + } + + private List actionsFor(long ruleId) { + return jdbc.query( + "SELECT basic_action, action_details, seq AS sequence FROM rule_actions " + + "WHERE rule_id = ? ORDER BY seq", + (rs, i) -> new RuleAction(rs.getString("basic_action"), + rs.getString("action_details"), rs.getInt("sequence")), + ruleId); + } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/rules/RulesResource.java b/async-config-poll/src/main/java/com/example/asyncconfig/rules/RulesResource.java new file mode 100644 index 00000000..c1ff52bf --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/rules/RulesResource.java @@ -0,0 +1,70 @@ +package com.example.asyncconfig.rules; + +import java.util.List; + +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * Rule-engine endpoint: GET /rules/{useCase}. Requires the X-Tenant-Id and + * X-Agent-Id headers and returns the ordered rules for the (useCase, tenant), + * read from MySQL, e.g.: + *
+ * [{"use_case":"ORDER_FLOW","tenant":"ACME","rules":[
+ *   {"rule_id":14,"constraints":"...","rule_type":"POST","actions":[
+ *     {"basic_action":"...","action_details":"{}","sequence":1}]}]}]
+ * 
+ */ +@Component +@Path("/rules") +public class RulesResource { + + private final RuleDao ruleDao; + private final ObjectMapper mapper; + private final long delayMs; + + @Autowired + public RulesResource(RuleDao ruleDao, ObjectMapper mapper, + @Value("${app.rules.delayMs:0}") long delayMs) { + this.ruleDao = ruleDao; + this.mapper = mapper; + this.delayMs = delayMs; + } + + @GET + @Path("/{useCase}") + @Produces("application/json;charset=utf-8") + public Response rules(@PathParam("useCase") String useCase, + @HeaderParam("X-Tenant-Id") String tenantId, + @HeaderParam("X-Agent-Id") String agentId) throws Exception { + if (isBlank(tenantId) || isBlank(agentId)) { + return Response.status(Response.Status.BAD_REQUEST) + .type("application/json") + .entity("{\"error\":\"X-Tenant-Id and X-Agent-Id headers are required\"}") + .build(); + } + if (delayMs > 0) { + try { + Thread.sleep(delayMs); // widen the request window for the fast-poller demo + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + List result = ruleDao.rulesFor(useCase, tenantId); + String json = mapper.writeValueAsString(result); + return Response.ok(json).build(); + } + + private static boolean isBlank(String s) { + return s == null || s.trim().isEmpty(); + } +} diff --git a/async-config-poll/src/main/java/com/example/asyncconfig/rules/UseCaseRules.java b/async-config-poll/src/main/java/com/example/asyncconfig/rules/UseCaseRules.java new file mode 100644 index 00000000..8f86e233 --- /dev/null +++ b/async-config-poll/src/main/java/com/example/asyncconfig/rules/UseCaseRules.java @@ -0,0 +1,23 @@ +package com.example.asyncconfig.rules; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** One (use_case, tenant) group with its ordered rules. */ +public class UseCaseRules { + @JsonProperty("use_case") + private String useCase; + private String tenant; + private List rules; + + public UseCaseRules(String useCase, String tenant, List rules) { + this.useCase = useCase; + this.tenant = tenant; + this.rules = rules; + } + + public String getUseCase() { return useCase; } + public String getTenant() { return tenant; } + public List getRules() { return rules; } +} diff --git a/async-config-poll/src/main/resources/application.yml b/async-config-poll/src/main/resources/application.yml new file mode 100644 index 00000000..6c12965c --- /dev/null +++ b/async-config-poll/src/main/resources/application.yml @@ -0,0 +1,35 @@ +server: + port: 8080 + +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/ruledb?useSSL=false + username: app + password: app + # driver auto-detected: com.mysql.jdbc.Driver (Connector/J 5.1.x, managed by SB 1.5). + # Keep the pool tiny with no validation queries so MySQL traffic is lean and + # deterministic — important for a clean Keploy record/replay. + tomcat: + initial-size: 1 + max-active: 2 + max-idle: 1 + min-idle: 1 + test-on-borrow: false + test-on-return: false + test-while-idle: false + +app: + config: + # The config service the app boot-fetches from and then watches. + baseUrl: http://127.0.0.1:9100 + # Background watch long-poll interval. Lower it (e.g. WATCH_INTERVAL_MS=150) + # to make a poll land in the middle of a testcase during replay. + watchIntervalMs: ${WATCH_INTERVAL_MS:700} + rules: + # Artificial delay on GET /rules/{useCase}; widen it (RULES_DELAY_MS) so a + # fast watch poll can land while a testcase is still executing. + delayMs: ${RULES_DELAY_MS:0} + +logging: + level: + root: INFO diff --git a/dropwizard-dedup/.dockerignore b/dropwizard-dedup/.dockerignore new file mode 100644 index 00000000..a8ab0690 --- /dev/null +++ b/dropwizard-dedup/.dockerignore @@ -0,0 +1,13 @@ +target/* +!target/dropwizard-dedup.jar +!target/keploy-sdk.jar +!target/jacocoagent.jar +!target/classes/ +!target/classes/** +!target/dependency/ +!target/dependency/** +keploy/reports +dedupData.yaml +duplicates.yaml +replay-*.log +dedup-*.log diff --git a/dropwizard-dedup/.gitignore b/dropwizard-dedup/.gitignore new file mode 100644 index 00000000..eea631b8 --- /dev/null +++ b/dropwizard-dedup/.gitignore @@ -0,0 +1,3 @@ +/target/ +/*.log +/META-INF/ diff --git a/dropwizard-dedup/Dockerfile b/dropwizard-dedup/Dockerfile new file mode 100644 index 00000000..ff522a3c --- /dev/null +++ b/dropwizard-dedup/Dockerfile @@ -0,0 +1,17 @@ +ARG JAVA_VERSION=8 +FROM eclipse-temurin:${JAVA_VERSION}-jre + +WORKDIR /app + +RUN groupadd --gid 10001 appuser \ + && useradd --uid 10001 --gid 10001 --home-dir /home/appuser --create-home --shell /usr/sbin/nologin appuser + +COPY --chown=10001:10001 target/dropwizard-dedup.jar /app/app.jar +COPY --chown=10001:10001 target/classes /app/classes +COPY --chown=10001:10001 target/keploy-sdk.jar /app/keploy-sdk.jar +COPY --chown=10001:10001 target/jacocoagent.jar /app/jacocoagent.jar +COPY --chown=10001:10001 config.yml /app/config.yml +ENV KEPLOY_JAVA_CLASS_DIRS=/app/classes +EXPOSE 8080 +USER 10001:10001 +ENTRYPOINT ["java", "-javaagent:/app/keploy-sdk.jar", "-javaagent:/app/jacocoagent.jar=destfile=/tmp/jacoco.exec", "-jar", "/app/app.jar", "server", "/app/config.yml"] diff --git a/dropwizard-dedup/Dockerfile.classpath b/dropwizard-dedup/Dockerfile.classpath new file mode 100644 index 00000000..0e26748d --- /dev/null +++ b/dropwizard-dedup/Dockerfile.classpath @@ -0,0 +1,19 @@ +ARG JAVA_VERSION=8 +FROM eclipse-temurin:${JAVA_VERSION}-jre + +WORKDIR /app + +RUN groupadd --gid 10001 appuser \ + && useradd --uid 10001 --gid 10001 --home-dir /home/appuser --create-home --shell /usr/sbin/nologin appuser + +COPY --chown=10001:10001 target/classes /app/classes +COPY --chown=10001:10001 target/dependency /app/libs +COPY --chown=10001:10001 target/keploy-sdk.jar /app/keploy-sdk.jar +COPY --chown=10001:10001 target/jacocoagent.jar /app/jacocoagent.jar +COPY --chown=10001:10001 config.yml /app/config.yml + +ENV KEPLOY_JAVA_CLASS_DIRS=/app/classes + +EXPOSE 8080 +USER 10001:10001 +ENTRYPOINT ["java", "-javaagent:/app/keploy-sdk.jar", "-javaagent:/app/jacocoagent.jar=destfile=/tmp/jacoco.exec", "-cp", "/app/classes:/app/libs/*", "io.keploy.samples.dropwizarddedup.DropwizardDedupApplication", "server", "/app/config.yml"] diff --git a/dropwizard-dedup/Dockerfile.distroless b/dropwizard-dedup/Dockerfile.distroless new file mode 100644 index 00000000..12878bc8 --- /dev/null +++ b/dropwizard-dedup/Dockerfile.distroless @@ -0,0 +1,14 @@ +FROM gcr.io/distroless/java17-debian12:nonroot +WORKDIR /app + +COPY --chown=10001:10001 target/dropwizard-dedup.jar /app/app.jar +COPY --chown=10001:10001 target/classes /app/classes +COPY --chown=10001:10001 target/keploy-sdk.jar /app/keploy-sdk.jar +COPY --chown=10001:10001 target/jacocoagent.jar /app/jacocoagent.jar +COPY --chown=10001:10001 config.yml /app/config.yml + +ENV KEPLOY_JAVA_CLASS_DIRS=/app/classes + +EXPOSE 8080 +USER 10001:10001 +ENTRYPOINT ["java", "-javaagent:/app/keploy-sdk.jar", "-javaagent:/app/jacocoagent.jar=destfile=/tmp/jacoco.exec", "-jar", "/app/app.jar", "server", "/app/config.yml"] diff --git a/dropwizard-dedup/README.md b/dropwizard-dedup/README.md new file mode 100644 index 00000000..fb2b3faa --- /dev/null +++ b/dropwizard-dedup/README.md @@ -0,0 +1,26 @@ +# Dropwizard Dynamic Deduplication Sample + +This sample validates that Keploy Java dynamic deduplication works for a non-Spring Java service. The app is a Dropwizard/Jersey HTTP service and does not import or depend on the Keploy SDK at compile time. + +CI does not record this sample. The `keploy/` directory contains checked-in fixtures, so Enterprise CI only builds the app and runs replay with `--dedup`. When the sample behavior changes, record the fixtures locally and push the updated `keploy/` files. + +Build without Keploy on the compile classpath: + +```bash +mvn -B -DskipTests clean package +``` + +Build with the runtime Java agent copied into `target/keploy-sdk.jar`: + +```bash +mvn -B -DskipTests -Dkeploy.agent.version=2.0.6 clean package +``` + +Run with the agent: + +```bash +java \ + -javaagent:target/keploy-sdk.jar \ + -javaagent:target/jacocoagent.jar=destfile=/tmp/jacoco.exec \ + -jar target/dropwizard-dedup.jar server config.yml +``` diff --git a/dropwizard-dedup/config.yml b/dropwizard-dedup/config.yml new file mode 100644 index 00000000..540bcebc --- /dev/null +++ b/dropwizard-dedup/config.yml @@ -0,0 +1,12 @@ +server: + applicationConnectors: + - type: http + port: ${DW_HTTP_PORT:-8080} + adminConnectors: + - type: http + port: ${DW_ADMIN_PORT:-8081} + +logging: + level: WARN + appenders: + - type: console diff --git a/dropwizard-dedup/docker-compose.classpath.yml b/dropwizard-dedup/docker-compose.classpath.yml new file mode 100644 index 00000000..6c2b31c9 --- /dev/null +++ b/dropwizard-dedup/docker-compose.classpath.yml @@ -0,0 +1,4 @@ +services: + dropwizard-dedup: + build: + dockerfile: Dockerfile.classpath diff --git a/dropwizard-dedup/docker-compose.distroless.yml b/dropwizard-dedup/docker-compose.distroless.yml new file mode 100644 index 00000000..42cf8edb --- /dev/null +++ b/dropwizard-dedup/docker-compose.distroless.yml @@ -0,0 +1,4 @@ +services: + dropwizard-dedup: + build: + dockerfile: Dockerfile.distroless diff --git a/dropwizard-dedup/docker-compose.restricted.yml b/dropwizard-dedup/docker-compose.restricted.yml new file mode 100644 index 00000000..4db205be --- /dev/null +++ b/dropwizard-dedup/docker-compose.restricted.yml @@ -0,0 +1,7 @@ +services: + dropwizard-dedup: + read_only: true + cap_drop: + - ALL + security_opt: + - no-new-privileges:true diff --git a/dropwizard-dedup/docker-compose.yml b/dropwizard-dedup/docker-compose.yml new file mode 100644 index 00000000..f39df96e --- /dev/null +++ b/dropwizard-dedup/docker-compose.yml @@ -0,0 +1,13 @@ +services: + dropwizard-dedup: + image: ${JAVA_DEDUP_IMAGE:-dropwizard-dedup:local} + build: + context: . + dockerfile: Dockerfile + args: + JAVA_VERSION: ${JAVA_VERSION:-8} + environment: + KEPLOY_JAVA_DEDUP_DIAGNOSTICS: ${KEPLOY_JAVA_DEDUP_DIAGNOSTICS:-} + container_name: dedup-java + ports: + - "${JAVA_DEDUP_HOST_PORT:-8080}:8080" diff --git a/dropwizard-dedup/keploy.yml b/dropwizard-dedup/keploy.yml new file mode 100644 index 00000000..c756c59c --- /dev/null +++ b/dropwizard-dedup/keploy.yml @@ -0,0 +1,91 @@ +# Generated by Keploy (3-dev) +path: "" +appId: 0 +appName: "" +command: "" +templatize: + testSets: [] +port: 0 +proxyPort: 16789 +incomingProxyPort: 36789 +dnsPort: 26789 +debug: false +disableANSI: false +disableTele: false +generateGithubActions: false +containerName: "" +networkName: "" +buildDelay: 30 +test: + selectedTests: {} + ignoredTests: {} + globalNoise: + global: {} + test-sets: {} + replaceWith: + global: {} + test-sets: {} + delay: 5 + host: "localhost" + port: 0 + grpcPort: 0 + ssePort: 0 + protocol: + http: + port: 0 + sse: + port: 0 + grpc: + port: 0 + apiTimeout: 5 + skipCoverage: false + coverageReportPath: "" + ignoreOrdering: true + mongoPassword: "default@123" + language: "" + removeUnusedMocks: false + fallBackOnMiss: false + jacocoAgentPath: "" + basePath: "" + mocking: true + disableLineCoverage: false + disableMockUpload: false + useLocalMock: false + updateTemplate: false + mustPass: false + maxFailAttempts: 5 + maxFlakyChecks: 1 + protoFile: "" + protoDir: "" + protoInclude: [] + compareAll: false + updateTestMapping: false + disableAutoHeaderNoise: false + strictMockWindow: true + dedup: false + freezeTime: false + fuzzyMatch: false +record: + recordTimer: 0s + filters: [] + sync: false + memoryLimit: 0 +configPath: "" +bypassRules: [] +disableMapping: true +contract: + driven: "consumer" + mappings: + servicesMapping: {} + self: "s1" + services: [] + tests: [] + path: "" + download: false + generate: false +inCi: false +cmdType: "native" +enableTesting: false +inDocker: false +keployContainer: "keploy-v3" +keployNetwork: "keploy-network" diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-1.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-1.yaml new file mode 100644 index 00000000..7d02fab0 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-1.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-1 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-10.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-10.yaml new file mode 100644 index 00000000..bc4885d4 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-10.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=books&limit=2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 257 + body: '{"category":"books","limit":2,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=books&limit=2' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-100.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-100.yaml new file mode 100644 index 00000000..251fe49c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-100.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-100 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: globex + X-Request-Id: req-001 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 41 + body: '{"tenant":"globex","requestId":"req-001"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: globex' \ + --header 'X-Request-Id: req-001' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-101.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-101.yaml new file mode 100644 index 00000000..78fee226 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-101.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-101 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: globex + X-Request-Id: req-002 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 41 + body: '{"tenant":"globex","requestId":"req-002"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: globex' \ + --header 'X-Request-Id: req-002' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-102.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-102.yaml new file mode 100644 index 00000000..7e3a0656 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-102.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-102 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: globex + X-Request-Id: req-abc + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 41 + body: '{"tenant":"globex","requestId":"req-abc"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: globex' \ + --header 'X-Request-Id: req-abc' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-103.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-103.yaml new file mode 100644 index 00000000..eb10a72a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-103.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-103 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: globex + X-Request-Id: req-xyz + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 41 + body: '{"tenant":"globex","requestId":"req-xyz"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: globex' \ + --header 'X-Request-Id: req-xyz' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-104.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-104.yaml new file mode 100644 index 00000000..ff2c040b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-104.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-104 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: globex + X-Request-Id: missing + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 41 + body: '{"tenant":"globex","requestId":"missing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: globex' \ + --header 'X-Request-Id: missing' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-105.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-105.yaml new file mode 100644 index 00000000..98b20c05 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-105.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-105 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: umbrella + X-Request-Id: req-001 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 43 + body: '{"tenant":"umbrella","requestId":"req-001"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: umbrella' \ + --header 'X-Request-Id: req-001' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-106.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-106.yaml new file mode 100644 index 00000000..d091d98f --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-106.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-106 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: umbrella + X-Request-Id: req-002 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 43 + body: '{"tenant":"umbrella","requestId":"req-002"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: umbrella' \ + --header 'X-Request-Id: req-002' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-107.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-107.yaml new file mode 100644 index 00000000..ece7fe22 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-107.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-107 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: umbrella + X-Request-Id: req-abc + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 43 + body: '{"tenant":"umbrella","requestId":"req-abc"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: umbrella' \ + --header 'X-Request-Id: req-abc' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-108.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-108.yaml new file mode 100644 index 00000000..b1d3fc02 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-108.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-108 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: umbrella + X-Request-Id: req-xyz + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 43 + body: '{"tenant":"umbrella","requestId":"req-xyz"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: umbrella' \ + --header 'X-Request-Id: req-xyz' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-109.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-109.yaml new file mode 100644 index 00000000..2bcbd6c2 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-109.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-109 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: umbrella + X-Request-Id: missing + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 43 + body: '{"tenant":"umbrella","requestId":"missing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: umbrella' \ + --header 'X-Request-Id: missing' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-11.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-11.yaml new file mode 100644 index 00000000..032c96d1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-11.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=books&limit=3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 257 + body: '{"category":"books","limit":3,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=books&limit=3' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-110.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-110.yaml new file mode 100644 index 00000000..91b1559a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-110.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-110 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: soylent + X-Request-Id: req-001 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 42 + body: '{"tenant":"soylent","requestId":"req-001"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: soylent' \ + --header 'X-Request-Id: req-001' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-111.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-111.yaml new file mode 100644 index 00000000..39ed3d0d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-111.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-111 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: soylent + X-Request-Id: req-002 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 42 + body: '{"tenant":"soylent","requestId":"req-002"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: soylent' \ + --header 'X-Request-Id: req-002' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-112.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-112.yaml new file mode 100644 index 00000000..c79575dc --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-112.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-112 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: soylent + X-Request-Id: req-abc + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 42 + body: '{"tenant":"soylent","requestId":"req-abc"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: soylent' \ + --header 'X-Request-Id: req-abc' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-113.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-113.yaml new file mode 100644 index 00000000..44ecace9 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-113.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-113 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: soylent + X-Request-Id: req-xyz + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 42 + body: '{"tenant":"soylent","requestId":"req-xyz"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: soylent' \ + --header 'X-Request-Id: req-xyz' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-114.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-114.yaml new file mode 100644 index 00000000..9648aa13 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-114.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-114 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: soylent + X-Request-Id: missing + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 42 + body: '{"tenant":"soylent","requestId":"missing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: soylent' \ + --header 'X-Request-Id: missing' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-115.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-115.yaml new file mode 100644 index 00000000..74a1409c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-115.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-115 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/us-east/az1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 60 + body: '{"region":"us-east","zone":"az1","target":"us-east-az1-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/us-east/az1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-116.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-116.yaml new file mode 100644 index 00000000..1da568aa --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-116.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-116 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/us-east/az2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 60 + body: '{"region":"us-east","zone":"az2","target":"us-east-az2-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/us-east/az2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-117.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-117.yaml new file mode 100644 index 00000000..49d0991a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-117.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-117 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/us-east/az3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 60 + body: '{"region":"us-east","zone":"az3","target":"us-east-az3-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/us-east/az3 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-118.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-118.yaml new file mode 100644 index 00000000..dddf3a9d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-118.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-118 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/us-west/az1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 60 + body: '{"region":"us-west","zone":"az1","target":"us-west-az1-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/us-west/az1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-119.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-119.yaml new file mode 100644 index 00000000..06548685 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-119.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-119 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/us-west/az2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 60 + body: '{"region":"us-west","zone":"az2","target":"us-west-az2-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/us-west/az2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-12.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-12.yaml new file mode 100644 index 00000000..8d71d341 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-12.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=books&limit=5 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 257 + body: '{"category":"books","limit":5,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=books&limit=5' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-120.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-120.yaml new file mode 100644 index 00000000..c7220309 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-120.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-120 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/us-west/az3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 60 + body: '{"region":"us-west","zone":"az3","target":"us-west-az3-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/us-west/az3 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-121.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-121.yaml new file mode 100644 index 00000000..492a2057 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-121.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-121 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/eu-central/az1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 66 + body: '{"region":"eu-central","zone":"az1","target":"eu-central-az1-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/eu-central/az1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-122.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-122.yaml new file mode 100644 index 00000000..9627b812 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-122.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-122 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/eu-central/az2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 66 + body: '{"region":"eu-central","zone":"az2","target":"eu-central-az2-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/eu-central/az2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-123.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-123.yaml new file mode 100644 index 00000000..09dee79f --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-123.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-123 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/eu-central/az3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 66 + body: '{"region":"eu-central","zone":"az3","target":"eu-central-az3-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/eu-central/az3 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-124.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-124.yaml new file mode 100644 index 00000000..67d97067 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-124.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-124 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/ap-south/az1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 62 + body: '{"region":"ap-south","zone":"az1","target":"ap-south-az1-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/ap-south/az1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-125.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-125.yaml new file mode 100644 index 00000000..83490294 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-125.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-125 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/ap-south/az2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 62 + body: '{"region":"ap-south","zone":"az2","target":"ap-south-az2-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/ap-south/az2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-126.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-126.yaml new file mode 100644 index 00000000..ff5d648e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-126.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-126 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/routes/ap-south/az3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 62 + body: '{"region":"ap-south","zone":"az3","target":"ap-south-az3-api"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/routes/ap-south/az3 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-127.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-127.yaml new file mode 100644 index 00000000..a20e8ae3 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-127.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-127 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/content/html + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: text/html + Vary: Accept-Encoding + Content-Length: 19 + body: '

dropwizard

' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/content/html \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-128.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-128.yaml new file mode 100644 index 00000000..b9172ffd --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-128.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-128 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/content/html + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: text/html + Vary: Accept-Encoding + Content-Length: 19 + body: '

dropwizard

' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/content/html \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-129.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-129.yaml new file mode 100644 index 00000000..0fd0f926 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-129.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-129 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/content/html + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: text/html + Vary: Accept-Encoding + Content-Length: 19 + body: '

dropwizard

' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/content/html \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-13.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-13.yaml new file mode 100644 index 00000000..f3334d34 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-13.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-13 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=electronics&limit=1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 184 + body: '{"category":"electronics","limit":1,"items":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"}],"source":"warehouse-b"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=electronics&limit=1' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-130.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-130.yaml new file mode 100644 index 00000000..d5da0e01 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-130.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-130 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/content/html + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: text/html + Vary: Accept-Encoding + Content-Length: 19 + body: '

dropwizard

' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/platform/content/html \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-131.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-131.yaml new file mode 100644 index 00000000..c5326360 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-131.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-131 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/events + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"type": "signup", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 51 + body: '{"accepted":true,"type":"signup","normalized":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/platform/events \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"type": "signup", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-132.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-132.yaml new file mode 100644 index 00000000..f416fb88 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-132.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-132 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/events + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"type": "login", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 50 + body: '{"accepted":true,"type":"login","normalized":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/platform/events \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"type": "login", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-133.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-133.yaml new file mode 100644 index 00000000..9de8ced9 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-133.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-133 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/events + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"type": "purchase", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 53 + body: '{"accepted":true,"type":"purchase","normalized":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/platform/events \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"type": "purchase", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-134.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-134.yaml new file mode 100644 index 00000000..43ea15f6 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-134.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-134 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/platform/events + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"type": "logout", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 51 + body: '{"accepted":true,"type":"logout","normalized":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/platform/events \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"type": "logout", "actor": "user", "ts": "2026-04-30T00:00:00Z"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-135.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-135.yaml new file mode 100644 index 00000000..64fe43d9 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-135.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-135 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "BK-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"alice","sku":"BK-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "BK-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-136.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-136.yaml new file mode 100644 index 00000000..74235c2c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-136.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-136 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "BK-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"alice","sku":"BK-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "BK-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-137.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-137.yaml new file mode 100644 index 00000000..4ccd86c5 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-137.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-137 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "BK-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"alice","sku":"BK-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "BK-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-138.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-138.yaml new file mode 100644 index 00000000..d61249cf --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-138.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-138 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "BK-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"alice","sku":"BK-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "BK-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-139.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-139.yaml new file mode 100644 index 00000000..53a9ad17 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-139.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-139 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "EL-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"alice","sku":"EL-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "EL-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-14.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-14.yaml new file mode 100644 index 00000000..20805484 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-14.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-14 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=electronics&limit=2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 281 + body: '{"category":"electronics","limit":2,"items":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"EL-2","name":"USB-C Dock","category":"electronics","status":"available","price":"89.00"}],"source":"warehouse-b"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=electronics&limit=2' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-140.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-140.yaml new file mode 100644 index 00000000..27293808 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-140.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-140 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "EL-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"alice","sku":"EL-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "EL-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-141.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-141.yaml new file mode 100644 index 00000000..1a8bd685 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-141.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-141 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "EL-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"alice","sku":"EL-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "EL-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-142.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-142.yaml new file mode 100644 index 00000000..483dff77 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-142.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-142 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "alice", "sku": "EL-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"alice","sku":"EL-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "alice", "sku": "EL-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-143.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-143.yaml new file mode 100644 index 00000000..0249e2c1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-143.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-143 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "BK-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 143 + body: '{"orderId":"ORD-PRIORITY","customer":"bob","sku":"BK-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "BK-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-144.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-144.yaml new file mode 100644 index 00000000..67cf5b1f --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-144.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-144 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "BK-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 147 + body: '{"orderId":"ORD-STANDARD","customer":"bob","sku":"BK-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "BK-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-145.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-145.yaml new file mode 100644 index 00000000..b96184a5 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-145.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-145 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "BK-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 143 + body: '{"orderId":"ORD-PRIORITY","customer":"bob","sku":"BK-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "BK-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-146.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-146.yaml new file mode 100644 index 00000000..fb7a0726 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-146.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-146 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "BK-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 147 + body: '{"orderId":"ORD-STANDARD","customer":"bob","sku":"BK-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "BK-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-147.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-147.yaml new file mode 100644 index 00000000..3ca21bb7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-147.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-147 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "EL-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 143 + body: '{"orderId":"ORD-PRIORITY","customer":"bob","sku":"EL-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "EL-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-148.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-148.yaml new file mode 100644 index 00000000..be5f28da --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-148.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-148 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "EL-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 147 + body: '{"orderId":"ORD-STANDARD","customer":"bob","sku":"EL-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "EL-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-149.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-149.yaml new file mode 100644 index 00000000..5ea8bf3e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-149.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-149 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "EL-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 143 + body: '{"orderId":"ORD-PRIORITY","customer":"bob","sku":"EL-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "EL-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-15.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-15.yaml new file mode 100644 index 00000000..47fe8c5d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-15.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-15 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=electronics&limit=3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 281 + body: '{"category":"electronics","limit":3,"items":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"EL-2","name":"USB-C Dock","category":"electronics","status":"available","price":"89.00"}],"source":"warehouse-b"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=electronics&limit=3' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-150.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-150.yaml new file mode 100644 index 00000000..a317ebf1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-150.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-150 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "bob", "sku": "EL-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 147 + body: '{"orderId":"ORD-STANDARD","customer":"bob","sku":"EL-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "bob", "sku": "EL-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-151.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-151.yaml new file mode 100644 index 00000000..bb27f84c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-151.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-151 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "BK-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"carol","sku":"BK-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "BK-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-152.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-152.yaml new file mode 100644 index 00000000..5893d29a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-152.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-152 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "BK-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"carol","sku":"BK-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "BK-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-153.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-153.yaml new file mode 100644 index 00000000..c18e5e86 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-153.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-153 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "BK-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"carol","sku":"BK-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "BK-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-154.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-154.yaml new file mode 100644 index 00000000..2aed3e78 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-154.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-154 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "BK-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"carol","sku":"BK-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "BK-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-155.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-155.yaml new file mode 100644 index 00000000..53cd2340 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-155.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-155 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "EL-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"carol","sku":"EL-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "EL-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-156.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-156.yaml new file mode 100644 index 00000000..6c5bc30a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-156.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-156 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "EL-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"carol","sku":"EL-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "EL-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-157.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-157.yaml new file mode 100644 index 00000000..68fb25e0 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-157.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-157 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "EL-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 145 + body: '{"orderId":"ORD-PRIORITY","customer":"carol","sku":"EL-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "EL-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-158.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-158.yaml new file mode 100644 index 00000000..ea748c38 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-158.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-158 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "carol", "sku": "EL-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 149 + body: '{"orderId":"ORD-STANDARD","customer":"carol","sku":"EL-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "carol", "sku": "EL-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-159.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-159.yaml new file mode 100644 index 00000000..8b192f2b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-159.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-159 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "BK-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 144 + body: '{"orderId":"ORD-PRIORITY","customer":"dave","sku":"BK-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "BK-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-16.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-16.yaml new file mode 100644 index 00000000..fb0936b7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-16.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-16 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=electronics&limit=5 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 281 + body: '{"category":"electronics","limit":5,"items":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"EL-2","name":"USB-C Dock","category":"electronics","status":"available","price":"89.00"}],"source":"warehouse-b"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=electronics&limit=5' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-160.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-160.yaml new file mode 100644 index 00000000..47e38d16 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-160.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-160 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "BK-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 148 + body: '{"orderId":"ORD-STANDARD","customer":"dave","sku":"BK-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "BK-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-161.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-161.yaml new file mode 100644 index 00000000..22a93d7f --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-161.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-161 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "BK-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 144 + body: '{"orderId":"ORD-PRIORITY","customer":"dave","sku":"BK-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "BK-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-162.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-162.yaml new file mode 100644 index 00000000..6b823f8d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-162.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-162 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "BK-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 148 + body: '{"orderId":"ORD-STANDARD","customer":"dave","sku":"BK-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "BK-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-163.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-163.yaml new file mode 100644 index 00000000..6ccfdd66 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-163.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-163 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "EL-1", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 144 + body: '{"orderId":"ORD-PRIORITY","customer":"dave","sku":"EL-1","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "EL-1", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-164.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-164.yaml new file mode 100644 index 00000000..1b0d007e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-164.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-164 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "EL-1", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 148 + body: '{"orderId":"ORD-STANDARD","customer":"dave","sku":"EL-1","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "EL-1", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-165.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-165.yaml new file mode 100644 index 00000000..1cb7eda0 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-165.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-165 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "EL-2", "quantity": 2, "priority": true}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 144 + body: '{"orderId":"ORD-PRIORITY","customer":"dave","sku":"EL-2","quantity":2,"priority":true,"route":"air","checks":["inventory","pricing","expedite"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "EL-2", "quantity": 2, "priority": true}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-166.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-166.yaml new file mode 100644 index 00000000..3a7e69d9 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-166.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-166 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"customer": "dave", "sku": "EL-2", "quantity": 2, "priority": false}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 201 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 148 + body: '{"orderId":"ORD-STANDARD","customer":"dave","sku":"EL-2","quantity":2,"priority":false,"route":"ground","checks":["inventory","pricing","standard"]}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request POST \ + --url http://127.0.0.1:8080/orders \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"customer": "dave", "sku": "EL-2", "quantity": 2, "priority": false}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-167.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-167.yaml new file mode 100644 index 00000000..78549809 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-167.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-167 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-1?expand=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 87 + body: '{"orderId":"ORD-1","status":"packed","expand":true,"audit":["created","paid","packed"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-1?expand=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-168.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-168.yaml new file mode 100644 index 00000000..8361c73b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-168.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-168 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-1?expand=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 52 + body: '{"orderId":"ORD-1","status":"packed","expand":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-1?expand=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-169.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-169.yaml new file mode 100644 index 00000000..924dd6b0 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-169.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-169 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-42?expand=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 88 + body: '{"orderId":"ORD-42","status":"packed","expand":true,"audit":["created","paid","packed"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-42?expand=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-17.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-17.yaml new file mode 100644 index 00000000..766cc288 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-17.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-17 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=home&limit=1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 161 + body: '{"category":"home","limit":1,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=home&limit=1' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-170.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-170.yaml new file mode 100644 index 00000000..cff4cd73 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-170.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-170 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-42?expand=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 53 + body: '{"orderId":"ORD-42","status":"packed","expand":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-42?expand=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-171.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-171.yaml new file mode 100644 index 00000000..e687cecf --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-171.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-171 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-100?expand=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 89 + body: '{"orderId":"ORD-100","status":"packed","expand":true,"audit":["created","paid","packed"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-100?expand=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-172.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-172.yaml new file mode 100644 index 00000000..189e07f4 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-172.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-172 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-100?expand=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 54 + body: '{"orderId":"ORD-100","status":"packed","expand":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-100?expand=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-173.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-173.yaml new file mode 100644 index 00000000..c8eb7849 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-173.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-173 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-PRIORITY?expand=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 94 + body: '{"orderId":"ORD-PRIORITY","status":"packed","expand":true,"audit":["created","paid","packed"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-PRIORITY?expand=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-174.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-174.yaml new file mode 100644 index 00000000..65c4dc88 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-174.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-174 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-PRIORITY?expand=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 59 + body: '{"orderId":"ORD-PRIORITY","status":"packed","expand":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-PRIORITY?expand=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-175.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-175.yaml new file mode 100644 index 00000000..b65ea4f6 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-175.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-175 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-X9?expand=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 88 + body: '{"orderId":"ORD-X9","status":"packed","expand":true,"audit":["created","paid","packed"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-X9?expand=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-176.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-176.yaml new file mode 100644 index 00000000..745f7c44 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-176.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-176 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-X9?expand=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 53 + body: '{"orderId":"ORD-X9","status":"packed","expand":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-X9?expand=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-177.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-177.yaml new file mode 100644 index 00000000..939f1352 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-177.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-177 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-7?expand=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 87 + body: '{"orderId":"ORD-7","status":"packed","expand":true,"audit":["created","paid","packed"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-7?expand=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-178.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-178.yaml new file mode 100644 index 00000000..5afdc99a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-178.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-178 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-7?expand=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 52 + body: '{"orderId":"ORD-7","status":"packed","expand":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/orders/ORD-7?expand=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-179.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-179.yaml new file mode 100644 index 00000000..eb6b1311 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-179.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-179 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "shipped"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 53 + body: '{"orderId":"ORD-1","status":"shipped","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "shipped"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-18.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-18.yaml new file mode 100644 index 00000000..b4ab58ea --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-18.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-18 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=home&limit=2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 256 + body: '{"category":"home","limit":2,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=home&limit=2' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-180.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-180.yaml new file mode 100644 index 00000000..683a68b4 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-180.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-180 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "delivered"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 55 + body: '{"orderId":"ORD-1","status":"delivered","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "delivered"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-181.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-181.yaml new file mode 100644 index 00000000..b804220a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-181.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-181 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "cancelled"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 55 + body: '{"orderId":"ORD-1","status":"cancelled","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "cancelled"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-182.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-182.yaml new file mode 100644 index 00000000..746d152a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-182.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-182 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-42 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "shipped"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 54 + body: '{"orderId":"ORD-42","status":"shipped","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-42 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "shipped"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-183.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-183.yaml new file mode 100644 index 00000000..3dfdf9ab --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-183.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-183 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-42 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "delivered"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 56 + body: '{"orderId":"ORD-42","status":"delivered","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-42 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "delivered"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-184.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-184.yaml new file mode 100644 index 00000000..8c9d71fa --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-184.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-184 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-42 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "cancelled"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 56 + body: '{"orderId":"ORD-42","status":"cancelled","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-42 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "cancelled"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-185.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-185.yaml new file mode 100644 index 00000000..c415396d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-185.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-185 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-100 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "shipped"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 55 + body: '{"orderId":"ORD-100","status":"shipped","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-100 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "shipped"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-186.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-186.yaml new file mode 100644 index 00000000..54ba99ec --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-186.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-186 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-100 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "delivered"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 57 + body: '{"orderId":"ORD-100","status":"delivered","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-100 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "delivered"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-187.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-187.yaml new file mode 100644 index 00000000..0950f181 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-187.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-187 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-100 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "cancelled"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 57 + body: '{"orderId":"ORD-100","status":"cancelled","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-100 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "cancelled"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-188.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-188.yaml new file mode 100644 index 00000000..1bf93dd1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-188.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-188 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-PRIORITY + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "shipped"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 60 + body: '{"orderId":"ORD-PRIORITY","status":"shipped","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-PRIORITY \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "shipped"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-189.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-189.yaml new file mode 100644 index 00000000..211a86f7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-189.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-189 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-PRIORITY + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "delivered"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 62 + body: '{"orderId":"ORD-PRIORITY","status":"delivered","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-PRIORITY \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "delivered"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-19.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-19.yaml new file mode 100644 index 00000000..e641ee5e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-19.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-19 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=home&limit=3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 256 + body: '{"category":"home","limit":3,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=home&limit=3' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-190.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-190.yaml new file mode 100644 index 00000000..5cddb186 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-190.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-190 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-PRIORITY + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + Content-Type: application/json + body: '{"status": "cancelled"}' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 62 + body: '{"orderId":"ORD-PRIORITY","status":"cancelled","updated":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request PUT \ + --url http://127.0.0.1:8080/orders/ORD-PRIORITY \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data '{"status": "cancelled"}' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-191.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-191.yaml new file mode 100644 index 00000000..75342c6b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-191.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-191 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"orderId":"ORD-1","deleted":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://127.0.0.1:8080/orders/ORD-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-192.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-192.yaml new file mode 100644 index 00000000..3d161152 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-192.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-192 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-42 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 35 + body: '{"orderId":"ORD-42","deleted":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://127.0.0.1:8080/orders/ORD-42 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-193.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-193.yaml new file mode 100644 index 00000000..820d4f40 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-193.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-193 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-100 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 36 + body: '{"orderId":"ORD-100","deleted":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://127.0.0.1:8080/orders/ORD-100 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-194.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-194.yaml new file mode 100644 index 00000000..387a4126 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-194.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-194 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-PRIORITY + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 41 + body: '{"orderId":"ORD-PRIORITY","deleted":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://127.0.0.1:8080/orders/ORD-PRIORITY \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-195.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-195.yaml new file mode 100644 index 00000000..eb007c51 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-195.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-195 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/orders/ORD-X9 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 35 + body: '{"orderId":"ORD-X9","deleted":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://127.0.0.1:8080/orders/ORD-X9 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-196.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-196.yaml new file mode 100644 index 00000000..f08288e5 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-196.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-196 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-197.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-197.yaml new file mode 100644 index 00000000..e8627c3a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-197.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-197 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-198.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-198.yaml new file mode 100644 index 00000000..86f9992b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-198.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-198 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-199.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-199.yaml new file mode 100644 index 00000000..72a51e8c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-199.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-199 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-2.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-2.yaml new file mode 100644 index 00000000..75c49000 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-2.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-20.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-20.yaml new file mode 100644 index 00000000..3788183e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-20.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-20 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=home&limit=5 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 256 + body: '{"category":"home","limit":5,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=home&limit=5' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-200.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-200.yaml new file mode 100644 index 00000000..97f26661 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-200.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-200 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-21.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-21.yaml new file mode 100644 index 00000000..9ee95b79 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-21.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-21 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=outdoor&limit=1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 164 + body: '{"category":"outdoor","limit":1,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=outdoor&limit=1' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-22.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-22.yaml new file mode 100644 index 00000000..735ffe9a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-22.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-22 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=outdoor&limit=2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 259 + body: '{"category":"outdoor","limit":2,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=outdoor&limit=2' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-23.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-23.yaml new file mode 100644 index 00000000..c2bd9bcc --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-23.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-23 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=outdoor&limit=3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 259 + body: '{"category":"outdoor","limit":3,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=outdoor&limit=3' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-24.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-24.yaml new file mode 100644 index 00000000..9c8ef51b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-24.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-24 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=outdoor&limit=5 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 259 + body: '{"category":"outdoor","limit":5,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=outdoor&limit=5' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-25.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-25.yaml new file mode 100644 index 00000000..8b6b3657 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-25.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-25 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 257 + body: '{"category":"books","limit":2,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"},{"sku":"BK-2","name":"Effective Java","category":"books","status":"available","price":"45.00"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-26.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-26.yaml new file mode 100644 index 00000000..550a9f79 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-26.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-26 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/BK-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 98 + body: '{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/BK-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-27.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-27.yaml new file mode 100644 index 00000000..a7082483 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-27.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-27 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/BK-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 98 + body: '{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/BK-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-28.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-28.yaml new file mode 100644 index 00000000..7cdced5d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-28.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-28 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/BK-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 98 + body: '{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/BK-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-29.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-29.yaml new file mode 100644 index 00000000..e968df60 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-29.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-29 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/BK-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/BK-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-3.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-3.yaml new file mode 100644 index 00000000..7f3d74be --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-3.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-30.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-30.yaml new file mode 100644 index 00000000..d55afb01 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-30.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-30 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/BK-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/BK-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-31.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-31.yaml new file mode 100644 index 00000000..9f118002 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-31.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-31 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/BK-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/BK-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-32.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-32.yaml new file mode 100644 index 00000000..f9bf0725 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-32.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-32 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/EL-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 114 + body: '{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/EL-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-33.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-33.yaml new file mode 100644 index 00000000..d743ec6c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-33.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-33 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/EL-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 114 + body: '{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/EL-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-34.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-34.yaml new file mode 100644 index 00000000..01511c53 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-34.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-34 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/EL-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 114 + body: '{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/EL-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-35.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-35.yaml new file mode 100644 index 00000000..39501f27 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-35.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-35 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/EL-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/EL-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-36.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-36.yaml new file mode 100644 index 00000000..9d88ca52 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-36.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-36 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/EL-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/EL-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-37.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-37.yaml new file mode 100644 index 00000000..7f767c59 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-37.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-37 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/EL-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/EL-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-38.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-38.yaml new file mode 100644 index 00000000..7a13fce1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-38.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-38 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/HM-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/HM-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-39.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-39.yaml new file mode 100644 index 00000000..35675f3e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-39.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-39 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/HM-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/HM-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-4.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-4.yaml new file mode 100644 index 00000000..3519e28f --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-4.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-40.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-40.yaml new file mode 100644 index 00000000..8adb173a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-40.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-40 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/HM-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/HM-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-41.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-41.yaml new file mode 100644 index 00000000..42e3d5d4 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-41.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-41 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/HM-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/HM-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-42.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-42.yaml new file mode 100644 index 00000000..bfd823cf --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-42.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-42 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/HM-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/HM-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-43.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-43.yaml new file mode 100644 index 00000000..e8164158 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-43.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-43 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/HM-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/HM-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-44.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-44.yaml new file mode 100644 index 00000000..4d041b52 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-44.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-44 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/OD-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/OD-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-45.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-45.yaml new file mode 100644 index 00000000..f804fe70 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-45.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-45 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/OD-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/OD-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-46.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-46.yaml new file mode 100644 index 00000000..b2cb4093 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-46.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-46 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/OD-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/OD-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-47.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-47.yaml new file mode 100644 index 00000000..8316629b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-47.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-47 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/OD-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/OD-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-48.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-48.yaml new file mode 100644 index 00000000..93e18045 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-48.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-48 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/OD-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/OD-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-49.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-49.yaml new file mode 100644 index 00000000..00da2749 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-49.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-49 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/OD-2 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/OD-2 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-5.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-5.yaml new file mode 100644 index 00000000..43113dde --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-5.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-50.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-50.yaml new file mode 100644 index 00000000..47e6a7bb --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-50.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-50 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/MISSING + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/MISSING \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-51.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-51.yaml new file mode 100644 index 00000000..1ab01e62 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-51.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-51 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/NOPE + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/NOPE \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-52.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-52.yaml new file mode 100644 index 00000000..aafae1b7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-52.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-52 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/ZZ-9 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/ZZ-9 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-53.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-53.yaml new file mode 100644 index 00000000..d38bb6d1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-53.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-53 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/FOO + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/FOO \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-54.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-54.yaml new file mode 100644 index 00000000..798c460b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-54.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-54 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog/X-1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 404 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 34 + body: '{"error":"not_found","status":404}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/catalog/X-1 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-55.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-55.yaml new file mode 100644 index 00000000..6affdb04 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-55.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-55 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=phone&sort=relevance + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 286 + body: '{"term":"phone","sort":"relevance","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=phone&sort=relevance' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-56.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-56.yaml new file mode 100644 index 00000000..9a41d9e1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-56.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-56 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=phone&sort=price + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 281 + body: '{"term":"phone","sort":"price","ranking":"discount-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=phone&sort=price' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-57.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-57.yaml new file mode 100644 index 00000000..54a8c69b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-57.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-57 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=phone&sort=popularity + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 287 + body: '{"term":"phone","sort":"popularity","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=phone&sort=popularity' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-58.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-58.yaml new file mode 100644 index 00000000..432da8e1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-58.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-58 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=phone&sort=newest + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 283 + body: '{"term":"phone","sort":"newest","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=phone&sort=newest' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-59.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-59.yaml new file mode 100644 index 00000000..e9425aa7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-59.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-59 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=book&sort=relevance + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 285 + body: '{"term":"book","sort":"relevance","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=book&sort=relevance' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-6.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-6.yaml new file mode 100644 index 00000000..43c254c3 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-6.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-60.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-60.yaml new file mode 100644 index 00000000..83a18ddc --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-60.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-60 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=book&sort=price + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 280 + body: '{"term":"book","sort":"price","ranking":"discount-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=book&sort=price' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-61.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-61.yaml new file mode 100644 index 00000000..6749d076 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-61.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-61 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=book&sort=popularity + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 286 + body: '{"term":"book","sort":"popularity","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=book&sort=popularity' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-62.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-62.yaml new file mode 100644 index 00000000..bb13878e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-62.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-62 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=book&sort=newest + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 282 + body: '{"term":"book","sort":"newest","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=book&sort=newest' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-63.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-63.yaml new file mode 100644 index 00000000..87c2a164 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-63.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-63 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=tent&sort=relevance + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 285 + body: '{"term":"tent","sort":"relevance","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=tent&sort=relevance' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-64.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-64.yaml new file mode 100644 index 00000000..e23267c6 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-64.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-64 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=tent&sort=price + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 280 + body: '{"term":"tent","sort":"price","ranking":"discount-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=tent&sort=price' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-65.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-65.yaml new file mode 100644 index 00000000..07502596 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-65.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-65 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=tent&sort=popularity + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 286 + body: '{"term":"tent","sort":"popularity","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=tent&sort=popularity' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-66.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-66.yaml new file mode 100644 index 00000000..309dde83 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-66.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-66 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=tent&sort=newest + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 282 + body: '{"term":"tent","sort":"newest","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=tent&sort=newest' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-67.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-67.yaml new file mode 100644 index 00000000..96587301 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-67.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-67 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=speaker&sort=relevance + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 288 + body: '{"term":"speaker","sort":"relevance","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=speaker&sort=relevance' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-68.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-68.yaml new file mode 100644 index 00000000..c1fb1bd5 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-68.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-68 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=speaker&sort=price + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 283 + body: '{"term":"speaker","sort":"price","ranking":"discount-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=speaker&sort=price' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-69.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-69.yaml new file mode 100644 index 00000000..2a1986e9 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-69.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-69 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=speaker&sort=popularity + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 289 + body: '{"term":"speaker","sort":"popularity","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=speaker&sort=popularity' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-7.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-7.yaml new file mode 100644 index 00000000..245a5de1 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-7.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-70.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-70.yaml new file mode 100644 index 00000000..6c0f430b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-70.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-70 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=speaker&sort=newest + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 285 + body: '{"term":"speaker","sort":"newest","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=speaker&sort=newest' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-71.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-71.yaml new file mode 100644 index 00000000..ea0839c3 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-71.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-71 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=kettle&sort=relevance + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 287 + body: '{"term":"kettle","sort":"relevance","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=kettle&sort=relevance' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-72.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-72.yaml new file mode 100644 index 00000000..e12da494 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-72.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-72 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=kettle&sort=price + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 282 + body: '{"term":"kettle","sort":"price","ranking":"discount-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=kettle&sort=price' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-73.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-73.yaml new file mode 100644 index 00000000..0bb2a4ac --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-73.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-73 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=kettle&sort=popularity + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 288 + body: '{"term":"kettle","sort":"popularity","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=kettle&sort=popularity' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-74.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-74.yaml new file mode 100644 index 00000000..4af07af0 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-74.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-74 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=kettle&sort=newest + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 284 + body: '{"term":"kettle","sort":"newest","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=kettle&sort=newest' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-75.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-75.yaml new file mode 100644 index 00000000..f9dac3d7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-75.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-75 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=lamp&sort=relevance + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 285 + body: '{"term":"lamp","sort":"relevance","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=lamp&sort=relevance' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-76.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-76.yaml new file mode 100644 index 00000000..38301233 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-76.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-76 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=lamp&sort=price + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 280 + body: '{"term":"lamp","sort":"price","ranking":"discount-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=lamp&sort=price' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-77.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-77.yaml new file mode 100644 index 00000000..ea858e5b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-77.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-77 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=lamp&sort=popularity + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 286 + body: '{"term":"lamp","sort":"popularity","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=lamp&sort=popularity' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-78.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-78.yaml new file mode 100644 index 00000000..6af8993c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-78.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-78 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=lamp&sort=newest + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 282 + body: '{"term":"lamp","sort":"newest","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=lamp&sort=newest' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-79.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-79.yaml new file mode 100644 index 00000000..4dbb7278 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-79.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-79 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=knife&sort=relevance + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 286 + body: '{"term":"knife","sort":"relevance","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=knife&sort=relevance' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-8.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-8.yaml new file mode 100644 index 00000000..81ffc03b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-8.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 16 + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-80.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-80.yaml new file mode 100644 index 00000000..923686cb --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-80.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-80 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=knife&sort=price + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 281 + body: '{"term":"knife","sort":"price","ranking":"discount-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=knife&sort=price' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-81.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-81.yaml new file mode 100644 index 00000000..2ed2132f --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-81.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-81 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=knife&sort=popularity + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 287 + body: '{"term":"knife","sort":"popularity","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=knife&sort=popularity' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-82.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-82.yaml new file mode 100644 index 00000000..0bee3f07 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-82.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-82 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?term=knife&sort=newest + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 283 + body: '{"term":"knife","sort":"newest","ranking":"relevance-first","hits":[{"sku":"EL-1","name":"Noise Cancelling Headphones","category":"electronics","status":"backorder","price":"199.99"},{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/search?term=knife&sort=newest' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-83.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-83.yaml new file mode 100644 index 00000000..273a878b --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-83.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-83 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/reports/2026/q1.csv?download=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 57 + body: '{"requested_file":"/reports/2026/q1.csv","download":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/reports/2026/q1.csv?download=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-84.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-84.yaml new file mode 100644 index 00000000..e6b96f3d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-84.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-84 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/reports/2026/q1.csv?download=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 58 + body: '{"requested_file":"/reports/2026/q1.csv","download":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/reports/2026/q1.csv?download=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-85.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-85.yaml new file mode 100644 index 00000000..f7076d29 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-85.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-85 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/reports/2025/q4.csv?download=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 57 + body: '{"requested_file":"/reports/2025/q4.csv","download":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/reports/2025/q4.csv?download=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-86.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-86.yaml new file mode 100644 index 00000000..8d72168d --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-86.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-86 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/reports/2025/q4.csv?download=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 58 + body: '{"requested_file":"/reports/2025/q4.csv","download":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/reports/2025/q4.csv?download=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-87.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-87.yaml new file mode 100644 index 00000000..c933ddf7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-87.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-87 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/exports/users.json?download=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 56 + body: '{"requested_file":"/exports/users.json","download":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/exports/users.json?download=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-88.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-88.yaml new file mode 100644 index 00000000..d612e4bf --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-88.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-88 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/exports/users.json?download=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 57 + body: '{"requested_file":"/exports/users.json","download":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/exports/users.json?download=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-89.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-89.yaml new file mode 100644 index 00000000..d4e25536 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-89.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-89 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/logs/app.log?download=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 50 + body: '{"requested_file":"/logs/app.log","download":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/logs/app.log?download=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-9.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-9.yaml new file mode 100644 index 00000000..767c224a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-9.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/catalog?category=books&limit=1 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 162 + body: '{"category":"books","limit":1,"items":[{"sku":"BK-1","name":"Clean Architecture","category":"books","status":"available","price":"32.50"}],"source":"warehouse-a"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/catalog?category=books&limit=1' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-90.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-90.yaml new file mode 100644 index 00000000..79f9c464 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-90.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-90 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/logs/app.log?download=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 51 + body: '{"requested_file":"/logs/app.log","download":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/logs/app.log?download=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-91.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-91.yaml new file mode 100644 index 00000000..25e4171f --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-91.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-91 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/media/banner.png?download=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 54 + body: '{"requested_file":"/media/banner.png","download":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/media/banner.png?download=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-92.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-92.yaml new file mode 100644 index 00000000..bd98cd6c --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-92.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-92 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/media/banner.png?download=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Content-Length: 55 + body: '{"requested_file":"/media/banner.png","download":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/media/banner.png?download=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-93.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-93.yaml new file mode 100644 index 00000000..20a6e90e --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-93.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-93 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/exports/orders/2026-04.csv?download=true + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 64 + body: '{"requested_file":"/exports/orders/2026-04.csv","download":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/exports/orders/2026-04.csv?download=true' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-94.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-94.yaml new file mode 100644 index 00000000..ddf854fa --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-94.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-94 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/files/exports/orders/2026-04.csv?download=false + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 65 + body: '{"requested_file":"/exports/orders/2026-04.csv","download":false}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/files/exports/orders/2026-04.csv?download=false' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-95.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-95.yaml new file mode 100644 index 00000000..d2fc494a --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-95.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-95 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: acme + X-Request-Id: req-001 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 39 + body: '{"tenant":"acme","requestId":"req-001"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: acme' \ + --header 'X-Request-Id: req-001' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-96.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-96.yaml new file mode 100644 index 00000000..7d0b25b7 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-96.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-96 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: acme + X-Request-Id: req-002 + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 39 + body: '{"tenant":"acme","requestId":"req-002"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: acme' \ + --header 'X-Request-Id: req-002' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-97.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-97.yaml new file mode 100644 index 00000000..a679f5d4 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-97.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-97 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: acme + X-Request-Id: req-abc + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 39 + body: '{"tenant":"acme","requestId":"req-abc"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: acme' \ + --header 'X-Request-Id: req-abc' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-98.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-98.yaml new file mode 100644 index 00000000..0d162462 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-98.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-98 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: acme + X-Request-Id: req-xyz + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 39 + body: '{"tenant":"acme","requestId":"req-xyz"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: acme' \ + --header 'X-Request-Id: req-xyz' diff --git a/dropwizard-dedup/keploy/test-set-0/tests/test-99.yaml b/dropwizard-dedup/keploy/test-set-0/tests/test-99.yaml new file mode 100644 index 00000000..af2fbf43 --- /dev/null +++ b/dropwizard-dedup/keploy/test-set-0/tests/test-99.yaml @@ -0,0 +1,47 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-99 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/headers + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + X-Tenant: acme + X-Request-Id: missing + body: '' + timestamp: 2026-04-30T21:29:55Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 21:29:55 GMT' + Content-Type: application/json + Vary: Accept-Encoding + Content-Length: 39 + body: '{"tenant":"acme","requestId":"missing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T21:29:55Z + objects: [] + assertions: + noise: + header.Date: [] + header.Vary: [] + header.Content-Length: [] + created: 1777584595 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/headers \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'X-Tenant: acme' \ + --header 'X-Request-Id: missing' diff --git a/dropwizard-dedup/pom.xml b/dropwizard-dedup/pom.xml new file mode 100644 index 00000000..c799b847 --- /dev/null +++ b/dropwizard-dedup/pom.xml @@ -0,0 +1,150 @@ + + + 4.0.0 + + io.keploy.samples + dropwizard-dedup + 1.0.0 + dropwizard-dedup + Keploy Java dynamic deduplication Dropwizard sample + + + 2.1.12 + 0.8.12 + 1.8 + 1.8 + UTF-8 + + + + + + io.dropwizard + dropwizard-dependencies + ${dropwizard.version} + pom + import + + + + + + + io.dropwizard + dropwizard-core + + + + + dropwizard-dedup + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + false + + + + io.keploy.samples.dropwizarddedup.DropwizardDedupApplication + + + + + + package + + shade + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + copy-jacoco-agent + package + + copy + + + + + org.jacoco + org.jacoco.agent + ${jacoco.version} + runtime + jar + ${project.build.directory} + jacocoagent.jar + + + + + + copy-runtime-dependencies + package + + copy-dependencies + + + runtime + ${project.build.directory}/dependency + + + + + + + + + + copy-keploy-agent + + + keploy.agent.version + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + copy-keploy-java-agent + package + + copy + + + + + io.keploy + keploy-sdk + ${keploy.agent.version} + ${project.build.directory} + keploy-sdk.jar + + + + + + + + + + + diff --git a/dropwizard-dedup/run_random_200.sh b/dropwizard-dedup/run_random_200.sh new file mode 100755 index 00000000..d3128e1f --- /dev/null +++ b/dropwizard-dedup/run_random_200.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +# Drives the dropwizard-dedup sample with a varied request mix so that +# `keploy record` ends up with ~200 testcases that exercise every +# resource path. Mirrors java-dedup/run_random_1000.sh. +# +# Usage (during a keploy record session): +# bash run_random_200.sh + +BASE_URL="${BASE_URL:-http://127.0.0.1:8080}" +TOTAL_REQUESTS="${TOTAL_REQUESTS:-200}" + +categories=(books electronics home outdoor) +skus_ok=(BK-1 BK-2 EL-1 EL-2 HM-1 HM-2 OD-1 OD-2) +skus_missing=(MISSING NOPE ZZ-9 FOO X-1) +search_terms=(phone book tent speaker kettle lamp knife) +sorts=(relevance price popularity newest) +file_paths=( + "reports/2026/q1.csv" + "reports/2025/q4.csv" + "exports/users.json" + "logs/app.log" + "media/banner.png" + "exports/orders/2026-04.csv" +) +order_ids=(ORD-1 ORD-42 ORD-100 ORD-PRIORITY ORD-X9 ORD-7) +regions=(us-east us-west eu-central ap-south) +zones=(az1 az2 az3) +tenants=(acme globex umbrella soylent) +request_ids=(req-001 req-002 req-abc req-xyz missing) +event_types=(signup login purchase logout) +customers=(alice bob carol dave) + +pick() { local -n a=$1; echo "${a[$((RANDOM % ${#a[@]}))]}"; } + +requests=() +for _ in $(seq 1 8); do requests+=("GET /healthz"); done +for c in "${categories[@]}"; do for l in 1 2 3 5; do requests+=("GET /catalog?category=$c&limit=$l"); done; done +requests+=("GET /catalog") +for sku in "${skus_ok[@]}"; do for _ in 1 2 3; do requests+=("GET /catalog/$sku"); done; done +for sku in "${skus_missing[@]}"; do requests+=("GET /catalog/$sku"); done +for t in "${search_terms[@]}"; do for s in "${sorts[@]}"; do requests+=("GET /search?term=$t&sort=$s"); done; done +for fp in "${file_paths[@]}"; do for d in true false; do requests+=("GET /files/$fp?download=$d"); done; done +for t in "${tenants[@]}"; do for r in "${request_ids[@]}"; do requests+=("HEADERS $t $r"); done; done +for r in "${regions[@]}"; do for z in "${zones[@]}"; do requests+=("GET /platform/routes/$r/$z"); done; done +for _ in 1 2 3 4; do requests+=("GET /platform/content/html"); done +for t in "${event_types[@]}"; do requests+=("EVENT $t"); done +for cust in "${customers[@]}"; do for sku in BK-1 BK-2 EL-1 EL-2; do for prio in true false; do requests+=("ORDER $cust $sku $prio"); done; done; done +for oid in "${order_ids[@]}"; do for ex in true false; do requests+=("GET /orders/$oid?expand=$ex"); done; done +for oid in "${order_ids[@]:0:4}"; do for st in shipped delivered cancelled; do requests+=("PUT /orders/$oid $st"); done; done +for oid in "${order_ids[@]:0:5}"; do requests+=("DELETE /orders/$oid"); done + +# Trim or pad to TOTAL_REQUESTS +while (( ${#requests[@]} < TOTAL_REQUESTS )); do requests+=("GET /healthz"); done +requests=("${requests[@]:0:$TOTAL_REQUESTS}") + +issued=0 +for spec in "${requests[@]}"; do + set -- $spec + case "$1" in + GET) + curl -s -o /dev/null -w "%{http_code} GET %{url_effective}\n" "$BASE_URL$2" + ;; + PUT) + curl -s -o /dev/null -w "%{http_code} PUT %{url_effective}\n" -X PUT \ + -H 'Content-Type: application/json' -d "{\"status\":\"$3\"}" "$BASE_URL$2" + ;; + DELETE) + curl -s -o /dev/null -w "%{http_code} DELETE %{url_effective}\n" -X DELETE "$BASE_URL$2" + ;; + HEADERS) + curl -s -o /dev/null -w "%{http_code} GET %{url_effective}\n" \ + -H "X-Tenant: $2" -H "X-Request-Id: $3" "$BASE_URL/headers" + ;; + EVENT) + curl -s -o /dev/null -w "%{http_code} POST %{url_effective}\n" -X POST \ + -H 'Content-Type: application/json' \ + -d "{\"type\":\"$2\",\"actor\":\"user\",\"ts\":\"2026-04-30T00:00:00Z\"}" \ + "$BASE_URL/platform/events" + ;; + ORDER) + curl -s -o /dev/null -w "%{http_code} POST %{url_effective}\n" -X POST \ + -H 'Content-Type: application/json' \ + -d "{\"customer\":\"$2\",\"sku\":\"$3\",\"quantity\":2,\"priority\":$4}" \ + "$BASE_URL/orders" + ;; + esac + issued=$((issued + 1)) +done + +echo "issued $issued requests" diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/DropwizardDedupApplication.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/DropwizardDedupApplication.java new file mode 100644 index 00000000..21e46788 --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/DropwizardDedupApplication.java @@ -0,0 +1,43 @@ +package io.keploy.samples.dropwizarddedup; + +import io.dropwizard.Application; +import io.dropwizard.configuration.EnvironmentVariableSubstitutor; +import io.dropwizard.configuration.SubstitutingSourceProvider; +import io.dropwizard.setup.Bootstrap; +import io.dropwizard.setup.Environment; +import io.keploy.samples.dropwizarddedup.core.CatalogService; +import io.keploy.samples.dropwizarddedup.errors.ApiExceptionMapper; +import io.keploy.samples.dropwizarddedup.health.ApplicationHealthCheck; +import io.keploy.samples.dropwizarddedup.resources.InventoryResource; +import io.keploy.samples.dropwizarddedup.resources.OrderResource; +import io.keploy.samples.dropwizarddedup.resources.PlatformResource; + +public class DropwizardDedupApplication extends Application { + + public static void main(String[] args) throws Exception { + new DropwizardDedupApplication().run(args); + } + + @Override + public String getName() { + return "dropwizard-dedup"; + } + + @Override + public void initialize(Bootstrap bootstrap) { + bootstrap.setConfigurationSourceProvider(new SubstitutingSourceProvider( + bootstrap.getConfigurationSourceProvider(), + new EnvironmentVariableSubstitutor(false) + )); + } + + @Override + public void run(DropwizardDedupConfiguration configuration, Environment environment) { + CatalogService catalogService = new CatalogService(); + environment.jersey().register(new InventoryResource(catalogService)); + environment.jersey().register(new OrderResource(catalogService)); + environment.jersey().register(new PlatformResource()); + environment.jersey().register(new ApiExceptionMapper()); + environment.healthChecks().register("application", new ApplicationHealthCheck()); + } +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/DropwizardDedupConfiguration.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/DropwizardDedupConfiguration.java new file mode 100644 index 00000000..77ec425e --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/DropwizardDedupConfiguration.java @@ -0,0 +1,6 @@ +package io.keploy.samples.dropwizarddedup; + +import io.dropwizard.Configuration; + +public class DropwizardDedupConfiguration extends Configuration { +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/core/CatalogService.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/core/CatalogService.java new file mode 100644 index 00000000..c842d704 --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/core/CatalogService.java @@ -0,0 +1,97 @@ +package io.keploy.samples.dropwizarddedup.core; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class CatalogService { + + public Map catalog(String category, int limit) { + Map response = map( + "category", category, + "limit", limit + ); + response.put("items", selectItems(category, limit)); + response.put("source", category.equals("electronics") ? "warehouse-b" : "warehouse-a"); + return response; + } + + public Map item(String sku) { + if ("BK-1".equals(sku)) { + return item("BK-1", "Clean Architecture", "books", "available", "32.50"); + } + if ("EL-1".equals(sku)) { + return item("EL-1", "Noise Cancelling Headphones", "electronics", "backorder", "199.99"); + } + return null; + } + + public Map search(String term, String sort) { + Map response = map("term", term, "sort", sort); + response.put("ranking", "price".equals(sort) ? "discount-first" : "relevance-first"); + response.put("hits", Arrays.asList( + item("EL-1", "Noise Cancelling Headphones", "electronics", "backorder", "199.99"), + item("BK-1", "Clean Architecture", "books", "available", "32.50") + )); + return response; + } + + public Map order(String customer, String sku, int quantity, boolean priority) { + Map response = map( + "orderId", priority ? "ORD-PRIORITY" : "ORD-STANDARD", + "customer", customer, + "sku", sku, + "quantity", quantity, + "priority", priority, + "route", priority ? "air" : "ground" + ); + response.put("checks", Arrays.asList("inventory", "pricing", priority ? "expedite" : "standard")); + return response; + } + + public Map orderStatus(String orderId, boolean expand) { + Map response = map( + "orderId", orderId, + "status", "packed", + "expand", expand + ); + if (expand) { + response.put("audit", Arrays.asList("created", "paid", "packed")); + } + return response; + } + + public Map updateOrder(String orderId, String status) { + return map("orderId", orderId, "status", status, "updated", true); + } + + public Map deleteOrder(String orderId) { + return map("orderId", orderId, "deleted", true); + } + + private List> selectItems(String category, int limit) { + List> items = new ArrayList>(); + if ("electronics".equals(category)) { + items.add(item("EL-1", "Noise Cancelling Headphones", "electronics", "backorder", "199.99")); + items.add(item("EL-2", "USB-C Dock", "electronics", "available", "89.00")); + } else { + items.add(item("BK-1", "Clean Architecture", "books", "available", "32.50")); + items.add(item("BK-2", "Effective Java", "books", "available", "45.00")); + } + return items.subList(0, Math.min(Math.max(limit, 0), items.size())); + } + + private Map item(String sku, String name, String category, String status, String price) { + return map("sku", sku, "name", name, "category", category, "status", status, "price", price); + } + + public static Map map(Object... values) { + Map response = new LinkedHashMap(); + for (int i = 0; i < values.length; i += 2) { + response.put(String.valueOf(values[i]), values[i + 1]); + } + return response; + } +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/core/OrderRequest.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/core/OrderRequest.java new file mode 100644 index 00000000..79f28afe --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/core/OrderRequest.java @@ -0,0 +1,53 @@ +package io.keploy.samples.dropwizarddedup.core; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class OrderRequest { + private String customer; + private String sku; + private int quantity; + private boolean priority; + private String status; + + public String getCustomer() { + return customer; + } + + public void setCustomer(String customer) { + this.customer = customer; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + @JsonProperty("priority") + public boolean isPriority() { + return priority; + } + + @JsonProperty("priority") + public void setPriority(boolean priority) { + this.priority = priority; + } + + public String getStatus() { + return status == null ? "packed" : status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/errors/ApiExceptionMapper.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/errors/ApiExceptionMapper.java new file mode 100644 index 00000000..d6b365f1 --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/errors/ApiExceptionMapper.java @@ -0,0 +1,21 @@ +package io.keploy.samples.dropwizarddedup.errors; + +import io.keploy.samples.dropwizarddedup.core.CatalogService; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; + +public class ApiExceptionMapper implements ExceptionMapper { + + @Override + public Response toResponse(WebApplicationException exception) { + Response source = exception.getResponse(); + int status = source == null ? 500 : source.getStatus(); + return Response.status(status) + .type(MediaType.APPLICATION_JSON_TYPE) + .entity(CatalogService.map("error", status == 404 ? "not_found" : "request_failed", "status", status)) + .build(); + } +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/health/ApplicationHealthCheck.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/health/ApplicationHealthCheck.java new file mode 100644 index 00000000..36e62a7d --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/health/ApplicationHealthCheck.java @@ -0,0 +1,11 @@ +package io.keploy.samples.dropwizarddedup.health; + +import com.codahale.metrics.health.HealthCheck; + +public class ApplicationHealthCheck extends HealthCheck { + + @Override + protected Result check() { + return Result.healthy(); + } +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/InventoryResource.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/InventoryResource.java new file mode 100644 index 00000000..bba1376d --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/InventoryResource.java @@ -0,0 +1,71 @@ +package io.keploy.samples.dropwizarddedup.resources; + +import io.keploy.samples.dropwizarddedup.core.CatalogService; + +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import java.util.Map; + +@Path("/") +@Produces(MediaType.APPLICATION_JSON) +public class InventoryResource { + + private final CatalogService catalogService; + + public InventoryResource(CatalogService catalogService) { + this.catalogService = catalogService; + } + + @GET + @Path("/healthz") + public Map healthz() { + return CatalogService.map("healthy", true); + } + + @GET + @Path("/catalog") + public Map catalog(@QueryParam("category") String category, + @QueryParam("limit") Integer limit) { + return catalogService.catalog(category == null ? "books" : category, limit == null ? 2 : limit); + } + + @GET + @Path("/catalog/{sku}") + public Map item(@PathParam("sku") String sku) { + Map item = catalogService.item(sku); + if (item == null) { + throw new NotFoundException(); + } + return item; + } + + @GET + @Path("/search") + public Map search(@QueryParam("term") String term, + @QueryParam("sort") String sort) { + return catalogService.search(term == null ? "" : term, sort == null ? "relevance" : sort); + } + + @GET + @Path("/files/{path: .+}") + public Map file(@PathParam("path") String path, + @QueryParam("download") boolean download) { + return CatalogService.map("requested_file", "/" + path, "download", download); + } + + @GET + @Path("/headers") + public Map headers(@HeaderParam("X-Tenant") String tenant, + @HeaderParam("X-Request-Id") String requestId) { + return CatalogService.map( + "tenant", tenant == null ? "default" : tenant, + "requestId", requestId == null ? "missing" : requestId + ); + } +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/OrderResource.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/OrderResource.java new file mode 100644 index 00000000..be85f176 --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/OrderResource.java @@ -0,0 +1,58 @@ +package io.keploy.samples.dropwizarddedup.resources; + +import io.keploy.samples.dropwizarddedup.core.CatalogService; +import io.keploy.samples.dropwizarddedup.core.OrderRequest; + +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.Map; + +@Path("/orders") +@Produces(MediaType.APPLICATION_JSON) +public class OrderResource { + + private final CatalogService catalogService; + + public OrderResource(CatalogService catalogService) { + this.catalogService = catalogService; + } + + @POST + public Response create(OrderRequest request) { + Map response = catalogService.order( + request.getCustomer(), + request.getSku(), + request.getQuantity(), + request.isPriority() + ); + return Response.status(Response.Status.CREATED).entity(response).build(); + } + + @GET + @Path("/{orderId}") + public Map status(@PathParam("orderId") String orderId, + @QueryParam("expand") boolean expand) { + return catalogService.orderStatus(orderId, expand); + } + + @PUT + @Path("/{orderId}") + public Map update(@PathParam("orderId") String orderId, + OrderRequest request) { + return catalogService.updateOrder(orderId, request.getStatus()); + } + + @DELETE + @Path("/{orderId}") + public Map delete(@PathParam("orderId") String orderId) { + return catalogService.deleteOrder(orderId); + } +} diff --git a/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/PlatformResource.java b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/PlatformResource.java new file mode 100644 index 00000000..e845b4ea --- /dev/null +++ b/dropwizard-dedup/src/main/java/io/keploy/samples/dropwizarddedup/resources/PlatformResource.java @@ -0,0 +1,39 @@ +package io.keploy.samples.dropwizarddedup.resources; + +import io.keploy.samples.dropwizarddedup.core.CatalogService; + +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.Map; + +@Path("/platform") +public class PlatformResource { + + @GET + @Path("/routes/{region}/{zone}") + @Produces(MediaType.APPLICATION_JSON) + public Map route(@PathParam("region") String region, + @PathParam("zone") String zone) { + return CatalogService.map("region", region, "zone", zone, "target", region + "-" + zone + "-api"); + } + + @POST + @Path("/events") + @Produces(MediaType.APPLICATION_JSON) + public Map event(Map event) { + Object type = event.get("type"); + return CatalogService.map("accepted", true, "type", type == null ? "unknown" : type, "normalized", true); + } + + @GET + @Path("/content/html") + @Produces(MediaType.TEXT_HTML) + public Response html() { + return Response.ok("

dropwizard

", MediaType.TEXT_HTML_TYPE).build(); + } +} diff --git a/employee-manager/keploy/test-set-0/mocks.yaml b/employee-manager/keploy/test-set-0/mocks.yaml deleted file mode 100755 index f85ec1c1..00000000 --- a/employee-manager/keploy/test-set-0/mocks.yaml +++ /dev/null @@ -1,2369 +0,0 @@ -# Generated by Keploy (2.5.2) -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-0 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:27.999326012Z - restimestampmock: 2025-04-16T15:25:27.999942846Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-1 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.001836596Z - restimestampmock: 2025-04-16T15:25:28.001867179Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-2 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 74, 94, 96, 73, 75, 96, 80, 45, 91, 66, 57, 126, 62, 67, 98, 108, 39, 108, 89, 87, 102, 63, 83, 114, 120, 115, 72, 112, 117, 109, 102, 121, 72, 122, 122, 101, 48, 69, 110, 78, 73, 67, 98, 76, 83, 49, 102, 119, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.009134596Z - restimestampmock: 2025-04-16T15:25:28.009156596Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-3 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 48, 49, 49, 99, 76, 52, 82, 66, 47, 121, 100, 43, 118, 109, 47, 82, 119, 99, 74, 66, 66, 115, 102, 98, 51, 84, 53, 84, 87, 51, 79, 110, 56, 85, 115, 74, 120, 48, 82, 114, 98, 81, 81, 61]} - backend_key_data: - process_id: 68 - secret_key: 3004201425 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.052300304Z - restimestampmock: 2025-04-16T15:25:28.052346512Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-4 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.065671721Z - restimestampmock: 2025-04-16T15:25:28.065706512Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-5 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAADcAU0VUIGFwcGxpY2F0aW9uX25hbWUgPSAnUG9zdGdyZVNRTCBKREJDIERyaXZlcicAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET application_name = 'PostgreSQL JDBC Driver' - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, S, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - parameter_status: - - name: application_name - value: PostgreSQL JDBC Driver - - name: application_name - value: PostgreSQL JDBC Driver - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.065988346Z - restimestampmock: 2025-04-16T15:25:28.066053512Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-6 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAAAgAAAAAQgAAAAwAAAAAAAAAAEQAAAAGUABFAAAACQAAAAABUwAAAAQ= - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - max_rows: 1 - parse: - - name: "" - query: "" - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", "n", I, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.072695929Z - restimestampmock: 2025-04-16T15:25:28.072717887Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-7 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.178856513Z - restimestampmock: 2025-04-16T15:25:28.179348804Z -connectionId: "2" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-8 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.180229596Z - restimestampmock: 2025-04-16T15:25:28.180276138Z -connectionId: "2" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-9 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 51, 33, 52, 109, 125, 46, 52, 58, 106, 48, 71, 69, 50, 101, 55, 118, 51, 94, 43, 65, 95, 33, 65, 62, 107, 105, 111, 107, 108, 49, 108, 104, 65, 118, 80, 48, 75, 108, 75, 70, 103, 110, 65, 76, 122, 74, 72, 85, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.180961388Z - restimestampmock: 2025-04-16T15:25:28.180980721Z -connectionId: "2" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-10 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 76, 56, 56, 67, 119, 56, 69, 73, 122, 47, 112, 83, 74, 100, 70, 53, 82, 43, 73, 66, 49, 103, 97, 121, 43, 120, 106, 77, 116, 85, 104, 75, 75, 115, 104, 114, 43, 43, 74, 54, 81, 74, 111, 61]} - backend_key_data: - process_id: 69 - secret_key: 2353455900 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.184236679Z - restimestampmock: 2025-04-16T15:25:28.184289721Z -connectionId: "2" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-11 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.185264221Z - restimestampmock: 2025-04-16T15:25:28.185285971Z -connectionId: "2" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-12 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.186910763Z - restimestampmock: 2025-04-16T15:25:28.187466388Z -connectionId: "4" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-13 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.188250054Z - restimestampmock: 2025-04-16T15:25:28.188629638Z -connectionId: "4" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-14 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 50, 60, 121, 93, 117, 37, 49, 42, 82, 86, 64, 46, 109, 86, 122, 90, 83, 36, 100, 67, 102, 38, 82, 114, 103, 72, 81, 111, 68, 83, 67, 66, 106, 80, 107, 102, 101, 114, 74, 71, 114, 101, 103, 79, 110, 111, 47, 48, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.188870054Z - restimestampmock: 2025-04-16T15:25:28.188888388Z -connectionId: "4" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-15 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 102, 101, 67, 101, 56, 76, 100, 50, 70, 115, 87, 57, 81, 51, 120, 106, 102, 81, 84, 65, 112, 47, 97, 75, 90, 122, 85, 119, 52, 73, 48, 109, 48, 72, 97, 81, 109, 99, 70, 83, 111, 106, 115, 61]} - backend_key_data: - process_id: 70 - secret_key: 902239529 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.192176888Z - restimestampmock: 2025-04-16T15:25:28.192229679Z -connectionId: "4" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-16 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.193391221Z - restimestampmock: 2025-04-16T15:25:28.193417638Z -connectionId: "4" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-17 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.194977554Z - restimestampmock: 2025-04-16T15:25:28.195530096Z -connectionId: "6" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-18 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.196380679Z - restimestampmock: 2025-04-16T15:25:28.196406763Z -connectionId: "6" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-19 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 75, 75, 37, 56, 34, 54, 95, 58, 79, 45, 64, 70, 115, 37, 37, 87, 122, 125, 42, 90, 81, 83, 33, 46, 69, 102, 67, 55, 104, 70, 65, 70, 104, 115, 65, 81, 74, 75, 115, 113, 117, 76, 112, 90, 81, 43, 77, 101, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.196970013Z - restimestampmock: 2025-04-16T15:25:28.197292054Z -connectionId: "6" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-20 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 109, 99, 81, 116, 43, 114, 86, 100, 77, 66, 106, 112, 43, 111, 70, 47, 73, 49, 112, 107, 113, 68, 88, 74, 111, 73, 56, 76, 98, 104, 57, 106, 43, 114, 88, 56, 76, 86, 84, 73, 71, 74, 65, 61]} - backend_key_data: - process_id: 71 - secret_key: 3038331515 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.200425263Z - restimestampmock: 2025-04-16T15:25:28.200470888Z -connectionId: "6" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-21 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.201648096Z - restimestampmock: 2025-04-16T15:25:28.201675054Z -connectionId: "6" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-22 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.202939513Z - restimestampmock: 2025-04-16T15:25:28.203523263Z -connectionId: "8" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-23 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.204342679Z - restimestampmock: 2025-04-16T15:25:28.204368638Z -connectionId: "8" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-24 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 95, 76, 110, 125, 53, 59, 115, 46, 47, 74, 98, 90, 50, 63, 123, 34, 96, 36, 105, 66, 82, 68, 94, 53, 113, 68, 103, 103, 104, 113, 97, 48, 69, 105, 102, 80, 57, 72, 66, 115, 102, 99, 67, 104, 85, 110, 76, 105, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.204875679Z - restimestampmock: 2025-04-16T15:25:28.204893846Z -connectionId: "8" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-25 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 114, 87, 97, 116, 112, 88, 121, 49, 48, 88, 66, 119, 52, 105, 80, 105, 83, 47, 57, 77, 113, 113, 69, 122, 88, 119, 111, 77, 65, 106, 82, 120, 65, 82, 105, 43, 98, 57, 111, 109, 102, 110, 89, 61]} - backend_key_data: - process_id: 72 - secret_key: 3110854069 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.207861346Z - restimestampmock: 2025-04-16T15:25:28.207898721Z -connectionId: "8" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-26 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.208955096Z - restimestampmock: 2025-04-16T15:25:28.209061804Z -connectionId: "8" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-27 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.217510304Z - restimestampmock: 2025-04-16T15:25:28.218698138Z -connectionId: "10" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-28 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.221724096Z - restimestampmock: 2025-04-16T15:25:28.221757679Z -connectionId: "10" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-29 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 118, 35, 124, 75, 118, 83, 86, 103, 87, 37, 54, 117, 67, 64, 115, 87, 109, 39, 117, 125, 56, 88, 60, 40, 74, 57, 110, 82, 75, 105, 77, 80, 70, 119, 80, 80, 108, 77, 51, 47, 102, 52, 74, 119, 68, 117, 105, 47, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.222217138Z - restimestampmock: 2025-04-16T15:25:28.222235679Z -connectionId: "10" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-30 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 119, 50, 116, 75, 54, 85, 50, 76, 65, 89, 106, 73, 104, 104, 72, 65, 86, 74, 99, 71, 52, 112, 43, 98, 80, 117, 101, 65, 57, 69, 100, 77, 109, 80, 54, 54, 104, 118, 74, 53, 71, 97, 111, 61]} - backend_key_data: - process_id: 73 - secret_key: 1158260816 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.225055263Z - restimestampmock: 2025-04-16T15:25:28.225103721Z -connectionId: "10" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-31 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.225990054Z - restimestampmock: 2025-04-16T15:25:28.226019096Z -connectionId: "10" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-32 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.227469054Z - restimestampmock: 2025-04-16T15:25:28.228074596Z -connectionId: "12" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-33 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.228980804Z - restimestampmock: 2025-04-16T15:25:28.229004971Z -connectionId: "12" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-34 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 57, 39, 61, 40, 93, 110, 42, 92, 118, 118, 62, 41, 77, 57, 50, 79, 60, 94, 109, 96, 86, 92, 82, 87, 53, 111, 111, 69, 50, 90, 47, 43, 121, 66, 51, 54, 57, 57, 49, 82, 72, 56, 67, 122, 120, 115, 109, 122, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.229558763Z - restimestampmock: 2025-04-16T15:25:28.229578471Z -connectionId: "12" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-35 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 119, 53, 65, 65, 50, 84, 106, 67, 88, 47, 90, 116, 99, 68, 76, 99, 68, 49, 110, 105, 85, 54, 75, 103, 73, 57, 73, 114, 67, 68, 53, 65, 119, 121, 51, 119, 76, 114, 101, 72, 83, 78, 85, 61]} - backend_key_data: - process_id: 74 - secret_key: 877817749 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.232121388Z - restimestampmock: 2025-04-16T15:25:28.232157721Z -connectionId: "12" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-36 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.233414679Z - restimestampmock: 2025-04-16T15:25:28.233477971Z -connectionId: "12" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-37 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.240611596Z - restimestampmock: 2025-04-16T15:25:28.241569888Z -connectionId: "14" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-38 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.243077096Z - restimestampmock: 2025-04-16T15:25:28.243126888Z -connectionId: "14" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-39 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 52, 73, 49, 77, 49, 58, 43, 116, 76, 41, 64, 101, 60, 103, 43, 102, 126, 64, 123, 76, 106, 48, 67, 107, 99, 54, 75, 102, 109, 115, 75, 84, 54, 87, 98, 72, 79, 102, 81, 97, 107, 103, 122, 105, 102, 83, 54, 82, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.243963471Z - restimestampmock: 2025-04-16T15:25:28.244004638Z -connectionId: "14" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-40 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 98, 69, 76, 81, 82, 57, 65, 81, 65, 85, 50, 119, 121, 78, 48, 99, 43, 119, 109, 97, 49, 80, 111, 122, 70, 47, 51, 104, 86, 65, 74, 78, 122, 107, 47, 48, 68, 57, 113, 106, 43, 87, 48, 61]} - backend_key_data: - process_id: 75 - secret_key: 3061429876 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.247338554Z - restimestampmock: 2025-04-16T15:25:28.247378888Z -connectionId: "14" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-41 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.249754471Z - restimestampmock: 2025-04-16T15:25:28.249786013Z -connectionId: "14" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-42 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.252215304Z - restimestampmock: 2025-04-16T15:25:28.253039096Z -connectionId: "16" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-43 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.253856513Z - restimestampmock: 2025-04-16T15:25:28.253878096Z -connectionId: "16" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-44 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 42, 99, 103, 98, 57, 122, 54, 53, 55, 123, 86, 104, 110, 57, 55, 48, 89, 78, 122, 119, 36, 108, 33, 101, 56, 109, 109, 53, 115, 121, 99, 47, 111, 105, 75, 122, 51, 65, 102, 99, 55, 109, 115, 118, 90, 71, 51, 117, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.254425429Z - restimestampmock: 2025-04-16T15:25:28.254446638Z -connectionId: "16" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-45 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 114, 74, 110, 53, 90, 86, 106, 68, 81, 54, 75, 52, 117, 111, 76, 56, 67, 43, 77, 103, 111, 103, 55, 110, 73, 89, 84, 111, 54, 121, 67, 98, 102, 72, 111, 90, 105, 55, 88, 83, 78, 107, 65, 61]} - backend_key_data: - process_id: 76 - secret_key: 2690736431 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.256999804Z - restimestampmock: 2025-04-16T15:25:28.257043388Z -connectionId: "16" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-46 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.257825054Z - restimestampmock: 2025-04-16T15:25:28.257841638Z -connectionId: "16" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-47 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - length: 8 - payload: AAAACATSFi8= - ssl_request: - is_ssl: true - auth_type: 0 - postgresresponses: - - payload: Tg== - authentication_md5_password: - salt: [0, 0, 0, 0] - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.259521804Z - restimestampmock: 2025-04-16T15:25:28.259918429Z -connectionId: "18" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-48 -spec: - metadata: - type: config - postgresrequests: - - identifier: StartupRequest - payload: AAAAeAADAAB1c2VyAGtlcGxveS11c2VyAGRhdGFiYXNlAGtlcGxveS10ZXN0AGNsaWVudF9lbmNvZGluZwBVVEY4AERhdGVTdHlsZQBJU08AVGltZVpvbmUARXRjL1VUQwBleHRyYV9mbG9hdF9kaWdpdHMAMgAA - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl: - auth_mechanisms: - - SCRAM-SHA-256 - msg_type: 82 - auth_type: 10 - reqtimestampmock: 2025-04-16T15:25:28.260839346Z - restimestampmock: 2025-04-16T15:25:28.260879179Z -connectionId: "18" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-49 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - password_message: - password: SCRAM-SHA-256 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_continue: {data: [114, 61, 75, 57, 79, 49, 119, 65, 75, 61, 97, 54, 91, 83, 99, 100, 97, 45, 94, 66, 50, 94, 33, 96, 75, 55, 79, 69, 50, 111, 98, 47, 89, 48, 49, 85, 101, 110, 81, 68, 79, 75, 117, 118, 57, 116, 67, 102, 109, 79, 44, 115, 61, 122, 65, 107, 71, 109, 65, 50, 84, 102, 104, 122, 69, 78, 56, 78, 106, 70, 101, 77, 75, 75, 81, 61, 61, 44, 105, 61, 52, 48, 57, 54]} - msg_type: 82 - auth_type: 11 - reqtimestampmock: 2025-04-16T15:25:28.261428221Z - restimestampmock: 2025-04-16T15:25:28.261451929Z -connectionId: "18" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-50 -spec: - metadata: - type: config - postgresrequests: - - header: [p] - identifier: ClientRequest - length: 8 - msg_type: 112 - auth_type: 0 - postgresresponses: - - header: [R, R, S, S, S, S, S, S, S, S, S, S, S, S, S, K, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - authentication_sasl_final: {data: [118, 61, 43, 101, 97, 100, 103, 55, 79, 51, 105, 43, 66, 103, 68, 105, 83, 75, 100, 77, 82, 75, 102, 55, 116, 85, 81, 75, 106, 52, 104, 43, 53, 67, 110, 104, 68, 102, 105, 89, 115, 103, 50, 81, 103, 61]} - backend_key_data: - process_id: 77 - secret_key: 4224288434 - parameter_status: - - name: application_name - value: "" - - name: client_encoding - value: UTF8 - - name: DateStyle - value: ISO, MDY - - name: default_transaction_read_only - value: "off" - - name: in_hot_standby - value: "off" - - name: integer_datetimes - value: "on" - - name: IntervalStyle - value: postgres - - name: is_superuser - value: "on" - - name: server_encoding - value: UTF8 - - name: server_version - value: 15.2 (Debian 15.2-1.pgdg110+1) - - name: session_authorization - value: keploy-user - - name: standard_conforming_strings - value: "on" - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - - name: TimeZone - value: Etc/UTC - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.263688596Z - restimestampmock: 2025-04-16T15:25:28.263725804Z -connectionId: "18" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-51 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAACIAU0VUIGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDMAAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAVMAAAAE - bind: - - {} - execute: - - max_rows: 1 - parse: - - name: "" - query: SET extra_float_digits = 3 - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SET - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.264349471Z - restimestampmock: 2025-04-16T15:25:28.264372221Z -connectionId: "18" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-52 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAACgAU0hPVyBUUkFOU0FDVElPTiBJU09MQVRJT04gTEVWRUwAAABCAAAADAAAAAAAAAAARAAAAAZQAEUAAAAJAAAAAABTAAAABA== - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - {} - parse: - - name: "" - query: SHOW TRANSACTION ISOLATION LEVEL - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", T, D, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SHOW - data_row: [{row_values: [read committed]}] - ready_for_query: - txstatus: 73 - row_description: {fields: [{field_name: transaction_isolation, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.073127137Z - restimestampmock: 2025-04-16T15:25:28.073148512Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-53 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAAB8Ac2VsZWN0IGN1cnJlbnRfc2NoZW1hKCkAAABCAAAADAAAAAAAAAAARAAAAAZQAEUAAAAJAAAAAABTAAAABA== - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - {} - parse: - - name: "" - query: select current_schema() - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", T, D, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SELECT 1 - data_row: [{row_values: [public]}] - ready_for_query: - txstatus: 73 - row_description: {fields: [{field_name: current_schema, table_oid: 0, table_attribute_number: 0, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.343578471Z - restimestampmock: 2025-04-16T15:25:28.343614638Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-54 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAAB8Ac2VsZWN0IGN1cnJlbnRfc2NoZW1hKCkAAABCAAAADAAAAAAAAAAARAAAAAZQAEUAAAAJAAAAAABTAAAABA== - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - {} - parse: - - name: "" - query: select current_schema() - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", T, D, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SELECT 1 - data_row: [{row_values: [public]}] - ready_for_query: - txstatus: 73 - row_description: {fields: [{field_name: current_schema, table_oid: 0, table_attribute_number: 0, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.344123304Z - restimestampmock: 2025-04-16T15:25:28.344145471Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-55 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAADIAc2VsZWN0ICogZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEuc2VxdWVuY2VzAAAAQgAAAAwAAAAAAAAAAEQAAAAGUABFAAAACQAAAAAAUwAAAAQ= - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - {} - parse: - - name: "" - query: select * from information_schema.sequences - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", T, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SELECT 0 - ready_for_query: - txstatus: 73 - row_description: {fields: [{field_name: sequence_catalog, table_oid: 13365, table_attribute_number: 1, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: sequence_schema, table_oid: 13365, table_attribute_number: 2, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: sequence_name, table_oid: 13365, table_attribute_number: 3, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: data_type, table_oid: 13365, table_attribute_number: 4, data_type_oid: 1043, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: numeric_precision, table_oid: 13365, table_attribute_number: 5, data_type_oid: 23, data_type_size: 4, type_modifier: -1, format: 0}, {field_name: numeric_precision_radix, table_oid: 13365, table_attribute_number: 6, data_type_oid: 23, data_type_size: 4, type_modifier: -1, format: 0}, {field_name: numeric_scale, table_oid: 13365, table_attribute_number: 7, data_type_oid: 23, data_type_size: 4, type_modifier: -1, format: 0}, {field_name: start_value, table_oid: 13365, table_attribute_number: 8, data_type_oid: 1043, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: minimum_value, table_oid: 13365, table_attribute_number: 9, data_type_oid: 1043, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: maximum_value, table_oid: 13365, table_attribute_number: 10, data_type_oid: 1043, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: increment, table_oid: 13365, table_attribute_number: 11, data_type_oid: 1043, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: cycle_option, table_oid: 13365, table_attribute_number: 12, data_type_oid: 1043, data_type_size: -1, type_modifier: 7, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.639269596Z - restimestampmock: 2025-04-16T15:25:28.639309096Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-56 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAABowAU0VMRUNUIE5VTEwgQVMgVEFCTEVfQ0FULCBuLm5zcG5hbWUgQVMgVEFCTEVfU0NIRU0sIGMucmVsbmFtZSBBUyBUQUJMRV9OQU1FLCAgQ0FTRSBuLm5zcG5hbWUgfiAnXnBnXycgT1Igbi5uc3BuYW1lID0gJ2luZm9ybWF0aW9uX3NjaGVtYScgIFdIRU4gdHJ1ZSBUSEVOIENBU0UgIFdIRU4gbi5uc3BuYW1lID0gJ3BnX2NhdGFsb2cnIE9SIG4ubnNwbmFtZSA9ICdpbmZvcm1hdGlvbl9zY2hlbWEnIFRIRU4gQ0FTRSBjLnJlbGtpbmQgICBXSEVOICdyJyBUSEVOICdTWVNURU0gVEFCTEUnICAgV0hFTiAndicgVEhFTiAnU1lTVEVNIFZJRVcnICAgV0hFTiAnaScgVEhFTiAnU1lTVEVNIElOREVYJyAgIEVMU0UgTlVMTCAgIEVORCAgV0hFTiBuLm5zcG5hbWUgPSAncGdfdG9hc3QnIFRIRU4gQ0FTRSBjLnJlbGtpbmQgICBXSEVOICdyJyBUSEVOICdTWVNURU0gVE9BU1QgVEFCTEUnICAgV0hFTiAnaScgVEhFTiAnU1lTVEVNIFRPQVNUIElOREVYJyAgIEVMU0UgTlVMTCAgIEVORCAgRUxTRSBDQVNFIGMucmVsa2luZCAgIFdIRU4gJ3InIFRIRU4gJ1RFTVBPUkFSWSBUQUJMRScgICBXSEVOICdwJyBUSEVOICdURU1QT1JBUlkgVEFCTEUnICAgV0hFTiAnaScgVEhFTiAnVEVNUE9SQVJZIElOREVYJyAgIFdIRU4gJ1MnIFRIRU4gJ1RFTVBPUkFSWSBTRVFVRU5DRScgICBXSEVOICd2JyBUSEVOICdURU1QT1JBUlkgVklFVycgICBFTFNFIE5VTEwgICBFTkQgIEVORCAgV0hFTiBmYWxzZSBUSEVOIENBU0UgYy5yZWxraW5kICBXSEVOICdyJyBUSEVOICdUQUJMRScgIFdIRU4gJ3AnIFRIRU4gJ1BBUlRJVElPTkVEIFRBQkxFJyAgV0hFTiAnaScgVEhFTiAnSU5ERVgnICBXSEVOICdQJyB0aGVuICdQQVJUSVRJT05FRCBJTkRFWCcgIFdIRU4gJ1MnIFRIRU4gJ1NFUVVFTkNFJyAgV0hFTiAndicgVEhFTiAnVklFVycgIFdIRU4gJ2MnIFRIRU4gJ1RZUEUnICBXSEVOICdmJyBUSEVOICdGT1JFSUdOIFRBQkxFJyAgV0hFTiAnbScgVEhFTiAnTUFURVJJQUxJWkVEIFZJRVcnICBFTFNFIE5VTEwgIEVORCAgRUxTRSBOVUxMICBFTkQgIEFTIFRBQkxFX1RZUEUsIGQuZGVzY3JpcHRpb24gQVMgUkVNQVJLUywgICcnIGFzIFRZUEVfQ0FULCAnJyBhcyBUWVBFX1NDSEVNLCAnJyBhcyBUWVBFX05BTUUsICcnIEFTIFNFTEZfUkVGRVJFTkNJTkdfQ09MX05BTUUsICcnIEFTIFJFRl9HRU5FUkFUSU9OICBGUk9NIHBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIG4sIHBnX2NhdGFsb2cucGdfY2xhc3MgYyAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfZGVzY3JpcHRpb24gZCBPTiAoYy5vaWQgPSBkLm9iam9pZCBBTkQgZC5vYmpzdWJpZCA9IDAgIGFuZCBkLmNsYXNzb2lkID0gJ3BnX2NsYXNzJzo6cmVnY2xhc3MpICBXSEVSRSBjLnJlbG5hbWVzcGFjZSA9IG4ub2lkICBBTkQgbi5uc3BuYW1lIExJS0UgJ3B1YmxpYycgQU5EIGMucmVsbmFtZSBMSUtFICclJyBBTkQgKGZhbHNlICBPUiAoIGMucmVsa2luZCA9ICdyJyBBTkQgbi5uc3BuYW1lICF+ICdecGdfJyBBTkQgbi5uc3BuYW1lIDw+ICdpbmZvcm1hdGlvbl9zY2hlbWEnICkgIE9SICggYy5yZWxraW5kID0gJ3YnIEFORCBuLm5zcG5hbWUgPD4gJ3BnX2NhdGFsb2cnIEFORCBuLm5zcG5hbWUgPD4gJ2luZm9ybWF0aW9uX3NjaGVtYScgKSApICBPUkRFUiBCWSBUQUJMRV9UWVBFLFRBQkxFX1NDSEVNLFRBQkxFX05BTUUgAAAAQgAAAAwAAAAAAAAAAEQAAAAGUABFAAAACQAAAAAAUwAAAAQ= - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - {} - parse: - - name: "" - query: 'SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS TABLE_NAME, CASE n.nspname ~ ''^pg_'' OR n.nspname = ''information_schema'' WHEN true THEN CASE WHEN n.nspname = ''pg_catalog'' OR n.nspname = ''information_schema'' THEN CASE c.relkind WHEN ''r'' THEN ''SYSTEM TABLE'' WHEN ''v'' THEN ''SYSTEM VIEW'' WHEN ''i'' THEN ''SYSTEM INDEX'' ELSE NULL END WHEN n.nspname = ''pg_toast'' THEN CASE c.relkind WHEN ''r'' THEN ''SYSTEM TOAST TABLE'' WHEN ''i'' THEN ''SYSTEM TOAST INDEX'' ELSE NULL END ELSE CASE c.relkind WHEN ''r'' THEN ''TEMPORARY TABLE'' WHEN ''p'' THEN ''TEMPORARY TABLE'' WHEN ''i'' THEN ''TEMPORARY INDEX'' WHEN ''S'' THEN ''TEMPORARY SEQUENCE'' WHEN ''v'' THEN ''TEMPORARY VIEW'' ELSE NULL END END WHEN false THEN CASE c.relkind WHEN ''r'' THEN ''TABLE'' WHEN ''p'' THEN ''PARTITIONED TABLE'' WHEN ''i'' THEN ''INDEX'' WHEN ''P'' then ''PARTITIONED INDEX'' WHEN ''S'' THEN ''SEQUENCE'' WHEN ''v'' THEN ''VIEW'' WHEN ''c'' THEN ''TYPE'' WHEN ''f'' THEN ''FOREIGN TABLE'' WHEN ''m'' THEN ''MATERIALIZED VIEW'' ELSE NULL END ELSE NULL END AS TABLE_TYPE, d.description AS REMARKS, '''' as TYPE_CAT, '''' as TYPE_SCHEM, '''' as TYPE_NAME, '''' AS SELF_REFERENCING_COL_NAME, '''' AS REF_GENERATION FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0 and d.classoid = ''pg_class''::regclass) WHERE c.relnamespace = n.oid AND n.nspname LIKE ''public'' AND c.relname LIKE ''%'' AND (false OR ( c.relkind = ''r'' AND n.nspname !~ ''^pg_'' AND n.nspname <> ''information_schema'' ) OR ( c.relkind = ''v'' AND n.nspname <> ''pg_catalog'' AND n.nspname <> ''information_schema'' ) ) ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME ' - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", T, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SELECT 0 - ready_for_query: - txstatus: 73 - row_description: {fields: [{field_name: table_cat, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: table_schem, table_oid: 2615, table_attribute_number: 2, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: table_name, table_oid: 1259, table_attribute_number: 2, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: table_type, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: remarks, table_oid: 2609, table_attribute_number: 4, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: type_cat, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: type_schem, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: type_name, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: self_referencing_col_name, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: ref_generation, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.644708346Z - restimestampmock: 2025-04-16T15:25:28.644741638Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-57 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAABFkAU0VMRUNUICogRlJPTSAoU0VMRUNUIG4ubnNwbmFtZSxjLnJlbG5hbWUsYS5hdHRuYW1lLGEuYXR0dHlwaWQsYS5hdHRub3RudWxsIE9SICh0LnR5cHR5cGUgPSAnZCcgQU5EIHQudHlwbm90bnVsbCkgQVMgYXR0bm90bnVsbCxhLmF0dHR5cG1vZCxhLmF0dGxlbix0LnR5cHR5cG1vZCxyb3dfbnVtYmVyKCkgT1ZFUiAoUEFSVElUSU9OIEJZIGEuYXR0cmVsaWQgT1JERVIgQlkgYS5hdHRudW0pIEFTIGF0dG51bSwgbnVsbGlmKGEuYXR0aWRlbnRpdHksICcnKSBhcyBhdHRpZGVudGl0eSxwZ19jYXRhbG9nLnBnX2dldF9leHByKGRlZi5hZGJpbiwgZGVmLmFkcmVsaWQpIEFTIGFkc3JjLGRzYy5kZXNjcmlwdGlvbix0LnR5cGJhc2V0eXBlLHQudHlwdHlwZSAgRlJPTSBwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBuICBKT0lOIHBnX2NhdGFsb2cucGdfY2xhc3MgYyBPTiAoYy5yZWxuYW1lc3BhY2UgPSBuLm9pZCkgIEpPSU4gcGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYSBPTiAoYS5hdHRyZWxpZD1jLm9pZCkgIEpPSU4gcGdfY2F0YWxvZy5wZ190eXBlIHQgT04gKGEuYXR0dHlwaWQgPSB0Lm9pZCkgIExFRlQgSk9JTiBwZ19jYXRhbG9nLnBnX2F0dHJkZWYgZGVmIE9OIChhLmF0dHJlbGlkPWRlZi5hZHJlbGlkIEFORCBhLmF0dG51bSA9IGRlZi5hZG51bSkgIExFRlQgSk9JTiBwZ19jYXRhbG9nLnBnX2Rlc2NyaXB0aW9uIGRzYyBPTiAoYy5vaWQ9ZHNjLm9iam9pZCBBTkQgYS5hdHRudW0gPSBkc2Mub2Jqc3ViaWQpICBMRUZUIEpPSU4gcGdfY2F0YWxvZy5wZ19jbGFzcyBkYyBPTiAoZGMub2lkPWRzYy5jbGFzc29pZCBBTkQgZGMucmVsbmFtZT0ncGdfY2xhc3MnKSAgTEVGVCBKT0lOIHBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIGRuIE9OIChkYy5yZWxuYW1lc3BhY2U9ZG4ub2lkIEFORCBkbi5uc3BuYW1lPSdwZ19jYXRhbG9nJykgIFdIRVJFIGMucmVsa2luZCBpbiAoJ3InLCdwJywndicsJ2YnLCdtJykgYW5kIGEuYXR0bnVtID4gMCBBTkQgTk9UIGEuYXR0aXNkcm9wcGVkICBBTkQgbi5uc3BuYW1lIExJS0UgJ3B1YmxpYycpIGMgV0hFUkUgdHJ1ZSAgQU5EIGF0dG5hbWUgTElLRSAnJScgT1JERVIgQlkgbnNwbmFtZSxjLnJlbG5hbWUsYXR0bnVtIAAAAEIAAAAMAAAAAAAAAABEAAAABlAARQAAAAkAAAAAAFMAAAAE - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - {} - parse: - - name: "" - query: 'SELECT * FROM (SELECT n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = ''d'' AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,t.typtypmod,row_number() OVER (PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity, '''') as attidentity,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON (a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum = dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND dc.relname=''pg_class'') LEFT JOIN pg_catalog.pg_namespace dn ON (dc.relnamespace=dn.oid AND dn.nspname=''pg_catalog'') WHERE c.relkind in (''r'',''p'',''v'',''f'',''m'') and a.attnum > 0 AND NOT a.attisdropped AND n.nspname LIKE ''public'') c WHERE true AND attname LIKE ''%'' ORDER BY nspname,c.relname,attnum ' - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", T, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: SELECT 0 - ready_for_query: - txstatus: 73 - row_description: {fields: [{field_name: nspname, table_oid: 2615, table_attribute_number: 2, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: relname, table_oid: 1259, table_attribute_number: 2, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: attname, table_oid: 1249, table_attribute_number: 2, data_type_oid: 19, data_type_size: 64, type_modifier: -1, format: 0}, {field_name: atttypid, table_oid: 1249, table_attribute_number: 3, data_type_oid: 26, data_type_size: 4, type_modifier: -1, format: 0}, {field_name: attnotnull, table_oid: 0, table_attribute_number: 0, data_type_oid: 16, data_type_size: 1, type_modifier: -1, format: 0}, {field_name: atttypmod, table_oid: 1249, table_attribute_number: 9, data_type_oid: 23, data_type_size: 4, type_modifier: -1, format: 0}, {field_name: attlen, table_oid: 1249, table_attribute_number: 5, data_type_oid: 21, data_type_size: 2, type_modifier: -1, format: 0}, {field_name: typtypmod, table_oid: 1247, table_attribute_number: 27, data_type_oid: 23, data_type_size: 4, type_modifier: -1, format: 0}, {field_name: attnum, table_oid: 0, table_attribute_number: 0, data_type_oid: 20, data_type_size: 8, type_modifier: -1, format: 0}, {field_name: attidentity, table_oid: 0, table_attribute_number: 0, data_type_oid: 18, data_type_size: 1, type_modifier: -1, format: 0}, {field_name: adsrc, table_oid: 0, table_attribute_number: 0, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: description, table_oid: 2609, table_attribute_number: 4, data_type_oid: 25, data_type_size: -1, type_modifier: -1, format: 0}, {field_name: typbasetype, table_oid: 1247, table_attribute_number: 26, data_type_oid: 26, data_type_size: 4, type_modifier: -1, format: 0}, {field_name: typtype, table_oid: 1247, table_attribute_number: 7, data_type_oid: 18, data_type_size: 1, type_modifier: -1, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.647440763Z - restimestampmock: 2025-04-16T15:25:28.647470471Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-58 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAANgACiAgICBjcmVhdGUgdGFibGUgZW1wbG95ZWVzICgKICAgICAgIGlkICBiaWdzZXJpYWwgbm90IG51bGwsCiAgICAgICAgZW1haWwgdmFyY2hhcigyNTUpLAogICAgICAgIGZpcnN0X25hbWUgdmFyY2hhcigyNTUpLAogICAgICAgIGxhc3RfbmFtZSB2YXJjaGFyKDI1NSksCiAgICAgICAgdGltZXN0YW1wIGludDgsCiAgICAgICAgcHJpbWFyeSBrZXkgKGlkKQogICAgKQAAAEIAAAAMAAAAAAAAAABEAAAABlAARQAAAAkAAAAAAFMAAAAE - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - {} - parse: - - name: "" - query: ' create table employees ( id bigserial not null, email varchar(255), first_name varchar(255), last_name varchar(255), timestamp int8, primary key (id) )' - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", "n", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: CREATE TABLE - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:28.652379846Z - restimestampmock: 2025-04-16T15:25:28.652411388Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-59 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAAAgAAAAAQgAAAAwAAAAAAAAAAEQAAAAGUABFAAAACQAAAAABUwAAAAQ= - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - max_rows: 1 - parse: - - name: "" - query: "" - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", "n", I, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:51.474710218Z - restimestampmock: 2025-04-16T15:25:51.474763759Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-60 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E, P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAAA0AQkVHSU4AAABCAAAADAAAAAAAAAAARQAAAAkAAAAAAFAAAAB7AGluc2VydCBpbnRvIGVtcGxveWVlcyAoZW1haWwsIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgdGltZXN0YW1wKSB2YWx1ZXMgKCQxLCAkMiwgJDMsICQ0KQpSRVRVUk5JTkcgKgAABAAABBMAAAQTAAAEEwAAABRCAAAAQQAAAAQAAAAAAAAAAQAEAAAADG10QGdtYWlsLmNvbQAAAARNeWtlAAAABVR5c29uAAAACAAAAABn/8v/AABEAAAABlAARQAAAAkAAAAAAFMAAAAE - bind: - - {} - - parameter_format_codes: [0, 0, 0, 1] - parameters: [[109, 116, 64, 103, 109, 97, 105, 108, 46, 99, 111, 109], [77, 121, 107, 101], [84, 121, 115, 111, 110], [0, 0, 0, 0, 103, 255, 203, 255]] - describe: - object_type: 80 - name: "" - execute: - - {} - - {} - parse: - - name: "" - query: BEGIN - parameter_oids: [] - - name: "" - query: insert into employees (email, first_name, last_name, timestamp) values ($1, $2, $3, $4) RETURNING * - parameter_oids: - - 1043 - - 1043 - - 1043 - - 20 - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, "1", "2", T, D, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: BEGIN - - command_tag_type: INSERT 0 1 - data_row: [{row_values: ["1", mt@gmail.com, Myke, Tyson, "1744817151"]}] - ready_for_query: - txstatus: 84 - row_description: {fields: [{field_name: id, table_oid: 16386, table_attribute_number: 1, data_type_oid: 20, data_type_size: 8, type_modifier: -1, format: 0}, {field_name: email, table_oid: 16386, table_attribute_number: 2, data_type_oid: 1043, data_type_size: -1, type_modifier: 259, format: 0}, {field_name: first_name, table_oid: 16386, table_attribute_number: 3, data_type_oid: 1043, data_type_size: -1, type_modifier: 259, format: 0}, {field_name: last_name, table_oid: 16386, table_attribute_number: 4, data_type_oid: 1043, data_type_size: -1, type_modifier: 259, format: 0}, {field_name: timestamp, table_oid: 16386, table_attribute_number: 5, data_type_oid: 20, data_type_size: 8, type_modifier: -1, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:51.494593051Z - restimestampmock: 2025-04-16T15:25:51.494645384Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-61 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E] - identifier: ClientRequest - length: 8 - payload: UAAAABFTXzEAQ09NTUlUAAAAQgAAAA8AU18xAAAAAAAAAEUAAAAJAAAAAAFTAAAABA== - bind: - - prepared_statement: S_1 - execute: - - max_rows: 1 - parse: - - name: S_1 - query: COMMIT - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: COMMIT - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:25:51.503463759Z - restimestampmock: 2025-04-16T15:25:51.503494593Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-62 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAAAgAAAAAQgAAAAwAAAAAAAAAAEQAAAAGUABFAAAACQAAAAABUwAAAAQ= - bind: - - {} - describe: - object_type: 80 - name: "" - execute: - - max_rows: 1 - parse: - - name: "" - query: "" - parameter_oids: [] - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", "n", I, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - ready_for_query: - txstatus: 73 - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:26:01.744670875Z - restimestampmock: 2025-04-16T15:26:01.744772625Z -connectionId: "0" -respType: json ---- -version: api.keploy.io/v1beta1 -kind: Postgres -name: mock-63 -spec: - metadata: - type: config - postgresrequests: - - header: [P, B, E, P, B, D, E] - identifier: ClientRequest - length: 8 - payload: UAAAABcAQkVHSU4gUkVBRCBPTkxZAAAAQgAAAAwAAAAAAAAAAEUAAAAJAAAAAABQAAAA9wBzZWxlY3QgZW1wbG95ZWUwXy5pZCBhcyBpZDFfMF8wXywgZW1wbG95ZWUwXy5lbWFpbCBhcyBlbWFpbDJfMF8wXywgZW1wbG95ZWUwXy5maXJzdF9uYW1lIGFzIGZpcnN0X25hM18wXzBfLCBlbXBsb3llZTBfLmxhc3RfbmFtZSBhcyBsYXN0X25hbTRfMF8wXywgZW1wbG95ZWUwXy50aW1lc3RhbXAgYXMgdGltZXN0YW01XzBfMF8gZnJvbSBlbXBsb3llZXMgZW1wbG95ZWUwXyB3aGVyZSBlbXBsb3llZTBfLmlkPSQxAAABAAAAFEIAAAAaAAAAAQABAAEAAAAIAAAAAAAAAAEAAEQAAAAGUABFAAAACQAAAAAAUwAAAAQ= - bind: - - {} - - parameter_format_codes: [1] - parameters: [[0, 0, 0, 0, 0, 0, 0, 1]] - describe: - object_type: 80 - name: "" - execute: - - {} - - {} - parse: - - name: "" - query: BEGIN READ ONLY - parameter_oids: [] - - name: "" - query: select employee0_.id as id1_0_0_, employee0_.email as email2_0_0_, employee0_.first_name as first_na3_0_0_, employee0_.last_name as last_nam4_0_0_, employee0_.timestamp as timestam5_0_0_ from employees employee0_ where employee0_.id=$1 - parameter_oids: - - 20 - msg_type: 69 - auth_type: 0 - postgresresponses: - - header: ["1", "2", C, "1", "2", T, D, C, Z] - identifier: ServerResponse - length: 8 - authentication_md5_password: - salt: [0, 0, 0, 0] - command_complete: - - command_tag_type: BEGIN - - command_tag_type: SELECT 1 - data_row: [{row_values: ["1", mt@gmail.com, Myke, Tyson, "1744817151"]}] - ready_for_query: - txstatus: 84 - row_description: {fields: [{field_name: id1_0_0_, table_oid: 16386, table_attribute_number: 1, data_type_oid: 20, data_type_size: 8, type_modifier: -1, format: 0}, {field_name: email2_0_0_, table_oid: 16386, table_attribute_number: 2, data_type_oid: 1043, data_type_size: -1, type_modifier: 259, format: 0}, {field_name: first_na3_0_0_, table_oid: 16386, table_attribute_number: 3, data_type_oid: 1043, data_type_size: -1, type_modifier: 259, format: 0}, {field_name: last_nam4_0_0_, table_oid: 16386, table_attribute_number: 4, data_type_oid: 1043, data_type_size: -1, type_modifier: 259, format: 0}, {field_name: timestam5_0_0_, table_oid: 16386, table_attribute_number: 5, data_type_oid: 20, data_type_size: 8, type_modifier: -1, format: 0}]} - msg_type: 90 - auth_type: 0 - reqtimestampmock: 2025-04-16T15:26:01.75708725Z - restimestampmock: 2025-04-16T15:26:01.75717475Z -connectionId: "0" -respType: json diff --git a/employee-manager/keploy/test-set-0/tests/test-1.yaml b/employee-manager/keploy/test-set-0/tests/test-1.yaml deleted file mode 100755 index 243dc366..00000000 --- a/employee-manager/keploy/test-set-0/tests/test-1.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Keploy (2.5.2) -version: api.keploy.io/v1beta1 -kind: Http -name: test-1 -spec: - metadata: {} - req: - method: POST - proto_major: 1 - proto_minor: 1 - url: http://localhost:8080/api/employees - header: - Accept: '*/*' - Content-Length: "100" - Content-Type: application/json - Host: localhost:8080 - User-Agent: curl/8.7.1 - body: |- - { - "firstName": "Myke", - "lastName": "Tyson", - "email": "mt@gmail.com", - "timestamp":1 - } - timestamp: 2025-04-16T15:25:51.381551857Z - resp: - status_code: 200 - header: - Content-Type: application/json - Date: Wed, 16 Apr 2025 15:25:51 GMT - body: '{"id":1,"firstName":"Myke","lastName":"Tyson","email":"mt@gmail.com","timestamp":1744817151}' - status_message: OK - proto_major: 0 - proto_minor: 0 - timestamp: 2025-04-16T15:25:54.532831219Z - objects: [] - assertions: - noise: - header.Date: [] - created: 1744817154 -curl: |- - curl --request POST \ - --url http://localhost:8080/api/employees \ - --header 'Accept: */*' \ - --header 'Content-Type: application/json' \ - --header 'Host: localhost:8080' \ - --header 'User-Agent: curl/8.7.1' \ - --data "{\n \"firstName\": \"Myke\",\n \"lastName\": \"Tyson\",\n \"email\": \"mt@gmail.com\",\n \"timestamp\":1\n}" -respType: json diff --git a/employee-manager/keploy/test-set-0/tests/test-2.yaml b/employee-manager/keploy/test-set-0/tests/test-2.yaml deleted file mode 100755 index e4a1858c..00000000 --- a/employee-manager/keploy/test-set-0/tests/test-2.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Keploy (2.5.2) -version: api.keploy.io/v1beta1 -kind: Http -name: test-2 -spec: - metadata: {} - req: - method: GET - proto_major: 1 - proto_minor: 1 - url: http://localhost:8080/api/employees/1 - header: - Accept: '*/*' - Host: localhost:8080 - User-Agent: curl/8.7.1 - body: "" - timestamp: 2025-04-16T15:26:01.73971932Z - resp: - status_code: 200 - header: - Content-Type: application/json - Date: Wed, 16 Apr 2025 15:26:01 GMT - body: '{"id":1,"firstName":"Myke","lastName":"Tyson","email":"mt@gmail.com","timestamp":1744817151}' - status_message: OK - proto_major: 0 - proto_minor: 0 - timestamp: 2025-04-16T15:26:04.868476251Z - objects: [] - assertions: - noise: - header.Date: [] - created: 1744817164 -curl: | - curl --request GET \ - --url http://localhost:8080/api/employees/1 \ - --header 'Host: localhost:8080' \ - --header 'User-Agent: curl/8.7.1' \ - --header 'Accept: */*' \ -respType: json diff --git a/java-dedup/.gitignore b/java-dedup/.gitignore new file mode 100644 index 00000000..79b94208 --- /dev/null +++ b/java-dedup/.gitignore @@ -0,0 +1,9 @@ +/target/ +/keploy/reports/ +/dedupData.yaml +/duplicates.yaml +/docker-compose-tmp.yaml +/jacoco.exec +/.java-sdk-installed +/java-sdk/ +/*.log diff --git a/java-dedup/Dockerfile b/java-dedup/Dockerfile new file mode 100644 index 00000000..3691d048 --- /dev/null +++ b/java-dedup/Dockerfile @@ -0,0 +1,14 @@ +ARG JAVA_VERSION=8 +FROM eclipse-temurin:${JAVA_VERSION}-jre + +WORKDIR /app + +RUN groupadd --gid 10001 appuser \ + && useradd --uid 10001 --gid 10001 --home-dir /home/appuser --create-home --shell /usr/sbin/nologin appuser + +COPY --chown=10001:10001 target/java-dedup.jar /app/app.jar +COPY --chown=10001:10001 target/keploy-sdk.jar /app/keploy-sdk.jar +COPY --chown=10001:10001 target/jacocoagent.jar /app/jacocoagent.jar +EXPOSE 8080 +USER 10001:10001 +ENTRYPOINT ["java", "-javaagent:/app/keploy-sdk.jar", "-javaagent:/app/jacocoagent.jar=destfile=/tmp/jacoco.exec", "-jar", "/app/app.jar"] diff --git a/java-dedup/Dockerfile.classpath b/java-dedup/Dockerfile.classpath new file mode 100644 index 00000000..83eb9382 --- /dev/null +++ b/java-dedup/Dockerfile.classpath @@ -0,0 +1,18 @@ +ARG JAVA_VERSION=8 +FROM eclipse-temurin:${JAVA_VERSION}-jre + +WORKDIR /app + +RUN groupadd --gid 10001 appuser \ + && useradd --uid 10001 --gid 10001 --home-dir /home/appuser --create-home --shell /usr/sbin/nologin appuser + +COPY --chown=10001:10001 target/classes /app/classes +COPY --chown=10001:10001 target/dependency /app/libs +COPY --chown=10001:10001 target/keploy-sdk.jar /app/keploy-sdk.jar +COPY --chown=10001:10001 target/jacocoagent.jar /app/jacocoagent.jar + +ENV KEPLOY_JAVA_CLASS_DIRS=/app/classes + +EXPOSE 8080 +USER 10001:10001 +ENTRYPOINT ["java", "-javaagent:/app/keploy-sdk.jar", "-javaagent:/app/jacocoagent.jar=destfile=/tmp/jacoco.exec", "-cp", "/app/classes:/app/libs/*", "io.keploy.samples.javadedup.JavaDedupApplication"] diff --git a/java-dedup/Dockerfile.distroless b/java-dedup/Dockerfile.distroless new file mode 100644 index 00000000..3427aea3 --- /dev/null +++ b/java-dedup/Dockerfile.distroless @@ -0,0 +1,11 @@ +FROM gcr.io/distroless/java17-debian12:nonroot + +WORKDIR /app + +COPY --chown=10001:10001 target/java-dedup.jar /app/app.jar +COPY --chown=10001:10001 target/keploy-sdk.jar /app/keploy-sdk.jar +COPY --chown=10001:10001 target/jacocoagent.jar /app/jacocoagent.jar + +EXPOSE 8080 +USER 10001:10001 +ENTRYPOINT ["java", "-javaagent:/app/keploy-sdk.jar", "-javaagent:/app/jacocoagent.jar=destfile=/tmp/jacoco.exec", "-jar", "/app/app.jar"] diff --git a/java-dedup/README.md b/java-dedup/README.md new file mode 100644 index 00000000..d3799491 --- /dev/null +++ b/java-dedup/README.md @@ -0,0 +1,69 @@ +# Java Dynamic Deduplication Sample + +A Spring Boot application used by Keploy CI to validate Java dynamic deduplication. It mirrors the Go dedup sample by exposing a broad set of endpoints and committing 400 replay fixtures across four testsets. + +CI does not record this sample. The `keploy/` directory is checked in so the pipeline only builds the app and runs replay with `--dedup --skip-app-restart`. When the sample behavior changes, record the fixtures locally and push the updated `keploy/` files. + +The Keploy Java SDK is attached as a Java agent at replay time. The sample does not compile against `io.keploy:keploy-sdk` and does not import Keploy classes in application code. + +The SDK reads JaCoCo coverage in-process via `org.jacoco.agent.rt.RT.getAgent().getExecutionData(...)`, so attach both agents when running dynamic deduplication: the Keploy agent for the control/data socket protocol, and the JaCoCo agent for runtime coverage. + +## Setup + +```bash +mvn -B -DskipTests -Dkeploy.agent.version=2.0.6 clean package +``` + +This builds the runnable application jar, copies `target/keploy-sdk.jar`, and copies `target/jacocoagent.jar` next to it. + +## Run dedup natively + +```bash +keploy test \ + -c "java -javaagent:target/keploy-sdk.jar -javaagent:target/jacocoagent.jar -jar target/java-dedup.jar" \ + --dedup --skip-app-restart --language java --delay 1 \ + --health-url "http://127.0.0.1:8080/healthz" \ + --health-poll-timeout 30s \ + --disableMockUpload --disableReportUpload + +keploy dedup --path . +``` + +## Run dedup with Docker + +```bash +docker compose build +keploy test \ + -c "docker compose up" \ + --container-name "dedup-java" \ + --host "127.0.0.1" \ + --dedup --skip-app-restart --language java --delay 1 \ + --health-url "http://127.0.0.1:8080/healthz" \ + --health-poll-timeout 30s \ + --disableMockUpload --disableReportUpload + +keploy dedup --path . +``` + +During `keploy test`, Enterprise rewrites the Compose file and injects its own shared `/tmp` volume for the dedup control/data sockets. The base sample Compose file does not need a host `/tmp` bind mount. +Re-run `docker compose build` whenever the jar, JaCoCo agent, or Dockerfile changes so replay uses the current image. + +## Run dedup with direct Docker + +```bash +docker compose build +keploy test \ + -c "docker run --rm --name dedup-java -p 8080:8080 java-dedup:local" \ + --container-name "dedup-java" \ + --host "127.0.0.1" \ + --dedup --skip-app-restart --language java --delay 1 \ + --health-url "http://127.0.0.1:8080/healthz" \ + --health-poll-timeout 30s \ + --disableMockUpload --disableReportUpload + +keploy dedup --path . +``` + +During direct `docker run`, Enterprise injects the same shared `/tmp` volume into the app container. Do not pass your own `/tmp` mount in the app command. + +The CI pipeline also validates additional production-style layouts for the same app, including native classpath, direct Docker run, Docker Compose, exploded classpath images, restricted runtime, restricted classpath, and distroless packaging. diff --git a/java-dedup/docker-compose.classpath.yml b/java-dedup/docker-compose.classpath.yml new file mode 100644 index 00000000..68500b3c --- /dev/null +++ b/java-dedup/docker-compose.classpath.yml @@ -0,0 +1,4 @@ +services: + java-dedup: + build: + dockerfile: Dockerfile.classpath diff --git a/java-dedup/docker-compose.distroless.yml b/java-dedup/docker-compose.distroless.yml new file mode 100644 index 00000000..7fc4d1f5 --- /dev/null +++ b/java-dedup/docker-compose.distroless.yml @@ -0,0 +1,4 @@ +services: + java-dedup: + build: + dockerfile: Dockerfile.distroless diff --git a/java-dedup/docker-compose.restricted.yml b/java-dedup/docker-compose.restricted.yml new file mode 100644 index 00000000..d97df717 --- /dev/null +++ b/java-dedup/docker-compose.restricted.yml @@ -0,0 +1,7 @@ +services: + java-dedup: + read_only: true + cap_drop: + - ALL + security_opt: + - no-new-privileges:true diff --git a/java-dedup/docker-compose.yml b/java-dedup/docker-compose.yml new file mode 100644 index 00000000..d57c3568 --- /dev/null +++ b/java-dedup/docker-compose.yml @@ -0,0 +1,13 @@ +services: + java-dedup: + image: ${JAVA_DEDUP_IMAGE:-java-dedup:local} + build: + context: . + dockerfile: Dockerfile + args: + JAVA_VERSION: ${JAVA_VERSION:-8} + environment: + KEPLOY_JAVA_DEDUP_DIAGNOSTICS: ${KEPLOY_JAVA_DEDUP_DIAGNOSTICS:-} + container_name: dedup-java + ports: + - "${JAVA_DEDUP_HOST_PORT:-8080}:8080" diff --git a/java-dedup/keploy.yml b/java-dedup/keploy.yml new file mode 100644 index 00000000..0ead24ca --- /dev/null +++ b/java-dedup/keploy.yml @@ -0,0 +1,104 @@ +# Generated by Keploy (3-dev) +path: "" +appId: 0 +appName: "" +command: "" +templatize: + testSets: [] +port: 0 +proxyPort: 16789 +incomingProxyPort: 36789 +dnsPort: 26789 +debug: false +disableANSI: false +disableTele: false +generateGithubActions: false +containerName: "" +networkName: "" +buildDelay: 30 +test: + selectedTests: {} + ignoredTests: {} + globalNoise: + global: {"body": {"current_time":[]}} + test-sets: {} + replaceWith: + global: {} + test-sets: {} + delay: 5 + host: "localhost" + port: 0 + grpcPort: 0 + ssePort: 0 + protocol: + http: + port: 0 + sse: + port: 0 + grpc: + port: 0 + apiTimeout: 5 + skipCoverage: false + coverageReportPath: "" + ignoreOrdering: true + mongoPassword: "default@123" + language: "" + removeUnusedMocks: false + fallBackOnMiss: false + jacocoAgentPath: "" + basePath: "" + mocking: true + disableLineCoverage: false + disableMockUpload: false + useLocalMock: false + updateTemplate: false + mustPass: false + maxFailAttempts: 5 + maxFlakyChecks: 1 + protoFile: "" + protoDir: "" + protoInclude: [] + compareAll: false + updateTestMapping: false + disableAutoHeaderNoise: false + # strictMockWindow enforces cross-test bleed prevention. Per-test + # (LifetimePerTest) mocks whose request timestamp falls outside the + # outer test window are dropped rather than promoted across tests. + # + # Default TRUE now that every stateful-protocol recorder classifies + # mocks finely enough (per-connection data mocks, session vs per-test + # distinction for connection-alive commands) that legitimate cross- + # test sharing is encoded as session/connection lifetime rather than + # implicit out-of-window reuse. If an older recording relies on the + # legacy lax behaviour, opt out with strictMockWindow: false here or + # export KEPLOY_STRICT_MOCK_WINDOW=0 — the env var wins. + strictMockWindow: true + dedup: false + freezeTime: false + fuzzyMatch: false +record: + recordTimer: 0s + filters: [] + sync: false + memoryLimit: 0 +configPath: "" +bypassRules: [] +disableMapping: true +contract: + driven: "consumer" + mappings: + servicesMapping: {} + self: "s1" + services: [] + tests: [] + path: "" + download: false + generate: false +inCi: false +cmdType: "native" +enableTesting: false +inDocker: false +keployContainer: "keploy-v3" +keployNetwork: "keploy-network" + +# Visit [https://keploy.io/docs/running-keploy/configuration-file/] to learn about using keploy through configration file. diff --git a/employee-manager/keploy/.gitignore b/java-dedup/keploy/.gitignore similarity index 100% rename from employee-manager/keploy/.gitignore rename to java-dedup/keploy/.gitignore diff --git a/java-dedup/keploy/test-set-0/tests/test-10.yaml b/java-dedup/keploy/test-set-0/tests/test-10.yaml new file mode 100644 index 00000000..150b3337 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-10.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.246997938+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.25057105+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-100.yaml b/java-dedup/keploy/test-set-0/tests/test-100.yaml new file mode 100644 index 00000000..3bfb3444 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-100.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-100 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.301192216+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.303821826+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-101.yaml b/java-dedup/keploy/test-set-0/tests/test-101.yaml new file mode 100644 index 00000000..33c8e913 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-101.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-101 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.312328831+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.314716531+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-11.yaml b/java-dedup/keploy/test-set-0/tests/test-11.yaml new file mode 100644 index 00000000..64d4a0e7 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-11.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.259592913+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.262830537+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-12.yaml b/java-dedup/keploy/test-set-0/tests/test-12.yaml new file mode 100644 index 00000000..6e96e4c4 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-12.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.271770604+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.274825167+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-13.yaml b/java-dedup/keploy/test-set-0/tests/test-13.yaml new file mode 100644 index 00000000..279045d3 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-13.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-13 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.283341231+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.294218108+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-14.yaml b/java-dedup/keploy/test-set-0/tests/test-14.yaml new file mode 100644 index 00000000..e788235d --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-14.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-14 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.303059118+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.309501889+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-15.yaml b/java-dedup/keploy/test-set-0/tests/test-15.yaml new file mode 100644 index 00000000..ff30a733 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-15.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-15 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.317694997+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.321284488+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-16.yaml b/java-dedup/keploy/test-set-0/tests/test-16.yaml new file mode 100644 index 00000000..7b0bf4e5 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-16.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-16 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.330829639+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.333827734+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-17.yaml b/java-dedup/keploy/test-set-0/tests/test-17.yaml new file mode 100644 index 00000000..25f9c35c --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-17.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-17 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.341390169+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.34424254+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-18.yaml b/java-dedup/keploy/test-set-0/tests/test-18.yaml new file mode 100644 index 00000000..f31d7f49 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-18.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-18 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.350819355+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.354737881+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-19.yaml b/java-dedup/keploy/test-set-0/tests/test-19.yaml new file mode 100644 index 00000000..e8b35847 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-19.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-19 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.362777407+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.365855248+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-2.yaml b/java-dedup/keploy/test-set-0/tests/test-2.yaml new file mode 100644 index 00000000..6e5fd67b --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-2.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.089211704+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.11014017+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-20.yaml b/java-dedup/keploy/test-set-0/tests/test-20.yaml new file mode 100644 index 00000000..0e8a4c00 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-20.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-20 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.373896932+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.377126848+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-21.yaml b/java-dedup/keploy/test-set-0/tests/test-21.yaml new file mode 100644 index 00000000..aef0739a --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-21.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-21 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.385656262+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.388574869+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-22.yaml b/java-dedup/keploy/test-set-0/tests/test-22.yaml new file mode 100644 index 00000000..4b070dea --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-22.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-22 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.395782179+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.398408679+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-23.yaml b/java-dedup/keploy/test-set-0/tests/test-23.yaml new file mode 100644 index 00000000..b80d6148 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-23.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-23 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.407039159+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.410247636+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-24.yaml b/java-dedup/keploy/test-set-0/tests/test-24.yaml new file mode 100644 index 00000000..a0313343 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-24.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-24 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.418832957+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.421297513+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-25.yaml b/java-dedup/keploy/test-set-0/tests/test-25.yaml new file mode 100644 index 00000000..b0c22ab9 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-25.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-25 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.428713034+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.431826254+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-26.yaml b/java-dedup/keploy/test-set-0/tests/test-26.yaml new file mode 100644 index 00000000..1ec7d734 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-26.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-26 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.440352828+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.443141802+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-27.yaml b/java-dedup/keploy/test-set-0/tests/test-27.yaml new file mode 100644 index 00000000..d68849fa --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-27.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-27 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.449964647+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.452932833+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-28.yaml b/java-dedup/keploy/test-set-0/tests/test-28.yaml new file mode 100644 index 00000000..5e22e3f6 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-28.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-28 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.460148822+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.462807441+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-29.yaml b/java-dedup/keploy/test-set-0/tests/test-29.yaml new file mode 100644 index 00000000..1e044ec9 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-29.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-29 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.470434753+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.474848799+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-3.yaml b/java-dedup/keploy/test-set-0/tests/test-3.yaml new file mode 100644 index 00000000..f2363ef9 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-3.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.119386275+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.122922237+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-30.yaml b/java-dedup/keploy/test-set-0/tests/test-30.yaml new file mode 100644 index 00000000..be1ef634 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-30.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-30 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.483631232+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.486893696+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-31.yaml b/java-dedup/keploy/test-set-0/tests/test-31.yaml new file mode 100644 index 00000000..5519edcf --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-31.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-31 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.494195981+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.497324791+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-32.yaml b/java-dedup/keploy/test-set-0/tests/test-32.yaml new file mode 100644 index 00000000..dc7834ea --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-32.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-32 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.506087604+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.508910327+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-33.yaml b/java-dedup/keploy/test-set-0/tests/test-33.yaml new file mode 100644 index 00000000..9c31bcce --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-33.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-33 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.515609887+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.519111651+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-34.yaml b/java-dedup/keploy/test-set-0/tests/test-34.yaml new file mode 100644 index 00000000..3eb9a7da --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-34.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-34 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.533654574+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.53639861+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-35.yaml b/java-dedup/keploy/test-set-0/tests/test-35.yaml new file mode 100644 index 00000000..f7511579 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-35.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-35 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.543253384+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.546736568+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-36.yaml b/java-dedup/keploy/test-set-0/tests/test-36.yaml new file mode 100644 index 00000000..3ae12838 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-36.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-36 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.563119554+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.566551772+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-37.yaml b/java-dedup/keploy/test-set-0/tests/test-37.yaml new file mode 100644 index 00000000..61ba00f9 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-37.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-37 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.57618174+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.579409935+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-38.yaml b/java-dedup/keploy/test-set-0/tests/test-38.yaml new file mode 100644 index 00000000..fc6d3437 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-38.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-38 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.593624861+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.598378823+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-39.yaml b/java-dedup/keploy/test-set-0/tests/test-39.yaml new file mode 100644 index 00000000..8527f394 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-39.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-39 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.608605996+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.611572482+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-4.yaml b/java-dedup/keploy/test-set-0/tests/test-4.yaml new file mode 100644 index 00000000..60a9c9c7 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-4.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.13077401+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.135140206+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-40.yaml b/java-dedup/keploy/test-set-0/tests/test-40.yaml new file mode 100644 index 00000000..0d8a971e --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-40.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-40 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.623223115+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.626153894+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-41.yaml b/java-dedup/keploy/test-set-0/tests/test-41.yaml new file mode 100644 index 00000000..bbbc112f --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-41.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-41 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.633576794+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.636410066+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-42.yaml b/java-dedup/keploy/test-set-0/tests/test-42.yaml new file mode 100644 index 00000000..9317f8eb --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-42.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-42 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.645455848+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.648505121+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-43.yaml b/java-dedup/keploy/test-set-0/tests/test-43.yaml new file mode 100644 index 00000000..00239937 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-43.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-43 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.657997554+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.661292038+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-44.yaml b/java-dedup/keploy/test-set-0/tests/test-44.yaml new file mode 100644 index 00000000..2cc6b4e0 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-44.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-44 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.67081526+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.673844402+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-45.yaml b/java-dedup/keploy/test-set-0/tests/test-45.yaml new file mode 100644 index 00000000..e4556eac --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-45.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-45 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.681525482+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.68517059+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-46.yaml b/java-dedup/keploy/test-set-0/tests/test-46.yaml new file mode 100644 index 00000000..a16c2f4d --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-46.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-46 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.693363458+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.695897332+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-47.yaml b/java-dedup/keploy/test-set-0/tests/test-47.yaml new file mode 100644 index 00000000..7b855443 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-47.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-47 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.704623149+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.707189541+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-48.yaml b/java-dedup/keploy/test-set-0/tests/test-48.yaml new file mode 100644 index 00000000..aa1d8ba8 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-48.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-48 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.713564776+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.715537983+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-49.yaml b/java-dedup/keploy/test-set-0/tests/test-49.yaml new file mode 100644 index 00000000..3fda9bcb --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-49.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-49 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.721762573+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.72400678+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-5.yaml b/java-dedup/keploy/test-set-0/tests/test-5.yaml new file mode 100644 index 00000000..36cda728 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-5.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.143247918+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.1741081+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-50.yaml b/java-dedup/keploy/test-set-0/tests/test-50.yaml new file mode 100644 index 00000000..345bc889 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-50.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-50 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.731131953+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.733321521+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-51.yaml b/java-dedup/keploy/test-set-0/tests/test-51.yaml new file mode 100644 index 00000000..d9fbc3b0 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-51.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-51 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.740121868+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.743103903+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-52.yaml b/java-dedup/keploy/test-set-0/tests/test-52.yaml new file mode 100644 index 00000000..a5de0c26 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-52.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-52 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.751666175+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.754286685+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-53.yaml b/java-dedup/keploy/test-set-0/tests/test-53.yaml new file mode 100644 index 00000000..2e27fda7 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-53.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-53 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.76233114+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.765340125+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-54.yaml b/java-dedup/keploy/test-set-0/tests/test-54.yaml new file mode 100644 index 00000000..4b33c1c5 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-54.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-54 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.772436688+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.775396964+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-55.yaml b/java-dedup/keploy/test-set-0/tests/test-55.yaml new file mode 100644 index 00000000..50e87651 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-55.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-55 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.785955315+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.788656261+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-56.yaml b/java-dedup/keploy/test-set-0/tests/test-56.yaml new file mode 100644 index 00000000..377b9e6a --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-56.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-56 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.799431362+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.802229835+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-57.yaml b/java-dedup/keploy/test-set-0/tests/test-57.yaml new file mode 100644 index 00000000..52d2c497 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-57.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-57 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.810295548+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.812819012+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-58.yaml b/java-dedup/keploy/test-set-0/tests/test-58.yaml new file mode 100644 index 00000000..14110339 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-58.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-58 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.820603607+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.823223508+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-59.yaml b/java-dedup/keploy/test-set-0/tests/test-59.yaml new file mode 100644 index 00000000..ed12d632 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-59.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-59 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.833192883+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.835705997+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-6.yaml b/java-dedup/keploy/test-set-0/tests/test-6.yaml new file mode 100644 index 00000000..c2a0dc4f --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-6.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.183819775+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.187117168+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-60.yaml b/java-dedup/keploy/test-set-0/tests/test-60.yaml new file mode 100644 index 00000000..3f2374f5 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-60.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-60 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.844689203+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.847673317+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-61.yaml b/java-dedup/keploy/test-set-0/tests/test-61.yaml new file mode 100644 index 00000000..890f78ad --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-61.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-61 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.859075122+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.861878635+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-62.yaml b/java-dedup/keploy/test-set-0/tests/test-62.yaml new file mode 100644 index 00000000..526b564a --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-62.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-62 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.870822852+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.873816757+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-63.yaml b/java-dedup/keploy/test-set-0/tests/test-63.yaml new file mode 100644 index 00000000..118f0776 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-63.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-63 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.882197267+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.885060527+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-64.yaml b/java-dedup/keploy/test-set-0/tests/test-64.yaml new file mode 100644 index 00000000..72b6f703 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-64.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-64 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.892746546+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.896393634+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-65.yaml b/java-dedup/keploy/test-set-0/tests/test-65.yaml new file mode 100644 index 00000000..147d6960 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-65.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-65 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.903871262+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.906759152+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-66.yaml b/java-dedup/keploy/test-set-0/tests/test-66.yaml new file mode 100644 index 00000000..cad5f5c0 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-66.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-66 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.915282085+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.918281632+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-67.yaml b/java-dedup/keploy/test-set-0/tests/test-67.yaml new file mode 100644 index 00000000..bab278fa --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-67.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-67 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.927801274+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.930900334+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-68.yaml b/java-dedup/keploy/test-set-0/tests/test-68.yaml new file mode 100644 index 00000000..a92ee34a --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-68.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-68 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.939242296+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.941564589+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-69.yaml b/java-dedup/keploy/test-set-0/tests/test-69.yaml new file mode 100644 index 00000000..8076267f --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-69.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-69 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.949865033+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.952985083+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-7.yaml b/java-dedup/keploy/test-set-0/tests/test-7.yaml new file mode 100644 index 00000000..18757bfb --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-7.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.196349423+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.203398288+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-70.yaml b/java-dedup/keploy/test-set-0/tests/test-70.yaml new file mode 100644 index 00000000..42aaca6c --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-70.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-70 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.961472098+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.964477033+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-71.yaml b/java-dedup/keploy/test-set-0/tests/test-71.yaml new file mode 100644 index 00000000..ac4fd561 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-71.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-71 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.973581103+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.976436853+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-72.yaml b/java-dedup/keploy/test-set-0/tests/test-72.yaml new file mode 100644 index 00000000..1b32ff46 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-72.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-72 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.986416708+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.989147893+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-73.yaml b/java-dedup/keploy/test-set-0/tests/test-73.yaml new file mode 100644 index 00000000..481f2efe --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-73.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-73 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.99807687+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.000181382+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-74.yaml b/java-dedup/keploy/test-set-0/tests/test-74.yaml new file mode 100644 index 00000000..1aa1a6fa --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-74.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-74 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.009719734+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.012465989+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-75.yaml b/java-dedup/keploy/test-set-0/tests/test-75.yaml new file mode 100644 index 00000000..7dc42871 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-75.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-75 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.022606606+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.025032815+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-76.yaml b/java-dedup/keploy/test-set-0/tests/test-76.yaml new file mode 100644 index 00000000..0168a2b5 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-76.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-76 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.031518203+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.034002169+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-77.yaml b/java-dedup/keploy/test-set-0/tests/test-77.yaml new file mode 100644 index 00000000..45db5157 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-77.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-77 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.041578903+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.04405845+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-78.yaml b/java-dedup/keploy/test-set-0/tests/test-78.yaml new file mode 100644 index 00000000..b2825d52 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-78.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-78 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.051947731+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.054955264+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-79.yaml b/java-dedup/keploy/test-set-0/tests/test-79.yaml new file mode 100644 index 00000000..91adefa4 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-79.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-79 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.065680626+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.068291127+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-8.yaml b/java-dedup/keploy/test-set-0/tests/test-8.yaml new file mode 100644 index 00000000..9e0d8ba1 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-8.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.214448427+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.223436382+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-80.yaml b/java-dedup/keploy/test-set-0/tests/test-80.yaml new file mode 100644 index 00000000..d1dd1788 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-80.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-80 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.077157506+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.08017922+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-81.yaml b/java-dedup/keploy/test-set-0/tests/test-81.yaml new file mode 100644 index 00000000..da0e9ae4 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-81.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-81 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.08929152+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.091742287+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-82.yaml b/java-dedup/keploy/test-set-0/tests/test-82.yaml new file mode 100644 index 00000000..6ffc351c --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-82.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-82 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.100870516+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.103925678+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-83.yaml b/java-dedup/keploy/test-set-0/tests/test-83.yaml new file mode 100644 index 00000000..2cf88bb3 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-83.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-83 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.115793772+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.118988039+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-84.yaml b/java-dedup/keploy/test-set-0/tests/test-84.yaml new file mode 100644 index 00000000..046852bd --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-84.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-84 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.127774291+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.130267178+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-85.yaml b/java-dedup/keploy/test-set-0/tests/test-85.yaml new file mode 100644 index 00000000..16521420 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-85.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-85 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.140476872+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.142845742+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-86.yaml b/java-dedup/keploy/test-set-0/tests/test-86.yaml new file mode 100644 index 00000000..1f9735a8 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-86.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-86 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.153870912+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.156846748+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-87.yaml b/java-dedup/keploy/test-set-0/tests/test-87.yaml new file mode 100644 index 00000000..a28c2121 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-87.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-87 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.164962218+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.168104787+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-88.yaml b/java-dedup/keploy/test-set-0/tests/test-88.yaml new file mode 100644 index 00000000..ad52c2b4 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-88.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-88 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.177134239+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.179953731+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-89.yaml b/java-dedup/keploy/test-set-0/tests/test-89.yaml new file mode 100644 index 00000000..ad9bc268 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-89.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-89 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.187453818+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.190686653+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-9.yaml b/java-dedup/keploy/test-set-0/tests/test-9.yaml new file mode 100644 index 00000000..394d92ed --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-9.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:15.234605135+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:15 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:15.239474372+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015095 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-90.yaml b/java-dedup/keploy/test-set-0/tests/test-90.yaml new file mode 100644 index 00000000..f3b8cfb0 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-90.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-90 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.199350491+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.202333387+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-91.yaml b/java-dedup/keploy/test-set-0/tests/test-91.yaml new file mode 100644 index 00000000..ffb352cd --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-91.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-91 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.211278263+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.214312756+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-92.yaml b/java-dedup/keploy/test-set-0/tests/test-92.yaml new file mode 100644 index 00000000..f6f45e5a --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-92.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-92 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.222306933+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.224884985+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-93.yaml b/java-dedup/keploy/test-set-0/tests/test-93.yaml new file mode 100644 index 00000000..0a59dae1 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-93.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-93 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.233697156+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.236520379+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-94.yaml b/java-dedup/keploy/test-set-0/tests/test-94.yaml new file mode 100644 index 00000000..c7cb5208 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-94.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-94 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.24415261+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.246603027+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-95.yaml b/java-dedup/keploy/test-set-0/tests/test-95.yaml new file mode 100644 index 00000000..63c42b27 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-95.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-95 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.253913621+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.256448156+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-96.yaml b/java-dedup/keploy/test-set-0/tests/test-96.yaml new file mode 100644 index 00000000..24a84f2b --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-96.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-96 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.264280308+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.267313872+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-97.yaml b/java-dedup/keploy/test-set-0/tests/test-97.yaml new file mode 100644 index 00000000..b22a422d --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-97.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-97 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.273736283+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.275871654+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-98.yaml b/java-dedup/keploy/test-set-0/tests/test-98.yaml new file mode 100644 index 00000000..3cfd8299 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-98.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-98 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.281631984+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.284321251+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-0/tests/test-99.yaml b/java-dedup/keploy/test-set-0/tests/test-99.yaml new file mode 100644 index 00000000..2235b978 --- /dev/null +++ b/java-dedup/keploy/test-set-0/tests/test-99.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-99 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:48:16.291304919+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:18:16 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:48:16.293698238+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015096 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-10.yaml b/java-dedup/keploy/test-set-1/tests/test-10.yaml new file mode 100644 index 00000000..65fc49bd --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-10.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.654399317+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.657679652+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-100.yaml b/java-dedup/keploy/test-set-1/tests/test-100.yaml new file mode 100644 index 00000000..68dc64b1 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-100.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-100 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.639162423+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.641538008+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-101.yaml b/java-dedup/keploy/test-set-1/tests/test-101.yaml new file mode 100644 index 00000000..33279547 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-101.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-101 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.648021589+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.650108527+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-11.yaml b/java-dedup/keploy/test-set-1/tests/test-11.yaml new file mode 100644 index 00000000..f2b9d9bc --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-11.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.668017902+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.67077988+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-12.yaml b/java-dedup/keploy/test-set-1/tests/test-12.yaml new file mode 100644 index 00000000..5d354d72 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-12.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.677900754+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.68319034+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-13.yaml b/java-dedup/keploy/test-set-1/tests/test-13.yaml new file mode 100644 index 00000000..6f756b8e --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-13.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-13 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.691035781+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.693836147+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-14.yaml b/java-dedup/keploy/test-set-1/tests/test-14.yaml new file mode 100644 index 00000000..3addbf2c --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-14.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-14 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.701323024+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.725904964+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-15.yaml b/java-dedup/keploy/test-set-1/tests/test-15.yaml new file mode 100644 index 00000000..8f54d8d6 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-15.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-15 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.734959421+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.738264024+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-16.yaml b/java-dedup/keploy/test-set-1/tests/test-16.yaml new file mode 100644 index 00000000..22dc4b6a --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-16.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-16 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.747506495+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.750911743+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-17.yaml b/java-dedup/keploy/test-set-1/tests/test-17.yaml new file mode 100644 index 00000000..70898a18 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-17.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-17 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.759860746+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.762848344+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-18.yaml b/java-dedup/keploy/test-set-1/tests/test-18.yaml new file mode 100644 index 00000000..4f9343d7 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-18.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-18 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.77171822+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.774089045+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-19.yaml b/java-dedup/keploy/test-set-1/tests/test-19.yaml new file mode 100644 index 00000000..6f49d0aa --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-19.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-19 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.781672769+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.784177967+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-2.yaml b/java-dedup/keploy/test-set-1/tests/test-2.yaml new file mode 100644 index 00000000..342ee3f0 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-2.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.561926501+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.577041281+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-20.yaml b/java-dedup/keploy/test-set-1/tests/test-20.yaml new file mode 100644 index 00000000..725b484f --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-20.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-20 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.791723183+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.794639853+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-21.yaml b/java-dedup/keploy/test-set-1/tests/test-21.yaml new file mode 100644 index 00000000..48b460e8 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-21.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-21 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.804178659+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.807642446+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-22.yaml b/java-dedup/keploy/test-set-1/tests/test-22.yaml new file mode 100644 index 00000000..6c6471b6 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-22.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-22 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.817277808+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.820758523+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-23.yaml b/java-dedup/keploy/test-set-1/tests/test-23.yaml new file mode 100644 index 00000000..c54843d7 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-23.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-23 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.829978495+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.833292107+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-24.yaml b/java-dedup/keploy/test-set-1/tests/test-24.yaml new file mode 100644 index 00000000..28f30536 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-24.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-24 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.843193248+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.84606496+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-25.yaml b/java-dedup/keploy/test-set-1/tests/test-25.yaml new file mode 100644 index 00000000..ae76abf6 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-25.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-25 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.854789292+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.857692764+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-26.yaml b/java-dedup/keploy/test-set-1/tests/test-26.yaml new file mode 100644 index 00000000..6229fcf1 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-26.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-26 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.867435952+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.870595502+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-27.yaml b/java-dedup/keploy/test-set-1/tests/test-27.yaml new file mode 100644 index 00000000..f5941c14 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-27.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-27 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.879698827+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.883506598+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-28.yaml b/java-dedup/keploy/test-set-1/tests/test-28.yaml new file mode 100644 index 00000000..0d939943 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-28.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-28 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.891854308+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.895033887+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-29.yaml b/java-dedup/keploy/test-set-1/tests/test-29.yaml new file mode 100644 index 00000000..32208ce8 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-29.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-29 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.901673322+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.904409211+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-3.yaml b/java-dedup/keploy/test-set-1/tests/test-3.yaml new file mode 100644 index 00000000..63b14f21 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-3.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.583188158+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.586939972+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-30.yaml b/java-dedup/keploy/test-set-1/tests/test-30.yaml new file mode 100644 index 00000000..ebb80461 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-30.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-30 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.911725336+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.914257183+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-31.yaml b/java-dedup/keploy/test-set-1/tests/test-31.yaml new file mode 100644 index 00000000..0833cac7 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-31.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-31 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.921184476+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.924220632+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-32.yaml b/java-dedup/keploy/test-set-1/tests/test-32.yaml new file mode 100644 index 00000000..eb53c9a6 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-32.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-32 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.931047348+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.934697326+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-33.yaml b/java-dedup/keploy/test-set-1/tests/test-33.yaml new file mode 100644 index 00000000..04f5565e --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-33.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-33 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.94361423+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.946843497+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-34.yaml b/java-dedup/keploy/test-set-1/tests/test-34.yaml new file mode 100644 index 00000000..a8476317 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-34.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-34 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.954191611+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.956777447+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-35.yaml b/java-dedup/keploy/test-set-1/tests/test-35.yaml new file mode 100644 index 00000000..f6d12ef8 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-35.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-35 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.96528069+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.967846405+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-36.yaml b/java-dedup/keploy/test-set-1/tests/test-36.yaml new file mode 100644 index 00000000..c7512991 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-36.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-36 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.975066434+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.977790584+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-37.yaml b/java-dedup/keploy/test-set-1/tests/test-37.yaml new file mode 100644 index 00000000..1ab3f68e --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-37.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-37 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.985641444+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.98847177+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-38.yaml b/java-dedup/keploy/test-set-1/tests/test-38.yaml new file mode 100644 index 00000000..c5a3c491 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-38.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-38 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.996649676+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.99904461+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-39.yaml b/java-dedup/keploy/test-set-1/tests/test-39.yaml new file mode 100644 index 00000000..757ee6ff --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-39.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-39 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.005518033+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.007874378+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-4.yaml b/java-dedup/keploy/test-set-1/tests/test-4.yaml new file mode 100644 index 00000000..599b60a4 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-4.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.594441039+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.596802824+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-40.yaml b/java-dedup/keploy/test-set-1/tests/test-40.yaml new file mode 100644 index 00000000..ce0a28d9 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-40.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-40 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.015196753+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.017365047+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-41.yaml b/java-dedup/keploy/test-set-1/tests/test-41.yaml new file mode 100644 index 00000000..bdc2c86d --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-41.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-41 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.024095428+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.026498182+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-42.yaml b/java-dedup/keploy/test-set-1/tests/test-42.yaml new file mode 100644 index 00000000..c9117134 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-42.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-42 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.034426759+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.037202576+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-43.yaml b/java-dedup/keploy/test-set-1/tests/test-43.yaml new file mode 100644 index 00000000..851bbc6a --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-43.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-43 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.045068436+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.047945849+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-44.yaml b/java-dedup/keploy/test-set-1/tests/test-44.yaml new file mode 100644 index 00000000..daf371e7 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-44.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-44 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.057359401+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.060429454+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-45.yaml b/java-dedup/keploy/test-set-1/tests/test-45.yaml new file mode 100644 index 00000000..9ed4a452 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-45.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-45 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.067849506+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.070699708+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-46.yaml b/java-dedup/keploy/test-set-1/tests/test-46.yaml new file mode 100644 index 00000000..bd32fcbc --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-46.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-46 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.079315916+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.081560526+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-47.yaml b/java-dedup/keploy/test-set-1/tests/test-47.yaml new file mode 100644 index 00000000..56ef66ab --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-47.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-47 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.08867323+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.091346991+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-48.yaml b/java-dedup/keploy/test-set-1/tests/test-48.yaml new file mode 100644 index 00000000..3afae133 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-48.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-48 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.098720374+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.101260071+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-49.yaml b/java-dedup/keploy/test-set-1/tests/test-49.yaml new file mode 100644 index 00000000..74ec2543 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-49.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-49 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.108622295+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.110844676+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-5.yaml b/java-dedup/keploy/test-set-1/tests/test-5.yaml new file mode 100644 index 00000000..906a5f57 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-5.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.60365321+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.606315291+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-50.yaml b/java-dedup/keploy/test-set-1/tests/test-50.yaml new file mode 100644 index 00000000..55b3bc25 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-50.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-50 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.118135952+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.120678208+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-51.yaml b/java-dedup/keploy/test-set-1/tests/test-51.yaml new file mode 100644 index 00000000..6cfbf329 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-51.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-51 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.127818072+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.131445461+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-52.yaml b/java-dedup/keploy/test-set-1/tests/test-52.yaml new file mode 100644 index 00000000..e8da267f --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-52.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-52 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.139915625+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.142480221+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-53.yaml b/java-dedup/keploy/test-set-1/tests/test-53.yaml new file mode 100644 index 00000000..d1c2e3ce --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-53.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-53 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.150210918+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.152743515+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-54.yaml b/java-dedup/keploy/test-set-1/tests/test-54.yaml new file mode 100644 index 00000000..4aff2447 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-54.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-54 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.160813476+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.163377243+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-55.yaml b/java-dedup/keploy/test-set-1/tests/test-55.yaml new file mode 100644 index 00000000..809d4809 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-55.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-55 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.1717734+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.174326106+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-56.yaml b/java-dedup/keploy/test-set-1/tests/test-56.yaml new file mode 100644 index 00000000..6c98b57f --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-56.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-56 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.181598694+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.184193609+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-57.yaml b/java-dedup/keploy/test-set-1/tests/test-57.yaml new file mode 100644 index 00000000..b05288c1 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-57.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-57 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.192468351+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.194867584+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-58.yaml b/java-dedup/keploy/test-set-1/tests/test-58.yaml new file mode 100644 index 00000000..7d1b0146 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-58.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-58 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.201839985+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.204024427+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-59.yaml b/java-dedup/keploy/test-set-1/tests/test-59.yaml new file mode 100644 index 00000000..a4535a3e --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-59.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-59 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.211288325+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.213764075+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-6.yaml b/java-dedup/keploy/test-set-1/tests/test-6.yaml new file mode 100644 index 00000000..7ed93534 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-6.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.613318711+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.616432923+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-60.yaml b/java-dedup/keploy/test-set-1/tests/test-60.yaml new file mode 100644 index 00000000..de212267 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-60.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-60 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.22153614+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.224186552+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-61.yaml b/java-dedup/keploy/test-set-1/tests/test-61.yaml new file mode 100644 index 00000000..011f6dd8 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-61.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-61 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.232302922+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.235613205+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-62.yaml b/java-dedup/keploy/test-set-1/tests/test-62.yaml new file mode 100644 index 00000000..7cfc5c9d --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-62.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-62 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.244161015+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.246495332+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-63.yaml b/java-dedup/keploy/test-set-1/tests/test-63.yaml new file mode 100644 index 00000000..18ff844f --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-63.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-63 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.254306855+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.256625371+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-64.yaml b/java-dedup/keploy/test-set-1/tests/test-64.yaml new file mode 100644 index 00000000..5bd4009f --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-64.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-64 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.264453964+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.267277618+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-65.yaml b/java-dedup/keploy/test-set-1/tests/test-65.yaml new file mode 100644 index 00000000..5fbbb2ad --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-65.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-65 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.274297466+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.277466126+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-66.yaml b/java-dedup/keploy/test-set-1/tests/test-66.yaml new file mode 100644 index 00000000..1f7656d8 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-66.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-66 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.285017021+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.288451608+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-67.yaml b/java-dedup/keploy/test-set-1/tests/test-67.yaml new file mode 100644 index 00000000..93d305ae --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-67.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-67 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.295785143+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.298505751+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-68.yaml b/java-dedup/keploy/test-set-1/tests/test-68.yaml new file mode 100644 index 00000000..48d66deb --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-68.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-68 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.305578017+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.308153733+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-69.yaml b/java-dedup/keploy/test-set-1/tests/test-69.yaml new file mode 100644 index 00000000..87e615b7 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-69.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-69 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.316667536+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.319054829+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-7.yaml b/java-dedup/keploy/test-set-1/tests/test-7.yaml new file mode 100644 index 00000000..5a0a496e --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-7.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.623275269+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.627350938+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-70.yaml b/java-dedup/keploy/test-set-1/tests/test-70.yaml new file mode 100644 index 00000000..40d56fa6 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-70.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-70 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.328504429+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.331169652+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-71.yaml b/java-dedup/keploy/test-set-1/tests/test-71.yaml new file mode 100644 index 00000000..f5a82dde --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-71.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-71 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.339124658+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.341734582+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-72.yaml b/java-dedup/keploy/test-set-1/tests/test-72.yaml new file mode 100644 index 00000000..8c20db26 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-72.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-72 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.349752906+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.352026165+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-73.yaml b/java-dedup/keploy/test-set-1/tests/test-73.yaml new file mode 100644 index 00000000..7381f9bb --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-73.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-73 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.360605114+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.362842495+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-74.yaml b/java-dedup/keploy/test-set-1/tests/test-74.yaml new file mode 100644 index 00000000..a436e0fe --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-74.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-74 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.370271414+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.37284285+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-75.yaml b/java-dedup/keploy/test-set-1/tests/test-75.yaml new file mode 100644 index 00000000..07d58062 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-75.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-75 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.380124918+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.382702493+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-76.yaml b/java-dedup/keploy/test-set-1/tests/test-76.yaml new file mode 100644 index 00000000..e684205f --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-76.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-76 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.392198701+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.394992127+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-77.yaml b/java-dedup/keploy/test-set-1/tests/test-77.yaml new file mode 100644 index 00000000..3277375b --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-77.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-77 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.402965223+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.405549788+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-78.yaml b/java-dedup/keploy/test-set-1/tests/test-78.yaml new file mode 100644 index 00000000..e5f7d49e --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-78.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-78 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.413535493+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.41630916+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-79.yaml b/java-dedup/keploy/test-set-1/tests/test-79.yaml new file mode 100644 index 00000000..3e91ed0a --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-79.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-79 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.42398548+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.426773985+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-8.yaml b/java-dedup/keploy/test-set-1/tests/test-8.yaml new file mode 100644 index 00000000..424a194c --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-8.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.634631784+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.637723158+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-80.yaml b/java-dedup/keploy/test-set-1/tests/test-80.yaml new file mode 100644 index 00000000..7cb467c6 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-80.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-80 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.434980291+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.4377034+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-81.yaml b/java-dedup/keploy/test-set-1/tests/test-81.yaml new file mode 100644 index 00000000..9f36ed67 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-81.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-81 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.446363396+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.449444849+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-82.yaml b/java-dedup/keploy/test-set-1/tests/test-82.yaml new file mode 100644 index 00000000..730a7572 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-82.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-82 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.457018742+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.460043078+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-83.yaml b/java-dedup/keploy/test-set-1/tests/test-83.yaml new file mode 100644 index 00000000..bb70a597 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-83.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-83 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.468454975+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.471363045+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-84.yaml b/java-dedup/keploy/test-set-1/tests/test-84.yaml new file mode 100644 index 00000000..8e329a25 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-84.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-84 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.479963173+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.482636355+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-85.yaml b/java-dedup/keploy/test-set-1/tests/test-85.yaml new file mode 100644 index 00000000..dd8d50ce --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-85.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-85 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.491196625+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.494100496+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-86.yaml b/java-dedup/keploy/test-set-1/tests/test-86.yaml new file mode 100644 index 00000000..1d90d278 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-86.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-86 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.501507487+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.504547102+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-87.yaml b/java-dedup/keploy/test-set-1/tests/test-87.yaml new file mode 100644 index 00000000..89a1490c --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-87.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-87 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.513642157+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.516402865+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-88.yaml b/java-dedup/keploy/test-set-1/tests/test-88.yaml new file mode 100644 index 00000000..7da55994 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-88.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-88 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.524444358+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.527156517+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-89.yaml b/java-dedup/keploy/test-set-1/tests/test-89.yaml new file mode 100644 index 00000000..15a21b56 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-89.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-89 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.534267182+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.53632048+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-9.yaml b/java-dedup/keploy/test-set-1/tests/test-9.yaml new file mode 100644 index 00000000..a0a708e3 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-9.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:35.644309306+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:35.646843053+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015175 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-90.yaml b/java-dedup/keploy/test-set-1/tests/test-90.yaml new file mode 100644 index 00000000..fc4e5ac4 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-90.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-90 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.542594702+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:35 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.544679669+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-91.yaml b/java-dedup/keploy/test-set-1/tests/test-91.yaml new file mode 100644 index 00000000..724caecd --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-91.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-91 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.550850715+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.553187721+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-92.yaml b/java-dedup/keploy/test-set-1/tests/test-92.yaml new file mode 100644 index 00000000..8105aaf8 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-92.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-92 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.560695238+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.57010833+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-93.yaml b/java-dedup/keploy/test-set-1/tests/test-93.yaml new file mode 100644 index 00000000..03992ae9 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-93.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-93 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.577059271+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.579308631+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-94.yaml b/java-dedup/keploy/test-set-1/tests/test-94.yaml new file mode 100644 index 00000000..1644733c --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-94.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-94 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.586822078+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.588993091+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-95.yaml b/java-dedup/keploy/test-set-1/tests/test-95.yaml new file mode 100644 index 00000000..1fe9a7bd --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-95.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-95 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.594844812+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.596663721+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-96.yaml b/java-dedup/keploy/test-set-1/tests/test-96.yaml new file mode 100644 index 00000000..059a87e4 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-96.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-96 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.603307665+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.605527247+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-97.yaml b/java-dedup/keploy/test-set-1/tests/test-97.yaml new file mode 100644 index 00000000..4d833956 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-97.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-97 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.61110729+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.613252124+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-98.yaml b/java-dedup/keploy/test-set-1/tests/test-98.yaml new file mode 100644 index 00000000..1bae898f --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-98.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-98 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.62077598+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.623613353+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-1/tests/test-99.yaml b/java-dedup/keploy/test-set-1/tests/test-99.yaml new file mode 100644 index 00000000..92dbecb3 --- /dev/null +++ b/java-dedup/keploy/test-set-1/tests/test-99.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-99 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:49:36.629665355+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:19:36 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:49:36.631651577+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015176 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-10.yaml b/java-dedup/keploy/test-set-2/tests/test-10.yaml new file mode 100644 index 00000000..d1f052e0 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-10.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.174043416+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.180312137+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-100.yaml b/java-dedup/keploy/test-set-2/tests/test-100.yaml new file mode 100644 index 00000000..6306b99e --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-100.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-100 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.2257625+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.228462875+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-101.yaml b/java-dedup/keploy/test-set-2/tests/test-101.yaml new file mode 100644 index 00000000..085a985e --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-101.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-101 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.235317351+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.238027395+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-11.yaml b/java-dedup/keploy/test-set-2/tests/test-11.yaml new file mode 100644 index 00000000..f645bea2 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-11.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.189793428+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.197610048+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-12.yaml b/java-dedup/keploy/test-set-2/tests/test-12.yaml new file mode 100644 index 00000000..2700bebe --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-12.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.206742665+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.210447143+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-13.yaml b/java-dedup/keploy/test-set-2/tests/test-13.yaml new file mode 100644 index 00000000..41a8156a --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-13.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-13 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.219525289+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.22273687+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-14.yaml b/java-dedup/keploy/test-set-2/tests/test-14.yaml new file mode 100644 index 00000000..308da5c6 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-14.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-14 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.231842306+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.235162819+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-15.yaml b/java-dedup/keploy/test-set-2/tests/test-15.yaml new file mode 100644 index 00000000..80a0da09 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-15.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-15 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.244991694+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.248004343+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-16.yaml b/java-dedup/keploy/test-set-2/tests/test-16.yaml new file mode 100644 index 00000000..1bdc139c --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-16.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-16 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.256873137+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.259874925+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-17.yaml b/java-dedup/keploy/test-set-2/tests/test-17.yaml new file mode 100644 index 00000000..5fe44f60 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-17.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-17 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.266883356+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.269894814+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-18.yaml b/java-dedup/keploy/test-set-2/tests/test-18.yaml new file mode 100644 index 00000000..6e7661e2 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-18.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-18 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.278202031+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.281357791+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-19.yaml b/java-dedup/keploy/test-set-2/tests/test-19.yaml new file mode 100644 index 00000000..19ec9ecf --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-19.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-19 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.290417587+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.29382907+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-2.yaml b/java-dedup/keploy/test-set-2/tests/test-2.yaml new file mode 100644 index 00000000..448ba964 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-2.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.04935686+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.078885807+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-20.yaml b/java-dedup/keploy/test-set-2/tests/test-20.yaml new file mode 100644 index 00000000..61af7e89 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-20.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-20 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.302300149+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.30621566+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-21.yaml b/java-dedup/keploy/test-set-2/tests/test-21.yaml new file mode 100644 index 00000000..68570011 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-21.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-21 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.315428837+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.319343378+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-22.yaml b/java-dedup/keploy/test-set-2/tests/test-22.yaml new file mode 100644 index 00000000..f310a259 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-22.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-22 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.329083132+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.332541586+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-23.yaml b/java-dedup/keploy/test-set-2/tests/test-23.yaml new file mode 100644 index 00000000..d176bf24 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-23.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-23 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.344379468+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.34762198+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-24.yaml b/java-dedup/keploy/test-set-2/tests/test-24.yaml new file mode 100644 index 00000000..bc37512b --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-24.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-24 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.35703556+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.36011054+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-25.yaml b/java-dedup/keploy/test-set-2/tests/test-25.yaml new file mode 100644 index 00000000..3198d6e3 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-25.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-25 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.368641418+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.3719181+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-26.yaml b/java-dedup/keploy/test-set-2/tests/test-26.yaml new file mode 100644 index 00000000..aa508aee --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-26.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-26 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.381043818+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.384154487+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-27.yaml b/java-dedup/keploy/test-set-2/tests/test-27.yaml new file mode 100644 index 00000000..7dc1a8eb --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-27.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-27 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.39291531+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.395911928+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-28.yaml b/java-dedup/keploy/test-set-2/tests/test-28.yaml new file mode 100644 index 00000000..590099ac --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-28.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-28 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.405549191+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.408313697+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-29.yaml b/java-dedup/keploy/test-set-2/tests/test-29.yaml new file mode 100644 index 00000000..42b652b7 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-29.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-29 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.417297902+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.420058387+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-3.yaml b/java-dedup/keploy/test-set-2/tests/test-3.yaml new file mode 100644 index 00000000..c04a4580 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-3.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.088181707+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.095610982+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-30.yaml b/java-dedup/keploy/test-set-2/tests/test-30.yaml new file mode 100644 index 00000000..18d1a52a --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-30.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-30 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.429163194+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.432461246+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-31.yaml b/java-dedup/keploy/test-set-2/tests/test-31.yaml new file mode 100644 index 00000000..a31facf7 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-31.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-31 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.441955408+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.444729243+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-32.yaml b/java-dedup/keploy/test-set-2/tests/test-32.yaml new file mode 100644 index 00000000..e96eaa97 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-32.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-32 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.452797187+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.455749885+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-33.yaml b/java-dedup/keploy/test-set-2/tests/test-33.yaml new file mode 100644 index 00000000..0556a235 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-33.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-33 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.464400625+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.468425537+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-34.yaml b/java-dedup/keploy/test-set-2/tests/test-34.yaml new file mode 100644 index 00000000..d00bb7a0 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-34.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-34 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.477410262+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.48047283+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-35.yaml b/java-dedup/keploy/test-set-2/tests/test-35.yaml new file mode 100644 index 00000000..f0775741 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-35.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-35 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.48819735+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.491153578+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-36.yaml b/java-dedup/keploy/test-set-2/tests/test-36.yaml new file mode 100644 index 00000000..c7d009a3 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-36.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-36 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.501282557+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.504705721+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-37.yaml b/java-dedup/keploy/test-set-2/tests/test-37.yaml new file mode 100644 index 00000000..58b0e52c --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-37.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-37 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.512742014+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.516199059+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-38.yaml b/java-dedup/keploy/test-set-2/tests/test-38.yaml new file mode 100644 index 00000000..4de1d7ce --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-38.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-38 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.52568242+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.528568967+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-39.yaml b/java-dedup/keploy/test-set-2/tests/test-39.yaml new file mode 100644 index 00000000..228e390e --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-39.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-39 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.537425091+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.540621672+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-4.yaml b/java-dedup/keploy/test-set-2/tests/test-4.yaml new file mode 100644 index 00000000..0c77f553 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-4.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.103696186+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.108258404+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-40.yaml b/java-dedup/keploy/test-set-2/tests/test-40.yaml new file mode 100644 index 00000000..f55f9935 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-40.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-40 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.549472434+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.552441923+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-41.yaml b/java-dedup/keploy/test-set-2/tests/test-41.yaml new file mode 100644 index 00000000..2dd077bd --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-41.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-41 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.561950884+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.56469412+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-42.yaml b/java-dedup/keploy/test-set-2/tests/test-42.yaml new file mode 100644 index 00000000..cf4963d9 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-42.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-42 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.572663051+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.597141845+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-43.yaml b/java-dedup/keploy/test-set-2/tests/test-43.yaml new file mode 100644 index 00000000..3fe0b88c --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-43.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-43 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.60613117+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.609631285+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-44.yaml b/java-dedup/keploy/test-set-2/tests/test-44.yaml new file mode 100644 index 00000000..c609a876 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-44.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-44 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.617352514+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.620641886+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-45.yaml b/java-dedup/keploy/test-set-2/tests/test-45.yaml new file mode 100644 index 00000000..65d315c0 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-45.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-45 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.628977323+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.631751298+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-46.yaml b/java-dedup/keploy/test-set-2/tests/test-46.yaml new file mode 100644 index 00000000..268f9e24 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-46.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-46 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.641262711+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.64427131+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-47.yaml b/java-dedup/keploy/test-set-2/tests/test-47.yaml new file mode 100644 index 00000000..88d54a43 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-47.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-47 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.653233024+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.655996739+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-48.yaml b/java-dedup/keploy/test-set-2/tests/test-48.yaml new file mode 100644 index 00000000..5f9a443c --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-48.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-48 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.663768908+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.666072448+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-49.yaml b/java-dedup/keploy/test-set-2/tests/test-49.yaml new file mode 100644 index 00000000..f053d26a --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-49.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-49 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.677613966+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.68035359+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-5.yaml b/java-dedup/keploy/test-set-2/tests/test-5.yaml new file mode 100644 index 00000000..131e9d05 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-5.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.11729618+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.120290937+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-50.yaml b/java-dedup/keploy/test-set-2/tests/test-50.yaml new file mode 100644 index 00000000..a61be664 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-50.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-50 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.689785402+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.692661699+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-51.yaml b/java-dedup/keploy/test-set-2/tests/test-51.yaml new file mode 100644 index 00000000..3f00774f --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-51.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-51 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.70134506+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.704607402+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-52.yaml b/java-dedup/keploy/test-set-2/tests/test-52.yaml new file mode 100644 index 00000000..349bc194 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-52.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-52 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.712769346+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.715790235+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-53.yaml b/java-dedup/keploy/test-set-2/tests/test-53.yaml new file mode 100644 index 00000000..2e766e63 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-53.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-53 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.725078464+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.727942961+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-54.yaml b/java-dedup/keploy/test-set-2/tests/test-54.yaml new file mode 100644 index 00000000..eb2587f2 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-54.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-54 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.738336484+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.741164369+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-55.yaml b/java-dedup/keploy/test-set-2/tests/test-55.yaml new file mode 100644 index 00000000..8f3ad640 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-55.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-55 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.749622948+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.75283227+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-56.yaml b/java-dedup/keploy/test-set-2/tests/test-56.yaml new file mode 100644 index 00000000..8891f670 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-56.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-56 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.759558876+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.762448602+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-57.yaml b/java-dedup/keploy/test-set-2/tests/test-57.yaml new file mode 100644 index 00000000..1d456c87 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-57.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-57 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.770941361+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.773466863+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-58.yaml b/java-dedup/keploy/test-set-2/tests/test-58.yaml new file mode 100644 index 00000000..136c0cd2 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-58.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-58 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.779846105+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.78247117+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-59.yaml b/java-dedup/keploy/test-set-2/tests/test-59.yaml new file mode 100644 index 00000000..de3180f2 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-59.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-59 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.79027994+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.792907543+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-6.yaml b/java-dedup/keploy/test-set-2/tests/test-6.yaml new file mode 100644 index 00000000..361ceb64 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-6.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.129711289+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.132763587+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-60.yaml b/java-dedup/keploy/test-set-2/tests/test-60.yaml new file mode 100644 index 00000000..93a9bd40 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-60.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-60 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.802630247+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.805738897+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-61.yaml b/java-dedup/keploy/test-set-2/tests/test-61.yaml new file mode 100644 index 00000000..4a89ad09 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-61.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-61 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.814790823+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.817497218+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-62.yaml b/java-dedup/keploy/test-set-2/tests/test-62.yaml new file mode 100644 index 00000000..67a720d0 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-62.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-62 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.826431552+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.829919587+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-63.yaml b/java-dedup/keploy/test-set-2/tests/test-63.yaml new file mode 100644 index 00000000..3ffef908 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-63.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-63 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.837991881+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.841543966+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-64.yaml b/java-dedup/keploy/test-set-2/tests/test-64.yaml new file mode 100644 index 00000000..c9feb10b --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-64.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-64 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.848563245+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.851390902+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-65.yaml b/java-dedup/keploy/test-set-2/tests/test-65.yaml new file mode 100644 index 00000000..7dfd7c98 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-65.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-65 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.858084827+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.860764541+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-66.yaml b/java-dedup/keploy/test-set-2/tests/test-66.yaml new file mode 100644 index 00000000..97814190 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-66.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-66 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.868949147+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.870999503+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-67.yaml b/java-dedup/keploy/test-set-2/tests/test-67.yaml new file mode 100644 index 00000000..1abcf35d --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-67.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-67 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.877102631+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.87934821+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-68.yaml b/java-dedup/keploy/test-set-2/tests/test-68.yaml new file mode 100644 index 00000000..34175bfa --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-68.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-68 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.887117959+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.889664982+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-69.yaml b/java-dedup/keploy/test-set-2/tests/test-69.yaml new file mode 100644 index 00000000..75651094 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-69.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-69 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.896380037+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.899168123+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-7.yaml b/java-dedup/keploy/test-set-2/tests/test-7.yaml new file mode 100644 index 00000000..701ad31a --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-7.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.140599768+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.143699238+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-70.yaml b/java-dedup/keploy/test-set-2/tests/test-70.yaml new file mode 100644 index 00000000..475ade41 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-70.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-70 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.9059708+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.908771497+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-71.yaml b/java-dedup/keploy/test-set-2/tests/test-71.yaml new file mode 100644 index 00000000..3266b5e3 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-71.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-71 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.915461903+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.917813532+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-72.yaml b/java-dedup/keploy/test-set-2/tests/test-72.yaml new file mode 100644 index 00000000..8f69e85d --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-72.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-72 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.924796662+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.927709399+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-73.yaml b/java-dedup/keploy/test-set-2/tests/test-73.yaml new file mode 100644 index 00000000..b3437067 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-73.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-73 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.935797013+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.93871119+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-74.yaml b/java-dedup/keploy/test-set-2/tests/test-74.yaml new file mode 100644 index 00000000..18468845 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-74.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-74 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.946437869+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.949027503+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-75.yaml b/java-dedup/keploy/test-set-2/tests/test-75.yaml new file mode 100644 index 00000000..7b4dbf7e --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-75.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-75 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.954820056+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.957000955+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-76.yaml b/java-dedup/keploy/test-set-2/tests/test-76.yaml new file mode 100644 index 00000000..8e329470 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-76.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-76 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.963766321+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.966223043+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-77.yaml b/java-dedup/keploy/test-set-2/tests/test-77.yaml new file mode 100644 index 00000000..fed81fd0 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-77.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-77 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.9746361+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.977535057+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-78.yaml b/java-dedup/keploy/test-set-2/tests/test-78.yaml new file mode 100644 index 00000000..7d1f67af --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-78.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-78 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.986162578+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.989689213+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-79.yaml b/java-dedup/keploy/test-set-2/tests/test-79.yaml new file mode 100644 index 00000000..8596e83b --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-79.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-79 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.997018367+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.999572529+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-8.yaml b/java-dedup/keploy/test-set-2/tests/test-8.yaml new file mode 100644 index 00000000..ba8b23e4 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-8.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.151050611+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.153635786+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-80.yaml b/java-dedup/keploy/test-set-2/tests/test-80.yaml new file mode 100644 index 00000000..3640994c --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-80.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-80 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.007112954+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.00986766+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-81.yaml b/java-dedup/keploy/test-set-2/tests/test-81.yaml new file mode 100644 index 00000000..3639b1e5 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-81.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-81 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.018161665+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.020696536+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-82.yaml b/java-dedup/keploy/test-set-2/tests/test-82.yaml new file mode 100644 index 00000000..7ddc7709 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-82.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-82 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.02898234+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.039701846+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-83.yaml b/java-dedup/keploy/test-set-2/tests/test-83.yaml new file mode 100644 index 00000000..dc491f46 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-83.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-83 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.046810515+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.050166578+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-84.yaml b/java-dedup/keploy/test-set-2/tests/test-84.yaml new file mode 100644 index 00000000..a3e36022 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-84.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-84 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.057098934+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.05912543+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-85.yaml b/java-dedup/keploy/test-set-2/tests/test-85.yaml new file mode 100644 index 00000000..6841c177 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-85.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-85 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.065635632+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.068458488+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-86.yaml b/java-dedup/keploy/test-set-2/tests/test-86.yaml new file mode 100644 index 00000000..ee7c4a9a --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-86.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-86 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.076343697+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.079251424+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-87.yaml b/java-dedup/keploy/test-set-2/tests/test-87.yaml new file mode 100644 index 00000000..56b1c594 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-87.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-87 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.086418685+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.088922916+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-88.yaml b/java-dedup/keploy/test-set-2/tests/test-88.yaml new file mode 100644 index 00000000..e05eeabe --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-88.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-88 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.095769942+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.098554617+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-89.yaml b/java-dedup/keploy/test-set-2/tests/test-89.yaml new file mode 100644 index 00000000..78fb79a1 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-89.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-89 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/search?q=test&limit=5 + url_params: + limit: "5" + q: test + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.106442857+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"searching_for":"test","limit":"5"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.108958058+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/search?q=test&limit=5 \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-9.yaml b/java-dedup/keploy/test-set-2/tests/test-9.yaml new file mode 100644 index 00000000..7431556a --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-9.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:40.161110091+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:40 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:40.164558064+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015240 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-90.yaml b/java-dedup/keploy/test-set-2/tests/test-90.yaml new file mode 100644 index 00000000..4ba87a18 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-90.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-90 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.117631698+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.120378543+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-91.yaml b/java-dedup/keploy/test-set-2/tests/test-91.yaml new file mode 100644 index 00000000..77cde2e2 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-91.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-91 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.130311577+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.132779048+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-92.yaml b/java-dedup/keploy/test-set-2/tests/test-92.yaml new file mode 100644 index 00000000..1805f147 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-92.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-92 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.141213195+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.143377312+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-93.yaml b/java-dedup/keploy/test-set-2/tests/test-93.yaml new file mode 100644 index 00000000..1df91b53 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-93.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-93 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.151332903+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.153933216+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-94.yaml b/java-dedup/keploy/test-set-2/tests/test-94.yaml new file mode 100644 index 00000000..28889597 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-94.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-94 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.161724613+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.164335886+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-95.yaml b/java-dedup/keploy/test-set-2/tests/test-95.yaml new file mode 100644 index 00000000..2b7e6a64 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-95.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-95 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.172691492+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.175216783+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-96.yaml b/java-dedup/keploy/test-set-2/tests/test-96.yaml new file mode 100644 index 00000000..e9413b20 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-96.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-96 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.183414016+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.186416405+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-97.yaml b/java-dedup/keploy/test-set-2/tests/test-97.yaml new file mode 100644 index 00000000..4b6cd0cf --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-97.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-97 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.195433648+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.198408435+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-98.yaml b/java-dedup/keploy/test-set-2/tests/test-98.yaml new file mode 100644 index 00000000..74566502 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-98.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-98 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.20587143+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.208698435+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-2/tests/test-99.yaml b/java-dedup/keploy/test-set-2/tests/test-99.yaml new file mode 100644 index 00000000..cd42c249 --- /dev/null +++ b/java-dedup/keploy/test-set-2/tests/test-99.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-99 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:50:41.215734454+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:20:41 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:50:41.21856483+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015241 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-10.yaml b/java-dedup/keploy/test-set-3/tests/test-10.yaml new file mode 100644 index 00000000..d932bc7e --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-10.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.922440569+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.950044903+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-100.yaml b/java-dedup/keploy/test-set-3/tests/test-100.yaml new file mode 100644 index 00000000..69c30a63 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-100.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-100 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.836794416+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:45 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.839183968+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-101.yaml b/java-dedup/keploy/test-set-3/tests/test-101.yaml new file mode 100644 index 00000000..68ee9d16 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-101.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-101 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.846133645+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:45 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.848025558+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-11.yaml b/java-dedup/keploy/test-set-3/tests/test-11.yaml new file mode 100644 index 00000000..ab83e8e1 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-11.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.959263734+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.964458411+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-12.yaml b/java-dedup/keploy/test-set-3/tests/test-12.yaml new file mode 100644 index 00000000..95aa5c9e --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-12.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.974021162+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.976388794+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-13.yaml b/java-dedup/keploy/test-set-3/tests/test-13.yaml new file mode 100644 index 00000000..216ce9a1 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-13.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-13 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.984250384+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":1,"users":["alpha","beta"]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.988784041+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/users \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-14.yaml b/java-dedup/keploy/test-set-3/tests/test-14.yaml new file mode 100644 index 00000000..ae0adf90 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-14.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-14 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.997725621+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.000368215+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-15.yaml b/java-dedup/keploy/test-set-3/tests/test-15.yaml new file mode 100644 index 00000000..8e115d6d --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-15.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-15 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.007778022+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.011084046+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-16.yaml b/java-dedup/keploy/test-set-3/tests/test-16.yaml new file mode 100644 index 00000000..68cb37d7 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-16.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-16 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.018546784+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.020988777+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-17.yaml b/java-dedup/keploy/test-set-3/tests/test-17.yaml new file mode 100644 index 00000000..c50915cd --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-17.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-17 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.029111945+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.038128504+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-18.yaml b/java-dedup/keploy/test-set-3/tests/test-18.yaml new file mode 100644 index 00000000..4bba6594 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-18.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-18 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.048160906+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.050763658+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-19.yaml b/java-dedup/keploy/test-set-3/tests/test-19.yaml new file mode 100644 index 00000000..8389c998 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-19.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-19 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.057599386+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.059616257+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-2.yaml b/java-dedup/keploy/test-set-3/tests/test-2.yaml new file mode 100644 index 00000000..c91a881c --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-2.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.808081369+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.829617705+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-20.yaml b/java-dedup/keploy/test-set-3/tests/test-20.yaml new file mode 100644 index 00000000..55adeb54 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-20.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-20 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.065843754+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.068151277+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-21.yaml b/java-dedup/keploy/test-set-3/tests/test-21.yaml new file mode 100644 index 00000000..c353f762 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-21.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-21 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.077072737+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.079442429+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-22.yaml b/java-dedup/keploy/test-set-3/tests/test-22.yaml new file mode 100644 index 00000000..066766ba --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-22.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-22 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.086472156+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.088988289+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-23.yaml b/java-dedup/keploy/test-set-3/tests/test-23.yaml new file mode 100644 index 00000000..058b900b --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-23.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-23 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.097111388+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.0995269+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-24.yaml b/java-dedup/keploy/test-set-3/tests/test-24.yaml new file mode 100644 index 00000000..12a7a691 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-24.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-24 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.106330027+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.109154891+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-25.yaml b/java-dedup/keploy/test-set-3/tests/test-25.yaml new file mode 100644 index 00000000..56680c6a --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-25.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-25 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.11800661+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.120667623+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-26.yaml b/java-dedup/keploy/test-set-3/tests/test-26.yaml new file mode 100644 index 00000000..4f3ca98b --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-26.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-26 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.127584751+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.129956503+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-27.yaml b/java-dedup/keploy/test-set-3/tests/test-27.yaml new file mode 100644 index 00000000..f7eb8f87 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-27.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-27 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.138548882+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.141515984+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-28.yaml b/java-dedup/keploy/test-set-3/tests/test-28.yaml new file mode 100644 index 00000000..e76e691b --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-28.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-28 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.147582661+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.150000854+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-29.yaml b/java-dedup/keploy/test-set-3/tests/test-29.yaml new file mode 100644 index 00000000..7b911554 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-29.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-29 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.157063271+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.159749505+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-3.yaml b/java-dedup/keploy/test-set-3/tests/test-3.yaml new file mode 100644 index 00000000..8d556d84 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-3.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.838323007+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.842100971+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-30.yaml b/java-dedup/keploy/test-set-3/tests/test-30.yaml new file mode 100644 index 00000000..f27fd3c2 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-30.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-30 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.167359703+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.170426405+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-31.yaml b/java-dedup/keploy/test-set-3/tests/test-31.yaml new file mode 100644 index 00000000..3d6c8c4a --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-31.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-31 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.177876644+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.180467066+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-32.yaml b/java-dedup/keploy/test-set-3/tests/test-32.yaml new file mode 100644 index 00000000..0970e2fd --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-32.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-32 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.186909223+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.189948776+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-33.yaml b/java-dedup/keploy/test-set-3/tests/test-33.yaml new file mode 100644 index 00000000..a6eeead8 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-33.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-33 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.197171204+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.199839767+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-34.yaml b/java-dedup/keploy/test-set-3/tests/test-34.yaml new file mode 100644 index 00000000..ae84077c --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-34.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-34 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.206257083+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.208838956+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-35.yaml b/java-dedup/keploy/test-set-3/tests/test-35.yaml new file mode 100644 index 00000000..2795b48e --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-35.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-35 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.215275653+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.218310116+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-36.yaml b/java-dedup/keploy/test-set-3/tests/test-36.yaml new file mode 100644 index 00000000..72f26ea0 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-36.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-36 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.225598504+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.228471677+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-37.yaml b/java-dedup/keploy/test-set-3/tests/test-37.yaml new file mode 100644 index 00000000..90f97ed5 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-37.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-37 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.235870895+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.239208728+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-38.yaml b/java-dedup/keploy/test-set-3/tests/test-38.yaml new file mode 100644 index 00000000..088f5765 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-38.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-38 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.245991246+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.248462698+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-39.yaml b/java-dedup/keploy/test-set-3/tests/test-39.yaml new file mode 100644 index 00000000..c13e10b4 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-39.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-39 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/products + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.255575516+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"name":"Eco-friendly Water Bottle","description":"A reusable bottle.","tags":["eco","kitchen"],"product_id":"prod001"},{"name":"Wireless Charger","description":"Charges your devices.","tags":["tech","mobile"],"product_id":"prod002"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.257802378+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/products \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-4.yaml b/java-dedup/keploy/test-set-3/tests/test-4.yaml new file mode 100644 index 00000000..39d8da66 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-4.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.851688143+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.856890219+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-40.yaml b/java-dedup/keploy/test-set-3/tests/test-40.yaml new file mode 100644 index 00000000..e7b98d9c --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-40.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-40 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.265151846+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.26810262+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-41.yaml b/java-dedup/keploy/test-set-3/tests/test-41.yaml new file mode 100644 index 00000000..e375c3cf --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-41.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-41 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.27688667+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.279351952+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-42.yaml b/java-dedup/keploy/test-set-3/tests/test-42.yaml new file mode 100644 index 00000000..013e2808 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-42.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-42 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.286057529+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.288637571+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-43.yaml b/java-dedup/keploy/test-set-3/tests/test-43.yaml new file mode 100644 index 00000000..6bbbf037 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-43.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-43 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.297855032+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.300929815+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-44.yaml b/java-dedup/keploy/test-set-3/tests/test-44.yaml new file mode 100644 index 00000000..0774be0d --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-44.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-44 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.309367254+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.312866697+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-45.yaml b/java-dedup/keploy/test-set-3/tests/test-45.yaml new file mode 100644 index 00000000..656d94e3 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-45.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-45 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.320143374+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.322554958+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-46.yaml b/java-dedup/keploy/test-set-3/tests/test-46.yaml new file mode 100644 index 00000000..6eedc97b --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-46.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-46 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somebody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.329538145+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Somebody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.331900918+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somebody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-47.yaml b/java-dedup/keploy/test-set-3/tests/test-47.yaml new file mode 100644 index 00000000..87cce975 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-47.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-47 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.339588606+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.341861119+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-48.yaml b/java-dedup/keploy/test-set-3/tests/test-48.yaml new file mode 100644 index 00000000..e1e3e561 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-48.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-48 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.346828384+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.348658675+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-49.yaml b/java-dedup/keploy/test-set-3/tests/test-49.yaml new file mode 100644 index 00000000..fc75f674 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-49.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-49 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.354720171+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.357328284+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-5.yaml b/java-dedup/keploy/test-set-3/tests/test-5.yaml new file mode 100644 index 00000000..b81850db --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-5.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/proxy + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.867258622+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"forwarding_to":"downstream-service"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.870278396+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/proxy \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-50.yaml b/java-dedup/keploy/test-set-3/tests/test-50.yaml new file mode 100644 index 00000000..2f4560eb --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-50.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-50 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.365531423+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.367764506+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-51.yaml b/java-dedup/keploy/test-set-3/tests/test-51.yaml new file mode 100644 index 00000000..11b65d51 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-51.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-51 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.374400832+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.378138146+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-52.yaml b/java-dedup/keploy/test-set-3/tests/test-52.yaml new file mode 100644 index 00000000..fa954f58 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-52.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-52 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.385804786+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.388002237+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-53.yaml b/java-dedup/keploy/test-set-3/tests/test-53.yaml new file mode 100644 index 00000000..b1c3edd7 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-53.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-53 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.393728973+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.395083465+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-54.yaml b/java-dedup/keploy/test-set-3/tests/test-54.yaml new file mode 100644 index 00000000..8703af5c --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-54.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-54 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.401509652+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.402926363+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-55.yaml b/java-dedup/keploy/test-set-3/tests/test-55.yaml new file mode 100644 index 00000000..e90705c1 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-55.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-55 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.408599989+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.40973683+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-56.yaml b/java-dedup/keploy/test-set-3/tests/test-56.yaml new file mode 100644 index 00000000..b1f4232a --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-56.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-56 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.415065136+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.416234547+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-57.yaml b/java-dedup/keploy/test-set-3/tests/test-57.yaml new file mode 100644 index 00000000..55c58122 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-57.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-57 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.423443835+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.425578647+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-58.yaml b/java-dedup/keploy/test-set-3/tests/test-58.yaml new file mode 100644 index 00000000..fb01734a --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-58.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-58 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.432290424+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.434599736+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-59.yaml b/java-dedup/keploy/test-set-3/tests/test-59.yaml new file mode 100644 index 00000000..04fb3cc8 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-59.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-59 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.440329373+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.442857375+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-6.yaml b/java-dedup/keploy/test-set-3/tests/test-6.yaml new file mode 100644 index 00000000..80f2bee1 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-6.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.877589674+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.883411292+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-60.yaml b/java-dedup/keploy/test-set-3/tests/test-60.yaml new file mode 100644 index 00000000..cb513137 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-60.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-60 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.451541155+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.453828938+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-61.yaml b/java-dedup/keploy/test-set-3/tests/test-61.yaml new file mode 100644 index 00000000..6a06411f --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-61.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-61 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/info + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.461285495+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":"1.0.2","author":"Keploy"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.463832338+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/info \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-62.yaml b/java-dedup/keploy/test-set-3/tests/test-62.yaml new file mode 100644 index 00000000..fac12237 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-62.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-62 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.472032376+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"payload":"new data format"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.47432279+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/data \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-63.yaml b/java-dedup/keploy/test-set-3/tests/test-63.yaml new file mode 100644 index 00000000..b6e514ae --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-63.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-63 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.480843786+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.483294068+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-64.yaml b/java-dedup/keploy/test-set-3/tests/test-64.yaml new file mode 100644 index 00000000..e96e4e50 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-64.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-64 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.491854508+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"healthy":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.49390372+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-65.yaml b/java-dedup/keploy/test-set-3/tests/test-65.yaml new file mode 100644 index 00000000..1f57fd96 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-65.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-65 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.500117636+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.502534479+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-66.yaml b/java-dedup/keploy/test-set-3/tests/test-66.yaml new file mode 100644 index 00000000..86c7ad12 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-66.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-66 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.509904257+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.511717319+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-67.yaml b/java-dedup/keploy/test-set-3/tests/test-67.yaml new file mode 100644 index 00000000..49dbe6cf --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-67.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-67 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.517893315+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.520103758+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-68.yaml b/java-dedup/keploy/test-set-3/tests/test-68.yaml new file mode 100644 index 00000000..d579a044 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-68.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-68 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.527814336+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.530033889+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-69.yaml b/java-dedup/keploy/test-set-3/tests/test-69.yaml new file mode 100644 index 00000000..b9cdc17c --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-69.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-69 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/someone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.537443747+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Someone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.539901558+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/someone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-7.yaml b/java-dedup/keploy/test-set-3/tests/test-7.yaml new file mode 100644 index 00000000..934a1441 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-7.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.892117302+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.895161335+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-70.yaml b/java-dedup/keploy/test-set-3/tests/test-70.yaml new file mode 100644 index 00000000..496348b8 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-70.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-70 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.547571358+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.550499721+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-71.yaml b/java-dedup/keploy/test-set-3/tests/test-71.yaml new file mode 100644 index 00000000..bdfe3869 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-71.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-71 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.556728667+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.558504359+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-72.yaml b/java-dedup/keploy/test-set-3/tests/test-72.yaml new file mode 100644 index 00000000..5385de3b --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-72.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-72 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.566342667+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.56926952+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-73.yaml b/java-dedup/keploy/test-set-3/tests/test-73.yaml new file mode 100644 index 00000000..79788f69 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-73.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-73 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.577198559+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.579373481+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-74.yaml b/java-dedup/keploy/test-set-3/tests/test-74.yaml new file mode 100644 index 00000000..6f9e866b --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-74.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-74 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.588495731+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.591518354+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-75.yaml b/java-dedup/keploy/test-set-3/tests/test-75.yaml new file mode 100644 index 00000000..ae815830 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-75.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-75 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ping + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.599901862+05:30 + resp: + status_code: 200 + header: + Content-Length: "4" + Content-Type: text/plain;charset=UTF-8 + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: pong + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.601929755+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ping \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-76.yaml b/java-dedup/keploy/test-set-3/tests/test-76.yaml new file mode 100644 index 00000000..a2065db5 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-76.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-76 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.609211363+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.611592986+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-77.yaml b/java-dedup/keploy/test-set-3/tests/test-77.yaml new file mode 100644 index 00000000..065ebd83 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-77.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-77 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/logs + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.616848221+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"log_level":"INFO","entries":1024}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.618670103+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/logs \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-78.yaml b/java-dedup/keploy/test-set-3/tests/test-78.yaml new file mode 100644 index 00000000..4f0ef072 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-78.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-78 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.624777859+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.627433003+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-79.yaml b/java-dedup/keploy/test-set-3/tests/test-79.yaml new file mode 100644 index 00000000..e0066434 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-79.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-79 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.636276901+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.638464084+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-8.yaml b/java-dedup/keploy/test-set-3/tests/test-8.yaml new file mode 100644 index 00000000..37af5286 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-8.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.903119815+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.906073789+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-80.yaml b/java-dedup/keploy/test-set-3/tests/test-80.yaml new file mode 100644 index 00000000..44c43dc9 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-80.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-80 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/user/123/profile + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.646397853+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"user_id":"123","profile":"..."}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.650080367+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/user/123/profile \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-81.yaml b/java-dedup/keploy/test-set-3/tests/test-81.yaml new file mode 100644 index 00000000..594abc08 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-81.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-81 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nowhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.658588925+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nowhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.661058248+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nowhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-82.yaml b/java-dedup/keploy/test-set-3/tests/test-82.yaml new file mode 100644 index 00000000..1d1de5ac --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-82.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-82 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/noone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.668363406+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"No one"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.670651458+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/noone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-83.yaml b/java-dedup/keploy/test-set-3/tests/test-83.yaml new file mode 100644 index 00000000..0ad1490f --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-83.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-83 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/system/metrics + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.678152536+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"cpu_usage":"15%","memory":"256MB"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.680102598+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/system/metrics \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-84.yaml b/java-dedup/keploy/test-set-3/tests/test-84.yaml new file mode 100644 index 00000000..0750efea --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-84.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-84 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.686315615+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.688598788+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-85.yaml b/java-dedup/keploy/test-set-3/tests/test-85.yaml new file mode 100644 index 00000000..4c520439 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-85.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-85 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/ + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.695522604+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.697829537+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/ \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-86.yaml b/java-dedup/keploy/test-set-3/tests/test-86.yaml new file mode 100644 index 00000000..6c9e0651 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-86.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-86 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/items + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.703392444+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '[{"id":"item1","name":"Laptop","price":1200.00},{"id":"item2","name":"Mouse","price":25.50},{"id":"item3","name":"Keyboard","price":75.00}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.706510706+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/items \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-87.yaml b/java-dedup/keploy/test-set-3/tests/test-87.yaml new file mode 100644 index 00000000..5bb13c7f --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-87.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-87 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.713903535+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.716047057+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-88.yaml b/java-dedup/keploy/test-set-3/tests/test-88.yaml new file mode 100644 index 00000000..e9cb723a --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-88.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-88 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.722082624+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Anybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.724042645+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anybody \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-89.yaml b/java-dedup/keploy/test-set-3/tests/test-89.yaml new file mode 100644 index 00000000..fdd29c5e --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-89.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-89 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.730875532+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.734070246+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-9.yaml b/java-dedup/keploy/test-set-3/tests/test-9.yaml new file mode 100644 index 00000000..9a68f093 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-9.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/somewhere + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:44.912728247+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Somewhere"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:44.91497638+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015304 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/somewhere \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-90.yaml b/java-dedup/keploy/test-set-3/tests/test-90.yaml new file mode 100644 index 00000000..ba5faa50 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-90.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-90 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.741543093+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.743769967+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-91.yaml b/java-dedup/keploy/test-set-3/tests/test-91.yaml new file mode 100644 index 00000000..d38f1808 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-91.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-91 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/status + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.750572033+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"service":"user-api","status":"active"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.752907766+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/status \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-92.yaml b/java-dedup/keploy/test-set-3/tests/test-92.yaml new file mode 100644 index 00000000..4a2b65b1 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-92.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-92 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/nothing + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.760081064+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Nothing"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.762288266+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/nothing \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-93.yaml b/java-dedup/keploy/test-set-3/tests/test-93.yaml new file mode 100644 index 00000000..dd96754b --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-93.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-93 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.770132954+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.772464726+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-94.yaml b/java-dedup/keploy/test-set-3/tests/test-94.yaml new file mode 100644 index 00000000..c16023f9 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-94.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-94 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everybody + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.780595995+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everybody"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.782729878+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everybody \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-95.yaml b/java-dedup/keploy/test-set-3/tests/test-95.yaml new file mode 100644 index 00000000..f6b42027 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-95.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-95 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.790251155+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:44 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.792617978+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-96.yaml b/java-dedup/keploy/test-set-3/tests/test-96.yaml new file mode 100644 index 00000000..32bb3241 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-96.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-96 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v1/data + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.800117606+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:45 GMT + body: '{"version":1,"data":"legacy data"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.802180328+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v1/data \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-97.yaml b/java-dedup/keploy/test-set-3/tests/test-97.yaml new file mode 100644 index 00000000..325f4608 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-97.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-97 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/everyone + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.808133795+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:45 GMT + body: '{"message":"Everyone"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.810162157+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/everyone \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-98.yaml b/java-dedup/keploy/test-set-3/tests/test-98.yaml new file mode 100644 index 00000000..3be9dc76 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-98.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-98 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/api/v2/users + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.816209663+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:45 GMT + body: '{"version":2,"users":[{"name":"gamma"},{"name":"delta"}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.818460996+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/api/v2/users \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ diff --git a/java-dedup/keploy/test-set-3/tests/test-99.yaml b/java-dedup/keploy/test-set-3/tests/test-99.yaml new file mode 100644 index 00000000..211bc3a4 --- /dev/null +++ b/java-dedup/keploy/test-set-3/tests/test-99.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-99 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/anything + header: + Accept: '*/*' + Host: 127.0.0.1:8080 + User-Agent: curl/8.19.0 + body: "" + timestamp: 2026-04-24T12:51:45.826422244+05:30 + resp: + status_code: 200 + header: + Content-Type: application/json + Date: Fri, 24 Apr 2026 07:21:45 GMT + body: '{"message":"Anything"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-24T12:51:45.828670427+05:30 + objects: [] + assertions: + noise: + header.Date: [] + created: 1777015305 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/anything \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' \ + --header 'Host: 127.0.0.1:8080' \ diff --git a/java-dedup/pom.xml b/java-dedup/pom.xml new file mode 100644 index 00000000..c98da58b --- /dev/null +++ b/java-dedup/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + + + + io.keploy.samples + java-dedup + 1.0.0 + java-dedup + Keploy Java dynamic deduplication sample + + + 1.8 + 0.8.12 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + java-dedup + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + copy-jacoco-agent + package + + copy + + + + + org.jacoco + org.jacoco.agent + ${jacoco.version} + runtime + jar + ${project.build.directory} + jacocoagent.jar + + + + + + copy-runtime-dependencies + package + + copy-dependencies + + + runtime + ${project.build.directory}/dependency + + + + + + + + + + copy-keploy-agent + + + keploy.agent.version + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + copy-keploy-java-agent + package + + copy + + + + + io.keploy + keploy-sdk + ${keploy.agent.version} + ${project.build.directory} + keploy-sdk.jar + + + + + + + + + + + diff --git a/java-dedup/run_random_1000.sh b/java-dedup/run_random_1000.sh new file mode 100755 index 00000000..65e646ea --- /dev/null +++ b/java-dedup/run_random_1000.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +BASE_URL="${BASE_URL:-http://localhost:8080}" +TOTAL_REQUESTS="${TOTAL_REQUESTS:-400}" + +endpoints=( + "/" + "/someone" + "/noone" + "/everyone" + "/status" + "/everything" + "/somewhere" + "/api/v1/users" + "/api/v2/data" + "/somebody" + "/ping" + "/healthz" + "/info" + "/anything" + "/nothing" + "/nowhere" + "/products" + "/search?q=test&limit=5" + "/items" + "/api/v1/data" + "/api/v2/users" + "/system/logs" + "/system/metrics" + "/proxy" + "/anybody" + "/everybody" + "/user/123/profile" +) + +echo "--- Running randomized Java dedup endpoints ${TOTAL_REQUESTS} times ---" +echo "Base URL: ${BASE_URL}" +echo "Endpoint count: ${#endpoints[@]}" + +success_count=0 +error_count=0 +start_time="$(date +%s)" + +for i in $(seq 1 "${TOTAL_REQUESTS}"); do + random_index=$((RANDOM % ${#endpoints[@]})) + selected_endpoint="${endpoints[$random_index]}" + status_code="$(curl -X GET "${BASE_URL}${selected_endpoint}" -s -o /dev/null -w "%{http_code}")" + + if [[ "${status_code}" == "200" ]]; then + success_count=$((success_count + 1)) + else + error_count=$((error_count + 1)) + echo "ERROR: request ${i} failed with status ${status_code} for endpoint ${selected_endpoint}" + fi + + if (( i % 100 == 0 )); then + echo "Completed ${i} requests... (Success: ${success_count}, Errors: ${error_count})" + fi +done + +end_time="$(date +%s)" +duration=$((end_time - start_time)) +if (( duration == 0 )); then + requests_per_second="${TOTAL_REQUESTS}+" +else + requests_per_second=$((TOTAL_REQUESTS / duration)) +fi + +echo +echo "--- Performance Summary ---" +echo "Total requests: ${TOTAL_REQUESTS}" +echo "Successful requests (200): ${success_count}" +echo "Failed requests: ${error_count}" +echo "Success rate: $(((success_count * 100) / TOTAL_REQUESTS))%" +echo "Total time: ${duration}s" +echo "Requests per second: ${requests_per_second}" +echo "--- Complete ---" + +if (( error_count > 0 )); then + exit 1 +fi diff --git a/java-dedup/src/main/java/io/keploy/samples/javadedup/DedupController.java b/java-dedup/src/main/java/io/keploy/samples/javadedup/DedupController.java new file mode 100644 index 00000000..aa1baee4 --- /dev/null +++ b/java-dedup/src/main/java/io/keploy/samples/javadedup/DedupController.java @@ -0,0 +1,320 @@ +package io.keploy.samples.javadedup; + +import io.keploy.samples.javadedup.model.Item; +import io.keploy.samples.javadedup.model.Product; +import io.keploy.samples.javadedup.model.User; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.net.URI; +import java.time.Instant; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +@RestController +public class DedupController { + + @GetMapping("/") + public Map root() { + return response("status", "ok"); + } + + @GetMapping("/hello/{name}") + public String hello(@PathVariable String name) { + return greeting(name); + } + + @GetMapping("/random") + public Map random() { + return response("value", new Random(42).nextInt(2)); + } + + @GetMapping("/welcome") + public Map welcome(@RequestParam(defaultValue = "Guest") String name) { + return response("message", "Welcome, " + name); + } + + @PostMapping("/user") + public Map createUser(@RequestBody User user) { + return response("message", "User created successfully", "user", user); + } + + @GetMapping("/items") + public List items() { + return itemList(); + } + + @PutMapping("/item/{id}") + public Map updateItem(@PathVariable String id, @RequestBody Item item) { + return response("message", "Item updated successfully", "id", id, "updatedData", item); + } + + @DeleteMapping("/item/{id}") + public Map deleteItem(@PathVariable String id) { + return response("message", "Item deleted successfully", "id", id); + } + + @GetMapping({ + "/someone", "/something", "/anyone", "/noone", "/nobody", "/everyone", + "/anything", "/everything", "/nothing", "/somewhere", "/nowhere", + "/anybody", "/everybody", "/somebody" + }) + public Map simpleMessage(HttpServletRequest request) { + return response("message", messageForPath(request.getRequestURI())); + } + + @GetMapping("/ping") + public String ping() { + return "pong"; + } + + @GetMapping("/status") + public Map status() { + return response("service", "user-api", "status", "active"); + } + + @GetMapping("/status/{name}") + public Map namedStatus(@PathVariable String name) { + return response("message", greeting(name), "service", "java-dedup"); + } + + @GetMapping("/healthz") + public Map healthz() { + return response("healthy", true); + } + + @GetMapping("/info") + public Map info() { + return response("version", "1.0.2", "author", "Keploy"); + } + + @GetMapping("/timestamp") + public Map timestamp() { + return response("current_time", Instant.now().toString()); + } + + @GetMapping("/products") + public List products() { + return productList(); + } + + @PostMapping("/products") + public ResponseEntity> createProduct(@RequestBody Product product) { + return new ResponseEntity<>(response("status", "product created", "data", product), HttpStatus.CREATED); + } + + @GetMapping("/products/{id}") + public Map product(@PathVariable String id) { + return response("product_id", id, "name", "Sample Product", "price", new BigDecimal("99.99")); + } + + @PutMapping("/products/{id}") + public Map updateProduct(@PathVariable String id, @RequestBody Product product) { + return response("status", "product " + id + " updated", "data", product); + } + + @DeleteMapping("/products/{id}") + public Map deleteProduct(@PathVariable String id) { + return response("status", "product " + id + " deleted"); + } + + @PatchMapping("/products/{id}") + public Map patchProduct(@PathVariable String id, @RequestBody Map update) { + return response("status", "product " + id + " partially updated", "patch", update); + } + + @GetMapping("/users/{userId}/posts/{postId}") + public Map post(@PathVariable String userId, @PathVariable String postId) { + return response("user", userId, "post", postId, "content", "This is a sample post."); + } + + @GetMapping("/search") + public Map search(@RequestParam(defaultValue = "") String q, + @RequestParam(defaultValue = "10") String limit) { + return response("searching_for", q, "limit", limit); + } + + @GetMapping("/files/**") + public Map file(HttpServletRequest request) { + String prefix = request.getContextPath() + "/files"; + String requestedPath = request.getRequestURI().substring(prefix.length()); + return response("requested_file", requestedPath); + } + + @GetMapping(value = "/html", produces = MediaType.TEXT_HTML_VALUE) + public String html() { + return "

This is HTML

"; + } + + @GetMapping(value = "/xml", produces = MediaType.APPLICATION_XML_VALUE) + public String xml() { + return "johnactive"; + } + + @GetMapping("/redirect") + public ResponseEntity redirect() { + HttpHeaders headers = new HttpHeaders(); + headers.setLocation(URI.create("http://google.com")); + return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY); + } + + @PatchMapping("/config") + public Map config(@RequestBody Map update) { + return response("status", "config updated", "update", update); + } + + @RequestMapping(value = "/resource", method = RequestMethod.OPTIONS) + public ResponseEntity resourceOptions() { + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.ALLOW, "GET, POST, OPTIONS"); + return new ResponseEntity<>(headers, HttpStatus.OK); + } + + @GetMapping("/api/v1/data") + public Map apiV1Data() { + return response("version", 1, "data", "legacy data"); + } + + @GetMapping("/api/v1/users") + public Map apiV1Users() { + return response("version", 1, "users", Arrays.asList("alpha", "beta")); + } + + @PostMapping("/api/v1/users") + public ResponseEntity> createApiV1User() { + return new ResponseEntity<>(response("version", 1, "status", "user created"), HttpStatus.CREATED); + } + + @GetMapping("/api/v2/data") + public Map apiV2Data() { + return response("version", 2, "payload", "new data format"); + } + + @GetMapping("/api/v2/users") + public Map apiV2Users() { + Map first = response("name", "gamma"); + Map second = response("name", "delta"); + return response("version", 2, "users", Arrays.asList(first, second)); + } + + @PostMapping("/api/v2/users") + public ResponseEntity> createApiV2User() { + return new ResponseEntity<>(response("version", 2, "message", "user successfully registered"), HttpStatus.CREATED); + } + + @GetMapping("/system/logs") + public Map logs() { + return response("log_level", "INFO", "entries", 1024); + } + + @GetMapping("/system/metrics") + public Map metrics() { + return response("cpu_usage", "15%", "memory", "256MB"); + } + + @PostMapping("/system/reboot") + public ResponseEntity> reboot() { + return new ResponseEntity<>(response("message", "System reboot initiated"), HttpStatus.ACCEPTED); + } + + @GetMapping("/proxy") + public Map proxy() { + return response("forwarding_to", "downstream-service"); + } + + @GetMapping("/legacy") + public ResponseEntity> legacy() { + return new ResponseEntity<>(response("error", "This endpoint is deprecated"), HttpStatus.GONE); + } + + @GetMapping("/secure/data") + public ResponseEntity> secureData() { + return new ResponseEntity<>(response("error", "Authentication required"), HttpStatus.UNAUTHORIZED); + } + + @GetMapping("/admin/panel") + public ResponseEntity> adminPanel() { + return new ResponseEntity<>(response("error", "Access denied"), HttpStatus.FORBIDDEN); + } + + @GetMapping("/long-poll") + public Map longPoll() throws InterruptedException { + Thread.sleep(1000L); + return response("status", "task complete"); + } + + @PutMapping("/user/{id}/password") + public Map password(@PathVariable String id) { + return response("message", "password for user " + id + " updated"); + } + + @GetMapping("/user/{id}/profile") + public Map profile(@PathVariable String id) { + return response("user_id", id, "profile", "..."); + } + + @PostMapping("/events") + public ResponseEntity> events() { + return new ResponseEntity<>(response("status", "event received"), HttpStatus.ACCEPTED); + } + + @GetMapping("/session/info") + public Map sessionInfo() { + return response("session_id", "xyz-123", "active", true); + } + + private String greeting(String name) { + return "Hello, " + name + "!"; + } + + private List itemList() { + return Arrays.asList( + new Item("item1", "Laptop", new BigDecimal("1200.00")), + new Item("item2", "Mouse", new BigDecimal("25.50")), + new Item("item3", "Keyboard", new BigDecimal("75.00")) + ); + } + + private List productList() { + return Arrays.asList( + new Product("prod001", "Eco-friendly Water Bottle", "A reusable bottle.", + Arrays.asList("eco", "kitchen")), + new Product("prod002", "Wireless Charger", "Charges your devices.", + Arrays.asList("tech", "mobile")) + ); + } + + private String messageForPath(String path) { + String value = path.substring(path.lastIndexOf('/') + 1); + if ("noone".equals(value)) { + return "No one"; + } + return value.substring(0, 1).toUpperCase() + value.substring(1); + } + + private Map response(Object... entries) { + Map response = new LinkedHashMap<>(); + for (int i = 0; i < entries.length; i += 2) { + response.put(String.valueOf(entries[i]), entries[i + 1]); + } + return response; + } +} diff --git a/java-dedup/src/main/java/io/keploy/samples/javadedup/JavaDedupApplication.java b/java-dedup/src/main/java/io/keploy/samples/javadedup/JavaDedupApplication.java new file mode 100644 index 00000000..c97f9633 --- /dev/null +++ b/java-dedup/src/main/java/io/keploy/samples/javadedup/JavaDedupApplication.java @@ -0,0 +1,12 @@ +package io.keploy.samples.javadedup; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JavaDedupApplication { + + public static void main(String[] args) { + SpringApplication.run(JavaDedupApplication.class, args); + } +} diff --git a/java-dedup/src/main/java/io/keploy/samples/javadedup/model/Item.java b/java-dedup/src/main/java/io/keploy/samples/javadedup/model/Item.java new file mode 100644 index 00000000..a5deb401 --- /dev/null +++ b/java-dedup/src/main/java/io/keploy/samples/javadedup/model/Item.java @@ -0,0 +1,43 @@ +package io.keploy.samples.javadedup.model; + +import java.math.BigDecimal; + +public class Item { + + private String id; + private String name; + private BigDecimal price; + + public Item() { + } + + public Item(String id, String name, BigDecimal price) { + this.id = id; + this.name = name; + this.price = price; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } +} diff --git a/java-dedup/src/main/java/io/keploy/samples/javadedup/model/Product.java b/java-dedup/src/main/java/io/keploy/samples/javadedup/model/Product.java new file mode 100644 index 00000000..f2e4efde --- /dev/null +++ b/java-dedup/src/main/java/io/keploy/samples/javadedup/model/Product.java @@ -0,0 +1,56 @@ +package io.keploy.samples.javadedup.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class Product { + + @JsonProperty("product_id") + private String productId; + private String name; + private String description; + private List tags; + + public Product() { + } + + public Product(String productId, String name, String description, List tags) { + this.productId = productId; + this.name = name; + this.description = description; + this.tags = tags; + } + + public String getProductId() { + return productId; + } + + public void setProductId(String productId) { + this.productId = productId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } +} diff --git a/java-dedup/src/main/java/io/keploy/samples/javadedup/model/User.java b/java-dedup/src/main/java/io/keploy/samples/javadedup/model/User.java new file mode 100644 index 00000000..9b8cc1ee --- /dev/null +++ b/java-dedup/src/main/java/io/keploy/samples/javadedup/model/User.java @@ -0,0 +1,31 @@ +package io.keploy.samples.javadedup.model; + +public class User { + + private String name; + private String email; + + public User() { + } + + public User(String name, String email) { + this.name = name; + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/java-dedup/src/main/resources/application.properties b/java-dedup/src/main/resources/application.properties new file mode 100644 index 00000000..4f86c24b --- /dev/null +++ b/java-dedup/src/main/resources/application.properties @@ -0,0 +1,3 @@ +server.port=${PORT:8080} +spring.main.banner-mode=off +spring.jackson.serialization.write-dates-as-timestamps=false diff --git a/mysql-crud/.gitignore b/mysql-crud/.gitignore new file mode 100644 index 00000000..e1ffec22 --- /dev/null +++ b/mysql-crud/.gitignore @@ -0,0 +1,2 @@ +/target/ +/*.log diff --git a/mysql-crud/Dockerfile b/mysql-crud/Dockerfile new file mode 100644 index 00000000..95fe2e43 --- /dev/null +++ b/mysql-crud/Dockerfile @@ -0,0 +1,14 @@ +# Multi-stage build. NOTE: deliberately NO -javaagent — the Keploy enterprise +# sidecar auto-injects the JSSE javaagent at record/replay time. +FROM maven:3.9-eclipse-temurin-17 AS build +WORKDIR /src +COPY pom.xml . +RUN mvn -q -B dependency:go-offline +COPY src ./src +RUN mvn -q -B package -DskipTests + +FROM eclipse-temurin:17-jre +WORKDIR /app +COPY --from=build /src/target/app.jar /app/app.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "/app/app.jar"] diff --git a/mysql-crud/README.md b/mysql-crud/README.md new file mode 100644 index 00000000..229fe2b6 --- /dev/null +++ b/mysql-crud/README.md @@ -0,0 +1,52 @@ +# MySQL CRUD Sample + +A minimal Spring Boot + JDBC application used by Keploy Enterprise CI to validate the +self-hosted cloud-replay pipeline: JDBC-manifest secret obfuscation and object-storage +mock upload/download, exercised end-to-end via a real MySQL 8 backend. + +## Endpoints + +| Method | Path | Description | +|--------|----------------------|------------------------------------------------| +| GET | `/health` | Runs `SELECT 1` against the configured DB | +| GET | `/users` | Lists users + aggregate order stats | +| GET | `/users/{id}` | Single user, their orders, and order totals | +| POST | `/users` | Creates a user | +| POST | `/users/{id}/orders` | Creates an order for a user | +| GET | `/stats` | Aggregate user/order counts and amounts | + +## Configuration + +The datasource is fully env-driven so the same jar runs against any MySQL instance: + +``` +DB_URL (default: jdbc:mysql://localhost:3306/appdb) +DB_USER (default: root) +DB_PASS (default: empty) +``` + +`schema.sql` / `data.sql` run on every startup (idempotent — `IF NOT EXISTS` / `INSERT IGNORE`). + +## MySQL auth-plugin note + +MySQL 8's default `caching_sha2_password` auth plugin cannot be captured by Keploy's +MySQL recorder mid-handshake. When running this sample against a container you control, +start MySQL with: + +``` +--default-authentication-plugin=mysql_native_password +``` + +## Build & run + +```bash +mvn -q -B clean package -DskipTests +DB_URL="jdbc:mysql://localhost:3306/appdb" DB_USER=root java -jar target/app.jar +``` + +## Docker + +```bash +docker build -t mysql-crud . +docker run -p 8080:8080 -e DB_URL="jdbc:mysql://:3306/appdb" mysql-crud +``` diff --git a/mysql-crud/pom.xml b/mysql-crud/pom.xml new file mode 100644 index 00000000..24806e35 --- /dev/null +++ b/mysql-crud/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.2.5 + + + + com.keploy.sample + mysql-crud + 0.0.1 + jar + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-jdbc + + + com.mysql + mysql-connector-j + runtime + + + + + app + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/mysql-crud/src/main/java/com/keploy/sample/ApiController.java b/mysql-crud/src/main/java/com/keploy/sample/ApiController.java new file mode 100644 index 00000000..4c56999b --- /dev/null +++ b/mysql-crud/src/main/java/com/keploy/sample/ApiController.java @@ -0,0 +1,138 @@ +package com.keploy.sample; + +import org.springframework.http.HttpStatus; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.math.BigDecimal; +import java.sql.PreparedStatement; +import java.sql.Statement; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@RestController +public class ApiController { + + private final JdbcTemplate jdbc; + + public ApiController(JdbcTemplate jdbc) { + this.jdbc = jdbc; + } + + @GetMapping("/health") + public Map health() { + Integer one = jdbc.queryForObject("SELECT 1", Integer.class); + Map r = new LinkedHashMap<>(); + r.put("status", (one != null && one == 1) ? "ok" : "degraded"); + return r; + } + + @GetMapping("/users") + public Map listUsers() { + List> users = jdbc.queryForList("SELECT id,name,email FROM users ORDER BY id"); + Integer userCount = jdbc.queryForObject("SELECT COUNT(*) FROM users", Integer.class); + Integer orderCount = jdbc.queryForObject("SELECT COUNT(*) FROM orders", Integer.class); + BigDecimal total = jdbc.queryForObject("SELECT COALESCE(SUM(amount),0) FROM orders", BigDecimal.class); + Map r = new LinkedHashMap<>(); + r.put("users", users); + r.put("userCount", userCount); + r.put("orderCount", orderCount); + r.put("totalOrderAmount", total); + return r; + } + + @GetMapping("/users/{id}") + public Map getUser(@PathVariable long id) { + List> u = jdbc.queryForList("SELECT id,name,email FROM users WHERE id=?", id); + List> orders = jdbc.queryForList( + "SELECT id,amount,status FROM orders WHERE user_id=? ORDER BY id", id); + Integer cnt = jdbc.queryForObject("SELECT COUNT(*) FROM orders WHERE user_id=?", Integer.class, id); + BigDecimal sum = jdbc.queryForObject( + "SELECT COALESCE(SUM(amount),0) FROM orders WHERE user_id=?", BigDecimal.class, id); + jdbc.update("INSERT INTO audit_log(action,detail) VALUES(?,?)", "view_user", "id=" + id); + Map r = new LinkedHashMap<>(); + r.put("user", u.isEmpty() ? null : u.get(0)); + r.put("orders", orders); + r.put("orderCount", cnt); + r.put("orderTotal", sum); + return r; + } + + @PostMapping("/users") + public Map createUser(@RequestBody Map body) { + String name = String.valueOf(body.getOrDefault("name", "unknown")); + String email = String.valueOf(body.getOrDefault("email", "unknown@example.com")); + + // LAST_INSERT_ID() is connection-scoped; a pooled JdbcTemplate call can + // land on a different physical connection than the INSERT. Use + // generated keys from the same statement/connection instead. + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbc.update(connection -> { + PreparedStatement ps = connection.prepareStatement( + "INSERT INTO users(name,email) VALUES(?,?)", Statement.RETURN_GENERATED_KEYS); + ps.setString(1, name); + ps.setString(2, email); + return ps; + }, keyHolder); + long id = keyHolder.getKey().longValue(); + + jdbc.update("INSERT INTO audit_log(action,detail) VALUES(?,?)", "create_user", "name=" + name); + Integer userCount = jdbc.queryForObject("SELECT COUNT(*) FROM users", Integer.class); + Map created = jdbc.queryForMap("SELECT id,name,email FROM users WHERE id=?", id); + Map r = new LinkedHashMap<>(); + r.put("created", created); + r.put("userCount", userCount); + return r; + } + + @PostMapping("/users/{id}/orders") + public Map createOrder(@PathVariable long id, @RequestBody Map body) { + Integer userExists = jdbc.queryForObject("SELECT COUNT(*) FROM users WHERE id=?", Integer.class, id); + if (userExists == null || userExists == 0) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "user " + id + " does not exist"); + } + + BigDecimal amount = new BigDecimal(String.valueOf(body.getOrDefault("amount", 0))); + String status = String.valueOf(body.getOrDefault("status", "PENDING")); + + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbc.update(connection -> { + PreparedStatement ps = connection.prepareStatement( + "INSERT INTO orders(user_id,amount,status) VALUES(?,?,?)", Statement.RETURN_GENERATED_KEYS); + ps.setLong(1, id); + ps.setBigDecimal(2, amount); + ps.setString(3, status); + return ps; + }, keyHolder); + long orderId = keyHolder.getKey().longValue(); + + Map order = jdbc.queryForMap("SELECT id,user_id,amount,status FROM orders WHERE id=?", orderId); + Integer orderCount = jdbc.queryForObject("SELECT COUNT(*) FROM orders WHERE user_id=?", Integer.class, id); + jdbc.update("INSERT INTO audit_log(action,detail) VALUES(?,?)", "create_order", "user=" + id); + Map r = new LinkedHashMap<>(); + r.put("userExists", true); + r.put("order", order); + r.put("orderCountForUser", orderCount); + return r; + } + + @GetMapping("/stats") + public Map stats() { + Integer users = jdbc.queryForObject("SELECT COUNT(*) FROM users", Integer.class); + Integer orders = jdbc.queryForObject("SELECT COUNT(*) FROM orders", Integer.class); + BigDecimal sum = jdbc.queryForObject("SELECT COALESCE(SUM(amount),0) FROM orders", BigDecimal.class); + BigDecimal avg = jdbc.queryForObject("SELECT COALESCE(AVG(amount),0) FROM orders", BigDecimal.class); + BigDecimal max = jdbc.queryForObject("SELECT COALESCE(MAX(amount),0) FROM orders", BigDecimal.class); + Map r = new LinkedHashMap<>(); + r.put("userCount", users); + r.put("orderCount", orders); + r.put("sumAmount", sum); + r.put("avgAmount", avg); + r.put("maxAmount", max); + return r; + } +} diff --git a/mysql-crud/src/main/java/com/keploy/sample/Application.java b/mysql-crud/src/main/java/com/keploy/sample/Application.java new file mode 100644 index 00000000..9ea8eba5 --- /dev/null +++ b/mysql-crud/src/main/java/com/keploy/sample/Application.java @@ -0,0 +1,11 @@ +package com.keploy.sample; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/mysql-crud/src/main/resources/application.properties b/mysql-crud/src/main/resources/application.properties new file mode 100644 index 00000000..db4fce67 --- /dev/null +++ b/mysql-crud/src/main/resources/application.properties @@ -0,0 +1,14 @@ +server.port=8080 + +spring.datasource.url=${DB_URL:jdbc:mysql://localhost:3306/appdb} +spring.datasource.username=${DB_USER:root} +spring.datasource.password=${DB_PASS:} +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +# Run schema.sql + data.sql on startup (idempotent: IF NOT EXISTS / INSERT IGNORE) +spring.sql.init.mode=always +spring.sql.init.continue-on-error=false + +# Give the pool time while wait-for-db init container / MySQL warms up +spring.datasource.hikari.initialization-fail-timeout=60000 +spring.datasource.hikari.connection-timeout=30000 diff --git a/mysql-crud/src/main/resources/data.sql b/mysql-crud/src/main/resources/data.sql new file mode 100644 index 00000000..a5d1d2f2 --- /dev/null +++ b/mysql-crud/src/main/resources/data.sql @@ -0,0 +1,9 @@ +INSERT IGNORE INTO users (id, name, email) VALUES + (1, 'Alice', 'alice@example.com'), + (2, 'Bob', 'bob@example.com'), + (3, 'Carol', 'carol@example.com'); + +INSERT IGNORE INTO orders (id, user_id, amount, status) VALUES + (1, 1, 99.50, 'PAID'), + (2, 1, 15.00, 'PENDING'), + (3, 2, 250.00, 'PAID'); diff --git a/mysql-crud/src/main/resources/schema.sql b/mysql-crud/src/main/resources/schema.sql new file mode 100644 index 00000000..7dfc682d --- /dev/null +++ b/mysql-crud/src/main/resources/schema.sql @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS users ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS orders ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + user_id BIGINT NOT NULL, + amount DECIMAL(10,2) NOT NULL, + status VARCHAR(50) NOT NULL DEFAULT 'PENDING', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS audit_log ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + action VARCHAR(100) NOT NULL, + detail VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); diff --git a/mysql-dual-conn/docker-compose.yml b/mysql-dual-conn/docker-compose.yml new file mode 100644 index 00000000..28ddcf75 --- /dev/null +++ b/mysql-dual-conn/docker-compose.yml @@ -0,0 +1,10 @@ +version: '3.8' +services: + mysql: + image: mysql:8.0 + environment: + MYSQL_ROOT_PASSWORD: rootpass + ports: + - "3306:3306" + volumes: + - ./init.sql:/docker-entrypoint-initdb.d/init.sql diff --git a/mysql-dual-conn/init.sql b/mysql-dual-conn/init.sql new file mode 100644 index 00000000..9e79bb18 --- /dev/null +++ b/mysql-dual-conn/init.sql @@ -0,0 +1,40 @@ +CREATE DATABASE IF NOT EXISTS myntra_oms; +CREATE DATABASE IF NOT EXISTS camunda; + +CREATE USER IF NOT EXISTS 'omsAppUser'@'%' IDENTIFIED BY 'omsPassword'; +GRANT ALL PRIVILEGES ON myntra_oms.* TO 'omsAppUser'@'%'; + +CREATE USER IF NOT EXISTS 'stagebuster'@'%' IDENTIFIED BY 'camundaPassword'; +GRANT ALL PRIVILEGES ON camunda.* TO 'stagebuster'@'%'; + +FLUSH PRIVILEGES; + +-- Column-type fidelity fixture (keploy/keploy#4426). +-- +-- The OMS datasource runs with useServerPrepStmts=true, so a SELECT over +-- this table comes back as a binary-protocol result set — the wire format +-- whose FLOAT/DOUBLE columns keploy decoded as their raw IEEE-754 bit +-- pattern rather than their value, corrupting mocks.yaml at record time. +-- +-- The BIGINT UNSIGNED column covers the other half: values above MaxInt64 +-- have no lossless float64 form, so a mock format that routes them through +-- one collapses distinct rows onto the same number. +USE myntra_oms; + +CREATE TABLE IF NOT EXISTS numeric_fidelity ( + id INT PRIMARY KEY, + label VARCHAR(32) NOT NULL, + price_f FLOAT NOT NULL, + ratio_d DOUBLE NOT NULL, + big_u BIGINT UNSIGNED NOT NULL +); + +INSERT INTO numeric_fidelity (id, label, price_f, ratio_d, big_u) VALUES + -- 9.99 is the value from the bug report: read as a numeric cast it + -- surfaces as 1.0926057e+09 (FLOAT) / 4.621813488089437e+18 (DOUBLE). + (1, 'nine-ninety-nine', 9.99, 9.99, 18446744073709551615), + (2, 'negative', -0.5, -1234.5678, 9223372036854775808), + (3, 'zero', 0, 0, 0), + (4, 'whole', 10, 10, 4294967296), + (5, 'small', 1.5, 2.2250738585072014e-308, 1) +ON DUPLICATE KEY UPDATE label = VALUES(label); diff --git a/mysql-dual-conn/pom.xml b/mysql-dual-conn/pom.xml new file mode 100644 index 00000000..00d95024 --- /dev/null +++ b/mysql-dual-conn/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.2.5 + + + + com.example + mysql-dual-conn + 0.0.1-SNAPSHOT + mysql-dual-conn + E2E test for Keploy MySQL multi-connection handshake matching + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-jdbc + + + com.mysql + mysql-connector-j + runtime + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/DataSourceConfig.java b/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/DataSourceConfig.java new file mode 100644 index 00000000..00133952 --- /dev/null +++ b/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/DataSourceConfig.java @@ -0,0 +1,108 @@ +package com.example.mysqlreplicate; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +/** + * Replicates the multi-datasource setup that triggers the Keploy + * "no mysql mocks matched the HandshakeResponse41" error. + * + * Two HikariCP pools connect to the SAME MySQL server but with + * DIFFERENT usernames and databases. During Keploy test replay, + * each new TCP connection triggers simulateInitialHandshake which + * must match the client's HandshakeResponse41 against recorded + * config mocks. The mismatch occurs because: + * + * 1. mocks[0] (always omsAppUser/myntra_oms) is used to send the + * server greeting to ALL incoming connections. + * 2. When the camunda pool connects, its HandshakeResponse41 has + * username=stagebuster, database=camunda, and different + * capability_flags (423535119 vs 20881935). + * 3. The matcher loops all config mocks looking for a match on + * username + database + capability_flags + charset + filler. + * If no recorded config mock matches those exact fields, the + * error fires. + */ +@Configuration +public class DataSourceConfig { + + // ---- OMS pool (matches omsAppUser / myntra_oms mocks) ---- + + @Value("${datasource.oms.jdbc-url}") + private String omsJdbcUrl; + + @Value("${datasource.oms.username}") + private String omsUsername; + + @Value("${datasource.oms.password}") + private String omsPassword; + + @Value("${datasource.oms.driver-class-name}") + private String omsDriverClass; + + // ---- Camunda pool (matches stagebuster / camunda mocks) ---- + + @Value("${datasource.camunda.jdbc-url}") + private String camundaJdbcUrl; + + @Value("${datasource.camunda.username}") + private String camundaUsername; + + @Value("${datasource.camunda.password}") + private String camundaPassword; + + @Value("${datasource.camunda.driver-class-name}") + private String camundaDriverClass; + + @Bean(name = "omsDataSource", destroyMethod = "close") + @Primary + public HikariDataSource omsDataSource() { + HikariConfig config = new HikariConfig(); + config.setPoolName("oms-dataSource"); + config.setUsername(omsUsername); + config.setPassword(omsPassword); + return buildDataSource(config, 5, omsJdbcUrl, omsDriverClass); + } + + @Bean(name = "camundaDataSource", destroyMethod = "close") + public HikariDataSource camundaDataSource() { + HikariConfig config = new HikariConfig(); + config.setPoolName("camunda-dataSource"); + config.setUsername(camundaUsername); + config.setPassword(camundaPassword); + return buildDataSource(config, 5, camundaJdbcUrl, camundaDriverClass); + } + + @Bean(name = "omsJdbcTemplate") + @Primary + public JdbcTemplate omsJdbcTemplate() { + return new JdbcTemplate(omsDataSource()); + } + + @Bean(name = "camundaJdbcTemplate") + public JdbcTemplate camundaJdbcTemplate() { + return new JdbcTemplate(camundaDataSource()); + } + + private HikariDataSource buildDataSource(HikariConfig config, int maxConns, + String jdbcUrl, String driverClass) { + config.setMaximumPoolSize(maxConns); + config.setMinimumIdle(2); + config.setKeepaliveTime(5000); + config.setIdleTimeout(10000); + config.setConnectionTimeout(5000); + config.setValidationTimeout(2000); + config.setMaxLifetime(7200000); + config.setLeakDetectionThreshold(2000); + config.setDriverClassName(driverClass); + config.setJdbcUrl(jdbcUrl); + return new HikariDataSource(config); + } +} diff --git a/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/MysqlReplicateApplication.java b/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/MysqlReplicateApplication.java new file mode 100644 index 00000000..ec6b77f9 --- /dev/null +++ b/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/MysqlReplicateApplication.java @@ -0,0 +1,11 @@ +package com.example.mysqlreplicate; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MysqlReplicateApplication { + public static void main(String[] args) { + SpringApplication.run(MysqlReplicateApplication.class, args); + } +} diff --git a/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/QueryController.java b/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/QueryController.java new file mode 100644 index 00000000..d57cfdb6 --- /dev/null +++ b/mysql-dual-conn/src/main/java/com/example/mysqlreplicate/QueryController.java @@ -0,0 +1,137 @@ +package com.example.mysqlreplicate; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Simple REST controller that queries both datasources. + * Each endpoint triggers a DB query that forces a connection + * from the respective pool — reproducing the multi-handshake + * scenario during Keploy replay. + */ +@RestController +public class QueryController { + + private final JdbcTemplate omsJdbc; + private final JdbcTemplate camundaJdbc; + + public QueryController(@Qualifier("omsJdbcTemplate") JdbcTemplate omsJdbc, + @Qualifier("camundaJdbcTemplate") JdbcTemplate camundaJdbc) { + this.omsJdbc = omsJdbc; + this.camundaJdbc = camundaJdbc; + } + + /** + * Queries both databases, triggering connections from both pools. + * During Keploy test mode this forces two distinct HandshakeResponse41 + * packets with different username/database/capability_flags values. + */ + @GetMapping("/api/query-both") + public Map queryBoth() { + Map result = new HashMap<>(); + + // OMS query — user=omsAppUser, db=myntra_oms + List> omsResult = omsJdbc.queryForList("SELECT 1 AS oms_check"); + result.put("oms", omsResult); + + // Camunda query — user=stagebuster, db=camunda + List> camundaResult = camundaJdbc.queryForList("SELECT 1 AS camunda_check"); + result.put("camunda", camundaResult); + + return result; + } + + @GetMapping("/api/oms") + public List> queryOms() { + return omsJdbc.queryForList("SELECT 1 AS oms_check"); + } + + @GetMapping("/api/camunda") + public List> queryCamunda() { + return camundaJdbc.queryForList("SELECT 1 AS camunda_check"); + } + + /** + * Re-executes a server-prepared statement {@code n} times on the SAME + * JDBC connection. With useServerPrepStmts=true + useCursorFetch=true, + * Connector/J 8.x opportunistically emits COM_STMT_RESET before each + * COM_STMT_EXECUTE after the first, to clear cursor / long-data state. + * + * During Keploy replay this exercises the synthetic-OK fallback added + * in keploy/keploy#4217 — without it, the unmocked COM_STMT_RESET would + * cascade into "Connection closing due to no matching mock found" and + * tear down the TCP connection. + */ + /** + * Selects FLOAT / DOUBLE / BIGINT UNSIGNED columns over the OMS + * datasource, which runs with useServerPrepStmts=true. + * + * The {@code id >= ?} predicate is load-bearing, not filler: without + * a bound parameter JdbcTemplate issues a plain Statement, which + * Connector/J sends as COM_QUERY and MySQL answers with a *text* + * result set — every value a length-encoded string, which is not the + * code path this fixture exists to cover. The parameter forces a + * server-side prepared statement, so the rows come back as a + * binary-protocol result set carrying raw IEEE-754 bytes. + * + * This is the read path for keploy/keploy#4426: keploy decoded the + * FLOAT and DOUBLE wire bytes as a numeric cast instead of an + * IEEE-754 reinterpret, so a column holding 9.99 was recorded as + * 1.0926057e+09 / 4.621813488089437e+18. The corruption happened at + * record time, so it survived re-recording and replay asserted + * against a value the database never returned. + * + * big_u covers the neighbouring defect: a BIGINT UNSIGNED above + * MaxInt64 has no lossless float64 form, so any mock format that + * routes it through one collapses distinct rows onto one number. + */ + @GetMapping("/api/oms/numerics") + public List> numerics() { + return omsJdbc.queryForList( + "SELECT id, label, price_f, ratio_d, big_u FROM numeric_fidelity " + + "WHERE id >= ? ORDER BY id", + 0); + } + + /** + * Binds a FLOAT parameter, exercising the COM_STMT_EXECUTE decode + * path rather than the result-set one. The bound value is a float32 + * on the wire and comes back out of the mock file as a float64, so + * keploy's parameter matcher has to compare the two at float32 + * precision — widening instead means a correctly recorded FLOAT + * parameter never matches itself and replay finds no mock. + */ + @GetMapping("/api/oms/float-param/{v}") + public List> floatParam(@PathVariable("v") float v) { + return omsJdbc.queryForList( + "SELECT id, label, price_f FROM numeric_fidelity WHERE price_f = ? ORDER BY id", v); + } + + @GetMapping("/api/oms/stmt-reset/{n}") + public List stmtReset(@PathVariable("n") int n) { + return omsJdbc.execute((java.sql.Connection conn) -> { + List values = new ArrayList<>(n); + try (PreparedStatement ps = conn.prepareStatement("SELECT ? AS v")) { + for (int i = 0; i < n; i++) { + ps.setInt(1, i); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + values.add(rs.getInt(1)); + } + } + } + } + return values; + }); + } +} diff --git a/mysql-dual-conn/src/main/resources/application.properties b/mysql-dual-conn/src/main/resources/application.properties new file mode 100644 index 00000000..6bad40c0 --- /dev/null +++ b/mysql-dual-conn/src/main/resources/application.properties @@ -0,0 +1,20 @@ +server.port=8080 + +# --- OMS DataSource (primary) --- +# useServerPrepStmts + cachePrepStmts + useCursorFetch force Connector/J 8.x +# to issue COM_STMT_PREPARE / COM_STMT_EXECUTE (and COM_STMT_RESET between +# re-executions on the same connection) instead of plain COM_QUERY. +# This lets /api/oms/stmt-reset/{n} exercise the COM_STMT_RESET synthetic-OK +# fallback added in keploy/keploy#4217. +datasource.oms.jdbc-url=jdbc:mysql://localhost:3306/myntra_oms?useSSL=false&allowPublicKeyRetrieval=true&useServerPrepStmts=true&cachePrepStmts=true&useCursorFetch=true +datasource.oms.username=omsAppUser +datasource.oms.password=omsPassword +datasource.oms.driver-class-name=com.mysql.cj.jdbc.Driver + +# --- Camunda DataSource (secondary, different user & database) --- +# Different username + database is the key condition that triggers the +# multi-handshake matching bug during Keploy replay. +datasource.camunda.jdbc-url=jdbc:mysql://localhost:3306/camunda?useSSL=false&allowPublicKeyRetrieval=true +datasource.camunda.username=stagebuster +datasource.camunda.password=camundaPassword +datasource.camunda.driver-class-name=com.mysql.cj.jdbc.Driver diff --git a/ps-cache-kotlin/Dockerfile b/ps-cache-kotlin/Dockerfile new file mode 100644 index 00000000..17b63339 --- /dev/null +++ b/ps-cache-kotlin/Dockerfile @@ -0,0 +1,12 @@ +FROM maven:3.9-eclipse-temurin-21 AS builder +WORKDIR /app +COPY pom.xml . +RUN mvn dependency:go-offline -q +COPY src/ src/ +RUN mvn package -DskipTests -q + +FROM eclipse-temurin:21-jre-alpine +WORKDIR /app +COPY --from=builder /app/target/kotlin-app-1.0.0.jar app.jar +EXPOSE 8080 +CMD ["java", "-jar", "app.jar"] diff --git a/ps-cache-kotlin/README.md b/ps-cache-kotlin/README.md new file mode 100644 index 00000000..ffa35d21 --- /dev/null +++ b/ps-cache-kotlin/README.md @@ -0,0 +1,153 @@ +# PS-Cache Kotlin — JDBC Prepared Statement Cache Mock Mismatch Reproduction + +This sample demonstrates a bug in Keploy's Postgres mock matcher where **JDBC prepared statement caching combined with connection pool eviction causes the replay to return the wrong person's data**. + +## The Bug + +The JDBC driver (PostgreSQL JDBC + HikariCP) caches prepared statements per connection. When the connection pool evicts and creates a new connection, the PS cache is cold — but the recorded mocks from the evicted connection had warm-cache structure (Bind-only, no Parse). During replay, the matcher can't distinguish between mocks from different connection windows because: + +1. All mocks have the same parameterized SQL: `SELECT ... WHERE member_id = ?` +2. `bindParamMatchLen` mode only checks parameter byte-length (all int4 are 4 bytes) +3. Sort-order prediction starts from 0 on a fresh connection, pointing to the wrong window's mocks + +### Real-world impact +This was reported by a customer running a Kotlin/Spring Boot app with Agoda's travel account service. The post-eviction test returned Alice's data (member_id=19) instead of Charlie's — **silently returning the wrong customer's financial data**. + +## Architecture + +``` + ┌──────────────────────┐ + HTTP requests ──> │ Kotlin + Spring Boot │ + │ HikariCP pool=1 │ + │ prepareThreshold=1 │ + └──────────┬───────────┘ + │ + ┌──────────────────┼──────────────────┐ + │ │ │ + /account /evict /account + member=19 (pool evict) member=31 + │ │ │ + Connection A destroyed Connection B + PS cache: cold→warm PS cache: cold + │ │ + 1st: Parse+Bind+Desc+Exec Parse+Bind+Desc+Exec + 2nd: Bind+Exec (cached PS) + │ │ + mocks connID=0 mocks connID=2 + (Alice, 1000) (Charlie, 500) +``` + +## How to Reproduce the Bug + +### Option A: Using Docker Compose (recommended) + +```bash +docker compose up --build +``` + +This starts PostgreSQL (with schema + seed data via `init.sql`) and the app on port 8080. + +### Option B: Standalone + +**Prerequisites:** Java 21, Maven, PostgreSQL running on localhost:5432. + +```bash +# Start Postgres (if not already running) +docker run -d --name pg-demo \ + -e POSTGRES_USER=postgres \ + -e POSTGRES_PASSWORD=postgres \ + -e POSTGRES_DB=testdb \ + -p 5432:5432 postgres:16 + +# Wait for Postgres to be ready +sleep 3 + +# Create the schema and seed data +docker exec pg-demo psql -U postgres -d testdb -c " + CREATE SCHEMA IF NOT EXISTS travelcard; + CREATE TABLE IF NOT EXISTS travelcard.travel_account ( + id SERIAL PRIMARY KEY, member_id INT NOT NULL UNIQUE, + name TEXT NOT NULL, balance INT NOT NULL DEFAULT 0); + INSERT INTO travelcard.travel_account (member_id, name, balance) VALUES + (19, 'Alice', 1000), (23, 'Bob', 2500), + (31, 'Charlie', 500), (42, 'Diana', 7500) + ON CONFLICT (member_id) DO NOTHING;" + +# Build +mvn package -DskipTests -q +``` + +### Record and replay + +```bash +# Record +sudo keploy record -c "java -jar target/kotlin-app-1.0.0.jar" + +# In another terminal, hit endpoints in order: +curl "http://localhost:8080/account?member=19" # Alice (warms PS cache on Connection A) +curl "http://localhost:8080/account?member=23" # Bob (cached PS, Bind-only) +curl "http://localhost:8080/evict" # Force HikariCP to evict connections +curl "http://localhost:8080/account?member=31" # Charlie (new Connection B, cold PS cache) +curl "http://localhost:8080/account?member=42" # Diana (cached PS on Connection B) + +# Or run the traffic script: +# bash test.sh + +# Stop recording (Ctrl+C), then replay: +sudo keploy test -c "java -jar target/kotlin-app-1.0.0.jar" --skip-coverage +``` + +**Expected failure (without fix):** The post-eviction `/account?member=31` test fails: +``` +EXPECTED: {"id":3, "memberId":31, "name":"Charlie", "balance":500} +ACTUAL: {"id":1, "memberId":19, "name":"Alice", "balance":1000} <- WRONG PERSON +``` + +> **Note:** The exact test number that fails depends on how many health-check +> requests keploy captures during recording (typically test-5 through test-7). + +**With obfuscation enabled (worse):** +``` +Post-eviction member=31: EXPECTED Charlie -> ACTUAL Alice +Post-eviction member=42: EXPECTED Diana -> ACTUAL Bob <- TWO wrong results +``` + +### With the FIXED keploy binary +```bash +# Same steps -> all tests pass, correct data for each member +``` + +## What the Fix Does + +The fix adds **recording-connection affinity** to the Postgres mock matcher (see [keploy/integrations#121](https://github.com/keploy/integrations/pull/121)): + +1. When the first `Bind` mock is consumed on a replay connection, its recording `connID` is stored +2. Subsequent scoring applies a small tiebreaker bonus to prefer mocks from the same recording connection +3. Only activates when 2+ distinct recording connections exist (zero impact on single-connection apps) + +## Configuration + +### application.properties +| Property | Value | Purpose | +|----------|-------|---------| +| `server.port` | `8080` | HTTP server port | +| `spring.datasource.hikari.maximum-pool-size` | `1` | Forces all requests through one connection | +| `prepareThreshold=1` | JDBC URL param | Caches PS after first use | +| `spring.sql.init.mode` | `never` | Schema created externally (via init.sql) | + +### Environment variables (defaults in parentheses) +| Variable | Default | Description | +|----------|---------|-------------| +| `DB_HOST` | `localhost` | PostgreSQL host | +| `DB_PORT` | `5432` | PostgreSQL port | +| `DB_NAME` | `testdb` | Database name | +| `DB_USER` | `postgres` | Database user | +| `DB_PASSWORD` | `postgres` | Database password | + +### Endpoints + +| Endpoint | Description | +|----------|-------------| +| `GET /health` | Health check | +| `GET /account?member=N` | Query travel_account by member_id (BEGIN -> SELECT -> COMMIT) | +| `GET /evict` | Soft-evict HikariCP connections (forces new PG connection) | diff --git a/ps-cache-kotlin/docker-compose.yml b/ps-cache-kotlin/docker-compose.yml new file mode 100644 index 00000000..fc2ff39b --- /dev/null +++ b/ps-cache-kotlin/docker-compose.yml @@ -0,0 +1,48 @@ +services: + db: + image: postgres:16-alpine + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: testdb + ports: + - "5433:5432" + volumes: + - pgdata:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + healthcheck: + # -h 127.0.0.1 is load-bearing: it forces a TCP probe. + # + # Without it pg_isready talks to the Unix socket, and postgres' + # docker-entrypoint runs a *temporary* server reachable only over that + # socket (listen_addresses='') once initdb has finished, to create the + # database and run docker-entrypoint-initdb.d. The socket therefore + # answers "accepting connections" while no TCP listener exists at all, + # so compose marks this service healthy and depends_on: + # service_healthy releases the dependent straight into ECONNREFUSED. + # + # Short but real: ~235ms with no initdb.d scripts, and 1.2s of + # false-healthy plus a 2.7s shutdown checkpoint in the CI failure this + # was diagnosed from. Only bites on a fresh volume -- a populated one + # skips the temporary server entirely, which is why it failed rarely. + test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U postgres"] + interval: 2s + timeout: 5s + retries: 5 + + api: + build: . + ports: + - "8080:8080" + environment: + DB_HOST: db + DB_PORT: "5432" + DB_USER: postgres + DB_PASSWORD: postgres + DB_NAME: testdb + depends_on: + db: + condition: service_healthy + +volumes: + pgdata: diff --git a/ps-cache-kotlin/init.sql b/ps-cache-kotlin/init.sql new file mode 100644 index 00000000..fb7bb14b --- /dev/null +++ b/ps-cache-kotlin/init.sql @@ -0,0 +1,15 @@ +CREATE SCHEMA IF NOT EXISTS travelcard; + +CREATE TABLE IF NOT EXISTS travelcard.travel_account ( + id SERIAL PRIMARY KEY, + member_id INT NOT NULL UNIQUE, + name TEXT NOT NULL, + balance INT NOT NULL DEFAULT 0 +); + +INSERT INTO travelcard.travel_account (member_id, name, balance) VALUES + (19, 'Alice', 1000), + (23, 'Bob', 2500), + (31, 'Charlie', 500), + (42, 'Diana', 7500) +ON CONFLICT (member_id) DO NOTHING; diff --git a/ps-cache-kotlin/pom.xml b/ps-cache-kotlin/pom.xml new file mode 100644 index 00000000..287f22d5 --- /dev/null +++ b/ps-cache-kotlin/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.4 + + com.demo + kotlin-app + 1.0.0 + + 21 + 1.9.25 + + + org.springframework.bootspring-boot-starter-web + org.springframework.bootspring-boot-starter-jdbc + org.postgresqlpostgresql + org.jetbrains.kotlinkotlin-reflect + org.jetbrains.kotlinkotlin-stdlib + + + src/main/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + spring + ${java.version} + + + org.jetbrains.kotlinkotlin-maven-allopen${kotlin.version} + + compilecompile + + org.springframework.bootspring-boot-maven-plugin + + + diff --git a/ps-cache-kotlin/src/main/kotlin/com/demo/App.kt b/ps-cache-kotlin/src/main/kotlin/com/demo/App.kt new file mode 100644 index 00000000..dceee584 --- /dev/null +++ b/ps-cache-kotlin/src/main/kotlin/com/demo/App.kt @@ -0,0 +1,89 @@ +package com.demo + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import org.springframework.jdbc.core.JdbcTemplate +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController +import org.springframework.http.ResponseEntity +import javax.sql.DataSource +import com.zaxxer.hikari.HikariDataSource + +@SpringBootApplication +class App + +fun main(args: Array) { + runApplication(*args) +} + +data class Account( + val id: Int, + val memberId: Int, + val name: String, + val balance: Int +) + +@RestController +class AccountController(private val jdbc: JdbcTemplate, private val dataSource: DataSource) { + + @GetMapping("/health") + fun health() = mapOf("status" to "ok") + + @GetMapping("/account") + fun getAccount(@RequestParam("member") memberId: Int): ResponseEntity { + val result = jdbc.execute( + org.springframework.jdbc.core.ConnectionCallback { conn -> + conn.autoCommit = false + try { + conn.prepareStatement( + """SELECT id, member_id, name, balance + FROM travelcard.travel_account + WHERE member_id = ?""" + ).use { ps -> + ps.setInt(1, memberId) + ps.executeQuery().use { rs -> + val account = if (rs.next()) { + Account( + id = rs.getInt("id"), + memberId = rs.getInt("member_id"), + name = rs.getString("name"), + balance = rs.getInt("balance") + ) + } else null + + conn.commit() + account + } + } + } catch (e: Exception) { + conn.rollback() + throw e + } + }) + + return if (result != null) { + ResponseEntity.ok(result) + } else { + ResponseEntity.status(404).body(mapOf("error" to "not found", "member_id" to memberId)) + } + } + + @GetMapping("/evict") + fun evict(): ResponseEntity> { + val hikari = dataSource as? HikariDataSource + ?: return ResponseEntity.status(500).body(mapOf("error" to "not a HikariDataSource")) + + val mxBean = hikari.hikariPoolMXBean + ?: return ResponseEntity.status(500).body(mapOf("error" to "pool MXBean not available")) + + mxBean.softEvictConnections() + Thread.sleep(500) + + return ResponseEntity.ok(mapOf( + "evicted" to true, + "active" to mxBean.activeConnections, + "idle" to mxBean.idleConnections + )) + } +} diff --git a/ps-cache-kotlin/src/main/resources/application.properties b/ps-cache-kotlin/src/main/resources/application.properties new file mode 100644 index 00000000..29fae651 --- /dev/null +++ b/ps-cache-kotlin/src/main/resources/application.properties @@ -0,0 +1,7 @@ +server.port=8080 +spring.datasource.url=jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:testdb}?prepareThreshold=1&preparedStatementCacheQueries=256 +spring.datasource.username=${DB_USER:postgres} +spring.datasource.password=${DB_PASSWORD:postgres} +spring.datasource.hikari.maximum-pool-size=1 +spring.datasource.hikari.minimum-idle=1 +spring.sql.init.mode=never diff --git a/ps-cache-kotlin/test.sh b/ps-cache-kotlin/test.sh new file mode 100755 index 00000000..9c4eb75a --- /dev/null +++ b/ps-cache-kotlin/test.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +set -euo pipefail + +BASE_URL="http://localhost:8080" + +echo "=== PS-Cache Mock Mismatch Test (Kotlin/JDBC) ===" + +echo "--- Window 1: Connection A ---" +echo " /account?member=19:" +curl -fSs "$BASE_URL/account?member=19" +echo "" +sleep 1 + +echo " /account?member=23:" +curl -fSs "$BASE_URL/account?member=23" +echo "" +sleep 1 + +echo "" +echo "--- Evict (force new connection) ---" +echo " /evict:" +curl -fSs "$BASE_URL/evict" +echo "" +sleep 1 + +echo "" +echo "--- Window 2: Connection B ---" +echo " /account?member=31:" +curl -fSs "$BASE_URL/account?member=31" +echo "" +sleep 1 + +echo " /account?member=42:" +curl -fSs "$BASE_URL/account?member=42" +echo "" + +echo "" +echo "=== Done ===" diff --git a/restheart-mongo/.gitignore b/restheart-mongo/.gitignore new file mode 100644 index 00000000..ac3950e5 --- /dev/null +++ b/restheart-mongo/.gitignore @@ -0,0 +1,2 @@ +coverage/ +coverage_report.txt diff --git a/restheart-mongo/Dockerfile b/restheart-mongo/Dockerfile new file mode 100644 index 00000000..b51ca35b --- /dev/null +++ b/restheart-mongo/Dockerfile @@ -0,0 +1,7 @@ +# Thin wrapper around RESTHeart's official image at the version +# this sample tracks. Pin lives here so a future RESTHeart release +# is a one-line retag, not a hunt across keploy CI lanes. +# +# Upstream: https://github.com/SoftInstigate/restheart +# Image: docker.io/softinstigate/restheart:9.2.1 +FROM softinstigate/restheart:9.2.1 diff --git a/restheart-mongo/Dockerfile.coverage b/restheart-mongo/Dockerfile.coverage new file mode 100644 index 00000000..e864b0bc --- /dev/null +++ b/restheart-mongo/Dockerfile.coverage @@ -0,0 +1,43 @@ +# Coverage overlay image for restheart-mongo. +# +# Adds the JaCoCo agent (jacocoagent.jar) and CLI (jacococli.jar) +# alongside the upstream restheart 9.2.1 image. The agent is +# attached at JVM start via JAVA_TOOL_OPTIONS (set in +# docker-compose.coverage.yml) so we don't have to rewrite the +# upstream entrypoint, which is `java -jar restheart.jar` with +# specific JVM flags. +# +# The agent runs in `tcpserver` mode so the workflow can dump +# coverage data on demand without restarting the JVM — +# important for distroless-style upstream images that don't +# ship a shell. +# +# IMPORTANT: this image is only consumed by docker-compose.coverage.yml. +# The base Dockerfile and docker-compose.yml stay uninstrumented so +# enterprise's keploy compat lane pays no JVM-instrumentation cost +# (jacocoagent adds ~5-10% per-call overhead through bytecode +# rewriting, which would slow record/replay measurably). + +# Stage 1: pull JaCoCo zip in an alpine builder. The upstream +# restheart image is distroless (no shell, no curl/unzip), so we +# can't fetch JaCoCo from inside it. +FROM alpine:3.19 AS jacoco-fetch +ARG JACOCO_VERSION=0.8.13 +RUN apk add --no-cache curl ca-certificates unzip \ + && curl -fsSL "https://repo1.maven.org/maven2/org/jacoco/jacoco/${JACOCO_VERSION}/jacoco-${JACOCO_VERSION}.zip" -o /tmp/jacoco.zip \ + && mkdir -p /tmp/jacoco \ + && unzip -j /tmp/jacoco.zip lib/jacocoagent.jar lib/jacococli.jar -d /tmp/jacoco + +# Stage 2: layer JaCoCo into the upstream image. We can't `RUN` +# anything because the base image has no shell — only COPY and +# WORKDIR work. COPY --chown sets ownership at copy time so the +# distroless user (uid 65532) can read the agent. +FROM softinstigate/restheart:9.2.1 +COPY --from=jacoco-fetch --chown=65532:65532 /tmp/jacoco/jacocoagent.jar /opt/jacoco/jacocoagent.jar +COPY --from=jacoco-fetch --chown=65532:65532 /tmp/jacoco/jacococli.jar /opt/jacoco/jacococli.jar + +# Pre-create /coverage as an empty WORKDIR so docker has a +# mountpoint for the bind-mount in docker-compose.coverage.yml. +# WORKDIR doesn't require a shell. +WORKDIR /coverage +WORKDIR /opt/restheart diff --git a/restheart-mongo/README.md b/restheart-mongo/README.md new file mode 100644 index 00000000..ba929c4e --- /dev/null +++ b/restheart-mongo/README.md @@ -0,0 +1,71 @@ +# restheart-mongo — keploy compat lane sample + +A complete, self-contained sample that drives the RESTHeart 9.x REST surface keploy needs to gate on its compat lanes. Mirrors the architectural pattern of the [doccano-django sample in `samples-python`](https://github.com/keploy/samples-python/tree/main/doccano-django): the sample owns orchestration (compose / bootstrap / traffic / noise filter / coverage), and keploy CI lanes consume it as a thin wrapper. + +The traffic loop exercises the surfaces that keploy parsers and matchers have to handle correctly across record + replay: + +* **CRUD** on `//` and `///` — including `_size`, `_meta`, `_indexes`, ETag conditional requests, `writeMode=insert/update/upsert`, and `$inc / $push / $addToSet / $pull / $unset / $rename / $currentDate` PATCH operators. +* **HAL** representations via `Accept: application/hal+json` and `?rep=hal&hal=full` on documents, collections, indexes, and bulk responses. +* **Aggregations** via `_meta.aggrs` — group / count / sort / project / facet / lookup / unwind plus `avars` variable interpolation (scalars, arrays, nested objects, missing / malformed inputs). +* **Bulk writes** — array-body POST, filter-bound PATCH and DELETE, larger 25-doc batches, mixed valid / invalid documents. +* **GraphQL** apps — `gql-apps` registration, query / mutation / fragment / alias / multi-op forms, BSON scalar coercion (`BsonObjectId`, `BsonDecimal128`, `BsonLong`, `BsonDate`, `BsonBinary`) on outputs and inputs, introspection. +* **Files / GridFS** — buckets (`.files`), multipart upload, binary download with `Range` requests, metadata fetch, delete. +* **ACL** rules (`/acl`) — predicate evaluation (`method`, `path-prefix`, `qparams-whitelist`, `qparams-blacklist`, `qparams-contain`, `qparams-size`, `bson-request-whitelist/blacklist/contains`, `equals[%U,...]`, `in[%h, ...]`), `mongo` permission interceptors (`readFilter`, `writeFilter`, `projectResponse`, `mergeRequest`, `filterOperatorsBlacklist`, `propertiesBlacklist`, `allowBulk*`). +* **Users** (`/users`) — non-admin user creation with the bcrypt password hasher; reader / writer roles authenticating via Basic + Bearer; wrong-password denial. +* **Sessions / transactions** (`/_sessions`, `/_sessions//_txns/`) — open, write inside, commit (PATCH), abort (DELETE), and re-read. +* **Auth services** — `/token` form grants (password, client_credentials, refresh_token, unsupported), JWT bearer (valid + invalid signature), Auth-Token, Digest, OAuth metadata under `/.well-known/oauth-*`. +* **Diagnostics** — `/ping`, `/metrics` (json / prometheus / openmetrics, per-db, per-coll), `/health/db`, OPTIONS preflight, gzip request encoding, Accept-Encoding negotiation. +* **MongoMountResolver** — multiple databases, collections with dashes / dots / encoded slashes, root `/_size` and `/_meta`, trailing-slash and double-slash variants. + +## Layout + +``` +restheart-mongo/ +├── Dockerfile # FROM softinstigate/restheart:9.2.1 (base; uninstrumented) +├── Dockerfile.coverage # extends base, layers JaCoCo agent + cli for coverage +├── docker-compose.yml # mongo:7 + restheart:9.2.1, fixed subnet, env-driven +├── docker-compose.coverage.yml # overlay; arms JaCoCo via JAVA_TOOL_OPTIONS +├── flow.sh # bootstrap | record-traffic | coverage +├── keploy.yml.template # globalNoise for _etag/_oid/lastModified/Date +└── README.md # this file +``` + +## Contract + +The sample is keploy-independent: `docker compose up && bash flow.sh bootstrap && bash flow.sh record-traffic` runs end-to-end against bare RESTHeart. Lane scripts wrap that exact same path inside `keploy record` / `keploy test`. + +* `bootstrap` — wait for RESTHeart to start serving and PUT the seed collections (`items`, `people`, `places`, `halpeople`, `relpeople`, `gql-apps`, `acl`, `_schemas`, `avatars.files`, `range_files.files`, `imported_csv`) so subsequent record-traffic calls have something to find. +* `record-traffic` — drive the full RESTHeart REST surface listed above. Every call is fault-tolerant (`|| true`) so a single transient 4xx never aborts the run. keploy is the assertion layer. +* `coverage` — emits real Java line coverage via JaCoCo when the `docker-compose.coverage.yml` overlay is applied; otherwise a no-op (the base image is uninstrumented so this prints an info message and exits 0). + +## Local run + +### Without keploy — smoke check + +```sh +docker compose up -d +bash flow.sh bootstrap 240 +bash flow.sh record-traffic +docker compose down -v +``` + +This is what the keploy/enterprise compat lane wraps in `keploy record` / `keploy test` — the base compose is uninstrumented and runs unchanged inside that lane. + +### Without keploy — measuring real Java line coverage + +The base image is uninstrumented. Apply the coverage overlay to attach the JaCoCo agent: + +```sh +mkdir -p coverage +docker compose -f docker-compose.yml -f docker-compose.coverage.yml up -d --build +bash flow.sh bootstrap 240 +bash flow.sh record-traffic +bash flow.sh coverage +docker compose -f docker-compose.yml -f docker-compose.coverage.yml down -v +``` + +The overlay (`Dockerfile.coverage` + `docker-compose.coverage.yml`) layers JaCoCo's agent + cli jars into the upstream restheart image and arms the agent at JVM start via `JAVA_TOOL_OPTIONS=-javaagent:...=output=tcpserver,...`. `flow.sh coverage` dumps execution data over the agent's TCP server (no JVM stop needed) and renders an XML line-coverage report. The overlay is consumed ONLY by the standalone GH Actions workflow — keploy/enterprise's compat lane ignores it and runs the base compose, paying zero JaCoCo cost (the agent rewrites bytecode at class-load and adds ~5-10% per-call overhead that would slow record/replay). + +## Consumers + +* `keploy/enterprise` `.woodpecker/restheart-linux.yml` — the RESTHeart compat lane delegates compose + traffic + coverage to this sample and wraps them in `keploy record` / `keploy test`. diff --git a/restheart-mongo/docker-compose.coverage.yml b/restheart-mongo/docker-compose.coverage.yml new file mode 100644 index 00000000..778d6f21 --- /dev/null +++ b/restheart-mongo/docker-compose.coverage.yml @@ -0,0 +1,31 @@ +# Coverage overlay — applied with: +# +# docker compose -f docker-compose.yml -f docker-compose.coverage.yml up -d --build +# +# Used ONLY by the standalone .github/workflows/restheart-mongo.yml +# CI workflow. Keploy CI lanes (enterprise, integrations) ignore +# this file and run the base compose unchanged, so they pay zero +# JaCoCo-instrumentation cost. +services: + restheart: + build: + context: . + dockerfile: Dockerfile.coverage + image: ${RESTHEART_COVERAGE_IMAGE:-restheart-mongo:local-coverage} + environment: + # Attach the JaCoCo agent in TCP server mode. The upstream + # entrypoint is `java ... -jar restheart.jar`; JAVA_TOOL_OPTIONS + # is read by the JVM and prepended to all java args, so the + # `-javaagent` flag arms before restheart.jar starts loading + # classes. + # + # output=tcpserver: the agent listens on port 6300 inside the + # container and dumps coverage data over TCP on demand. No + # need to stop the JVM to read coverage — the workflow + # connects to 6300, dumps, and the report is generated + # post-hoc by jacococli. + JAVA_TOOL_OPTIONS: "-javaagent:/opt/jacoco/jacocoagent.jar=output=tcpserver,address=0.0.0.0,port=6300,sessionid=keploy,append=false" + ports: + - "${RESTHEART_JACOCO_PORT:-6300}:6300" + volumes: + - ./coverage:/coverage diff --git a/restheart-mongo/docker-compose.yml b/restheart-mongo/docker-compose.yml new file mode 100644 index 00000000..6db8e4ea --- /dev/null +++ b/restheart-mongo/docker-compose.yml @@ -0,0 +1,135 @@ +# restheart-mongo sample compose. RESTHeart 9.x + MongoDB 7 on a +# fixed subnet, every name env-driven so multiple matrix cells +# can run in parallel on the same docker daemon. +services: + restheart: + build: + context: . + dockerfile: Dockerfile + container_name: ${RESTHEART_APP_CONTAINER:-restheart_app} + init: true + stop_grace_period: 5s + ports: + - "${RESTHEART_APP_PORT:-8080}:8080" + environment: + # RHO is RESTHeart's runtime config-override syntax: + # key->value pairs separated by ';' + # We override the default mongo URL (which the upstream image + # points at host.docker.internal — irrelevant in compose), + # explicitly bind /http-listener/host to 0.0.0.0 (without it + # the upstream image binds localhost and is unreachable from + # the host port mapping), AND pin /jwtConfigProvider/key to + # a fixed secret. The default `key: null` makes RESTHeart + # generate a fresh random HS256 secret on every container + # start. Recorded JWT bearers carry an HS256 signature over + # the payload using that secret, so a fresh-container replay + # phase rejects the recorded bearer with 401 even though + # --freezeTime keeps `exp` valid. Pinning the secret keeps + # the bearer signature verifiable across record→replay + # container restarts (deterministic key, deterministic JWT). + RHO: '/mclient/connection-string->"mongodb://${RESTHEART_MONGO_IP:-172.36.0.10}:27017";/http-listener/host->"0.0.0.0";/core/log-level->"INFO";/jwtConfigProvider/key->"keploy-fixed-jwt-secret-for-deterministic-recordings";/mongoAclAuthorizer/cache-enabled->false;/graphql/app-cache-enabled->false;/mongo/local-cache-enabled->false;/mongo/schema-cache-enabled->false' + # Bound RESTHeart's JVM heap. RESTHeart 9.x's default uses + # `MaxRAMPercentage=25` of cgroup memory, which on a typical + # Woodpecker runner cgroup (~8GB) lands ~2GB heap. With three + # restheart matrix cells running concurrent on the same + # runner alongside parse-server / umami / doccano cells, the + # total memory pressure triggers cgroup OOM and the kernel + # SIGKILLs lighter processes (bash, curl) mid-bootstrap — + # observed in keploy/enterprise pipeline 3721/26 (cell + # record-stable-replay-pr) where `flow.sh bootstrap` got + # killed (exit 137) right after RESTHeart came up. Capping + # heap at 512m keeps each cell's footprint under ~700MB + # (heap + native + mongo) so the runner can host all three + # restheart cells plus the other lanes' cells in parallel. + # 512m is comfortable for the record/replay workload (peak + # observed at ~280MB in single-cell local runs). + JAVA_TOOL_OPTIONS: "-Xms128m -Xmx512m" + # Note on /mongoAclAuthorizer/cache-enabled->false in RHO: + # RESTHeart's mongoAclAuthorizer caches ACL rules with a 5s + # TTL backed by Caffeine, which uses System.nanoTime() to + # measure expiry. When the lane runs `keploy test --freezeTime`, + # the LD_PRELOADed clock-shim intercepts clock_gettime/ + # gettimeofday — and Caffeine's nanoTime ticker is also + # frozen — so the cache TTL never expires. flow.sh's `sleep 6` + # between an `acl` rule POST and the writer-permission test + # works at record time (the wall clock advances and the cache + # reloads), but at replay the cache stays loaded with whatever + # state it had at the first request and never picks up the + # newly-POSTed rule. Result: writer gets 403 at replay + # despite recorded 200. Disabling the cache makes ACL rules + # read-through from mongo on every request — small perf cost, + # but eliminates the time-freeze x cache-ttl interaction. + # + # Note on /graphql/app-cache-enabled->false in RHO: + # RESTHeart's GraphQL service caches gql-apps app definitions with a + # 60s time-to-revalidate (app-cache-ttr, Caffeine, nanoTime ticker) — + # the SAME time-freeze x cache-ttl interaction as the ACL cache above. + # flow.sh POSTs a "halpeople" GraphQL app to gql-apps and then fires + # POST /graphql/halpeople queries. At record the wall clock advances, + # so the app cache revalidates (re-reading gql-apps) at TTR + # boundaries; under `keploy test --freezeTime` the ticker is frozen so + # the cache never revalidates, producing a DIFFERENT number/order of + # `find gql-apps` mongo queries than were recorded. The unmatched + # find has no recorded mock -> keploy's mongo proxy closes the socket + # -> RESTHeart returns 500 (MongoSocketReadException) instead of the + # recorded response (the post-graphql-halpeople flakiness). Disabling + # the app cache makes gql-apps read-through on every request, so the + # mongo query stream is identical at record and replay. + # + # Note on /mongo/{local,schema}-cache-enabled->false in RHO: + # The SAME time-freeze x cache-ttl interaction as the ACL and GraphQL + # caches above, but for the mongo service's own Caffeine caches (default + # ttls tick on the frozen System.nanoTime()). + # - local-cache (db/collection _properties metadata, 60s ttl): this is + # the confirmed culprit. Every request routes/validates via the target + # collection's _properties — `GET /` (get-root) reads ALL collections' + # _properties, and writes/deletes (post-users, delete-users, + # delete-acl-*) read the target collection's. With local-cache on, that + # `find _properties` mongo stream is served from cache at record (wall + # clock warm) but the frozen ttl at replay shifts WHICH per-test window + # each find lands in, so keploy's strict per-test mock pool has no + # matching mock -> mongo proxy closes the socket -> 500 + # MongoSocketReadException. Observed on keploy/enterprise pipeline 5867 + # (record-pr-replay-stable): 13/306 failed — get-root-1..4, + # post-users-1/2, delete-users-*, delete-acl-* — a different leg each + # run (COMPAT_TEST_RETRIES=3 could not absorb it). + # - schema-cache (JSON schemas, 60s ttl): same frozen-ticker class; the + # sample bootstraps _schemas and posts a schema (flow.sh), so a + # schema-validated write can shift its `_schemas` find the same way. + # Disabled proactively to close the class on a path the sample exercises. + # (get-collection-cache is left enabled: it only activates on ?cache + # requests, which flow.sh never sends, so it is inert here.) + # Disabling makes _properties/schema reads read-through on every request, + # so the mongo query stream is identical at record and replay. Read-through + # is always correct (only a small perf cost), so this cannot regress + # behaviour. + depends_on: + mongo: + condition: service_healthy + networks: + - restheart-net + + mongo: + image: mongo:7 + container_name: ${RESTHEART_MONGO_CONTAINER:-restheart_mongo} + stop_grace_period: 5s + healthcheck: + test: ["CMD", "mongosh", "--quiet", "--eval", "db.adminCommand('ping').ok"] + interval: 5s + timeout: 5s + retries: 20 + volumes: + - restheart-mongo-data:/data/db + networks: + restheart-net: + ipv4_address: ${RESTHEART_MONGO_IP:-172.36.0.10} + +networks: + restheart-net: + driver: bridge + ipam: + config: + - subnet: ${RESTHEART_NETWORK_SUBNET:-172.36.0.0/24} + +volumes: + restheart-mongo-data: diff --git a/restheart-mongo/flow.sh b/restheart-mongo/flow.sh new file mode 100644 index 00000000..63555487 --- /dev/null +++ b/restheart-mongo/flow.sh @@ -0,0 +1,1324 @@ +#!/usr/bin/env bash +# +# flow.sh — keploy-independent orchestration for the +# restheart-mongo sample. Modeled on +# samples-python/doccano-django/flow.sh. +# +# Subcommands: +# bootstrap — wait for RESTHeart to start serving, then PUT +# the test database + the seed collections +# (items, halpeople, gql-apps, acl, files +# buckets) that record-traffic exercises. +# record-traffic — drive RESTHeart's full REST surface (Mongo +# CRUD / HAL / aggregations / bulk / GraphQL / +# files / ACL / users / sessions / metrics / +# OAuth metadata). Fire-and-forget; keploy is +# the assertion layer at replay. +# coverage — report (method, path) coverage. Denominator is +# derived from RESTHeart's known route-mounts +# (see SCOPE_PATHS in restheart_list_routes). +# list-routes — print the route table the coverage report +# uses as its denominator. + +set -Eeuo pipefail + +RESTHEART_APP_PORT="${RESTHEART_APP_PORT:-8080}" +RESTHEART_APP_CONTAINER="${RESTHEART_APP_CONTAINER:-restheart_app}" +RESTHEART_MONGO_CONTAINER="${RESTHEART_MONGO_CONTAINER:-restheart_mongo}" +RESTHEART_DB="${RESTHEART_DB:-restheart}" +RESTHEART_PHASE="${RESTHEART_PHASE:-local}" +RESTHEART_FIRED_ROUTES_FILE="${RESTHEART_FIRED_ROUTES_FILE:-}" + +# RESTHeart 9.x ships with an admin user (admin/secret) for +# protected endpoints. The full traffic loop authenticates as +# admin for every administrative call (db / collection / index / +# acl / users / sessions). Override RESTHEART_ADMIN_AUTH if your +# deployment uses different credentials. +RESTHEART_ADMIN_AUTH="${RESTHEART_ADMIN_AUTH:-Basic YWRtaW46c2VjcmV0}" + +base="http://127.0.0.1:${RESTHEART_APP_PORT}" +h_json='Content-Type: application/json' + +log_fired() { + [ -z "$RESTHEART_FIRED_ROUTES_FILE" ] && return 0 + printf '%s %s\n' "$1" "$2" >>"$RESTHEART_FIRED_ROUTES_FILE" +} + +restheart_wait_for_app() { + local timeout=${1:-180} + local start_ts code + start_ts=$(date +%s) + while true; do + code=$(curl -sS -o /dev/null -w '%{http_code}' "${base}/" 2>/dev/null || echo "") + # 401 (auth required on root) is a SUCCESS signal — it + # means RESTHeart is up and responding to HTTP. + if [ "$code" = "200" ] || [ "$code" = "401" ]; then return 0; fi + if [ $(( $(date +%s) - start_ts )) -ge "$timeout" ]; then + echo "restheart_wait_for_app: timed out (last code: ${code:-})" >&2 + return 1 + fi + sleep 2 + done +} + +restheart_bootstrap() { + local timeout=${1:-180} + restheart_wait_for_app "$timeout" + + # Seed the collections record-traffic depends on. Each PUT is + # idempotent (201 first time, 200 on subsequent runs) and + # tolerated if the collection already exists. + local coll + for coll in items people places halpeople relpeople gql-apps acl _schemas \ + avatars.files range_files.files imported_csv; do + curl -sS -o /dev/null -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "${base}/${RESTHEART_DB}/${coll}" || true + done + + echo "restheart_bootstrap: db=${RESTHEART_DB} ready" +} + +restheart_record_traffic() { + restheart_wait_for_app 60 + sleep 5 + + local encoded_doc_keys='%7B%22_id%22:1,%22name%22:1,%22age%22:1%7D' + local encoded_filter='%7B%22_id%22:%22jane%22%7D' + + # Liveness + root + metrics. + log_fired GET "$base/ping" + curl -fsS "$base/ping" >/dev/null || true + log_fired GET "$base/" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/" >/dev/null || true + log_fired GET "$base/metrics" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/metrics" >/dev/null || true + + # ------------------------------------------------------------------ + # Round 1: basic CRUD on /people — collection lifecycle, document + # CRUD, indexes, _size / _meta / _indexes management endpoints. + # ------------------------------------------------------------------ + log_fired PUT "$base/people" + curl -fsS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/people" >/dev/null || true + log_fired GET "$base/people" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/people" >/dev/null || true + log_fired GET "$base/people/_size" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/people/_size" >/dev/null || true + log_fired GET "$base/people/_meta" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/people/_meta" >/dev/null || true + log_fired GET "$base/people/_indexes" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/people/_indexes" >/dev/null || true + + log_fired POST "$base/people" + curl -fsS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X POST "$base/people" \ + -d '{"_id":"jane","name":"Jane","age":30}' >/dev/null || true + log_fired POST "$base/people" + curl -fsS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X POST "$base/people" \ + -d '{"_id":"john","name":"John","age":40}' >/dev/null || true + + log_fired GET "$base/people/jane" + curl -fsS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/people/jane?keys=${encoded_doc_keys}" >/dev/null || true + log_fired GET "$base/people/jane/_meta" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/people/jane/_meta" >/dev/null || true + log_fired PATCH "$base/people/jane" + curl -fsS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PATCH "$base/people/jane" \ + -d '{"$set":{"age":31}}' >/dev/null || true + log_fired PUT "$base/people/jane" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PUT "$base/people/jane" \ + -d '{"name":"Jane","age":32,"city":"Paris"}' >/dev/null || true + log_fired GET "$base/people" + curl -fsS -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/people?filter=${encoded_filter}&keys=${encoded_doc_keys}&pagesize=1" >/dev/null || true + + log_fired PUT "$base/people/_indexes/by_age" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PUT "$base/people/_indexes/by_age" \ + -d '{"keys":{"age":1},"ops":{"unique":false}}' >/dev/null || true + log_fired GET "$base/people/_indexes" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/people/_indexes" >/dev/null || true + log_fired DELETE "$base/people/_indexes/by_age" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/people/_indexes/by_age" >/dev/null || true + + log_fired DELETE "$base/people/john" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/people/john" >/dev/null || true + + log_fired PUT "$base/places" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/places" >/dev/null || true + log_fired POST "$base/places" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X POST "$base/places" \ + -d '{"_id":"paris","country":"FR"}' >/dev/null || true + log_fired GET "$base/places/paris" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/places/paris" >/dev/null || true + log_fired DELETE "$base/places/paris" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/places/paris" >/dev/null || true + log_fired DELETE "$base/places" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/places" >/dev/null || true + + # ------------------------------------------------------------------ + # HAL representation factories — Accept: application/hal+json drives + # DocumentRepresentationFactory / CollectionRepresentationFactory / + # IndexesRepresentationFactory. + # ------------------------------------------------------------------ + log_fired PUT "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/halpeople" >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X POST "$base/halpeople" \ + -d '{"_id":"alice","name":"Alice","age":29}' >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept: application/hal+json' "$base/halpeople" >/dev/null || true + log_fired GET "$base/halpeople/alice" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept: application/hal+json' "$base/halpeople/alice" >/dev/null || true + log_fired GET "$base/halpeople/_indexes" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept: application/hal+json' "$base/halpeople/_indexes" >/dev/null || true + log_fired GET "$base/" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept: application/hal+json' "$base/" >/dev/null || true + + # ------------------------------------------------------------------ + # Aggregations — define a pipeline on the collection then read it. + # ------------------------------------------------------------------ + log_fired PATCH "$base/halpeople/_meta" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PATCH "$base/halpeople/_meta" \ + -d '{"aggrs":[{"uri":"by-age","type":"pipeline","stages":[{"_$group":{"_id":"$age","count":{"_$sum":1}}}]}]}' >/dev/null || true + log_fired GET "$base/halpeople/_meta" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/_meta" >/dev/null || true + log_fired GET "$base/halpeople/_aggrs/by-age" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/_aggrs/by-age" >/dev/null || true + + # ------------------------------------------------------------------ + # Bulk write — POST array body, PATCH-with-filter, DELETE-with-filter. + # ------------------------------------------------------------------ + log_fired POST "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X POST "$base/halpeople" \ + -d '[{"_id":"bob","name":"Bob","age":35},{"_id":"carol","name":"Carol","age":41},{"_id":"dave","name":"Dave","age":52}]' >/dev/null || true + log_fired PATCH "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PATCH \ + "$base/halpeople?filter=%7B%22age%22:%7B%22%24gte%22:35%7D%7D" \ + -d '{"$set":{"vip":true}}' >/dev/null || true + log_fired DELETE "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE \ + "$base/halpeople?filter=%7B%22age%22:%7B%22%24gte%22:50%7D%7D" >/dev/null || true + + # ------------------------------------------------------------------ + # JSON schema validation — define a schema, write conforming and + # non-conforming docs. + # ------------------------------------------------------------------ + log_fired PUT "$base/_schemas" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PUT "$base/_schemas" >/dev/null || true + log_fired PUT "$base/_schemas/person" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PUT "$base/_schemas/person" \ + -d '{"$schema":"http://json-schema.org/draft-04/schema#","type":"object","properties":{"name":{"type":"string"},"age":{"type":"integer","minimum":0}},"required":["name"]}' >/dev/null || true + log_fired GET "$base/_schemas/person" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/_schemas/person" >/dev/null || true + log_fired GET "$base/_schemas" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/_schemas" >/dev/null || true + + # ------------------------------------------------------------------ + # Auth services — /token, /roles, /logout. + # ------------------------------------------------------------------ + log_fired GET "$base/roles/admin" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/roles/admin" >/dev/null || true + log_fired GET "$base/token/admin" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/token/admin" >/dev/null || true + log_fired POST "$base/logout" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/logout" >/dev/null || true + + # ------------------------------------------------------------------ + # Files / GridFS — create a files bucket, upload a small file, fetch + # binary + metadata, then delete. + # ------------------------------------------------------------------ + log_fired PUT "$base/avatars.files" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PUT "$base/avatars.files" \ + -d '{"descr":"avatars file bucket"}' >/dev/null || true + printf 'keploy-coverage' > /tmp/restheart-cov-upload.bin + log_fired POST "$base/avatars.files" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/avatars.files" \ + -F 'file=@/tmp/restheart-cov-upload.bin' \ + -F 'metadata={"_id":"avatar1","owner":"jane"};type=application/json' >/dev/null || true + rm -f /tmp/restheart-cov-upload.bin + log_fired GET "$base/avatars.files" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/avatars.files" >/dev/null || true + log_fired GET "$base/avatars.files/avatar1" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/avatars.files/avatar1" >/dev/null || true + log_fired GET "$base/avatars.files/avatar1/binary" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/avatars.files/avatar1/binary" >/dev/null || true + log_fired DELETE "$base/avatars.files/avatar1" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/avatars.files/avatar1" >/dev/null || true + + # ------------------------------------------------------------------ + # Pagination + sort + counting + 404 paths. + # ------------------------------------------------------------------ + log_fired GET "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople?pagesize=2&page=1&sort=%7B%22age%22:1%7D&count=true" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople?np=true&pagesize=1" >/dev/null || true + log_fired GET "$base/health/db" + curl -sS "$base/health/db" >/dev/null || true + log_fired GET "$base/no-such-collection" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/no-such-collection" >/dev/null || true + log_fired GET "$base/halpeople/no-such-doc" + curl -sS -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/no-such-doc" >/dev/null || true + + # ------------------------------------------------------------------ + # HAL via ?rep=hal — content negotiation route to the + # mongodb.hal.* representation factories. + # ------------------------------------------------------------------ + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople?rep=hal" >/dev/null || true + log_fired GET "$base/halpeople/alice" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/alice?rep=hal" >/dev/null || true + log_fired GET "$base/halpeople/_indexes" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/_indexes?rep=hal" >/dev/null || true + log_fired GET "$base/" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/?rep=hal" >/dev/null || true + + # ------------------------------------------------------------------ + # Relationships — declared in collection _meta. + # ------------------------------------------------------------------ + log_fired PATCH "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" -X PATCH "$base/halpeople/_meta" \ + -d '{"rels":[{"rel":"author","type":"ONE_TO_MANY","role":"OWNING","target-coll":"halpeople","ref-field":"_id"}]}' >/dev/null || true + log_fired GET "$base/halpeople/alice" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/alice?rep=hal&hal=full" >/dev/null || true + + # Cache invalidator service (/ic) — unsecured. + log_fired POST "$base/ic" + curl -sS --max-time 5 -X POST "$base/ic?db=${RESTHEART_DB}&coll=halpeople" >/dev/null || true + log_fired GET "$base/ic" + curl -sS --max-time 5 "$base/ic" >/dev/null || true + + # CSV loader service (/csv). + log_fired POST "$base/csv" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H 'Content-Type: text/csv' \ + -X POST "$base/csv?db=${RESTHEART_DB}&coll=imported_csv&id=col1" \ + --data-binary $'col1,col2,col3\nA1,B1,C1\nA2,B2,C2\nA3,B3,C3' >/dev/null || true + log_fired GET "$base/imported_csv" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/imported_csv" >/dev/null || true + + # ------------------------------------------------------------------ + # ETag conditional flow — capture the ETag of /halpeople, then + # issue PUT/DELETE with If-Match plus a conditional GET. + # ------------------------------------------------------------------ + halpeople_etag=$(curl -sSI --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople" 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^ETag:/ {gsub(/[\r\n"]/,"",$2); print $2; exit}') + if [ -n "${halpeople_etag:-}" ]; then + log_fired PUT "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "If-Match: ${halpeople_etag}" \ + -H "$h_json" -X PUT "$base/halpeople/_meta" \ + -d '{"descr":"keploy CI bumped"}' >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "If-None-Match: ${halpeople_etag}" \ + "$base/halpeople" >/dev/null || true + fi + + # ------------------------------------------------------------------ + # GraphQL service entry path — empty / introspection / unknown app. + # ------------------------------------------------------------------ + log_fired POST "$base/graphql" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql" -d '{"query":"{ __typename }"}' >/dev/null || true + log_fired GET "$base/graphql" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/graphql" >/dev/null || true + log_fired POST "$base/graphql/no-such-app" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/no-such-app" -d '{"query":"{ __schema { types { name } } }"}' >/dev/null || true + + # Change-streams URI. + log_fired GET "$base/halpeople/_streams" + curl -sS --max-time 3 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/_streams" >/dev/null || true + log_fired GET "$base/halpeople/_streams/no-such-stream" + curl -sS --max-time 3 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept: text/event-stream' \ + "$base/halpeople/_streams/no-such-stream" >/dev/null || true + + # ------------------------------------------------------------------ + # Sessions / multi-doc transactions. + # ------------------------------------------------------------------ + log_fired POST "$base/_sessions" + session_response=$(curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/_sessions" 2>/dev/null || true) + session_id=$(printf '%s' "$session_response" | jq -r '._id // empty' 2>/dev/null || true) + if [ -n "${session_id:-}" ]; then + log_fired GET "$base/_sessions/${session_id}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/_sessions/${session_id}" >/dev/null || true + log_fired POST "$base/_sessions/${session_id}/_txns" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/_sessions/${session_id}/_txns" >/dev/null || true + log_fired GET "$base/_sessions/${session_id}/_txns" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/_sessions/${session_id}/_txns" >/dev/null || true + fi + + # ------------------------------------------------------------------ + # Diverse query-string + projection variants. + # ------------------------------------------------------------------ + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople?count=true&pagesize=0" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople?keys=%7B%22name%22:1%7D&sort_by=age" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople?filter=%7B%22vip%22:true%7D&hint=%7B%22age%22:1%7D" >/dev/null || true + + # Method-not-allowed and bad-request paths. + log_fired TRACE "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X TRACE "$base/halpeople" >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople" -d '{not even json}' >/dev/null || true + + # ------------------------------------------------------------------ + # GraphQL application — define a schema bound to halpeople and + # query it. Drives the entire graphql.* tree. + # ------------------------------------------------------------------ + log_fired PUT "$base/gql-apps" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/gql-apps" >/dev/null || true + log_fired PUT "$base/gql-apps/halpeople-gql" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/gql-apps/halpeople-gql" \ + -d '{ + "descriptor": { "name": "halpeople-gql", "uri": "halpeople", "description": "keploy ci graphql probe" }, + "schema": "type Query { people: [Person] person(id: String!): Person count: Int } type Person { _id: String name: String age: Int }", + "mappings": { + "Query": { + "people": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": {} }, + "person": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "_id": { "$arg": "id" } }, "first": true }, + "count": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": {}, "stages": [ { "$count": "_count" } ] } + } + } + }' >/dev/null || true + + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"{ people { _id name age } }"}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"query Q($id:String!){ person(id:$id) { name age } }","variables":{"id":"alice"}}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"{ __schema { types { name kind } } }"}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"{ __type(name:\"Person\"){ name fields { name type { name } } } }"}' >/dev/null || true + + # Properly-formatted relationship on a fresh collection. + log_fired PUT "$base/relpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/relpeople" >/dev/null || true + log_fired PUT "$base/relpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/relpeople/_meta" \ + -d '{"rels":[{"rel":"self","type":"ONE_TO_ONE","role":"OWNING","target-coll":"halpeople","ref-field":"ref_id"}]}' >/dev/null || true + log_fired POST "$base/relpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/relpeople" \ + -d '{"_id":"link-alice","ref_id":"alice"}' >/dev/null || true + log_fired GET "$base/relpeople/link-alice" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/relpeople/link-alice?rep=hal&hal=full" >/dev/null || true + + # Token lifecycle. + log_fired GET "$base/token/admin" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/token/admin" >/dev/null || true + log_fired POST "$base/token/admin" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/token/admin" >/dev/null || true + log_fired DELETE "$base/token/admin" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/token/admin" >/dev/null || true + + # Metrics format variants. + log_fired GET "$base/metrics" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept: application/json' "$base/metrics" >/dev/null || true + log_fired GET "$base/metrics" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept: text/plain' "$base/metrics" >/dev/null || true + log_fired GET "$base/metrics/${RESTHEART_DB}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/metrics/${RESTHEART_DB}" >/dev/null || true + log_fired GET "$base/metrics/${RESTHEART_DB}/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/metrics/${RESTHEART_DB}/halpeople" >/dev/null || true + + # Content-Encoding: gzip on POST. + log_fired POST "$base/halpeople" + printf '{"_id":"gzip-doc","name":"Z","age":99}' | gzip -c \ + | curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H "$h_json" -H 'Content-Encoding: gzip' \ + -X POST --data-binary @- "$base/halpeople" >/dev/null || true + + # Bulk write with mixed valid/invalid docs. + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople" \ + -d '[{"_id":"eve","name":"Eve","age":-1},{"_id":"frank","name":"Frank","age":24}]' >/dev/null || true + + # Auth probes — wrong password, missing auth header, OPTIONS preflight. + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u admin:wrongpass "$base/halpeople" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 "$base/halpeople" >/dev/null || true + log_fired OPTIONS "$base/halpeople" + curl -sS --max-time 5 -X OPTIONS \ + -H 'Origin: https://example.com' \ + -H 'Access-Control-Request-Method: POST' \ + -H 'Access-Control-Request-Headers: content-type,authorization' \ + "$base/halpeople" >/dev/null || true + + # ------------------------------------------------------------------ + # Database lifecycle on a separate db (handlers.database). + # ------------------------------------------------------------------ + log_fired PUT "$base/keployci_db" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/keployci_db" -d '{"descr":"keploy ci db lifecycle"}' >/dev/null || true + log_fired GET "$base/keployci_db" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/keployci_db" >/dev/null || true + log_fired GET "$base/keployci_db/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/keployci_db/_meta" >/dev/null || true + log_fired GET "$base/keployci_db/_size" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/keployci_db/_size" >/dev/null || true + log_fired PUT "$base/keployci_db/things" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/keployci_db/things" >/dev/null || true + log_fired POST "$base/keployci_db/things" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/keployci_db/things" -d '{"_id":"t1","kind":"a"}' >/dev/null || true + keployci_db_etag=$(curl -sSI --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/keployci_db" 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^ETag:/ {gsub(/[\r\n"]/,"",$2); print $2; exit}') + things_etag=$(curl -sSI --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/keployci_db/things" 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^ETag:/ {gsub(/[\r\n"]/,"",$2); print $2; exit}') + if [ -n "${things_etag:-}" ]; then + log_fired DELETE "$base/keployci_db/things" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H "If-Match: ${things_etag}" -X DELETE "$base/keployci_db/things" >/dev/null || true + fi + if [ -n "${keployci_db_etag:-}" ]; then + log_fired DELETE "$base/keployci_db" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H "If-Match: ${keployci_db_etag}" -X DELETE "$base/keployci_db" >/dev/null || true + fi + + # ------------------------------------------------------------------ + # Schema-violation writes — drives JsonSchemaBeforeWriteChecker. + # ------------------------------------------------------------------ + log_fired PUT "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/halpeople/_meta" -d '{"schema":"person"}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"badname","name":42,"age":30}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"missingname","age":30}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"negage","name":"Bad","age":-5}' >/dev/null || true + + # Variety of $-operators in PATCH. + local op_payload + for op_payload in \ + '{"$inc":{"age":1}}' \ + '{"$push":{"tags":"vip"}}' \ + '{"$addToSet":{"tags":"early"}}' \ + '{"$pull":{"tags":"vip"}}' \ + '{"$unset":{"city":""}}' \ + '{"$rename":{"city":"location"}}' \ + '{"$currentDate":{"updatedAt":true}}'; do + log_fired PATCH "$base/halpeople/alice" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/alice" -d "$op_payload" >/dev/null || true + done + + # writeMode query param on POST / PUT. + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople?writeMode=upsert" -d '{"_id":"upsertdoc","name":"Upserted","age":1}' >/dev/null || true + log_fired PUT "$base/halpeople/upsertdoc" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/halpeople/upsertdoc?writeMode=insert" -d '{"name":"Insertish","age":2}' >/dev/null || true + log_fired PUT "$base/halpeople/upsertdoc" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/halpeople/upsertdoc?writeMode=update" -d '{"name":"Updatedish","age":3}' >/dev/null || true + + # Larger bulk write. + bulk_payload="$(printf '['; for i in $(seq 1 25); do + printf '{"_id":"bulk-%d","name":"User%d","age":%d}' "$i" "$i" "$((20 + i))" + [ "$i" -lt 25 ] && printf ','; + done; printf ']')" + log_fired POST "$base/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople" -d "$bulk_payload" >/dev/null || true + log_fired PATCH "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople?filter=%7B%22_id%22:%7B%22%24regex%22:%22%5Ebulk-%22%7D%7D" \ + -d '{"$set":{"role":"bulk"}}' >/dev/null || true + log_fired DELETE "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -X DELETE "$base/halpeople?filter=%7B%22_id%22:%7B%22%24regex%22:%22%5Ebulk-%22%7D%7D" >/dev/null || true + + # ------------------------------------------------------------------ + # GraphQL mutations — extend the app to add a write op. + # ------------------------------------------------------------------ + log_fired PUT "$base/gql-apps/halpeople-gql" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/gql-apps/halpeople-gql" \ + -d '{ + "descriptor": { "name": "halpeople-gql", "uri": "halpeople" }, + "schema": "type Query { people: [Person] person(id: String!): Person } type Mutation { tag(id: String!, tag: String!): Person } type Person { _id: String name: String age: Int tags: [String] }", + "mappings": { + "Query": { + "people": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": {} }, + "person": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "_id": { "$arg": "id" } }, "first": true } + }, + "Mutation": { + "tag": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "update": { "$addToSet": { "tags": { "$arg": "tag" } } }, "filter": { "_id": { "$arg": "id" } } } + } + } + }' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"mutation M($id:String!,$t:String!){ tag(id:$id, tag:$t) { _id tags } }","variables":{"id":"alice","tag":"vip"}}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" -d '{"query":"{ this is not graphql"}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" -d '{"query":"{ people { unknownField } }"}' >/dev/null || true + + # Define a change stream then attempt SSE upgrade. + log_fired PATCH "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/_meta" \ + -d '{"streams":[{"uri":"all","stages":[{"_$match":{}}]}]}' >/dev/null || true + log_fired GET "$base/halpeople/_streams/all" + curl -sS --max-time 3 -H "Authorization: $RESTHEART_ADMIN_AUTH" -N \ + -H 'Accept: text/event-stream' "$base/halpeople/_streams/all" >/dev/null || true + + # JWT bearer + Auth-Token bogus probes. + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.bm90LWEtcmVhbC1qd3Q.signature' \ + "$base/halpeople" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H 'Auth-Token: bogus-token' "$base/halpeople" >/dev/null || true + + # ------------------------------------------------------------------ + # ACL — non-admin role evaluation. Inserts must use POST /acl. + # User passwords are sent plaintext; userPwdHasher bcrypts on insert. + # ------------------------------------------------------------------ + log_fired PUT "$base/acl" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/acl" >/dev/null || true + + local acl_rule + for acl_rule in \ + '{"_id":"reader-get-halpeople","roles":["reader"],"predicate":"method(GET) and path-prefix[/halpeople] and qparams-whitelist[page, pagesize, filter, keys]"}' \ + '{"_id":"reader-blacklist","roles":["reader"],"predicate":"method(GET) and path-prefix[/halpeople] and qparams-blacklist[secret, token]"}' \ + '{"_id":"reader-self-equals","roles":["reader"],"predicate":"path-prefix[/halpeople] and equals[%U, reader]"}' \ + '{"_id":"reader-localhost","roles":["reader"],"predicate":"path-prefix[/halpeople] and in[%h, {127.0.0.1, localhost}]"}' \ + '{"_id":"writer-bson-whitelist","roles":["writer"],"predicate":"path-prefix[/halpeople] and (method(GET) or method(POST) or method(PATCH)) and bson-request-whitelist[name, age, _id, role]"}' \ + '{"_id":"writer-bson-blacklist","roles":["writer"],"predicate":"path-prefix[/halpeople] and method(POST) and bson-request-blacklist[password, secret]"}' \ + '{"_id":"writer-bson-contains","roles":["writer"],"predicate":"path-prefix[/halpeople] and method(POST) and bson-request-contains[name]"}'; do + log_fired POST "$base/acl" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/acl" -d "$acl_rule" >/dev/null || true + done + + log_fired GET "$base/acl" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/acl" >/dev/null || true + + # Create non-admin users (plaintext passwords). + log_fired POST "$base/users" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/users" \ + -d '{"_id":"reader","password":"reader-secret","roles":["reader"]}' >/dev/null || true + log_fired POST "$base/users" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/users" \ + -d '{"_id":"writer","password":"writer-secret","roles":["writer"]}' >/dev/null || true + + # Wait for the mongoAclAuthorizer cache TTL to refresh. + sleep 6 + + # Reader requests — drive predicate evaluator. + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople?page=1&pagesize=5" >/dev/null || true + log_fired GET "$base/halpeople/alice" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople/alice" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople?evil=true" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople?secret=leak&page=1" >/dev/null || true + log_fired DELETE "$base/halpeople/alice" + curl -sS --max-time 5 -u reader:reader-secret -X DELETE "$base/halpeople/alice" >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -u reader:reader-secret -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"intruder","name":"X"}' >/dev/null || true + log_fired GET "$base/places" + curl -sS --max-time 5 -u reader:reader-secret "$base/places" >/dev/null || true + + # Writer requests. + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"writer-doc","name":"W","age":1,"role":"writer"}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"writer-bad","name":"B","extra":"forbidden"}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"writer-pw","name":"B","password":"x"}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"writer-noname","age":1}' >/dev/null || true + log_fired PATCH "$base/halpeople/writer-doc" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X PATCH "$base/halpeople/writer-doc" -d '{"$set":{"role":"writer"}}' >/dev/null || true + log_fired DELETE "$base/halpeople/writer-doc" + curl -sS --max-time 5 -u writer:writer-secret -X DELETE "$base/halpeople/writer-doc" >/dev/null || true + + # Wrong-password probe — drives mongoRealmAuthenticator verify-fail. + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u reader:wrongpassword "$base/halpeople" >/dev/null || true + + # ------------------------------------------------------------------ + # Aggregation pipeline with variable interpolation. + # ------------------------------------------------------------------ + log_fired PATCH "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/_meta" \ + -d '{"aggrs":[{"uri":"older-than","type":"pipeline","stages":[{"_$match":{"age":{"_$gte":{"_$var":"min_age"}}}},{"_$count":"_count"}]}]}' >/dev/null || true + sleep 2 + avars_25='%7B%22min_age%22:25%7D' + avars_50='%7B%22min_age%22:50%7D' + log_fired GET "$base/halpeople/_aggrs/older-than" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople/_aggrs/older-than?avars=${avars_25}" >/dev/null || true + log_fired GET "$base/halpeople/_aggrs/older-than" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople/_aggrs/older-than?avars=${avars_50}" >/dev/null || true + log_fired GET "$base/halpeople/_aggrs/older-than" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople/_aggrs/older-than" >/dev/null || true + log_fired GET "$base/halpeople/_aggrs/older-than" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople/_aggrs/older-than?avars=not-json" >/dev/null || true + + # ------------------------------------------------------------------ + # Additional ACL rules with @user.* / @request.* var set. + # ------------------------------------------------------------------ + for acl_rule in \ + '{"_id":"reader-roles-array","roles":["reader"],"predicate":"path-prefix[/halpeople] and equals[%U, @user.userid]"}' \ + '{"_id":"reader-qparam-var","roles":["reader"],"predicate":"path-prefix[/halpeople] and qparams-contain[user]"}' \ + '{"_id":"reader-qparam-size","roles":["reader"],"predicate":"path-prefix[/halpeople] and qparams-size[0, 5]"}'; do + log_fired POST "$base/acl" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/acl" -d "$acl_rule" >/dev/null || true + done + sleep 6 + + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople?user=reader&page=1" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople?a=1&b=2&c=3&d=4&e=5&f=6" >/dev/null || true + + # ------------------------------------------------------------------ + # GraphQL with BSON scalar types. + # ------------------------------------------------------------------ + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople" \ + -d '{"_id":"bson-doc","name":"BsonDoc","age":42,"score":{"$numberLong":"9999999999"},"price":{"$numberDecimal":"19.99"},"created":{"$date":"2024-01-15T10:00:00Z"},"oid":{"$oid":"507f1f77bcf86cd799439011"},"data":{"$binary":{"base64":"a2Vwbg==","subType":"00"}}}' >/dev/null || true + + log_fired PUT "$base/gql-apps/bson-types" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/gql-apps/bson-types" \ + -d '{ + "descriptor": { "name": "bson-types", "uri": "bson-types" }, + "schema": "scalar BsonObjectId scalar BsonDecimal128 scalar BsonLong scalar BsonDate scalar BsonBinary type Query { docs: [Doc] doc(id: String!): Doc } type Doc { _id: String name: String age: Int score: BsonLong price: BsonDecimal128 created: BsonDate oid: BsonObjectId data: BsonBinary }", + "mappings": { + "Query": { + "docs": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": {} }, + "doc": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "_id": { "$arg": "id" } }, "first": true } + } + } + }' >/dev/null || true + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"{ doc(id:\"bson-doc\") { _id name age score price created oid data } }"}' >/dev/null || true + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"{ docs { _id score price oid } }"}' >/dev/null || true + + # ------------------------------------------------------------------ + # Transactions — session id + txn id come back in Location headers. + # ------------------------------------------------------------------ + log_fired POST "$base/_sessions" + sess_loc=$(curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/_sessions" -i 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^Location:/{gsub(/[\r\n]/,""); print $2; exit}') + if [ -n "${sess_loc:-}" ]; then + sid="${sess_loc##*/}" + log_fired POST "$base/_sessions/${sid}/_txns" + txn_loc=$(curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/_sessions/${sid}/_txns" -i 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^Location:/{gsub(/[\r\n]/,""); print $2; exit}') + txn_id="${txn_loc##*/}" + log_fired GET "$base/_sessions/${sid}/_txns" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/_sessions/${sid}/_txns" >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople?sid=${sid}&txn=${txn_id}" \ + -d '{"_id":"in-txn-1","name":"InTxn1","age":11}' >/dev/null || true + log_fired PATCH "$base/halpeople/alice" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/alice?sid=${sid}&txn=${txn_id}" \ + -d '{"$set":{"in_txn":true}}' >/dev/null || true + log_fired PATCH "$base/_sessions/${sid}/_txns/${txn_id}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -X PATCH "$base/_sessions/${sid}/_txns/${txn_id}" >/dev/null || true + log_fired GET "$base/halpeople/in-txn-1" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/in-txn-1" >/dev/null || true + + log_fired POST "$base/_sessions/${sid}/_txns" + txn_loc2=$(curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/_sessions/${sid}/_txns" -i 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^Location:/{gsub(/[\r\n]/,""); print $2; exit}') + txn_id2="${txn_loc2##*/}" + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/halpeople?sid=${sid}&txn=${txn_id2}" \ + -d '{"_id":"in-txn-aborted","name":"WontExist"}' >/dev/null || true + log_fired DELETE "$base/_sessions/${sid}/_txns/${txn_id2}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -X DELETE "$base/_sessions/${sid}/_txns/${txn_id2}" >/dev/null || true + log_fired GET "$base/halpeople/in-txn-aborted" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/in-txn-aborted" >/dev/null || true + fi + + # ------------------------------------------------------------------ + # HAL on write responses — drives BulkResultRepresentationFactory. + # ------------------------------------------------------------------ + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -H 'Accept: application/hal+json' \ + -X POST "$base/halpeople?rep=hal" \ + -d '{"_id":"hal-post","name":"HalPost","age":1}' >/dev/null || true + log_fired PUT "$base/halpeople/hal-post" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -H 'Accept: application/hal+json' \ + -X PUT "$base/halpeople/hal-post?rep=hal" \ + -d '{"name":"HalPut","age":2}' >/dev/null || true + log_fired PATCH "$base/halpeople/hal-post" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -H 'Accept: application/hal+json' \ + -X PATCH "$base/halpeople/hal-post?rep=hal&hal=full" \ + -d '{"$set":{"age":3}}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -H 'Accept: application/hal+json' \ + -X POST "$base/halpeople?rep=hal" \ + -d '[{"_id":"hal-b1","name":"B1"},{"_id":"hal-b2","name":"B2"}]' >/dev/null || true + + # Aggregation with array + nested var interpolation. + log_fired PATCH "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/_meta" \ + -d '{"aggrs":[{"uri":"by-name-list","type":"pipeline","stages":[{"_$match":{"name":{"_$in":{"_$var":"names"}}}},{"_$count":"_count"}]}]}' >/dev/null || true + sleep 2 + avars_arr='%7B%22names%22:%5B%22Alice%22,%22Bob%22%5D%7D' + log_fired GET "$base/halpeople/_aggrs/by-name-list" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople/_aggrs/by-name-list?avars=${avars_arr}" >/dev/null || true + avars_nested='%7B%22cfg%22:%7B%22field%22:%22age%22,%22min%22:25%7D%7D' + log_fired PATCH "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/_meta" \ + -d '{"aggrs":[{"uri":"with-cfg","type":"pipeline","stages":[{"_$match":{"_$expr":{"_$gte":[{"_$var":"cfg.min"},25]}}}]}]}' >/dev/null || true + sleep 2 + log_fired GET "$base/halpeople/_aggrs/with-cfg" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + "$base/halpeople/_aggrs/with-cfg?avars=${avars_nested}" >/dev/null || true + + # ------------------------------------------------------------------ + # /token grants — password / client_credentials / refresh_token. + # ------------------------------------------------------------------ + log_fired POST "$base/token" + grant_pw_resp=$(curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -X POST "$base/token" \ + -d 'grant_type=password&username=admin&password=secret&scope=read' 2>/dev/null || true) + valid_jwt=$(printf '%s' "$grant_pw_resp" | jq -r '.access_token // empty' 2>/dev/null || true) + log_fired POST "$base/token" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -X POST "$base/token" \ + -d 'grant_type=client_credentials&client_id=admin&client_secret=secret' >/dev/null || true + log_fired POST "$base/token" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -X POST "$base/token" \ + -d 'grant_type=refresh_token&refresh_token=ignored' >/dev/null || true + log_fired POST "$base/token" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -X POST "$base/token" -d 'grant_type=device_code' >/dev/null || true + log_fired POST "$base/token" + curl -sS --max-time 5 \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -X POST "$base/token" \ + -d 'grant_type=password&username=admin&password=wrong' >/dev/null || true + + if [ -n "${valid_jwt:-}" ]; then + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: Bearer $valid_jwt" \ + "$base/halpeople" >/dev/null || true + log_fired GET "$base/halpeople/alice" + curl -sS --max-time 5 -H "Authorization: Bearer $valid_jwt" \ + "$base/halpeople/alice" >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: Bearer $valid_jwt" \ + -H "$h_json" \ + -X POST "$base/halpeople" -d '{"_id":"jwt-doc","name":"JWT","age":1}' >/dev/null || true + fi + log_fired GET "$base/halpeople" + curl -sS --max-time 5 \ + -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0In0.signature' \ + "$base/halpeople" >/dev/null || true + + # OPTIONS preflight on /token + /graphql. + log_fired OPTIONS "$base/token" + curl -sS --max-time 5 -X OPTIONS \ + -H 'Origin: https://example.com' \ + -H 'Access-Control-Request-Method: POST' \ + -H 'Access-Control-Request-Headers: content-type,authorization' \ + "$base/token" >/dev/null || true + log_fired OPTIONS "$base/graphql" + curl -sS --max-time 5 -X OPTIONS \ + -H 'Origin: https://example.com' \ + -H 'Access-Control-Request-Method: POST' \ + "$base/graphql" >/dev/null || true + + # Accept-Encoding variants. + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept-Encoding: gzip' \ + "$base/halpeople" -o /dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept-Encoding: deflate' \ + "$base/halpeople" -o /dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept-Encoding: gzip, deflate, br' \ + "$base/halpeople?pagesize=2" -o /dev/null || true + + # Multiple Accept-Language. + log_fired GET "$base/halpeople/alice" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Accept-Language: en-US,en;q=0.9' \ + "$base/halpeople/alice" >/dev/null || true + + # URL pattern variants — drive MongoMountResolverImpl branches. + log_fired GET "$base/_size" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/_size" >/dev/null || true + log_fired GET "$base/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/_meta" >/dev/null || true + log_fired GET "$base/halpeople/" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/" >/dev/null || true + log_fired GET "$base//halpeople" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base//halpeople" >/dev/null || true + log_fired GET "$base/halpeople/alice/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/alice/_meta/" >/dev/null || true + + # /metrics format variants. + log_fired GET "$base/metrics" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H 'Accept: application/openmetrics-text; version=1.0.0; charset=utf-8' \ + "$base/metrics" >/dev/null || true + log_fired GET "$base/metrics" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H 'Accept: text/plain; version=0.0.4' "$base/metrics" >/dev/null || true + + # ------------------------------------------------------------------ + # GraphQL with INPUT-typed BSON scalars. + # ------------------------------------------------------------------ + log_fired PUT "$base/gql-apps/bson-types" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PUT "$base/gql-apps/bson-types" \ + -d '{ + "descriptor": { "name": "bson-types", "uri": "bson-types" }, + "schema": "scalar BsonObjectId scalar BsonDecimal128 scalar BsonLong scalar BsonDate scalar BsonBinary type Query { docs: [Doc] doc(id: String!): Doc byOid(oid: BsonObjectId!): [Doc] byScore(min: BsonLong!): [Doc] byPrice(min: BsonDecimal128!): [Doc] byCreated(after: BsonDate!): [Doc] } type Doc { _id: String name: String age: Int score: BsonLong price: BsonDecimal128 created: BsonDate oid: BsonObjectId data: BsonBinary }", + "mappings": { + "Query": { + "docs": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": {} }, + "doc": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "_id": { "$arg": "id" } }, "first": true }, + "byOid": { "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "oid": { "$arg": "oid" } } }, + "byScore":{ "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "score": { "$gte": { "$arg": "min" } } } }, + "byPrice":{ "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "price": { "$gte": { "$arg": "min" } } } }, + "byCreated":{ "db": "'"${RESTHEART_DB}"'", "collection": "halpeople", "find": { "created": { "$gte": { "$arg": "after" } } } } + } + } + }' >/dev/null || true + + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"query Q($id:BsonObjectId!){ byOid(oid:$id) { _id name } }","variables":{"id":"507f1f77bcf86cd799439011"}}' >/dev/null || true + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"query Q($m:BsonLong!){ byScore(min:$m) { _id score } }","variables":{"m":"100"}}' >/dev/null || true + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"query Q($m:BsonDecimal128!){ byPrice(min:$m) { _id price } }","variables":{"m":"9.99"}}' >/dev/null || true + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"query Q($d:BsonDate!){ byCreated(after:$d) { _id created } }","variables":{"d":"2020-01-01T00:00:00Z"}}' >/dev/null || true + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"{ byOid(oid:\"507f191e810c19729de860ea\") { _id } }"}' >/dev/null || true + log_fired POST "$base/graphql/bson-types" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/bson-types" \ + -d '{"query":"query Q($id:BsonObjectId!){ byOid(oid:$id) { _id } }","variables":{"id":"not-a-valid-oid"}}' >/dev/null || true + + # ------------------------------------------------------------------ + # More aggregation pipeline forms. + # ------------------------------------------------------------------ + log_fired PATCH "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/_meta" \ + -d '{"aggrs":[ + {"uri":"sort-by-age","type":"pipeline","stages":[{"_$sort":{"age":-1}},{"_$limit":5}]}, + {"uri":"project-name-only","type":"pipeline","stages":[{"_$project":{"name":1,"_id":0}}]}, + {"uri":"facet-multi","type":"pipeline","stages":[{"_$facet":{"young":[{"_$match":{"age":{"_$lt":30}}},{"_$count":"_count"}],"old":[{"_$match":{"age":{"_$gte":30}}},{"_$count":"_count"}]}}]}, + {"uri":"lookup-self","type":"pipeline","stages":[{"_$lookup":{"from":"halpeople","localField":"_id","foreignField":"_id","as":"self"}}]} + ]}' >/dev/null || true + sleep 2 + local agg_name + for agg_name in sort-by-age project-name-only facet-multi lookup-self; do + log_fired GET "$base/halpeople/_aggrs/${agg_name}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/_aggrs/${agg_name}" >/dev/null || true + done + log_fired GET "$base/halpeople/_aggrs" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/_aggrs" >/dev/null || true + + # ------------------------------------------------------------------ + # Range requests on file binary. + # ------------------------------------------------------------------ + log_fired PUT "$base/range_files.files" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/range_files.files" >/dev/null || true + printf 'keploy-coverage-range-test-payload-1234567890' > /tmp/restheart-cov-range.bin + log_fired POST "$base/range_files.files" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X POST "$base/range_files.files" \ + -F 'file=@/tmp/restheart-cov-range.bin' \ + -F 'metadata={"_id":"range-doc","kind":"range"};type=application/json' >/dev/null || true + rm -f /tmp/restheart-cov-range.bin + log_fired GET "$base/range_files.files/range-doc/binary" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Range: bytes=0-9' \ + "$base/range_files.files/range-doc/binary" -o /dev/null || true + log_fired GET "$base/range_files.files/range-doc/binary" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Range: bytes=10-19' \ + "$base/range_files.files/range-doc/binary" -o /dev/null || true + log_fired GET "$base/range_files.files/range-doc/binary" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H 'Range: bytes=99999-' \ + "$base/range_files.files/range-doc/binary" -o /dev/null || true + + log_fired DELETE "$base/token/no-such-user" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/token/no-such-user" >/dev/null || true + + # ------------------------------------------------------------------ + # OAuth metadata endpoints + Digest auth probes. + # ------------------------------------------------------------------ + log_fired GET "$base/.well-known/oauth-authorization-server" + curl -sS --max-time 5 "$base/.well-known/oauth-authorization-server" >/dev/null || true + log_fired GET "$base/.well-known/oauth-protected-resource" + curl -sS --max-time 5 "$base/.well-known/oauth-protected-resource" >/dev/null || true + log_fired GET "$base/.well-known/oauth-protected-resource/halpeople" + curl -sS --max-time 5 "$base/.well-known/oauth-protected-resource/halpeople" >/dev/null || true + log_fired GET "$base/.well-known/oauth-authorization-server" + curl -sS --max-time 5 -H 'X-Forwarded-Host: api.example.com' \ + -H 'X-Forwarded-Proto: https' \ + "$base/.well-known/oauth-authorization-server" >/dev/null || true + log_fired GET "$base/.well-known/oauth-protected-resource" + curl -sS --max-time 5 -H 'X-Forwarded-Host: api.example.com' \ + -H 'X-Forwarded-Proto: https' \ + "$base/.well-known/oauth-protected-resource" >/dev/null || true + + log_fired GET "$base/halpeople" + curl -sS --max-time 5 \ + -H 'Authorization: Digest username="admin", realm="RESTHeart Realm", nonce="abc", uri="/halpeople", response="def"' \ + "$base/halpeople" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -i \ + -H 'Authorization: Digest username="admin"' \ + "$base/halpeople" >/dev/null || true + + # ------------------------------------------------------------------ + # ACL with `mongo` permission fields — drives the three permission + # interceptors (mongoPermissionFilters / mergeRequest / + # projectResponse). + # ------------------------------------------------------------------ + log_fired POST "$base/acl" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/acl" \ + -d '{ + "_id":"reader-mongo-perms", + "roles":["reader"], + "predicate":"method(GET) and path-prefix[/halpeople]", + "mongo": { + "readFilter": { "name": { "$exists": true } }, + "projectResponse": { "_etag": 0 }, + "mergeRequest": { "lastReadAt": "@now" }, + "allowManagementRequests": false, + "allowBulkPatch": false, + "allowBulkDelete": false + } + }' >/dev/null || true + log_fired POST "$base/acl" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/acl" \ + -d '{ + "_id":"writer-mongo-perms", + "roles":["writer"], + "predicate":"path-prefix[/halpeople] and (method(POST) or method(PATCH) or method(GET))", + "mongo": { + "writeFilter": { "role": { "$ne": "admin" } }, + "readFilter": {}, + "projectResponse": { "secret": 0 }, + "mergeRequest": { "writtenBy": "@user.userid", "writtenAt": "@now" }, + "allowManagementRequests": true, + "allowBulkPatch": true, + "allowBulkDelete": false + } + }' >/dev/null || true + sleep 6 + + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople" >/dev/null || true + log_fired GET "$base/halpeople/alice" + curl -sS --max-time 5 -u reader:reader-secret "$base/halpeople/alice" >/dev/null || true + + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X POST "$base/halpeople" \ + -d '{"_id":"writer-perm-ok","name":"OK","age":1}' >/dev/null || true + log_fired POST "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X POST "$base/halpeople" \ + -d '{"_id":"writer-perm-bad","name":"Bad","role":"admin"}' >/dev/null || true + log_fired PATCH "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret -H "$h_json" \ + -X PATCH "$base/halpeople?filter=%7B%22name%22:%22OK%22%7D" \ + -d '{"$set":{"role":"writer"}}' >/dev/null || true + log_fired DELETE "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret \ + -X DELETE "$base/halpeople?filter=%7B%22name%22:%22OK%22%7D" >/dev/null || true + + # ACL extras — filterOperatorsBlacklist + propertiesBlacklist. + log_fired POST "$base/acl" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/acl" \ + -d '{ + "_id":"writer-extras", + "roles":["writer"], + "predicate":"path-prefix[/halpeople] and method(GET)", + "mongo": { + "filterOperatorsBlacklist": ["$where", "$expr", "$function"], + "propertiesBlacklist": ["password", "token", "secret"], + "writeFilter": {}, + "readFilter": {} + } + }' >/dev/null || true + sleep 6 + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret \ + "$base/halpeople?filter=%7B%22%24where%22:%221%3D%3D1%22%7D" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret \ + "$base/halpeople?filter=%7B%22%24expr%22:%7B%22%24eq%22:%5B%22%24age%22,%2230%22%5D%7D%7D" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret \ + "$base/halpeople?keys=%7B%22password%22:1%7D" >/dev/null || true + log_fired GET "$base/halpeople" + curl -sS --max-time 5 -u writer:writer-secret \ + "$base/halpeople?filter=%7B%22age%22:%7B%22%24gte%22:1%7D%7D" >/dev/null || true + + # ------------------------------------------------------------------ + # Multiple collections + databases — drives MongoMountResolverImpl. + # ------------------------------------------------------------------ + local coll encoded + for coll in coll_a coll_b coll_with_dashes coll.with.dots; do + encoded=$(printf '%s' "$coll" | sed 's/\./%2E/g') + log_fired PUT "$base/${encoded}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/$encoded" >/dev/null || true + log_fired POST "$base/${encoded}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/$encoded" -d '{"_id":"d1","v":1}' >/dev/null || true + log_fired GET "$base/${encoded}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/$encoded" >/dev/null || true + log_fired GET "$base/${encoded}/_size" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/$encoded/_size" >/dev/null || true + log_fired DELETE "$base/${encoded}/d1" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/$encoded/d1" >/dev/null || true + done + + local db_name d_etag t_etag + for db_name in db_alpha db_beta; do + log_fired PUT "$base/${db_name}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/$db_name" >/dev/null || true + log_fired PUT "$base/${db_name}/things" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X PUT "$base/$db_name/things" >/dev/null || true + log_fired POST "$base/${db_name}/things" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/$db_name/things" -d '{"_id":"x","v":1}' >/dev/null || true + log_fired GET "$base/${db_name}/things" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/$db_name/things" >/dev/null || true + d_etag=$(curl -sSI --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/$db_name" 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^ETag:/{gsub(/[\r\n"]/,"",$2); print $2; exit}') + t_etag=$(curl -sSI --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/$db_name/things" 2>/dev/null \ + | awk 'BEGIN{IGNORECASE=1} /^ETag:/{gsub(/[\r\n"]/,"",$2); print $2; exit}') + if [ -n "${t_etag:-}" ]; then + log_fired DELETE "$base/${db_name}/things" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H "If-Match: ${t_etag}" -X DELETE "$base/$db_name/things" >/dev/null || true + fi + if [ -n "${d_etag:-}" ]; then + log_fired DELETE "$base/${db_name}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" \ + -H "If-Match: ${d_etag}" -X DELETE "$base/$db_name" >/dev/null || true + fi + done + + # ------------------------------------------------------------------ + # More aggregations + GraphQL alias / fragments / multi-op. + # ------------------------------------------------------------------ + log_fired PATCH "$base/halpeople/_meta" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X PATCH "$base/halpeople/_meta" \ + -d '{"aggrs":[ + {"uri":"group-by-tag","type":"pipeline","stages":[{"_$unwind":"$tags"},{"_$group":{"_id":"$tags","count":{"_$sum":1}}}]}, + {"uri":"sort-asc","type":"pipeline","stages":[{"_$sort":{"_id":1}}]}, + {"uri":"limit-3","type":"pipeline","stages":[{"_$limit":3}]} + ]}' >/dev/null || true + sleep 2 + for agg_name in group-by-tag sort-asc limit-3; do + log_fired GET "$base/halpeople/_aggrs/${agg_name}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" "$base/halpeople/_aggrs/${agg_name}" >/dev/null || true + done + + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"{ first: people { _id name } second: people { _id age } }"}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"fragment P on Person { _id name age } query { people { ...P } }"}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"query A { people { _id } } query B { people { name } }","operationName":"B"}' >/dev/null || true + log_fired POST "$base/graphql/halpeople" + curl -sS --max-time 8 -H "Authorization: $RESTHEART_ADMIN_AUTH" -H "$h_json" \ + -X POST "$base/graphql/halpeople" \ + -d '{"query":"query Q($id:String){ person(id:$id) { _id } }","variables":{"id":null}}' >/dev/null || true + + # ------------------------------------------------------------------ + # Cleanup — drop the non-admin users + ACL rules created above. + # ------------------------------------------------------------------ + log_fired DELETE "$base/users/reader" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/users/reader" >/dev/null || true + log_fired DELETE "$base/users/writer" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/users/writer" >/dev/null || true + local rule_id + for rule_id in reader-get-halpeople reader-blacklist reader-self-equals \ + reader-localhost writer-bson-whitelist writer-bson-blacklist \ + writer-bson-contains reader-roles-array reader-qparam-var \ + reader-qparam-size reader-mongo-perms writer-mongo-perms writer-extras; do + log_fired DELETE "$base/acl/${rule_id}" + curl -sS --max-time 5 -H "Authorization: $RESTHEART_ADMIN_AUTH" -X DELETE "$base/acl/$rule_id" >/dev/null || true + done +} + +# restheart_report_coverage (real Java line coverage via JaCoCo). +# +# Requires the docker-compose.coverage.yml overlay — the base +# compose is uninstrumented so keploy CI lanes (enterprise, +# integrations) pay zero JVM-instrumentation cost. When called +# from a base-compose run this function detects the missing +# coverage image and exits 0 cleanly so `flow.sh coverage || true` +# informational hooks don't break. +# +# Mechanics: +# - The overlay's Dockerfile.coverage layers JaCoCo's agent jar +# into the upstream restheart image; the overlay compose sets +# JAVA_TOOL_OPTIONS=-javaagent:.../jacocoagent.jar=output=tcpserver,... +# so the agent listens on port 6300 inside the container. +# - This function uses the coverage image (which has java + +# jacococli.jar) to dump execution data over TCP into +# /coverage/jacoco.exec, then renders a JaCoCo XML report +# against /opt/restheart/restheart.jar's classfiles. +# - The XML's rows under +# aggregate every analysed class; we sum and emit a +# `Covered N/M (XX.X%)` line in the helper-script's expected +# format. +restheart_report_coverage() { + local app="${RESTHEART_APP_CONTAINER:-restheart_app}" + local data_dir="${RESTHEART_COVERAGE_DATA_DIR:-${PWD}/coverage}" + local report_file="${COVERAGE_REPORT_FILE:-coverage_report.txt}" + local image="${RESTHEART_COVERAGE_IMAGE:-restheart-mongo:local-coverage}" + local jacoco_port="${RESTHEART_JACOCO_PORT:-6300}" + + if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${app}$"; then + echo "INFO: ${app} not running — coverage report skipped" + : >"$report_file" + return 0 + fi + if ! docker image inspect "$image" >/dev/null 2>&1; then + echo "INFO: coverage image ${image} not built — base image is uninstrumented (apply docker-compose.coverage.yml overlay to enable)" + : >"$report_file" + return 0 + fi + + # Locate the docker network the running container is on so the + # one-off jacococli container can reach :6300 via container DNS. + local network + network=$(docker inspect "$app" --format '{{range $k, $v := .NetworkSettings.Networks}}{{$k}}{{println}}{{end}}' 2>/dev/null | head -1 | tr -d ' \r\n') + if [ -z "$network" ]; then + echo "ERROR: could not resolve docker network for ${app}" >&2 + return 1 + fi + + docker run --rm --network "$network" -v "${data_dir}:/coverage" --entrypoint java "$image" \ + -jar /opt/jacoco/jacococli.jar dump \ + --address "$app" --port "$jacoco_port" \ + --destfile /coverage/jacoco.exec >/dev/null + + docker run --rm -v "${data_dir}:/coverage" --entrypoint java "$image" \ + -jar /opt/jacoco/jacococli.jar report /coverage/jacoco.exec \ + --xml /coverage/report.xml \ + --classfiles /opt/restheart/restheart.jar >/dev/null + + # Parse the top-level rows from the + # JaCoCo XML. Use python3 inside the alpine helper so we don't + # rely on the host having lxml/xmlstarlet/etc. + local pct missed covered total + read -r missed covered <<<"$(docker run --rm -v "${data_dir}:/coverage" python:3.12-alpine python3 -c ' +import xml.etree.ElementTree as ET +root = ET.parse("/coverage/report.xml").getroot() +miss = sum(int(c.get("missed",0)) for c in root.findall("counter") if c.get("type") == "LINE") +cov = sum(int(c.get("covered",0)) for c in root.findall("counter") if c.get("type") == "LINE") +print(miss, cov) +')" + total=$((missed + covered)) + pct=$(awk -v c="$covered" -v t="$total" 'BEGIN{if(t>0)printf "%.1f", c*100/t; else print "0.0"}') + + { + echo "============== RESTHeart line coverage (JaCoCo) ==============" + echo "Lines missed: ${missed}" + echo "Lines covered: ${covered}" + echo "Lines total: ${total}" + echo "" + echo "Covered ${covered}/${total} (${pct}%)" + echo "==============================================================" + } | tee "$report_file" +} + +case "${1:-}" in + bootstrap) restheart_bootstrap "${2:-180}" ;; + record-traffic) restheart_record_traffic ;; + coverage) restheart_report_coverage ;; + *) + echo "usage: $0 {bootstrap|record-traffic|coverage}" >&2 + exit 2 ;; +esac diff --git a/restheart-mongo/keploy.yml.template b/restheart-mongo/keploy.yml.template new file mode 100644 index 00000000..8b5a3736 --- /dev/null +++ b/restheart-mongo/keploy.yml.template @@ -0,0 +1,70 @@ +# keploy.yml template for the restheart-mongo sample. +# +# globalNoise.global is consumed at replay-time as a `body` / +# `header` map of field-name → regex array. Keploy's matcher +# expects a NESTED structure (top-level keys are the response +# section "body" / "header"; inner keys are the field names). +# Flat dotted-keys like `body.field: []` are not unflattened by +# the parser — they end up as outer keys "body.field" and never +# match the body section, so the noise is silently ignored. +# +# Fields covered here: +# +# header.Date / header.Content-Length +# Runtime-stamped; Content-Length is downstream-of body.client_ip +# on /ping (length changes when the reflected client_ip differs +# in byte width). +# body._etag / body._oid / body._id +# RESTHeart auto-stamped on each document; ObjectIds and ETag +# change per write. +# body.lastModified +# Auto-now timestamp. +# body.client_ip +# RESTHeart's /ping echoes the requesting client IP. Differs +# between host-driven record (loopback) and docker-bridge +# replay (gateway). Time-freeze can't help; this is +# network-derived. +# body.latencyMs +# /health/db reports a freshly measured DB ping duration; varies +# per request even with time freeze (the duration is computed +# end-start across two clock reads). +# header.Auth-Token / body.access_token +# RESTHeart's /token endpoint mints a JWT with `exp` and `jti` +# (random UUID) on every call. Time-freeze pins exp, but jti is +# a SecureRandom UUID and the HS256 signature is a function of +# the full payload, so tokens never match byte-for-byte across +# record/replay. +# +# Centralised here so a future RESTHeart version that adds another +# auto-stamped field is one edit, not a fan-out across lane scripts. +test: + globalNoise: + global: + header: + Date: [] + Content-Length: [] + Auth-Token: [] + # Etag is server-stamped per write/read on every doc and + # collection in RESTHeart. The body field _etag is already + # noised (below), but RESTHeart also exposes the same hash + # in the response header `Etag`, which differs per run. + Etag: [] + # POST /_sessions returns a `Location: /_sessions/` + # header where the UUID is server-generated per session. + # Each replay gets a fresh UUID; ignore the header to match. + Location: [] + body: + _etag: [] + _oid: [] + _id: [] + lastModified: [] + client_ip: [] + latencyMs: [] + access_token: [] + # RESTHeart's /tokens endpoint returns expires_in = seconds until + # the JWT `exp`, computed as (exp - now) at request time. Even under + # --freezeTime the recorded vs replayed value can differ by 1s when + # the request straddles a second boundary (observed 872 vs 871 on + # post-token), so the countdown must be treated as noise just like + # the access_token JWT itself. + expires_in: [] diff --git a/sap-demo-java/.dockerignore b/sap-demo-java/.dockerignore new file mode 100644 index 00000000..9c56a06f --- /dev/null +++ b/sap-demo-java/.dockerignore @@ -0,0 +1,20 @@ +.git +.gitignore +.dockerignore +.env +.env.example +.idea +.vscode +# Allow only the final fat jar into the build context (built by mvn package). +# Everything else under target/ is excluded. +target/* +!target/customer360.jar +keploy/ +keploy.yml +k8s/secret.yaml +*.log +/tmp +README.md +demo_script.sh +simulate_fiori_flow.sh +deploy_kind.sh diff --git a/sap-demo-java/.env.example b/sap-demo-java/.env.example new file mode 100644 index 00000000..5169da59 --- /dev/null +++ b/sap-demo-java/.env.example @@ -0,0 +1,16 @@ +# Copy to .env and fill in the SAP API key. +# .env is gitignored. Never commit real credentials. + +# SAP Business Accelerator Hub sandbox API key. +# Get a free one at https://api.sap.com → any API → "Show API Key". +SAP_API_KEY= + +# Optional — for real BTP tenant (OAuth2 xsuaa bearer token). +# If set, takes precedence over SAP_API_KEY. +SAP_BEARER_TOKEN= + +# Override these if you point at a non-sandbox tenant. +SAP_API_BASE_URL=https://sandbox.api.sap.com/s4hanacloud + +# Local dev port. Ignored when running in kind (NodePort 30080 is the entry). +SERVER_PORT=8080 diff --git a/sap-demo-java/.gitignore b/sap-demo-java/.gitignore new file mode 100644 index 00000000..cda2660e --- /dev/null +++ b/sap-demo-java/.gitignore @@ -0,0 +1,21 @@ +# Build artefacts +target/ +*.jar +!.mvn/wrapper/maven-wrapper.jar +.idea/ +.vscode/ +*.iml + +# Secrets +.env +k8s/secret.yaml + +# Keploy captures (these ARE the artefact — commit deliberately, not auto) +# Uncomment the next two lines if you prefer to gitignore them: +# keploy/ +# keploy.yml + +# OS / editor noise +.DS_Store +*.swp +*.swo diff --git a/sap-demo-java/Dockerfile b/sap-demo-java/Dockerfile new file mode 100644 index 00000000..d22ec3a3 --- /dev/null +++ b/sap-demo-java/Dockerfile @@ -0,0 +1,23 @@ +# syntax=docker/dockerfile:1.7 +# +# Uses amazoncorretto:21 — Amazon Linux 2023-based, minimal, JDK-ready. +# Matches the Maven toolchain (pom.xml targets Java 21). The jar is built +# outside Docker (mvn package); this image just packages it and runs it. +# K8s securityContext enforces the non-root runtime UID (1001). +# +# Docker Hub pull rate limits are avoided by relying on the locally cached +# amazoncorretto:21 image. + +FROM amazoncorretto:21 + +WORKDIR /app + +# Make /app world-readable so the K8s-enforced UID 1001 can read the jar. +COPY target/customer360.jar /app/customer360.jar +RUN chmod 755 /app && chmod 644 /app/customer360.jar + +ENV JAVA_OPTS="-XX:MaxRAMPercentage=75 -XX:+ExitOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom" + +EXPOSE 8080 + +ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /app/customer360.jar"] diff --git a/sap-demo-java/README.md b/sap-demo-java/README.md new file mode 100644 index 00000000..772d7940 --- /dev/null +++ b/sap-demo-java/README.md @@ -0,0 +1,276 @@ +# sap-demo-java — Customer 360 aggregation service + +Spring Boot 3 / Java 21 reference service that builds a **Customer 360 view** +on the fly by fanning out to SAP S/4HANA Business Partner OData endpoints +and merging the result with locally stored CRM annotations (tags + notes) +from Postgres. Used inside the Keploy project as the canonical regression +fixture for the SAP fan-out path and the v3 HTTPS + Postgres parsers. + +--- + +## What this app does + +This is a small "Customer 360" aggregator, the kind of service an internal +CRM dashboard team would ship on SAP BTP. When a user hits +`GET /api/v1/customers/{id}/360`, the service fans out: **one synchronous +SAP OData call** for the BusinessPartner master record, then **two more +parallel SAP OData calls** (addresses + roles), **in parallel with two +Postgres queries** (tags + notes). The five results are merged into a single +JSON response. + +The real-world analog is an in-house CRM dashboard that needs a unified +customer view by calling the system-of-record (SAP) plus a local CRM +annotations DB (Postgres), without any surface area that hides how those +downstream calls behave on the wire. + +--- + +## Architecture at a glance + +```mermaid +flowchart LR + Client[Client
curl / browser] --> Ctrl[Customer360Controller] + Ctrl --> Agg[Customer360AggregatorService] + + Agg -->|sync| SapPartner[SAP OData
A_BusinessPartner] + Agg -->|async| SapAddr[SAP OData
to_BusinessPartnerAddress] + Agg -->|async| SapRole[SAP OData
to_BusinessPartnerRole] + Agg -->|async| PgTags[(Postgres
customer_tag)] + Agg -->|async| PgNotes[(Postgres
customer_note)] + + SapPartner -.->|HTTP/1.1 + TLS
keep-alive| SAPAPI[SAP Sandbox] + SapAddr -.-> SAPAPI + SapRole -.-> SAPAPI + PgTags -.->|JDBC + TLS| PG[(Postgres 16)] + PgNotes -.-> PG +``` + +A few things to notice about this shape: + +- The synchronous SAP `A_BusinessPartner` fetch runs first and acts as the + existence check — if it fails the whole request short-circuits. +- The four remaining calls (two SAP nav collections + two Postgres + queries) run **in parallel** via `CompletableFuture.allOf` dispatched on + the dedicated `sapCallExecutor` thread pool. +- All three SAP calls hit the same host (same SNI) and share a + connection-pooled Apache `HttpComponents5` client with keep-alive; the + two Postgres calls share a HikariCP pool. +- The five results are merged into a single JSON envelope and returned to + the caller in one trip — one inbound request, five concurrent backend + conversations, one response. + +--- + +## Why this shape is interesting for Keploy + +The service is deliberately structured to exercise the trickiest parts of +Keploy's interception layer in a single flow. + +- **Parallel outbound TLS** — every `/360` request opens 3 concurrent HTTPS + connections to the SAP sandbox plus 2 concurrent TLS-enabled Postgres + queries, giving Keploy a dense concurrency pattern to capture and replay. +- **Chunked HTTP/1.1 + keep-alive reuse** — SAP's sandbox returns chunked + responses over a reused keep-alive connection, so the recorded mocks + preserve the same wire shape your service sees in production. +- **Schema diversity in a single repo** — GET / POST / DELETE verbs, JSON + request bodies, a custom `X-Correlation-Id` header, actuator health + probes, both chunked and Content-Length responses, and the OpenAPI + `/v3/api-docs` catalog endpoint. +- **Stateful local DB** — Flyway-migrated schema behind a HikariCP + connection pool, which exercises the v3 Postgres parser's + prepared-statement cache handling and pool-reuse semantics. + +### Why Keploy? + +- Captures live production-shape traffic, including the concurrent SAP + fan-out, without mocks. +- Replays the exact same multi-TLS concurrency pattern inside CI, so + regressions in the real HTTP/Postgres stack are caught before release. +- Auto-detects non-deterministic fields (timestamps, correlation IDs) and + marks them as noise. +- In-cluster mode spins up an ephemeral replica and runs the test set + automatically on every new pod version — no manual test writing. +- No code changes to the Spring Boot app — Keploy sits in the network + path via eBPF. + +--- + +## Requirements + +- Java 21 + Maven 3.9+ +- Docker (Postgres 16 is brought up as a sidecar via `docker compose`) +- A Keploy binary if you want to record / replay (any v3.3.x or newer is fine) +- An SAP API sandbox key — grab one for free from the SAP Business + Accelerator Hub: + [api.sap.com/api/API_BUSINESS_PARTNER](https://api.sap.com/api/API_BUSINESS_PARTNER). + Click *Show API Key* once signed in. + +--- + +## Local quickstart + +```bash +cd sap-demo-java + +# 1. Bring up Postgres in the background (or use ./deploy_kind.sh for k8s) +docker compose up -d postgres + +# 2. Point the app at the SAP sandbox +export SAP_API_KEY= +export SAP_SANDBOX_BASE_URL=https://sandbox.api.sap.com/s4hanacloud + +# 3. Build and run +mvn spring-boot:run +``` + +The service listens on `:8080`. Smoke-test it: + +```bash +curl -s http://localhost:8080/actuator/health | jq . +curl -s http://localhost:8080/api/v1/customers/202/360 | jq . +``` + +--- + +## Recording with Keploy (native CLI) + +Run the service under `keploy record`, exercise it with `run_flow.sh` +(which fires 20 distinct request shapes covering every endpoint and +verb), then replay: + +```bash +# terminal 1 — record +keploy record -c "java -jar target/customer360.jar" + +# terminal 2 — drive traffic +bash run_flow.sh + +# Ctrl+C the record command. Testcases land under ./keploy/ +# then replay: +keploy test -c "java -jar target/customer360.jar" +``` + +--- + +## Recording inside Kubernetes (k8s-proxy) + +The same flow runs in-cluster through the Keploy k8s-proxy. Deploy the +app to kind: + +```bash +./deploy_kind.sh +kubectl -n sap-demo annotate deploy/customer360 keploy.io/record=enabled + +# start recording +curl -k -X POST https://:8080/record/start \ + -H "Authorization: Bearer $KEPLOY_SHARED_TOKEN_OVERRIDE" \ + -d '{"namespace":"sap-demo","deployment":"customer360"}' + +# drive traffic (e.g. run_flow.sh against the NodePort / Ingress host) +./run_flow.sh + +# stop recording — auto-replay then fires on a standalone pod +curl -k -X POST https://:8080/record/stop \ + -d '{"record_id":"sap-demo-customer360"}' +``` + +Replay results land in the enterprise dashboard at +[app.keploy.io](https://app.keploy.io). + +--- + +## Key endpoints + +| Method | Path | Purpose | Downstream | +|---------|------------------------------------------|-----------------------------------------|----------------------------------| +| GET | `/actuator/health` | Liveness / readiness probe | none | +| GET | `/api/v1/customers/count` | KPI tile — total partner count | Postgres only | +| GET | `/api/v1/customers/{id}` | Business partner detail | SAP only | +| GET | `/api/v1/customers/{id}/tags` | Customer tags | Postgres only | +| GET | **`/api/v1/customers/{id}/360`** | **Full aggregation** | **SAP × 3 + Postgres × 2 parallel** | +| POST | `/api/v1/customers/{id}/tags` | Add a tag | Postgres only | +| POST | `/api/v1/customers/{id}/notes` | Add a note | Postgres only | +| DELETE | `/api/v1/customers/{id}/tags/{tag}` | Remove a tag | Postgres only | +| GET | `/v3/api-docs` | OpenAPI catalog | none | + +--- + +## Noise configuration + +`keploy.yml` marks three fields as global noise so replays stay +deterministic across runs: + +- `header.X-Correlation-Id` — generated per-request by `CorrelationIdFilter`; + it's intentionally unique per call, so it can never match on replay. +- `body.timestamp` / `body.installedOn` / `body.id` — server-generated + values on write paths (tag / note rows). The semantic content is stable; + the numeric/temporal surface is not. +- `ETag` on SAP responses (and `Date` headers) — SAP regenerates these on + every fetch, independent of the underlying record state. + +If your team adds more generated fields, extend `test.globalNoise.global` +in `keploy.yml`. + +--- + +## Architecture + +Classic Spring Boot layering, with one custom wrinkle for the fan-out: + +- **Controller** — `web/Customer360Controller.java` (+ `CustomerController`, + `TagController`, `NoteController`, `AuditController`). RFC 7807 problem + responses come from `web/GlobalExceptionHandler`. +- **Aggregator** — `service/Customer360AggregatorService.java`. Builds + three `CompletableFuture`s for the SAP calls and two more for the + Postgres queries, all dispatched on a dedicated `sapCallExecutor` thread + pool, then joins them via `CompletableFuture.allOf`. Partial-failure + policy: the SAP partner fetch is mandatory; everything else degrades + gracefully. +- **SAP client** — `sap/SapBusinessPartnerClient.java`. Spring + `RestTemplate` backed by the Apache `HttpComponents5` client factory + (keep-alive + transparent gzip handling, which the JDK default doesn't + offer). Retries + circuit breaker via Resilience4j (`sapApi` instance in + `application.yml`). +- **Persistence** — `repository/CustomerTagRepository.java` and + `CustomerNoteRepository.java` (Spring Data JPA), plus + `AuditEventRepository`. Schema is Flyway-migrated + (`src/main/resources/db/migration/V1__init_schema.sql`); pool is + HikariCP with `maximum-pool-size=10`. +- **Correlation** — inbound `CorrelationIdFilter` seeds the MDC; + outbound `CorrelationIdInterceptor` propagates the ID on every SAP call. + +--- + +## Troubleshooting + +- **`502 SAP upstream error` on `/360`.** Check `SAP_API_KEY`; the SAP + sandbox also rate-limits at roughly 120 requests/minute. The built-in + Resilience4j circuit breaker will open if you punch through that. +- **Tests drift on `X-Correlation-Id`.** Configure `X-Correlation-Id` + as noise in `keploy.yml` under `globalNoise.header.X-Correlation-Id`. + Keploy respects case-insensitive header matching, so you can use any + casing. +- **`ImagePullBackOff` / `ErrImageNeverPull` in kind.** You forgot to + `kind load docker-image customer360:local` — run `./deploy_kind.sh build`. +- **Liveness probe flaps at startup.** The 40 s `startupProbe` grace is + usually enough for the JVM; raise `failureThreshold` in + `k8s/deployment.yaml` if your host is slow. + +--- + +## Files + +| Path | Purpose | +|---|---| +| `pom.xml` | Spring Boot 3, Java 21, Resilience4j, Flyway, HikariCP, SpringDoc | +| `src/main/java/com/keploy/sapdemo/customer360/...` | Application source (see *Architecture* above) | +| `src/main/resources/application.yml` | Externalised config | +| `src/main/resources/db/migration/V1__init_schema.sql` | Flyway schema: `customer_tag`, `customer_note`, `audit_event` | +| `docker-compose.yml` | Local Postgres 16 sidecar | +| `Dockerfile` | Multi-stage, non-root Spring Boot layered image | +| `k8s/*.yaml` | Namespace / ConfigMap / Secret / Deployment / Service / Ingress | +| `deploy_kind.sh` | One-shot kind cluster + build + load + apply | +| `run_flow.sh` | 20-request exerciser used during `keploy record` | +| `demo_script.sh` | Record / replay / offline-test harness | +| `simulate_fiori_flow.sh` | Narrated Fiori-style flow for two-terminal demos | +| `keploy.yml` | Recorded-mock metadata + global noise rules | diff --git a/sap-demo-java/demo_script.sh b/sap-demo-java/demo_script.sh new file mode 100755 index 00000000..993cbabe --- /dev/null +++ b/sap-demo-java/demo_script.sh @@ -0,0 +1,188 @@ +#!/usr/bin/env bash +# demo_script.sh — live demo harness for the Customer 360 service. +# +# Unlike sap_demo_A (Go, local), this demo runs the service in a kind cluster +# via Kubernetes — closer to the way a RISE customer would deploy a BTP +# extension. There are two recording modes: +# +# local — run Keploy on the host, record an out-of-cluster binary +# (same pattern as sap_demo_A; simplest, works anywhere) +# k8s — run Keploy inside the kind cluster as a sidecar on the pod +# (demonstrates the k8s-proxy integration story) +# +# Usage: +# ./demo_script.sh exercise # hit the deployed service with the sample flow +# ./demo_script.sh record-local # Keploy record against a local binary +# ./demo_script.sh test-local # replay captured mocks +# ./demo_script.sh offline-test # replay with SAP blackholed in /etc/hosts +# ./demo_script.sh record-k8s # (placeholder) record via k8s-proxy sidecar +# +# Prereqs for local mode: go>=1.25 or java>=21+mvn, keploy, sudo +# Prereqs for k8s mode: docker, kind, kubectl, app already deployed + +set -euo pipefail + +cd "$(dirname "$0")" + +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +BOLD='\033[1m' +NC='\033[0m' + +say() { printf "${BOLD}${GREEN}==> %s${NC}\n" "$*"; } +warn() { printf "${BOLD}${YELLOW}!! %s${NC}\n" "$*"; } +fail() { printf "${BOLD}${RED}XX %s${NC}\n" "$*"; } + +BASE_URL="${BASE_URL:-http://localhost:30080}" + +# ---------------------------------------------------------------------------- +# exercise_endpoints — the scripted UI-style business flow that drives +# the service while Keploy records underneath. 1 inbound → many SAP calls. +# ---------------------------------------------------------------------------- +exercise_endpoints() { + say "exercising Customer 360 endpoints against ${BASE_URL}" + say "each /360 call fans out to 3 parallel SAP OData GETs — Keploy captures all of them" + + echo " GET /actuator/health $(curl -sw '%{http_code}' -o /dev/null ${BASE_URL}/actuator/health)" + sleep 1 + echo " GET /api/v1/customers/count $(curl -sw '%{http_code}' -o /dev/null ${BASE_URL}/api/v1/customers/count)" + sleep 2 + echo " GET /api/v1/customers?top=3 $(curl -sw '%{http_code}' -o /dev/null ${BASE_URL}/api/v1/customers?top=3)" + sleep 2 + echo " GET /api/v1/customers/11 $(curl -sw '%{http_code}' -o /dev/null ${BASE_URL}/api/v1/customers/11)" + sleep 2 + echo " GET /api/v1/customers/202 $(curl -sw '%{http_code}' -o /dev/null ${BASE_URL}/api/v1/customers/202)" + sleep 2 + say "the money shot: aggregated 360 view (1 inbound, 3 parallel SAP OData calls)" + echo " GET /api/v1/customers/202/360 $(curl -sw '%{http_code}' -o /dev/null ${BASE_URL}/api/v1/customers/202/360)" + sleep 2 + echo " GET /api/v1/customers/11/360 $(curl -sw '%{http_code}' -o /dev/null ${BASE_URL}/api/v1/customers/11/360)" + sleep 2 +} + +ensure_built_locally() { + if [ ! -f target/customer360.jar ]; then + say "building customer360.jar (first run only)" + mvn -q -DskipTests package + fi +} + +load_env() { + if [ -f .env ]; then + set -a; source .env; set +a + fi +} + +start_local_keploy_record() { + ensure_built_locally + load_env + if [ -z "${SAP_API_KEY:-}" ]; then + fail "SAP_API_KEY missing — set it in .env or export before running" + exit 1 + fi + rm -rf keploy keploy.yml + say "starting service under keploy record (local JVM + eBPF attach)" + sudo -E keploy record -c "java -jar target/customer360.jar" > /tmp/keploy-record.log 2>&1 & + + for i in $(seq 1 60); do + if curl -s -o /dev/null http://localhost:8080/actuator/health 2>/dev/null; then + say "service ready after ${i}s" + return 0 + fi + sleep 1 + done + fail "service never became ready — see /tmp/keploy-record.log" + sudo pkill -INT -f "keploy record" 2>/dev/null || true + exit 1 +} + +stop_record() { + say "stopping keploy record" + sudo pkill -INT -f "keploy record" 2>/dev/null || true + for i in $(seq 1 45); do + if ! pgrep -f "keploy record" >/dev/null; then break; fi + sleep 1 + done + say "captured test cases:" + ls -1 keploy/test-set-0/tests/ 2>/dev/null | sed 's/^/ /' || true + if grep -lq "BusinessPartner" keploy/test-set-0/tests/*.yaml 2>/dev/null; then + say "confirmed real SAP data in captured YAML" + fi +} + +run_test() { + load_env + # Local replay against the local binary. BASE_URL is intentionally 8080 here + # (the Keploy test harness brings the app up on its original port). + BASE_URL="http://localhost:8080" + say "running keploy test — replays mocks without touching SAP" + sudo -E keploy test -c "java -jar target/customer360.jar" --delay 15 > /tmp/keploy-test.log 2>&1 & + TPID=$! + wait $TPID || true + + stripped=$(sed -E 's/\x1B\[[0-9;]*[mK]//g' /tmp/keploy-test.log) + pass_count=$(echo "$stripped" | awk '/Total test passed:/ {print $NF; exit}') + fail_count=$(echo "$stripped" | awk '/Total test failed:/ {print $NF; exit}') + total_count=$(echo "$stripped" | awk '/Total tests:/ {print $NF; exit}') + if [ -n "${pass_count:-}" ] && [ -n "${fail_count:-}" ] && [ "$fail_count" = "0" ]; then + printf "\n${BOLD}${GREEN}PASS${NC} %s/%s Keploy replays covered the 360 fan-out (3 SAP OData calls per /360) — no SAP traffic.\n\n" \ + "$pass_count" "${total_count:-$pass_count}" + return 0 + fi + fail "keploy test did not all pass — see /tmp/keploy-test.log" + tail -30 /tmp/keploy-test.log + return 1 +} + +offline_test() { + if ! grep -q "sandbox.api.sap.com" /etc/hosts; then + say "blackholing sandbox.api.sap.com in /etc/hosts (sudo)" + echo "127.0.0.1 sandbox.api.sap.com" | sudo tee -a /etc/hosts >/dev/null + trap 'sudo sed -i "/127.0.0.1 sandbox.api.sap.com/d" /etc/hosts' EXIT + fi + say "sanity: direct probe to SAP should now fail" + if curl -sS --max-time 5 -o /dev/null 'https://sandbox.api.sap.com/s4hanacloud/' 2>&1; then + warn "direct curl unexpectedly succeeded" + else + say "SAP unreachable (expected)" + fi + run_test +} + +record_k8s_stub() { + cat <<'EOF' +[PLACEHOLDER] Recording inside the kind cluster via Keploy's k8s-proxy is a +separate integration (see ../k8s-proxy/charts/k8s-proxy). The high-level steps: + + 1. Deploy the k8s-proxy Helm chart alongside the app: + helm upgrade --install k8s-proxy ../k8s-proxy/charts/k8s-proxy \ + --namespace keploy --create-namespace \ + --set keploy.apiServerUrl=http://host.docker.internal:8086 \ + --set keploy.clusterName=sap-demo + + 2. The k8s-proxy injects an eBPF-capable agent pod that can attach to the + customer360 pod via a shared mount-ns / PID-ns. + + 3. Drive traffic: ./demo_script.sh exercise + + 4. Keploy writes captured tests back through the api-server and they show + up at http://localhost:3000 in the enterprise UI. + +For the acquisition demo we typically use local recording (./demo_script.sh +record-local) — same mechanic, simpler to rehearse. +EOF +} + +cmd="${1:-exercise}" +case "$cmd" in + exercise) exercise_endpoints ;; + record-local) start_local_keploy_record; exercise_endpoints; stop_record ;; + test-local) run_test ;; + offline-test) offline_test ;; + record-k8s) record_k8s_stub ;; + *) + echo "usage: $0 [exercise|record-local|test-local|offline-test|record-k8s]" + exit 2 + ;; +esac diff --git a/sap-demo-java/deploy_kind.sh b/sap-demo-java/deploy_kind.sh new file mode 100755 index 00000000..112cf2da --- /dev/null +++ b/sap-demo-java/deploy_kind.sh @@ -0,0 +1,361 @@ +#!/usr/bin/env bash +# deploy_kind.sh — one-shot helper to stand up the Customer 360 service +# inside a local kind cluster ready for Keploy recording. +# +# Usage: +# ./deploy_kind.sh [--cluster NAME | -c NAME] [SUBCOMMAND] +# KIND_CLUSTER=NAME ./deploy_kind.sh [SUBCOMMAND] +# +# The cluster name defaults to "sap-demo". Override via flag or env var to +# target an existing cluster (e.g. one that hosts the Keploy k8s-proxy). +# +# Subcommands: +# (none) / all — full pipeline: cluster + build + load + apply + wait +# cluster — only create the kind cluster (skipped if it exists) +# build — only (re)build the jar + docker image and kind-load it +# apply — only apply k8s manifests (assumes cluster + image ready) +# status — show pod, service and recent events +# logs — tail the app logs +# destroy — delete the kind cluster (and only that cluster) +# +# Examples: +# ./deploy_kind.sh # default: fresh sap-demo cluster +# KIND_CLUSTER=my-cluster ./deploy_kind.sh apply # apply into an existing cluster +# ./deploy_kind.sh -c keploy-bug2 apply # same via flag +# +# Prereqs: docker, kind, kubectl + +set -euo pipefail + +cd "$(dirname "$0")" + +# --- defaults --------------------------------------------------------------- +CLUSTER_NAME="${KIND_CLUSTER:-sap-demo}" +IMAGE_TAG="customer360:local" +NS="sap-demo" + +# --- flag parsing ----------------------------------------------------------- +# Accepts --cluster NAME / -c NAME anywhere in the arg list. +POSITIONAL=() +while [ $# -gt 0 ]; do + case "$1" in + -c|--cluster) + if [ -z "${2:-}" ]; then + echo "error: $1 requires a cluster name"; exit 2 + fi + CLUSTER_NAME="$2" + shift 2 + ;; + --cluster=*) + CLUSTER_NAME="${1#--cluster=}" + shift + ;; + -h|--help) + sed -n '1,28p' "$0" | sed 's/^# \{0,1\}//' + exit 0 + ;; + --) + shift; POSITIONAL+=("$@"); break ;; + *) + POSITIONAL+=("$1"); shift ;; + esac +done +set -- "${POSITIONAL[@]:-}" + +# --- colours ---------------------------------------------------------------- +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +BOLD='\033[1m' +NC='\033[0m' + +say() { printf "${BOLD}${GREEN}==> %s${NC}\n" "$*"; } +warn() { printf "${BOLD}${YELLOW}!! %s${NC}\n" "$*"; } +fail() { printf "${BOLD}${RED}XX %s${NC}\n" "$*"; } + +check_prereqs() { + for bin in docker kind kubectl; do + command -v "$bin" >/dev/null || { fail "$bin not found in PATH"; exit 1; } + done + say "target kind cluster: '${CLUSTER_NAME}' (kubectl context: kind-${CLUSTER_NAME})" +} + +cluster_exists() { + kind get clusters 2>/dev/null | grep -qx "${CLUSTER_NAME}" +} + +# Probe the control-plane container for which host→node port mappings exist. +# Purely advisory; we don't fail if something is missing. +check_port_mappings() { + local container="${CLUSTER_NAME}-control-plane" + if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -qx "${container}"; then + return 0 + fi + local ports + ports="$(docker port "${container}" 2>/dev/null || true)" + + HAS_HTTP=0 + HAS_NODEPORT=0 + echo "${ports}" | grep -q '80/tcp' && HAS_HTTP=1 + echo "${ports}" | grep -q '30080/tcp' && HAS_NODEPORT=1 + + if [ "${HAS_HTTP}" = 1 ]; then + say "host:80 → ${container}:80 mapping present (Ingress path available)" + else + warn "host:80 is NOT mapped on ${container} — Ingress won't be reachable on localhost" + fi + if [ "${HAS_NODEPORT}" = 1 ]; then + say "host:30080 → ${container}:30080 mapping present (NodePort path available)" + else + warn "host:30080 is NOT mapped on ${container} — NodePort won't be reachable on localhost" + fi + if [ "${HAS_HTTP}" = 0 ] && [ "${HAS_NODEPORT}" = 0 ]; then + warn "Neither access path is mapped. Fallback:" + warn " kubectl -n ${NS} port-forward svc/customer360 8080:8080" + fi +} + +# Install the kind-flavoured ingress-nginx controller if the target cluster +# has no IngressClass yet. Idempotent: skips if already present. +ensure_ingress_controller() { + kubectl config use-context "kind-${CLUSTER_NAME}" >/dev/null + if kubectl get ingressclass nginx >/dev/null 2>&1; then + say "ingress-nginx already present (IngressClass 'nginx' found)" + return 0 + fi + if kubectl get ingressclass -o name 2>/dev/null | head -n1 | grep -q .; then + warn "an IngressClass other than 'nginx' exists; skipping ingress-nginx install." + warn "edit k8s/ingress.yaml → ingressClassName to match if needed." + return 0 + fi + say "installing ingress-nginx (kind variant) — one-time per cluster" + local manifest="https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.3/deploy/static/provider/kind/deploy.yaml" + if ! kubectl apply -f "${manifest}"; then + warn "could not fetch ingress-nginx manifest from ${manifest}" + warn "install it manually, or stick to the NodePort URL at http://localhost:30080" + return 1 + fi + say "waiting for ingress-nginx controller pod to become ready" + kubectl wait --namespace ingress-nginx \ + --for=condition=ready pod \ + --selector=app.kubernetes.io/component=controller \ + --timeout=180s || warn "ingress-nginx didn't reach ready — Ingress URL may 503 until it does" + + # The controller pod being "ready" is not enough: the admission webhook + # service is a separate endpoint seeded by two short-lived Jobs + # (ingress-nginx-admission-create / -patch). If we apply the Ingress + # before those complete, the apiserver can't reach the validating + # webhook and the apply fails with a dial-tcp connection-refused error. + say "waiting for ingress-nginx admission jobs to complete" + kubectl wait --namespace ingress-nginx \ + --for=condition=complete job \ + --selector=app.kubernetes.io/component=admission-webhook \ + --timeout=120s || warn "admission jobs didn't complete — apply may need a retry" +} + +ensure_secret() { + if [ ! -f k8s/secret.yaml ]; then + warn "k8s/secret.yaml missing — creating from example" + if [ ! -f k8s/secret.yaml.example ]; then + fail "k8s/secret.yaml.example missing" + exit 1 + fi + if [ -f .env ] && grep -q '^SAP_API_KEY=' .env; then + KEY=$(grep '^SAP_API_KEY=' .env | cut -d= -f2- | tr -d '"'"'") + sed "s||${KEY}|" k8s/secret.yaml.example > k8s/secret.yaml + say "secret.yaml generated from .env" + else + fail "No SAP_API_KEY in .env and no k8s/secret.yaml — copy and edit k8s/secret.yaml.example" + exit 1 + fi + fi +} + +create_cluster() { + if cluster_exists; then + say "kind cluster '${CLUSTER_NAME}' already exists — reusing" + else + if [ "${CLUSTER_NAME}" != "sap-demo" ]; then + warn "cluster '${CLUSTER_NAME}' does not exist; 'cluster'/'all' will create it" + warn "using kind-config.yaml (NodePort 30080 → host 30080 mapping)." + warn "if that's not what you want, create the cluster externally first," + warn "then run './deploy_kind.sh -c ${CLUSTER_NAME} apply' to skip creation." + fi + say "creating kind cluster '${CLUSTER_NAME}'" + # kind-config.yaml hardcodes name: sap-demo; override via --name + kind create cluster --config kind-config.yaml --name "${CLUSTER_NAME}" + fi + kubectl config use-context "kind-${CLUSTER_NAME}" >/dev/null + say "kubectl context: $(kubectl config current-context)" +} + +build_and_load() { + if cluster_exists; then :; else + fail "cluster '${CLUSTER_NAME}' does not exist — run '$0 -c ${CLUSTER_NAME} cluster' first" + exit 1 + fi + # Rebuild the jar if any source file under src/ or pom.xml is newer than + # the jar — `dir -nt file` only compares the directory mtime, which does + # NOT move when files inside the directory are edited, so a plain + # `[ src -nt target/customer360.jar ]` would happily reuse a stale jar + # after a code change. + needs_build=1 + if [ -f target/customer360.jar ]; then + if [ -z "$(find src pom.xml -type f -newer target/customer360.jar -print -quit 2>/dev/null)" ]; then + needs_build=0 + fi + fi + if [ "${needs_build}" -eq 1 ]; then + say "building customer360.jar (mvn package)" + mvn -q -B -DskipTests package + else + say "using existing target/customer360.jar" + fi + say "building docker image ${IMAGE_TAG}" + DOCKER_BUILDKIT=0 docker build --pull=false -t "${IMAGE_TAG}" . + say "loading image into kind cluster '${CLUSTER_NAME}'" + kind load docker-image "${IMAGE_TAG}" --name "${CLUSTER_NAME}" +} + +# Check if ${IMAGE_TAG} is already loaded into the target cluster's node. +# `kind load` is per-cluster — an image loaded into cluster A is invisible +# to cluster B. This guards against ImagePullBackOff on cross-cluster applies. +image_in_cluster() { + local node_container="${CLUSTER_NAME}-control-plane" + if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -qx "${node_container}"; then + return 1 + fi + docker exec "${node_container}" crictl images 2>/dev/null \ + | awk '{print $1":"$2}' | grep -qx "docker.io/library/${IMAGE_TAG}" +} + +# Ensure the image is present in the cluster; load it if not. +# Called from apply_manifests so that `./deploy_kind.sh apply` against a +# fresh cluster or a different cluster still works without a prior `build`. +ensure_image_in_cluster() { + if image_in_cluster; then + say "image ${IMAGE_TAG} already present in cluster '${CLUSTER_NAME}'" + return 0 + fi + warn "image ${IMAGE_TAG} not present in cluster '${CLUSTER_NAME}' — loading it now" + # Make sure the image exists on the host first. + if ! docker image inspect "${IMAGE_TAG}" >/dev/null 2>&1; then + say "host image ${IMAGE_TAG} missing too — running full build" + build_and_load + return $? + fi + say "loading host-cached ${IMAGE_TAG} into cluster '${CLUSTER_NAME}'" + kind load docker-image "${IMAGE_TAG}" --name "${CLUSTER_NAME}" +} + +apply_manifests() { + if cluster_exists; then :; else + fail "cluster '${CLUSTER_NAME}' does not exist — nothing to apply to" + exit 1 + fi + kubectl config use-context "kind-${CLUSTER_NAME}" >/dev/null + ensure_secret + ensure_image_in_cluster + ensure_ingress_controller + say "applying k8s manifests into context kind-${CLUSTER_NAME}" + kubectl apply -f k8s/namespace.yaml + kubectl apply -f k8s/postgres.yaml + say "waiting for Postgres rollout" + kubectl -n "${NS}" rollout status deployment/postgres --timeout=120s + kubectl apply -f k8s/configmap.yaml + kubectl apply -f k8s/secret.yaml + kubectl apply -f k8s/deployment.yaml + kubectl apply -f k8s/service.yaml + # Retry the Ingress apply a couple of times — the admission webhook can + # briefly 503 right after the controller comes up. + for attempt in 1 2 3; do + if kubectl apply -f k8s/ingress.yaml; then + break + fi + warn "ingress apply failed (attempt ${attempt}/3), retrying in 5s…" + sleep 5 + done + + say "waiting for rollout" + if ! kubectl -n "${NS}" rollout status deployment/customer360 --timeout=180s; then + fail "rollout did not complete — diagnosing" + kubectl -n "${NS}" get pods -o wide + # Surface ImagePullBackOff specifically, since it's the most common + # cross-cluster apply failure mode. + local ipbp + ipbp=$(kubectl -n "${NS}" get pod -l app.kubernetes.io/name=customer360 \ + -o jsonpath='{.items[*].status.containerStatuses[*].state.waiting.reason}' 2>/dev/null) + if echo "${ipbp}" | grep -qE "ImagePullBackOff|ErrImagePull|ErrImageNeverPull"; then + warn "pod can't find the image — '${IMAGE_TAG}' is not on the cluster's node." + warn "fix: ./deploy_kind.sh -c ${CLUSTER_NAME} build" + warn " (that rebuilds + kind-loads into THIS cluster specifically)" + fi + exit 1 + fi + + check_port_mappings + + say "ready. preferred URL (Ingress, port 80):" + if [ "${HAS_HTTP:-0}" = 1 ]; then + echo " curl -s http://customer360.localtest.me/actuator/health | jq ." + echo " curl -s http://customer360.localtest.me/api/v1/customers/count | jq ." + echo " curl -s http://customer360.localtest.me/api/v1/customers/202/360 | jq ." + echo " open http://customer360.localtest.me/swagger-ui.html" + fi + if [ "${HAS_NODEPORT:-0}" = 1 ]; then + say "also available (NodePort, port 30080):" + echo " curl -s http://localhost:30080/actuator/health | jq ." + fi + if [ "${HAS_HTTP:-0}" = 0 ] && [ "${HAS_NODEPORT:-0}" = 0 ]; then + say "fallback via port-forward:" + echo " kubectl -n ${NS} port-forward svc/customer360 8080:8080" + echo " curl -s http://localhost:8080/actuator/health | jq ." + fi +} + +show_status() { + kubectl config use-context "kind-${CLUSTER_NAME}" >/dev/null + say "nodes" + kubectl get nodes -o wide + say "pods" + kubectl -n "${NS}" get pods -o wide + say "service" + kubectl -n "${NS}" get svc + say "events (last 10)" + kubectl -n "${NS}" get events --sort-by='.lastTimestamp' | tail -10 +} + +tail_logs() { + kubectl config use-context "kind-${CLUSTER_NAME}" >/dev/null + POD=$(kubectl -n "${NS}" get pod -l app.kubernetes.io/name=customer360 -o name | head -n1) + if [ -z "${POD}" ]; then + fail "no customer360 pod found in namespace ${NS} on kind-${CLUSTER_NAME}" + exit 1 + fi + kubectl -n "${NS}" logs -f "${POD}" +} + +destroy() { + say "deleting kind cluster '${CLUSTER_NAME}'" + kind delete cluster --name "${CLUSTER_NAME}" || true +} + +cmd="${1:-all}" +case "$cmd" in + all|"") + check_prereqs + create_cluster + build_and_load + apply_manifests + ;; + cluster) check_prereqs; create_cluster ;; + build) check_prereqs; build_and_load ;; + apply) check_prereqs; apply_manifests ;; + status) check_prereqs; show_status ;; + logs) check_prereqs; tail_logs ;; + destroy) check_prereqs; destroy ;; + *) + echo "usage: $0 [--cluster NAME | -c NAME] [cluster|build|apply|status|logs|destroy|all]" + exit 2 + ;; +esac diff --git a/sap-demo-java/docker-compose.yml b/sap-demo-java/docker-compose.yml new file mode 100644 index 00000000..bfce0100 --- /dev/null +++ b/sap-demo-java/docker-compose.yml @@ -0,0 +1,58 @@ +# Local-only runner — convenient for quick iteration without kind. +# Starts Postgres + the Spring Boot app; the app waits for Postgres via +# depends_on/healthcheck. +# +# For the demo, prefer ./deploy_kind.sh (matches production topology). +services: + postgres: + image: postgres:16-alpine + container_name: customer360-postgres + environment: + POSTGRES_DB: customer360 + POSTGRES_USER: customer360 + POSTGRES_PASSWORD: customer360 + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5432:5432" + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + # -h 127.0.0.1 is load-bearing: it forces a TCP probe. + # + # Without it pg_isready talks to the Unix socket, and postgres' + # docker-entrypoint runs a *temporary* server reachable only over that + # socket (listen_addresses='') once initdb has finished, to create the + # database and run docker-entrypoint-initdb.d. The socket therefore + # answers "accepting connections" while no TCP listener exists at all, + # so compose marks this service healthy and depends_on: + # service_healthy releases customer360 straight into ECONNREFUSED. + # + # Short but real: ~235ms with no initdb.d scripts, and 1.2s of + # false-healthy plus a 2.7s shutdown checkpoint in the CI failure this + # was diagnosed from. Only bites on a fresh volume -- a populated one + # skips the temporary server entirely, which is why it failed rarely. + test: ["CMD", "pg_isready", "-h", "127.0.0.1", "-U", "customer360", "-d", "customer360"] + interval: 5s + timeout: 3s + retries: 10 + + customer360: + build: . + container_name: customer360 + image: customer360:local + depends_on: + postgres: + condition: service_healthy + env_file: + - .env + environment: + SPRING_PROFILES_ACTIVE: default + SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/customer360 + SPRING_DATASOURCE_USERNAME: customer360 + SPRING_DATASOURCE_PASSWORD: customer360 + ports: + - "8080:8080" + restart: unless-stopped + +volumes: + pgdata: diff --git a/sap-demo-java/k8s/configmap.yaml b/sap-demo-java/k8s/configmap.yaml new file mode 100644 index 00000000..d85f516f --- /dev/null +++ b/sap-demo-java/k8s/configmap.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: customer360-config + namespace: sap-demo + labels: + app.kubernetes.io/name: customer360 + app.kubernetes.io/component: integration-service +data: + # Non-secret runtime config. Override per-environment. + SPRING_PROFILES_ACTIVE: "kubernetes" + SAP_API_BASE_URL: "https://sandbox.api.sap.com/s4hanacloud" + SERVER_PORT: "8080" + JAVA_OPTS: "-XX:MaxRAMPercentage=75 -XX:+ExitOnOutOfMemoryError" diff --git a/sap-demo-java/k8s/deployment.yaml b/sap-demo-java/k8s/deployment.yaml new file mode 100644 index 00000000..d265237c --- /dev/null +++ b/sap-demo-java/k8s/deployment.yaml @@ -0,0 +1,113 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: customer360 + namespace: sap-demo + labels: + app.kubernetes.io/name: customer360 + app.kubernetes.io/component: integration-service + app.kubernetes.io/part-of: customer360 + app.kubernetes.io/version: "1.0.0" +spec: + replicas: 1 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 + selector: + matchLabels: + app.kubernetes.io/name: customer360 + template: + metadata: + labels: + app.kubernetes.io/name: customer360 + app.kubernetes.io/component: integration-service + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "8080" + prometheus.io/path: "/actuator/prometheus" + # Marker read by Keploy k8s-proxy when live-recording is enabled. + keploy.io/record: "enabled" + spec: + terminationGracePeriodSeconds: 30 + initContainers: + # Wait for Postgres to accept connections before the Spring app starts. + # Avoids a noisy Flyway/DataSource retry loop in the main container. + - name: wait-for-postgres + image: postgres:15-alpine + imagePullPolicy: IfNotPresent + command: + - sh + - -c + - | + echo "waiting for postgres.sap-demo.svc.cluster.local:5432" + until pg_isready -h postgres -p 5432 -U customer360 -d customer360 >/dev/null 2>&1; do + sleep 2 + done + echo "postgres ready" + containers: + - name: customer360 + image: customer360:local + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: 8080 + protocol: TCP + envFrom: + - configMapRef: + name: customer360-config + - secretRef: + name: customer360-secrets + env: + - name: SPRING_DATASOURCE_URL + value: jdbc:postgresql://postgres.sap-demo.svc.cluster.local:5432/customer360 + - name: SPRING_DATASOURCE_USERNAME + valueFrom: + secretKeyRef: + name: customer360-db + key: POSTGRES_USER + - name: SPRING_DATASOURCE_PASSWORD + valueFrom: + secretKeyRef: + name: customer360-db + key: POSTGRES_PASSWORD + resources: + requests: + cpu: "200m" + memory: "384Mi" + limits: + cpu: "1000m" + memory: "768Mi" + startupProbe: + httpGet: + path: /actuator/health/liveness + port: http + periodSeconds: 3 + failureThreshold: 40 + livenessProbe: + httpGet: + path: /actuator/health/liveness + port: http + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /actuator/health/readiness + port: http + periodSeconds: 5 + failureThreshold: 3 + securityContext: + runAsNonRoot: true + runAsUser: 1001 + runAsGroup: 1001 + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + capabilities: + drop: ["ALL"] + volumeMounts: + - name: tmp + mountPath: /tmp + volumes: + - name: tmp + emptyDir: {} diff --git a/sap-demo-java/k8s/ingress.yaml b/sap-demo-java/k8s/ingress.yaml new file mode 100644 index 00000000..1e21b2fd --- /dev/null +++ b/sap-demo-java/k8s/ingress.yaml @@ -0,0 +1,42 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: customer360 + namespace: sap-demo + labels: + app.kubernetes.io/name: customer360 + annotations: + # Send the upstream request with the original Host header so Spring + # Boot's forward-headers-strategy sees the correct X-Forwarded-Host. + nginx.ingress.kubernetes.io/upstream-vhost: "$host" +spec: + # Use the ingress-nginx class by default. ingress-nginx is installed + # automatically by deploy_kind.sh when the target cluster has no + # IngressClass yet. + ingressClassName: nginx + rules: + # localtest.me is a public DNS record that resolves *.localtest.me to + # 127.0.0.1. No /etc/hosts editing required — just + # curl http://customer360.localtest.me/actuator/health + - host: customer360.localtest.me + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: customer360 + port: + number: 8080 + # Fallback: plain localhost also works, for scripts / smoke tests that + # don't care about Host headers. + - host: localhost + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: customer360 + port: + number: 8080 diff --git a/sap-demo-java/k8s/namespace.yaml b/sap-demo-java/k8s/namespace.yaml new file mode 100644 index 00000000..1a4f2692 --- /dev/null +++ b/sap-demo-java/k8s/namespace.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: sap-demo + labels: + app.kubernetes.io/part-of: customer360 + # Marker for Keploy's k8s-proxy: treat this namespace as a candidate for + # sidecar injection / live recording. Ignored if k8s-proxy isn't installed. + keploy.io/enabled: "true" diff --git a/sap-demo-java/k8s/postgres.yaml b/sap-demo-java/k8s/postgres.yaml new file mode 100644 index 00000000..ca69cf66 --- /dev/null +++ b/sap-demo-java/k8s/postgres.yaml @@ -0,0 +1,117 @@ +# Postgres 16 for the Customer 360 local store (tags, notes, audit). +# +# Kept in a single file for demo-legibility: Secret + Service + Deployment. +# emptyDir volume (not PVC) — fresh DB on every pod restart, which is fine +# for demo/recording purposes and eliminates PVC provisioner complexity. +# +# For a production deployment this should be a managed Postgres (AWS RDS, +# Azure DB for Postgres, SAP HANA Cloud, etc.) or at minimum a StatefulSet +# with a real PVC. +--- +apiVersion: v1 +kind: Secret +metadata: + name: customer360-db + namespace: sap-demo + labels: + app.kubernetes.io/name: customer360 + app.kubernetes.io/component: database +type: Opaque +stringData: + POSTGRES_DB: customer360 + POSTGRES_USER: customer360 + POSTGRES_PASSWORD: customer360 +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres + namespace: sap-demo + labels: + app.kubernetes.io/name: postgres + app.kubernetes.io/component: database +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: postgres + ports: + - name: postgres + port: 5432 + targetPort: postgres + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres + namespace: sap-demo + labels: + app.kubernetes.io/name: postgres + app.kubernetes.io/component: database +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: postgres + template: + metadata: + labels: + app.kubernetes.io/name: postgres + app.kubernetes.io/component: database + annotations: + # Tell Keploy's k8s-proxy that this pod produces recordable + # Postgres wire-protocol traffic from the customer360 pod. + keploy.io/capture: "postgres" + spec: + terminationGracePeriodSeconds: 15 + containers: + - name: postgres + image: postgres:16-alpine + imagePullPolicy: IfNotPresent + ports: + - name: postgres + containerPort: 5432 + protocol: TCP + envFrom: + - secretRef: + name: customer360-db + env: + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "500m" + memory: "256Mi" + readinessProbe: + # Readiness means "can serve clients", so probe over TCP. + # Without -h, pg_isready uses the Unix socket, which the + # temporary post-initdb server (listen_addresses='') already + # answers -- marking the pod Ready while no TCP listener exists + # and letting dependents connect to a refused port. + exec: + command: ["pg_isready", "-h", "127.0.0.1", "-U", "customer360", "-d", "customer360"] + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 5 + livenessProbe: + # Deliberately the socket probe, unlike readiness above: liveness + # asks "is the process alive", and a failure restarts the pod. A + # TCP probe here would restart-loop a pod whose initdb outruns + # initialDelaySeconds + failureThreshold * periodSeconds. + exec: + command: ["pg_isready", "-U", "customer360", "-d", "customer360"] + initialDelaySeconds: 15 + periodSeconds: 15 + timeoutSeconds: 3 + failureThreshold: 4 + volumeMounts: + - name: data + mountPath: /var/lib/postgresql/data + volumes: + - name: data + emptyDir: {} diff --git a/sap-demo-java/k8s/secret.yaml.example b/sap-demo-java/k8s/secret.yaml.example new file mode 100644 index 00000000..7351bd4c --- /dev/null +++ b/sap-demo-java/k8s/secret.yaml.example @@ -0,0 +1,23 @@ +# Copy to secret.yaml and fill in SAP_API_KEY before applying. +# secret.yaml is gitignored; this example file is not. +# +# cp k8s/secret.yaml.example k8s/secret.yaml +# # edit SAP_API_KEY below, then: +# kubectl apply -f k8s/secret.yaml +# +apiVersion: v1 +kind: Secret +metadata: + name: customer360-secrets + namespace: sap-demo + labels: + app.kubernetes.io/name: customer360 +type: Opaque +stringData: + # SAP Business Accelerator Hub sandbox API key. + # Get a free one at https://api.sap.com → any API → "Show API Key". + SAP_API_KEY: "" + + # Optional — only needed when pointing at a real BTP tenant that uses + # OAuth2 xsuaa bearer tokens. For the sandbox this stays empty. + SAP_BEARER_TOKEN: "" diff --git a/sap-demo-java/k8s/service.yaml b/sap-demo-java/k8s/service.yaml new file mode 100644 index 00000000..16fdf69c --- /dev/null +++ b/sap-demo-java/k8s/service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: customer360 + namespace: sap-demo + labels: + app.kubernetes.io/name: customer360 +spec: + type: NodePort + selector: + app.kubernetes.io/name: customer360 + ports: + - name: http + protocol: TCP + port: 8080 + targetPort: http + # The kind cluster (kind-config.yaml) exposes 30080 to the host. + # http://localhost:30080 → this Service → the pod. + nodePort: 30080 diff --git a/sap-demo-java/keploy.yml b/sap-demo-java/keploy.yml new file mode 100755 index 00000000..38a6365d --- /dev/null +++ b/sap-demo-java/keploy.yml @@ -0,0 +1,122 @@ +# Generated by Keploy (3-dev) +path: "" +appName: sap_demo_java +appId: 0 +command: java -jar target/customer360.jar +templatize: + testSets: [] +port: 0 +e2e: false +dnsPort: 26789 +proxyPort: 16789 +incomingProxyPort: 36789 +debug: false +disableTele: false +disableANSI: false +jsonOutput: false +containerName: "" +networkName: "" +buildDelay: 30 +test: + selectedTests: {} + globalNoise: + global: + header.X-Correlation-Id: [] + body.correlationId: [] + body.timestamp: [] + body.installedOn: [] + body.id: [] + # /actuator/health Spring Boot DataSourceHealthIndicator can + # flip between UP and DOWN depending on Hikari pool warmup + # state at the instant of the probe; the actual DB + # connectivity is already proven by every downstream test + # that hits the persistence layer successfully. + body.status: [] + test-sets: {} + replaceWith: + global: + url: {} + port: {} + test-sets: {} + delay: 5 + host: localhost + port: 0 + grpcPort: 0 + ssePort: 0 + protocol: + grpc: + port: 0 + http: + port: 0 + sse: + port: 0 + apiTimeout: 5 + skipCoverage: false + coverageReportPath: "" + ignoreOrdering: true + mongoPassword: default@123 + language: "" + removeUnusedMocks: false + preserveFailedMocks: false + fallBackOnMiss: false + jacocoAgentPath: "" + basePath: "" + mocking: true + ignoredTests: {} + disableLineCoverage: false + disableMockUpload: true + useLocalMock: false + updateTemplate: false + mustPass: false + maxFailAttempts: 5 + maxFlakyChecks: 1 + protoFile: "" + protoDir: "" + protoInclude: [] + compareAll: false + schemaMatch: false + updateTestMapping: false + disableAutoHeaderNoise: false + strictMockWindow: true +record: + filters: [] + basePath: "" + recordTimer: 0s + metadata: "" + sync: false + enableSampling: 0 + memoryLimit: 0 + globalPassthrough: false + tlsPrivateKeyPath: "" + mockFormat: yaml +report: + selectedTestSets: {} + showFullBody: false + reportPath: "" + summary: false + testCaseIDs: [] + format: "" +disableMapping: true +retryPassing: false +configPath: "" +bypassRules: [] +generateGithubActions: false +keployContainer: keploy-v3 +keployNetwork: keploy-network +cmdType: native +contract: + services: [] + tests: [] + path: "" + download: false + generate: false + driven: consumer + mappings: + servicesMapping: {} + self: s1 +inCi: false +serverPort: 0 +mockDownload: + registryIds: [] + +# Visit [https://keploy.io/docs/running-keploy/configuration-file/] to learn about using keploy through configuration file. diff --git a/sap-demo-java/kind-config.yaml b/sap-demo-java/kind-config.yaml new file mode 100644 index 00000000..de1ff262 --- /dev/null +++ b/sap-demo-java/kind-config.yaml @@ -0,0 +1,22 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: +- role: control-plane + kubeadmConfigPatches: + - | + kind: InitConfiguration + nodeRegistration: + kubeletExtraArgs: + node-labels: "ingress-ready=true" + extraPortMappings: + - containerPort: 80 + hostPort: 80 + protocol: TCP + - containerPort: 443 + hostPort: 443 + protocol: TCP + # The NodePort Service (k8s/service.yaml) binds 30080 on every node; this + # mapping makes http://localhost:30080 reach the single-node kind cluster. + - containerPort: 30080 + hostPort: 30080 + protocol: TCP \ No newline at end of file diff --git a/sap-demo-java/pom.xml b/sap-demo-java/pom.xml new file mode 100644 index 00000000..27cdeda1 --- /dev/null +++ b/sap-demo-java/pom.xml @@ -0,0 +1,143 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.3.4 + + + + com.keploy.sapdemo + customer360 + 1.0.0 + jar + SAP Customer 360 Service + + Spring Boot integration service that aggregates SAP Business Partner data from multiple + S/4HANA OData endpoints into a unified Customer 360 view, merged with locally stored + CRM tags and notes from Postgres. Used as a regression-testing sample for Keploy's SAP + fan-out handling and its HTTPS + Postgres parsers. + + + + 21 + 21 + 21 + UTF-8 + 2.2.0 + 2.6.0 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.apache.httpcomponents.client5 + httpclient5 + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-cache + + + com.github.ben-manes.caffeine + caffeine + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.postgresql + postgresql + runtime + + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-database-postgresql + + + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-registry-prometheus + + + + + io.github.resilience4j + resilience4j-spring-boot3 + ${resilience4j.version} + + + io.github.resilience4j + resilience4j-micrometer + ${resilience4j.version} + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + customer360 + + + org.springframework.boot + spring-boot-maven-plugin + + + true + + + + + + diff --git a/sap-demo-java/run_flow.sh b/sap-demo-java/run_flow.sh new file mode 100755 index 00000000..1c895401 --- /dev/null +++ b/sap-demo-java/run_flow.sh @@ -0,0 +1,276 @@ +#!/usr/bin/env bash +# run_flow.sh — drive the Customer 360 business flow against a deployed API. +# +# Each "iteration" plays a 20-call slice of realistic enterprise behaviour: +# KPI refresh → detail drill-downs → 360° composites → write operations +# (tags + notes) → cleanup → one negative validation test. 25 iterations +# = 500 inbound calls = roughly 1000+ outbound SAP/Postgres operations +# for Keploy to record at the wire level. +# +# Varies the customer ID across a small pool (11, 202, 203) to get +# diverse SAP responses, and generates unique tag names per call so +# writes always take the insert path (not the idempotent no-op path). +# +# Auto-detects the base URL; override with --host. +# +# Usage: +# ./run_flow.sh # default: 25 iterations → 500 calls +# ./run_flow.sh --iterations 50 # 50 iterations → 1000 calls +# ./run_flow.sh --host http://... # explicit URL +# ./run_flow.sh --trace # + tail correlated pod logs at end +# ./run_flow.sh --quiet # summary only +# ./run_flow.sh --iterations 1 --verbose # narrate every call in detail +# +# Exit code: 0 if all calls passed. Non-zero otherwise. + +set -euo pipefail + +cd "$(dirname "$0")" + +# --- colours ---------------------------------------------------------------- +BOLD='\033[1m'; DIM='\033[2m'; NC='\033[0m' +GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m' + +say() { [ "${QUIET:-0}" = 1 ] || printf "${BOLD}${GREEN}==>${NC} %s\n" "$*"; } +note() { [ "${QUIET:-0}" = 1 ] || printf "${DIM}%s${NC}\n" "$*"; } +warn() { printf "${BOLD}${YELLOW}!!${NC} %s\n" "$*"; } +fail() { printf "${BOLD}${RED}XX${NC} %s\n" "$*"; } + +# --- args ------------------------------------------------------------------- +HOST="" +ITERATIONS=25 +TRACE=0 +QUIET=0 +VERBOSE=0 +while [ $# -gt 0 ]; do + case "$1" in + --host) HOST="$2"; shift 2 ;; + --iterations) ITERATIONS="$2"; shift 2 ;; + --trace) TRACE=1; shift ;; + --quiet) QUIET=1; shift ;; + --verbose) VERBOSE=1; shift ;; + -h|--help) + sed -n '2,26p' "$0" | sed 's/^# \{0,1\}//' + exit 0 ;; + *) fail "unknown arg: $1"; exit 2 ;; + esac +done + +# --- URL auto-detect -------------------------------------------------------- +CANDIDATES=( + "${HOST:-}" + "http://customer360.localtest.me" + "http://localhost" + "http://localhost:30080" + "http://localhost:8080" +) +BASE="" +for u in "${CANDIDATES[@]}"; do + [ -z "$u" ] && continue + if curl -s -o /dev/null -m 3 -f "$u/actuator/health/liveness" 2>/dev/null; then + BASE="$u" + break + fi +done +if [ -z "$BASE" ]; then + fail "Customer 360 not reachable on any of:" + for u in "${CANDIDATES[@]}"; do [ -n "$u" ] && printf " %s\n" "$u"; done + fail "Is the deployment up? Try: sudo kubectl -n sap-demo get pods" + exit 1 +fi +say "target: ${BOLD}${BASE}${NC} iterations: ${ITERATIONS} expected calls: $((ITERATIONS * 20))" + +# --- per-run correlation prefix -------------------------------------------- +RUN_ID="flow-$(date +%Y%m%d-%H%M%S)-$$" + +# --- tracking state -------------------------------------------------------- +PASS_COUNT=0 +FAIL_COUNT=0 +FAIL_LAST="" +CALL_SEQ=0 +CNT_SAP=0 +CNT_DB=0 +CNT_MIXED=0 +CNT_WRITE=0 + +# Quiet call helper: no per-line output unless VERBOSE=1. Still counts. +# Args: category (SAP|DB|MIXED|WRITE), method, path, [extra curl args...] +# Optional trailing `-- EXPECT N` at the end to assert a specific HTTP code. +call() { + local category="$1" method="$2" path="$3"; shift 3 + local expect="" + # Extract optional "-- EXPECT N" from args + local filtered=() + while [ $# -gt 0 ]; do + if [ "$1" = "--" ] && [ "${2:-}" = "EXPECT" ] && [ -n "${3:-}" ]; then + expect="$3"; shift 3 + else + filtered+=("$1"); shift + fi + done + + local cid="${RUN_ID}-${CALL_SEQ}" + CALL_SEQ=$((CALL_SEQ + 1)) + + local status + if [ ${#filtered[@]} -gt 0 ]; then + status=$(curl -sS -m 90 -o /dev/null -w "%{http_code}" \ + -X "${method}" \ + -H "X-Correlation-ID: ${cid}" \ + "${filtered[@]}" \ + "${BASE}${path}" || echo "000") + else + status=$(curl -sS -m 90 -o /dev/null -w "%{http_code}" \ + -X "${method}" \ + -H "X-Correlation-ID: ${cid}" \ + "${BASE}${path}" || echo "000") + fi + + local pass=0 + if [ -n "${expect}" ]; then + [ "${status}" = "${expect}" ] && pass=1 + else + [[ "${status}" =~ ^2 ]] && pass=1 + fi + + if [ "${pass}" = 1 ]; then + PASS_COUNT=$((PASS_COUNT + 1)) + case "${category}" in + SAP) CNT_SAP=$((CNT_SAP + 1)) ;; + DB) CNT_DB=$((CNT_DB + 1)) ;; + MIXED) CNT_MIXED=$((CNT_MIXED + 1)) ;; + WRITE) CNT_WRITE=$((CNT_WRITE + 1)) ;; + esac + if [ "${VERBOSE}" = 1 ]; then + printf " ${GREEN}${status}${NC} %-5s %-42s ${DIM}[%s]${NC}\n" "${method}" "${path}" "${category}" + fi + else + FAIL_COUNT=$((FAIL_COUNT + 1)) + FAIL_LAST="${method} ${path} → got ${status}${expect:+ (expected ${expect})}" + printf " ${RED}${status}${NC} %-5s %-42s ${DIM}[%s]${NC} ${RED}FAIL${NC}\n" \ + "${method}" "${path}" "${category}" + fi +} + +# --- the per-iteration flow (20 calls) ------------------------------------- +# Breakdown: +# A tile-refresh block → 5 calls (2 DB-light health, 2 SAP, 1 DB-read) +# B detail drill-downs → 6 calls (2 SAP + 4 DB) +# C 360° composites → 3 calls (MIXED: each fires 3 SAP + 2 DB + 1 audit) +# D write operations → 4 calls (2 tag inserts + 2 note inserts, all WRITE) +# E cleanup + negative test → 2 calls (1 DELETE, 1 validation 400) +BP_POOL=(11 202 203) +run_once() { + local iter="$1" + local bp_a="${BP_POOL[$((iter % 3))]}" + local bp_b="${BP_POOL[$(((iter + 1) % 3))]}" + local bp_c="${BP_POOL[$(((iter + 2) % 3))]}" + + # Block A — platform/KPI refresh + call DB GET /actuator/health/liveness + call DB GET /actuator/health/readiness + call SAP GET /api/v1/customers/count + call SAP GET "/api/v1/customers?top=5" + call DB GET /api/v1/customers/recent-views + + # Block B — detail drill-downs + call SAP GET "/api/v1/customers/${bp_a}" + call SAP GET "/api/v1/customers/${bp_b}" + call DB GET "/api/v1/customers/${bp_a}/tags" + call DB GET "/api/v1/customers/${bp_b}/tags" + call DB GET "/api/v1/customers/${bp_a}/notes" + call DB GET "/api/v1/customers/${bp_b}/notes" + + # Block C — 360° (each: 3 SAP + 2 DB + 1 audit insert — the fan-out story) + call MIXED GET "/api/v1/customers/${bp_a}/360" + call MIXED GET "/api/v1/customers/${bp_b}/360" + call MIXED GET "/api/v1/customers/${bp_c}/360" + + # Block D — writes (unique tag/note per call so every INSERT takes) + local nonce="i${iter}-$(printf '%04x' $((RANDOM + CALL_SEQ)))" + call WRITE POST "/api/v1/customers/${bp_a}/tags" \ + -H "Content-Type: application/json" \ + -d "{\"tag\":\"demo-${nonce}\",\"createdBy\":\"flow\"}" + call WRITE POST "/api/v1/customers/${bp_b}/tags" \ + -H "Content-Type: application/json" \ + -d "{\"tag\":\"priority-${nonce}\",\"createdBy\":\"flow\"}" + call WRITE POST "/api/v1/customers/${bp_a}/notes" \ + -H "Content-Type: application/json" \ + -d "{\"body\":\"Iteration ${iter}: customer profile reviewed by flow harness\",\"author\":\"flow\"}" + call WRITE POST "/api/v1/customers/${bp_b}/notes" \ + -H "Content-Type: application/json" \ + -d "{\"body\":\"Iteration ${iter}: follow-up scheduled\",\"author\":\"flow\"}" + + # Block E — cleanup + negative validation + call WRITE DELETE "/api/v1/customers/${bp_a}/tags/demo-${nonce}" + call DB GET "/api/v1/customers/bad!!id/360" -- EXPECT 400 +} + +# --- main loop -------------------------------------------------------------- +START_TS=$(date +%s) +LAST_PROGRESS=0 +for i in $(seq 1 "${ITERATIONS}"); do + run_once "$i" + # Progress line every 5% or every 5 iterations, whichever is coarser. + local_mod=$(( ITERATIONS / 20 )) + [ "${local_mod}" -lt 1 ] && local_mod=1 + if [ $((i % local_mod)) = 0 ] || [ "$i" = "${ITERATIONS}" ]; then + if [ "${QUIET}" != 1 ]; then + printf "${DIM} [iter %3d/%d] calls=%-4d pass=%d fail=%d${NC}\n" \ + "$i" "${ITERATIONS}" "${CALL_SEQ}" "${PASS_COUNT}" "${FAIL_COUNT}" + fi + fi +done +END_TS=$(date +%s) + +# --- optional log tail ------------------------------------------------------ +if [ "${TRACE}" = 1 ]; then + say "trace: a sample of pod log lines tagged with run id ${RUN_ID} (first 60)" + if command -v kubectl >/dev/null; then + sudo kubectl -n sap-demo logs deploy/customer360 --tail=$((ITERATIONS * 100)) 2>/dev/null \ + | grep -F "${RUN_ID}" \ + | head -60 \ + | python3 -c " +import json,sys +for line in sys.stdin: + try: + d=json.loads(line) + logger=d.get('logger','').split('.')[-1] + print(f\" {d['ts']} {logger:<32} {d['msg'][:140]}\") + except Exception: pass" || true + else + warn "kubectl not on PATH — skipping log tail" + fi +fi + +# --- summary ---------------------------------------------------------------- +TOTAL=$((PASS_COUNT + FAIL_COUNT)) +WALL=$((END_TS - START_TS)) +[ "${WALL}" -le 0 ] && WALL=1 +RPS=$(awk -v t="${TOTAL}" -v w="${WALL}" 'BEGIN { printf "%.1f", t/w }') + +printf "\n${BOLD}───────────────────────────────────────────────────────────────${NC}\n" +printf "${BOLD} %s${NC}\n" "$(basename "${BASE}") — ${ITERATIONS} iterations in ${WALL}s (${RPS} req/s)" +printf "${BOLD}───────────────────────────────────────────────────────────────${NC}\n" +printf " SAP-backed reads %d\n" "${CNT_SAP}" +printf " Postgres-only reads %d\n" "${CNT_DB}" +printf " MIXED (SAP + DB fan-outs) %d ${DIM}(each ≈ 6 backend ops)${NC}\n" "${CNT_MIXED}" +printf " Writes (inserts/deletes) %d\n" "${CNT_WRITE}" +printf " ──────────────────────────────────────\n" +if [ "${FAIL_COUNT}" = 0 ]; then + printf " ${BOLD}${GREEN}PASS${NC} %d/%d calls ok\n" "${PASS_COUNT}" "${TOTAL}" + printf " ${DIM}run id: ${RUN_ID}${NC}\n" + printf "\n ${DIM}estimated backend operations captured by Keploy:${NC}\n" + # SAP: 1 HTTP each. DB: 1 Postgres query each. MIXED: ~6 (3 SAP + 2 DB + 1 INSERT). + # WRITE: 2 (1 INSERT + 1 audit INSERT). + BACKEND=$(( CNT_SAP + CNT_DB + (CNT_MIXED * 6) + (CNT_WRITE * 2) )) + printf " ${DIM} SAP HTTPS: ~%d Postgres: ~%d Total: ~%d${NC}\n" \ + "$(( CNT_SAP + (CNT_MIXED * 3) ))" \ + "$(( CNT_DB + (CNT_MIXED * 3) + (CNT_WRITE * 2) ))" \ + "${BACKEND}" + exit 0 +else + printf " ${BOLD}${RED}FAIL${NC} %d/%d calls failed\n" "${FAIL_COUNT}" "${TOTAL}" + printf " last error: %s\n" "${FAIL_LAST}" + exit 1 +fi diff --git a/sap-demo-java/simulate_fiori_flow.sh b/sap-demo-java/simulate_fiori_flow.sh new file mode 100755 index 00000000..5051bd3b --- /dev/null +++ b/sap-demo-java/simulate_fiori_flow.sh @@ -0,0 +1,127 @@ +#!/usr/bin/env bash +# simulate_fiori_flow.sh — narrated "UI drives Fiori; Keploy records the +# 3-way fan-out underneath" demo for the Customer 360 service. +# +# Run this while `keploy record` is recording the service in another terminal. +# Default target is the in-cluster service exposed at http://localhost:30080 +# (NodePort from kind). Override with --host for local runs. + +set -euo pipefail + +cd "$(dirname "$0")" + +HOST="${HOST:-http://localhost:30080}" +FAST=0 + +while [ $# -gt 0 ]; do + case "$1" in + --fast) FAST=1; shift ;; + --host) HOST="$2"; shift 2 ;; + -h|--help) + sed -n '2,9p' "$0" | sed 's/^# \{0,1\}//' + exit 0 + ;; + *) echo "unknown arg: $1"; exit 2 ;; + esac +done + +BOLD='\033[1m'; DIM='\033[2m'; GREEN='\033[0;32m'; BLUE='\033[0;34m' +YELLOW='\033[1;33m'; MAGENTA='\033[0;35m'; NC='\033[0m' + +pause() { [ "$FAST" = "1" ] || sleep "${1:-2}"; } +ui_step() { printf "\n${BOLD}${MAGENTA}[FIORI UI]${NC} %s\n" "$1"; pause 1; } +ui_click() { printf "${DIM} ↳ clicks:${NC} %s\n" "$1"; pause 1; } +backend() { printf "${BOLD}${BLUE}[KEPLOY ]${NC} ${DIM}%s${NC}\n" "$1"; } + +call() { + local label="$1"; shift + local status + status=$(curl -sw '%{http_code}' -o /tmp/simulate-body.json "$@" || echo "000") + local color="${GREEN}" + [[ "$status" =~ ^[45] ]] && color="${YELLOW}" + printf "${BOLD}${color}[HTTP ]${NC} %-48s %s\n" "$label" "$status" +} + +check_reachable() { + if ! curl -sf -o /dev/null "${HOST}/actuator/health" 2>/dev/null; then + printf "${BOLD}${YELLOW}service not reachable at ${HOST}${NC}\n" + printf "start it first:\n" + printf " ${DIM}./deploy_kind.sh${NC} (k8s mode)\n" + printf " ${DIM}./demo_script.sh record-local${NC} (local mode)\n" + exit 1 + fi +} + +banner() { + printf "\n${BOLD}" + printf "═══════════════════════════════════════════════════════════════════\n" + printf " Simulated Fiori-driven flow: 'Customer 360 in Sales Cockpit'\n" + printf " Keploy records every outbound SAP OData call in parallel.\n" + printf " Target: ${HOST}\n" + printf "═══════════════════════════════════════════════════════════════════${NC}\n" +} + +check_reachable +banner +pause 2 + +# ───────────────────────────────────────────────────────────────────────────── +ui_step "Opening Sales Cockpit → clicking 'Customers' tile" +ui_click "Customers launchpad tile" +backend "Tile click fans out: list query + KPI count" +call "GET /api/v1/customers/count (KPI tile)" "${HOST}/api/v1/customers/count" +pause 2 +call "GET /api/v1/customers?top=5 (list grid)" "${HOST}/api/v1/customers?top=5" +pause 2 + +# ───────────────────────────────────────────────────────────────────────────── +ui_step "On the customer list, opening row BP=11" +ui_click "Row BusinessPartner=11" +backend "Detail fetch — single SAP OData GET" +call "GET /api/v1/customers/11 (detail)" "${HOST}/api/v1/customers/11" +pause 2 + +# ───────────────────────────────────────────────────────────────────────────── +ui_step "User clicks '360° view' on BP=202 — this is the fan-out moment" +ui_click "360° view button" +backend "ONE inbound → THREE parallel SAP OData calls:" +backend " • /A_BusinessPartner('202')" +backend " • /A_BusinessPartner('202')/to_BusinessPartnerAddress" +backend " • /A_BusinessPartner('202')/to_BusinessPartnerRole" +backend "UI tests assert on the surface. Keploy captures all three on the wire." +call "GET /api/v1/customers/202/360 (360 fan-out)" "${HOST}/api/v1/customers/202/360" +pause 3 + +# ───────────────────────────────────────────────────────────────────────────── +ui_step "Drilling into a second customer — BP=11 360" +ui_click "Back → select BP=11 → 360° view" +call "GET /api/v1/customers/11/360 (360 fan-out)" "${HOST}/api/v1/customers/11/360" +pause 2 + +# ───────────────────────────────────────────────────────────────────────────── +printf "\n${BOLD}${GREEN}" +printf "═══════════════════════════════════════════════════════════════════\n" +printf " Fiori flow complete. What happened in two panes:\n" +printf "═══════════════════════════════════════════════════════════════════${NC}\n\n" + +cat <<'EOF' + ┌─────────────────────────────┬─────────────────────────────────────────┐ + │ UI LAYER (this terminal) │ KEPLOY (other terminal) │ + ├─────────────────────────────┼─────────────────────────────────────────┤ + │ • 5 Fiori interactions │ • 5 inbound HTTP test cases captured │ + │ • Asserted on UI state │ • ~11 outbound SAP OData mocks │ + │ • Zero backend visibility │ (2× 360 fan-out = 6 mocks alone) │ + │ │ • Full vertical slice: UI click→DB row │ + └─────────────────────────────┴─────────────────────────────────────────┘ + + One UI flow, two coverage layers. UI suites own the surface. Keploy owns + the plumbing they could not see before — especially the hidden parallel + fan-out behind the 360° tile. + + Stop Keploy in its terminal, then: + ./demo_script.sh offline-test (local mode) + + to replay the same flow with SAP blackholed in /etc/hosts. +EOF + +printf "\n" diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/Customer360Application.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/Customer360Application.java new file mode 100644 index 00000000..902a6e1e --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/Customer360Application.java @@ -0,0 +1,49 @@ +package com.keploy.sapdemo.customer360; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Contact; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; +import io.swagger.v3.oas.annotations.servers.Server; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * Entry point for the SAP Customer 360 aggregator service. + * + * This service sits between downstream consumers (CRM, partner portals, + * analytics pipelines) and SAP S/4HANA's Business Partner OData APIs. A single + * inbound request for a "customer 360 view" triggers parallel fan-out calls to + * three SAP endpoints — the partner master record, associated addresses, and + * assigned roles — aggregated into a flat response. + * + * In a typical RISE with SAP landscape this would run as a BTP extension + * (Cloud Foundry or Kyma/Kubernetes). It's the kind of service teams + * regression-test end-to-end after every S/4HANA quarterly update, and the + * workload Keploy uses to validate its SAP fan-out handling (parallel + * outbound TLS + keep-alive + chunked responses) alongside its Postgres + * parser. + */ +@SpringBootApplication +@EnableAsync +@EnableCaching +@OpenAPIDefinition( + info = @Info( + title = "SAP Customer 360 Service", + version = "1.0.0", + description = "Aggregates SAP Business Partner master data, addresses, and roles into a unified view.", + contact = @Contact(name = "Integration Platform Team", email = "integration@example.com"), + license = @License(name = "Internal — Reference Implementation") + ), + servers = { + @Server(url = "/", description = "In-cluster / local") + } +) +public class Customer360Application { + + public static void main(String[] args) { + SpringApplication.run(Customer360Application.class, args); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/config/SapClientConfig.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/config/SapClientConfig.java new file mode 100644 index 00000000..490d4104 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/config/SapClientConfig.java @@ -0,0 +1,133 @@ +package com.keploy.sapdemo.customer360.config; + +import com.keploy.sapdemo.customer360.sap.CorrelationIdInterceptor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.client.RestTemplate; + +import java.io.IOException; +import java.time.Duration; +import java.util.concurrent.Executor; + +/** + * Configures the {@link RestTemplate} used for all outbound calls to the SAP + * S/4HANA Business Partner OData service. + * + *

Two interceptors are attached: + *

    + *
  1. SapAuthInterceptor — stamps the required {@code APIKey} header + * (sandbox) or {@code Authorization: Bearer} (production tenant).
  2. + *
  3. CorrelationIdInterceptor — propagates the inbound request's + * correlation id into the outbound SAP call so traces chain across + * the hop.
  4. + *
+ * + *

An {@link Executor} bean is also exposed for the + * {@link com.keploy.sapdemo.customer360.service.Customer360AggregatorService} + * fan-out pattern. The three SAP OData calls run in parallel; the pool is + * intentionally small to avoid overwhelming the SAP API manager during + * regression test runs. + */ +@Configuration +@EnableAsync +public class SapClientConfig { + + private static final Logger log = LoggerFactory.getLogger(SapClientConfig.class); + + @Value("${sap.api.base-url}") + private String baseUrl; + + @Value("${sap.api.key:}") + private String apiKey; + + @Value("${sap.api.bearer-token:}") + private String bearerToken; + + @Value("${sap.api.connect-timeout-seconds:10}") + private int connectTimeoutSeconds; + + @Value("${sap.api.read-timeout-seconds:30}") + private int readTimeoutSeconds; + + @Bean + public RestTemplate sapRestTemplate(RestTemplateBuilder builder) { + log.info("Configuring SAP RestTemplate: baseUrl={}, connectTimeout={}s, readTimeout={}s, authMode={}", + baseUrl, connectTimeoutSeconds, readTimeoutSeconds, + !bearerToken.isBlank() ? "bearer" : !apiKey.isBlank() ? "apikey" : "NONE"); + + if (apiKey.isBlank() && bearerToken.isBlank()) { + log.warn("No SAP credentials configured (SAP_API_KEY / SAP_BEARER_TOKEN both empty). " + + "Outbound SAP calls will fail with 401."); + } + + // Spring Boot auto-selects HttpClient5 when httpclient5 is on the + // classpath (see pom.xml). Setting connect+read timeouts via the + // RestTemplateBuilder plumbs them through to the underlying + // HttpClient5 RequestConfig (connect) and SocketConfig (soTimeout == + // read timeout), which is the only API surface that still exists in + // Spring 6 — HttpComponentsClientHttpRequestFactory.setReadTimeout + // was removed with the HttpClient5 migration. + return builder + .rootUri(baseUrl) + .setConnectTimeout(Duration.ofSeconds(connectTimeoutSeconds)) + .setReadTimeout(Duration.ofSeconds(readTimeoutSeconds)) + .additionalInterceptors( + new SapAuthInterceptor(apiKey, bearerToken), + new CorrelationIdInterceptor() + ) + .build(); + } + + @Bean(name = "sapCallExecutor") + public Executor sapCallExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(4); + executor.setMaxPoolSize(8); + executor.setQueueCapacity(32); + executor.setThreadNamePrefix("sap-call-"); + executor.setAllowCoreThreadTimeOut(true); + executor.initialize(); + return executor; + } + + /** + * Adds {@code APIKey} (sandbox) or {@code Authorization: Bearer} (production) + * plus a standard {@code Accept: application/json} on every outbound call. + */ + static final class SapAuthInterceptor implements ClientHttpRequestInterceptor { + private final String apiKey; + private final String bearerToken; + + SapAuthInterceptor(String apiKey, String bearerToken) { + this.apiKey = apiKey; + this.bearerToken = bearerToken; + } + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, + ClientHttpRequestExecution execution) throws IOException { + HttpHeaders headers = request.getHeaders(); + if (!bearerToken.isBlank()) { + headers.set(HttpHeaders.AUTHORIZATION, "Bearer " + bearerToken); + } else if (!apiKey.isBlank()) { + headers.set("APIKey", apiKey); + } + if (!headers.containsKey(HttpHeaders.ACCEPT)) { + headers.set(HttpHeaders.ACCEPT, "application/json"); + } + return execution.execute(request, body); + } + } + +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartner.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartner.java new file mode 100644 index 00000000..d9f75c38 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartner.java @@ -0,0 +1,99 @@ +package com.keploy.sapdemo.customer360.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Maps a subset of SAP's {@code A_BusinessPartner} entity. + * + *

SAP returns ~80 fields on this entity; we project only the ones this + * service consumes. {@link JsonIgnoreProperties} is intentionally set to + * {@code ignoreUnknown = true} so a downstream addition of a new field by + * SAP doesn't break this client — but a removal or rename + * of a consumed field will surface as a missing value during + * {@code keploy test}, which is exactly the contract-drift signal teams + * need after quarterly S/4HANA updates. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class BusinessPartner { + + @JsonProperty("BusinessPartner") + private String businessPartner; + + @JsonProperty("BusinessPartnerCategory") + private String category; + + @JsonProperty("BusinessPartnerFullName") + private String fullName; + + @JsonProperty("BusinessPartnerGrouping") + private String grouping; + + @JsonProperty("FirstName") + private String firstName; + + @JsonProperty("LastName") + private String lastName; + + @JsonProperty("OrganizationBPName1") + private String organizationName; + + @JsonProperty("CreatedByUser") + private String createdBy; + + @JsonProperty("CreationDate") + private String createdDate; + + @JsonProperty("LastChangedByUser") + private String lastChangedBy; + + @JsonProperty("LastChangeDate") + private String lastChangeDate; + + @JsonProperty("BusinessPartnerIsBlocked") + private Boolean blocked; + + @JsonProperty("ETag") + private String etag; + + // ---- accessors --------------------------------------------------------- + + public String getBusinessPartner() { return businessPartner; } + public void setBusinessPartner(String v) { this.businessPartner = v; } + + public String getCategory() { return category; } + public void setCategory(String v) { this.category = v; } + + public String getFullName() { return fullName; } + public void setFullName(String v) { this.fullName = v; } + + public String getGrouping() { return grouping; } + public void setGrouping(String v) { this.grouping = v; } + + public String getFirstName() { return firstName; } + public void setFirstName(String v) { this.firstName = v; } + + public String getLastName() { return lastName; } + public void setLastName(String v) { this.lastName = v; } + + public String getOrganizationName() { return organizationName; } + public void setOrganizationName(String v) { this.organizationName = v; } + + public String getCreatedBy() { return createdBy; } + public void setCreatedBy(String v) { this.createdBy = v; } + + public String getCreatedDate() { return createdDate; } + public void setCreatedDate(String v) { this.createdDate = v; } + + public String getLastChangedBy() { return lastChangedBy; } + public void setLastChangedBy(String v) { this.lastChangedBy = v; } + + public String getLastChangeDate() { return lastChangeDate; } + public void setLastChangeDate(String v) { this.lastChangeDate = v; } + + public Boolean getBlocked() { return blocked; } + public void setBlocked(Boolean v) { this.blocked = v; } + + public String getEtag() { return etag; } + public void setEtag(String v) { this.etag = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartnerAddress.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartnerAddress.java new file mode 100644 index 00000000..be4d4b18 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartnerAddress.java @@ -0,0 +1,75 @@ +package com.keploy.sapdemo.customer360.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Subset of SAP's {@code A_BusinessPartnerAddress} entity used by the 360 view. + * One business partner typically has 1..N addresses (billing, shipping, + * registered office, etc.) keyed by {@code AddressID}. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class BusinessPartnerAddress { + + @JsonProperty("BusinessPartner") + private String businessPartner; + + @JsonProperty("AddressID") + private String addressId; + + @JsonProperty("ValidityStartDate") + private String validFrom; + + @JsonProperty("ValidityEndDate") + private String validTo; + + @JsonProperty("StreetName") + private String street; + + @JsonProperty("HouseNumber") + private String houseNumber; + + @JsonProperty("CityName") + private String city; + + @JsonProperty("PostalCode") + private String postalCode; + + @JsonProperty("Country") + private String country; + + @JsonProperty("Region") + private String region; + + // ---- accessors --------------------------------------------------------- + + public String getBusinessPartner() { return businessPartner; } + public void setBusinessPartner(String v) { this.businessPartner = v; } + + public String getAddressId() { return addressId; } + public void setAddressId(String v) { this.addressId = v; } + + public String getValidFrom() { return validFrom; } + public void setValidFrom(String v) { this.validFrom = v; } + + public String getValidTo() { return validTo; } + public void setValidTo(String v) { this.validTo = v; } + + public String getStreet() { return street; } + public void setStreet(String v) { this.street = v; } + + public String getHouseNumber() { return houseNumber; } + public void setHouseNumber(String v) { this.houseNumber = v; } + + public String getCity() { return city; } + public void setCity(String v) { this.city = v; } + + public String getPostalCode() { return postalCode; } + public void setPostalCode(String v) { this.postalCode = v; } + + public String getCountry() { return country; } + public void setCountry(String v) { this.country = v; } + + public String getRegion() { return region; } + public void setRegion(String v) { this.region = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartnerRole.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartnerRole.java new file mode 100644 index 00000000..a8d5cd78 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/BusinessPartnerRole.java @@ -0,0 +1,38 @@ +package com.keploy.sapdemo.customer360.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Subset of SAP's {@code A_BusinessPartnerRole}. A business partner can act + * in several roles (customer {@code FLCU00}, supplier {@code FLVN00}, etc.) + * simultaneously; this is the classic "one master record, many roles" + * pattern at the heart of SAP master data. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class BusinessPartnerRole { + + @JsonProperty("BusinessPartner") + private String businessPartner; + + @JsonProperty("BusinessPartnerRole") + private String roleCode; + + @JsonProperty("ValidFrom") + private String validFrom; + + @JsonProperty("ValidTo") + private String validTo; + + public String getBusinessPartner() { return businessPartner; } + public void setBusinessPartner(String v) { this.businessPartner = v; } + + public String getRoleCode() { return roleCode; } + public void setRoleCode(String v) { this.roleCode = v; } + + public String getValidFrom() { return validFrom; } + public void setValidFrom(String v) { this.validFrom = v; } + + public String getValidTo() { return validTo; } + public void setValidTo(String v) { this.validTo = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/Customer360View.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/Customer360View.java new file mode 100644 index 00000000..6b43b8bf --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/Customer360View.java @@ -0,0 +1,64 @@ +package com.keploy.sapdemo.customer360.model; + +import com.keploy.sapdemo.customer360.persistence.CustomerNote; +import com.keploy.sapdemo.customer360.persistence.CustomerTag; + +import java.time.Instant; +import java.util.List; + +/** + * The aggregated "Customer 360" response returned to downstream consumers. + * + *

Produced by + * {@link com.keploy.sapdemo.customer360.service.Customer360AggregatorService} + * from three parallel SAP OData calls + two parallel Postgres queries + + * one audit INSERT. This composite shape is the kind of payload + * downstream CRM / portal / analytics pipelines consume in typical RISE + * with SAP BTP landscapes. + */ +public class Customer360View { + + private String customerId; + private BusinessPartner partner; + private List addresses; + private List roles; + private List tags; + private List notes; + private Instant aggregatedAt; + private String correlationId; + private String dataSource; + private Integer elapsedMs; + + public Customer360View() { + } + + public String getCustomerId() { return customerId; } + public void setCustomerId(String v) { this.customerId = v; } + + public BusinessPartner getPartner() { return partner; } + public void setPartner(BusinessPartner v) { this.partner = v; } + + public List getAddresses() { return addresses; } + public void setAddresses(List v) { this.addresses = v; } + + public List getRoles() { return roles; } + public void setRoles(List v) { this.roles = v; } + + public List getTags() { return tags; } + public void setTags(List v) { this.tags = v; } + + public List getNotes() { return notes; } + public void setNotes(List v) { this.notes = v; } + + public Integer getElapsedMs() { return elapsedMs; } + public void setElapsedMs(Integer v) { this.elapsedMs = v; } + + public Instant getAggregatedAt() { return aggregatedAt; } + public void setAggregatedAt(Instant v) { this.aggregatedAt = v; } + + public String getCorrelationId() { return correlationId; } + public void setCorrelationId(String v) { this.correlationId = v; } + + public String getDataSource() { return dataSource; } + public void setDataSource(String v) { this.dataSource = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/CustomerSummary.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/CustomerSummary.java new file mode 100644 index 00000000..1c39a52a --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/CustomerSummary.java @@ -0,0 +1,52 @@ +package com.keploy.sapdemo.customer360.model; + +/** + * Flat, list-friendly projection of a {@link BusinessPartner} for the + * {@code GET /api/v1/customers} paged list endpoint. Keeps payloads small + * for UI tables that only need an at-a-glance view. + */ +public class CustomerSummary { + + private String id; + private String name; + private String category; + private boolean blocked; + + public CustomerSummary() { + } + + public CustomerSummary(String id, String name, String category, boolean blocked) { + this.id = id; + this.name = name; + this.category = category; + this.blocked = blocked; + } + + public static CustomerSummary from(BusinessPartner bp) { + String displayName = bp.getFullName(); + if (displayName == null || displayName.isBlank()) { + displayName = bp.getOrganizationName(); + } + if (displayName == null || displayName.isBlank()) { + displayName = (bp.getFirstName() + " " + bp.getLastName()).trim(); + } + return new CustomerSummary( + bp.getBusinessPartner(), + displayName, + bp.getCategory(), + Boolean.TRUE.equals(bp.getBlocked()) + ); + } + + public String getId() { return id; } + public void setId(String v) { this.id = v; } + + public String getName() { return name; } + public void setName(String v) { this.name = v; } + + public String getCategory() { return category; } + public void setCategory(String v) { this.category = v; } + + public boolean isBlocked() { return blocked; } + public void setBlocked(boolean v) { this.blocked = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/NoteRequest.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/NoteRequest.java new file mode 100644 index 00000000..5fbb8f1f --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/NoteRequest.java @@ -0,0 +1,24 @@ +package com.keploy.sapdemo.customer360.model; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +/** + * Request body for {@code POST /api/v1/customers/{id}/notes}. + */ +public class NoteRequest { + + @NotBlank + @Size(min = 1, max = 2000) + private String body; + + private String author; + + public NoteRequest() {} + + public String getBody() { return body; } + public void setBody(String v) { this.body = v; } + + public String getAuthor() { return author; } + public void setAuthor(String v) { this.author = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ODataCollectionResponse.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ODataCollectionResponse.java new file mode 100644 index 00000000..27be047b --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ODataCollectionResponse.java @@ -0,0 +1,75 @@ +package com.keploy.sapdemo.customer360.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +/** + * Envelope for an SAP OData v2 collection response: + * + *

+ * {
+ *   "d": {
+ *     "results": [ { ... }, { ... } ],
+ *     "__count": "42",
+ *     "__next": "...pagination link..."
+ *   }
+ * }
+ * 
+ */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ODataCollectionResponse { + + @JsonProperty("d") + private Data data; + + public Data getData() { + return data; + } + + public void setData(Data data) { + this.data = data; + } + + public List getResults() { + return data == null ? List.of() : data.getResults(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Data { + + @JsonProperty("results") + private List results; + + @JsonProperty("__count") + private String count; + + @JsonProperty("__next") + private String nextLink; + + public List getResults() { + return results == null ? List.of() : results; + } + + public void setResults(List results) { + this.results = results; + } + + public String getCount() { + return count; + } + + public void setCount(String count) { + this.count = count; + } + + public String getNextLink() { + return nextLink; + } + + public void setNextLink(String nextLink) { + this.nextLink = nextLink; + } + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ODataEntityResponse.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ODataEntityResponse.java new file mode 100644 index 00000000..7d74baa7 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ODataEntityResponse.java @@ -0,0 +1,35 @@ +package com.keploy.sapdemo.customer360.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Generic envelope for an SAP OData v2 single-entity response: + * + *
+ * { "d": { ...entity fields... } }
+ * 
+ * + * The {@code d} wrapper is SAP's OData v2 convention. OData v4 drops it and + * returns the entity at the root — when this service is migrated to v4 APIs + * (e.g., {@code /API_BUSINESS_PARTNER_SRV/A_BusinessPartner('11')} in + * S/4HANA Cloud), this envelope goes away. That shift is the exact kind of + * change migration teams have to regression-test. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ODataEntityResponse { + + @JsonProperty("d") + private T entity; + + public ODataEntityResponse() { + } + + public T getEntity() { + return entity; + } + + public void setEntity(T entity) { + this.entity = entity; + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ProblemResponse.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ProblemResponse.java new file mode 100644 index 00000000..d169120b --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/ProblemResponse.java @@ -0,0 +1,57 @@ +package com.keploy.sapdemo.customer360.model; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.time.Instant; + +/** + * RFC 7807 Problem Details for HTTP APIs response body. + * + *

Returned by {@link com.keploy.sapdemo.customer360.web.GlobalExceptionHandler} + * for any unhandled exception surfaced by the service. Stable shape so that + * downstream consumers (and Keploy mock diffs) can rely on it. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ProblemResponse { + + private String type; + private String title; + private int status; + private String detail; + private String instance; + private String correlationId; + private Integer upstreamStatus; + private String sapErrorCode; + private Instant timestamp; + + public ProblemResponse() { + this.timestamp = Instant.now(); + } + + public String getType() { return type; } + public void setType(String v) { this.type = v; } + + public String getTitle() { return title; } + public void setTitle(String v) { this.title = v; } + + public int getStatus() { return status; } + public void setStatus(int v) { this.status = v; } + + public String getDetail() { return detail; } + public void setDetail(String v) { this.detail = v; } + + public String getInstance() { return instance; } + public void setInstance(String v) { this.instance = v; } + + public String getCorrelationId() { return correlationId; } + public void setCorrelationId(String v) { this.correlationId = v; } + + public Integer getUpstreamStatus() { return upstreamStatus; } + public void setUpstreamStatus(Integer v) { this.upstreamStatus = v; } + + public String getSapErrorCode() { return sapErrorCode; } + public void setSapErrorCode(String v) { this.sapErrorCode = v; } + + public Instant getTimestamp() { return timestamp; } + public void setTimestamp(Instant v) { this.timestamp = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/TagRequest.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/TagRequest.java new file mode 100644 index 00000000..691afa87 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/model/TagRequest.java @@ -0,0 +1,26 @@ +package com.keploy.sapdemo.customer360.model; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; + +/** + * Request body for {@code POST /api/v1/customers/{id}/tags}. + */ +public class TagRequest { + + @NotBlank + @Size(min = 1, max = 64) + @Pattern(regexp = "^[a-zA-Z0-9_.\\-]{1,64}$", message = "tag must match [a-zA-Z0-9_.-]{1,64}") + private String tag; + + private String createdBy; + + public TagRequest() {} + + public String getTag() { return tag; } + public void setTag(String v) { this.tag = v; } + + public String getCreatedBy() { return createdBy; } + public void setCreatedBy(String v) { this.createdBy = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/AuditEvent.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/AuditEvent.java new file mode 100644 index 00000000..096afe31 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/AuditEvent.java @@ -0,0 +1,65 @@ +package com.keploy.sapdemo.customer360.persistence; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import java.time.Instant; + +/** + * One row per service operation — the compliance audit trail. + * + *

Written synchronously as part of the aggregator flow so the INSERT + * statement shows up in Keploy's Postgres wire-protocol capture on the + * same path as the SAP HTTP GETs. If you reorder this to an async write, + * Keploy replays may race against the test runner. + */ +@Entity +@Table(name = "audit_event") +public class AuditEvent { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "customer_id", length = 10) + private String customerId; + + @Column(nullable = false, length = 64) + private String operation; + + @Column(name = "correlation_id", length = 128) + private String correlationId; + + @Column(name = "latency_ms") + private Integer latencyMs; + + @Column(name = "happened_at", nullable = false, updatable = false) + private Instant happenedAt; + + public AuditEvent() {} + + public AuditEvent(String customerId, String operation, String correlationId, Integer latencyMs) { + this.customerId = customerId; + this.operation = operation; + this.correlationId = correlationId; + this.latencyMs = latencyMs; + this.happenedAt = Instant.now(); + } + + public Long getId() { return id; } + public void setId(Long v) { this.id = v; } + public String getCustomerId() { return customerId; } + public void setCustomerId(String v) { this.customerId = v; } + public String getOperation() { return operation; } + public void setOperation(String v) { this.operation = v; } + public String getCorrelationId() { return correlationId; } + public void setCorrelationId(String v) { this.correlationId = v; } + public Integer getLatencyMs() { return latencyMs; } + public void setLatencyMs(Integer v) { this.latencyMs = v; } + public Instant getHappenedAt() { return happenedAt; } + public void setHappenedAt(Instant v) { this.happenedAt = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/CustomerNote.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/CustomerNote.java new file mode 100644 index 00000000..5ccf0783 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/CustomerNote.java @@ -0,0 +1,55 @@ +package com.keploy.sapdemo.customer360.persistence; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +import java.time.Instant; + +/** + * Free-text note captured on a customer (e.g. during a CSR call). Multiple + * notes allowed per customer; ordered by created_at for display. + */ +@Entity +@Table(name = "customer_note") +public class CustomerNote { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "customer_id", nullable = false, length = 10) + private String customerId; + + @Column(nullable = false, columnDefinition = "TEXT") + private String body; + + @Column(nullable = false, length = 64) + private String author; + + @Column(name = "created_at", nullable = false, updatable = false) + private Instant createdAt; + + public CustomerNote() {} + + public CustomerNote(String customerId, String body, String author) { + this.customerId = customerId; + this.body = body; + this.author = author; + this.createdAt = Instant.now(); + } + + public Long getId() { return id; } + public void setId(Long v) { this.id = v; } + public String getCustomerId() { return customerId; } + public void setCustomerId(String v) { this.customerId = v; } + public String getBody() { return body; } + public void setBody(String v) { this.body = v; } + public String getAuthor() { return author; } + public void setAuthor(String v) { this.author = v; } + public Instant getCreatedAt() { return createdAt; } + public void setCreatedAt(Instant v) { this.createdAt = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/CustomerTag.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/CustomerTag.java new file mode 100644 index 00000000..4092c072 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/persistence/CustomerTag.java @@ -0,0 +1,58 @@ +package com.keploy.sapdemo.customer360.persistence; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; + +import java.time.Instant; + +/** + * User-assigned label attached to a customer (BP). Unique per (customer_id, tag). + */ +@Entity +@Table( + name = "customer_tag", + uniqueConstraints = @UniqueConstraint(name = "uk_customer_tag", columnNames = {"customer_id", "tag"}) +) +public class CustomerTag { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "customer_id", nullable = false, length = 10) + private String customerId; + + @Column(nullable = false, length = 64) + private String tag; + + @Column(name = "created_at", nullable = false, updatable = false) + private Instant createdAt; + + @Column(name = "created_by", nullable = false, length = 64) + private String createdBy; + + public CustomerTag() {} + + public CustomerTag(String customerId, String tag, String createdBy) { + this.customerId = customerId; + this.tag = tag; + this.createdBy = createdBy; + this.createdAt = Instant.now(); + } + + public Long getId() { return id; } + public void setId(Long v) { this.id = v; } + public String getCustomerId() { return customerId; } + public void setCustomerId(String v) { this.customerId = v; } + public String getTag() { return tag; } + public void setTag(String v) { this.tag = v; } + public Instant getCreatedAt() { return createdAt; } + public void setCreatedAt(Instant v) { this.createdAt = v; } + public String getCreatedBy() { return createdBy; } + public void setCreatedBy(String v) { this.createdBy = v; } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/AuditEventRepository.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/AuditEventRepository.java new file mode 100644 index 00000000..ce3263eb --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/AuditEventRepository.java @@ -0,0 +1,15 @@ +package com.keploy.sapdemo.customer360.repository; + +import com.keploy.sapdemo.customer360.persistence.AuditEvent; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface AuditEventRepository extends JpaRepository { + + List findTop50ByOrderByHappenedAtDesc(); + + List findTop20ByCustomerIdOrderByHappenedAtDesc(String customerId); +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/CustomerNoteRepository.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/CustomerNoteRepository.java new file mode 100644 index 00000000..e62ffab2 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/CustomerNoteRepository.java @@ -0,0 +1,15 @@ +package com.keploy.sapdemo.customer360.repository; + +import com.keploy.sapdemo.customer360.persistence.CustomerNote; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CustomerNoteRepository extends JpaRepository { + + List findAllByCustomerIdOrderByCreatedAtDesc(String customerId); + + long countByCustomerId(String customerId); +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/CustomerTagRepository.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/CustomerTagRepository.java new file mode 100644 index 00000000..3da67838 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/repository/CustomerTagRepository.java @@ -0,0 +1,25 @@ +package com.keploy.sapdemo.customer360.repository; + +import com.keploy.sapdemo.customer360.persistence.CustomerTag; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface CustomerTagRepository extends JpaRepository { + + List findAllByCustomerIdOrderByCreatedAtDesc(String customerId); + + Optional findByCustomerIdAndTag(String customerId, String tag); + + @Modifying + @Transactional + @Query("DELETE FROM CustomerTag t WHERE t.customerId = :customerId AND t.tag = :tag") + int deleteByCustomerIdAndTag(@Param("customerId") String customerId, @Param("tag") String tag); +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/CorrelationIdFilter.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/CorrelationIdFilter.java new file mode 100644 index 00000000..00e1178f --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/CorrelationIdFilter.java @@ -0,0 +1,48 @@ +package com.keploy.sapdemo.customer360.sap; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.MDC; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.UUID; + +/** + * Inbound correlation-id filter. Runs first in the filter chain. + * + *

If the caller supplies an {@code X-Correlation-ID} header (typical for + * requests routed through an API gateway or upstream BTP service), we honour + * it. Otherwise we mint a new one. Either way, it lands in MDC for the + * duration of the request so every log line carries it, and is echoed back + * on the response so the caller can correlate on their side. + */ +@Component +@Order(Ordered.HIGHEST_PRECEDENCE) +public class CorrelationIdFilter extends OncePerRequestFilter { + + public static final String MDC_KEY = CorrelationIdInterceptor.MDC_KEY; + public static final String HEADER = CorrelationIdInterceptor.HEADER; + + @Override + protected void doFilterInternal(HttpServletRequest request, + HttpServletResponse response, + FilterChain chain) throws ServletException, IOException { + String correlationId = request.getHeader(HEADER); + if (correlationId == null || correlationId.isBlank()) { + correlationId = UUID.randomUUID().toString(); + } + MDC.put(MDC_KEY, correlationId); + response.setHeader(HEADER, correlationId); + try { + chain.doFilter(request, response); + } finally { + MDC.remove(MDC_KEY); + } + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/CorrelationIdInterceptor.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/CorrelationIdInterceptor.java new file mode 100644 index 00000000..7c9aef8b --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/CorrelationIdInterceptor.java @@ -0,0 +1,39 @@ +package com.keploy.sapdemo.customer360.sap; + +import org.slf4j.MDC; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; +import java.util.UUID; + +/** + * Propagates the caller's correlation id into every outbound SAP call. + * + *

For incoming requests, {@link com.keploy.sapdemo.customer360.sap.CorrelationIdFilter} + * seeds the MDC. This interceptor reads it back and sets the + * {@code X-Correlation-ID} header on the SAP call so distributed traces + * chain across the hop — operationally critical in BTP landscapes where a + * single business request can trigger calls to five or more backends. + * + *

If MDC is empty (e.g., a scheduled job), a fresh id is generated so + * the SAP side always sees something. + */ +public class CorrelationIdInterceptor implements ClientHttpRequestInterceptor { + + public static final String MDC_KEY = "correlationId"; + public static final String HEADER = "X-Correlation-ID"; + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, + ClientHttpRequestExecution execution) throws IOException { + String correlationId = MDC.get(MDC_KEY); + if (correlationId == null || correlationId.isBlank()) { + correlationId = UUID.randomUUID().toString(); + } + request.getHeaders().set(HEADER, correlationId); + return execution.execute(request, body); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/SapApiException.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/SapApiException.java new file mode 100644 index 00000000..6377c323 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/SapApiException.java @@ -0,0 +1,68 @@ +package com.keploy.sapdemo.customer360.sap; + +import org.springframework.http.HttpStatus; + +/** + * Application-level exception that translates SAP-side failures into something + * the Spring MVC layer can map to a meaningful HTTP status. + * + *

Thrown by the {@link SapBusinessPartnerClient} when: + *

    + *
  • SAP returns a 4xx/5xx response (status preserved verbatim)
  • + *
  • A transport-level error occurs (connect timeout, read timeout, + * TLS failure — mapped to 502 Bad Gateway)
  • + *
  • A response body cannot be deserialised to the expected model + * (mapped to 502 Bad Gateway with a schema-drift hint)
  • + *
+ * + *

The {@link #upstreamStatus} field preserves the exact status SAP returned + * so {@link com.keploy.sapdemo.customer360.web.GlobalExceptionHandler} + * can surface it in an RFC 7807 problem response as + * {@code X-Upstream-Status}. Keploy captures this header verbatim in the + * replayed mocks, which lets contract-diff checks catch status regressions + * even when the body hasn't changed. + */ +public class SapApiException extends RuntimeException { + + private final HttpStatus upstreamStatus; + private final String sapErrorCode; + + /** + * Minimal constructor — upstream HTTP status + message only. + * Use this for SAP-returned 4xx/5xx errors where no further code or + * underlying cause is available. + */ + public SapApiException(HttpStatus upstreamStatus, String message) { + super(message); + this.upstreamStatus = upstreamStatus; + this.sapErrorCode = null; + } + + /** + * With SAP error code (from the OData error envelope, e.g. + * {@code "error.code": "SY/530"}) for richer client diagnostics. + */ + public SapApiException(HttpStatus upstreamStatus, String sapErrorCode, String message) { + super(message); + this.upstreamStatus = upstreamStatus; + this.sapErrorCode = sapErrorCode; + } + + /** + * For transport-level failures that wrap an underlying cause + * (IOException, deserialisation failure, etc.). + */ + public SapApiException(HttpStatus upstreamStatus, String message, Throwable cause) { + super(message, cause); + this.upstreamStatus = upstreamStatus; + this.sapErrorCode = null; + } + + public HttpStatus getUpstreamStatus() { + return upstreamStatus; + } + + public String getSapErrorCode() { + return sapErrorCode; + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/SapBusinessPartnerClient.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/SapBusinessPartnerClient.java new file mode 100644 index 00000000..f904a5ff --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/sap/SapBusinessPartnerClient.java @@ -0,0 +1,250 @@ +package com.keploy.sapdemo.customer360.sap; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.keploy.sapdemo.customer360.model.BusinessPartner; +import com.keploy.sapdemo.customer360.model.BusinessPartnerAddress; +import com.keploy.sapdemo.customer360.model.BusinessPartnerRole; +import com.keploy.sapdemo.customer360.model.ODataCollectionResponse; +import com.keploy.sapdemo.customer360.model.ODataEntityResponse; +import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; +import io.github.resilience4j.retry.annotation.Retry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * Low-level gateway to SAP's {@code API_BUSINESS_PARTNER} OData service. + * + *

All outbound SAP calls go through here. Each method: + *

    + *
  • Has a Resilience4j {@link Retry @Retry} and + * {@link CircuitBreaker @CircuitBreaker} annotation so transient + * 5xx / timeout failures don't blow up the caller
  • + *
  • Translates HTTP layer exceptions into domain-level + * {@link SapApiException}
  • + *
  • Logs every call at INFO with method + path + correlation id, + * including final status for traceability
  • + *
+ * + *

The service path is fixed; only the sub-path varies. Base URL is set + * on the RestTemplate's rootUri (see + * {@link com.keploy.sapdemo.customer360.config.SapClientConfig}). + */ +@Component +public class SapBusinessPartnerClient { + + private static final Logger log = LoggerFactory.getLogger(SapBusinessPartnerClient.class); + + private static final String BP_SERVICE = "/sap/opu/odata/sap/API_BUSINESS_PARTNER"; + private static final String ENTITY_SET_PARTNER = "/A_BusinessPartner"; + // Nav properties — preferred for fetching a partner's child collections. + // SAP's sandbox rejects $filter on the top-level child entity sets. + private static final String NAV_ADDRESSES = "/to_BusinessPartnerAddress"; + private static final String NAV_ROLES = "/to_BusinessPartnerRole"; + + private final RestTemplate sapRestTemplate; + private final ObjectMapper objectMapper; + + @Value("${sap.api.default-top:10}") + private int defaultTop; + + public SapBusinessPartnerClient(RestTemplate sapRestTemplate, ObjectMapper objectMapper) { + this.sapRestTemplate = sapRestTemplate; + this.objectMapper = objectMapper; + } + + // ----------------------------------------------------------------------- + // Single entity reads + // ----------------------------------------------------------------------- + + @Retry(name = "sapApi") + @CircuitBreaker(name = "sapApi") + @Cacheable(value = "sap.partner", key = "#businessPartnerId") + public BusinessPartner fetchPartner(String businessPartnerId) { + String path = BP_SERVICE + ENTITY_SET_PARTNER + + "('" + urlEncode(businessPartnerId) + "')?$format=json"; + log.info("SAP GET partner id={} path={}", businessPartnerId, path); + + String raw = exchangeForString(path); + try { + ODataEntityResponse wrapper = objectMapper.readValue( + raw, new TypeReference>() {}); + if (wrapper == null || wrapper.getEntity() == null) { + throw new SapApiException( + org.springframework.http.HttpStatus.BAD_GATEWAY, + "SAP response did not contain a d.entity element; schema drift?"); + } + return wrapper.getEntity(); + } catch (IOException e) { + throw new SapApiException( + org.springframework.http.HttpStatus.BAD_GATEWAY, + "Failed to parse SAP business partner response: " + e.getMessage(), e); + } + } + + // ----------------------------------------------------------------------- + // Collection reads + // ----------------------------------------------------------------------- + + @Retry(name = "sapApi") + @CircuitBreaker(name = "sapApi") + @Cacheable(value = "sap.partners-page", key = "#top + '-' + #skip") + public List listPartners(int top, int skip) { + int safeTop = top <= 0 ? defaultTop : Math.min(top, 100); + int safeSkip = Math.max(skip, 0); + + String path = BP_SERVICE + ENTITY_SET_PARTNER + + "?$top=" + safeTop + + "&$skip=" + safeSkip + + "&$format=json"; + log.info("SAP GET partners top={} skip={}", safeTop, safeSkip); + + String raw = exchangeForString(path); + try { + ODataCollectionResponse wrapper = objectMapper.readValue( + raw, new TypeReference>() {}); + return wrapper.getResults(); + } catch (IOException e) { + throw new SapApiException( + org.springframework.http.HttpStatus.BAD_GATEWAY, + "Failed to parse SAP business partner list: " + e.getMessage(), e); + } + } + + @Retry(name = "sapApi") + @CircuitBreaker(name = "sapApi") + @Cacheable(value = "sap.addresses", key = "#businessPartnerId") + public List fetchAddresses(String businessPartnerId) { + String path = BP_SERVICE + ENTITY_SET_PARTNER + + "('" + urlEncode(businessPartnerId) + "')" + + NAV_ADDRESSES + + "?$format=json&$top=50"; + log.info("SAP GET addresses for bp={}", businessPartnerId); + + String raw = exchangeForString(path); + try { + ODataCollectionResponse wrapper = objectMapper.readValue( + raw, new TypeReference>() {}); + return wrapper.getResults(); + } catch (IOException e) { + throw new SapApiException( + org.springframework.http.HttpStatus.BAD_GATEWAY, + "Failed to parse SAP addresses response: " + e.getMessage(), e); + } + } + + @Retry(name = "sapApi") + @CircuitBreaker(name = "sapApi") + @Cacheable(value = "sap.roles", key = "#businessPartnerId") + public List fetchRoles(String businessPartnerId) { + String path = BP_SERVICE + ENTITY_SET_PARTNER + + "('" + urlEncode(businessPartnerId) + "')" + + NAV_ROLES + + "?$format=json&$top=50"; + log.info("SAP GET roles for bp={}", businessPartnerId); + + String raw = exchangeForString(path); + try { + ODataCollectionResponse wrapper = objectMapper.readValue( + raw, new TypeReference>() {}); + return wrapper.getResults(); + } catch (IOException e) { + throw new SapApiException( + org.springframework.http.HttpStatus.BAD_GATEWAY, + "Failed to parse SAP roles response: " + e.getMessage(), e); + } + } + + // ----------------------------------------------------------------------- + // Aggregate reads + // ----------------------------------------------------------------------- + + @Retry(name = "sapApi") + @CircuitBreaker(name = "sapApi") + @Cacheable(value = "sap.count") + public long fetchTotalCount() { + String path = BP_SERVICE + ENTITY_SET_PARTNER + "/$count"; + log.info("SAP GET $count"); + String raw = exchangeForString(path); + try { + return Long.parseLong(raw.trim()); + } catch (NumberFormatException e) { + throw new SapApiException( + org.springframework.http.HttpStatus.BAD_GATEWAY, + "SAP $count endpoint returned non-numeric response: '" + raw + "'", e); + } + } + + // ----------------------------------------------------------------------- + // Shared plumbing + // ----------------------------------------------------------------------- + + private String exchangeForString(String path) { + try { + // NOTE: pass the path as a String (not a URI) so RestTemplateBuilder's + // rootUri is prefixed. Passing a URI instance bypasses the root and + // the path — being relative — blows up with "URI is not absolute". + ResponseEntity response = sapRestTemplate.getForEntity( + path, String.class); + HttpStatusCode status = response.getStatusCode(); + if (!status.is2xxSuccessful()) { + throw new SapApiException( + org.springframework.http.HttpStatus.valueOf(status.value()), + "SAP returned non-2xx: " + status.value()); + } + return response.getBody() != null ? response.getBody() : ""; + } catch (HttpStatusCodeException upstream) { + log.warn("SAP upstream error status={} path={} body={}", + upstream.getStatusCode(), path, + truncate(upstream.getResponseBodyAsString(), 500)); + throw new SapApiException( + org.springframework.http.HttpStatus.valueOf(upstream.getStatusCode().value()), + "SAP upstream error: " + upstream.getStatusText(), + upstream); + } catch (ResourceAccessException transport) { + log.warn("SAP transport error path={} cause={}", path, + transport.getMessage()); + throw new SapApiException( + org.springframework.http.HttpStatus.BAD_GATEWAY, + "SAP transport error: " + transport.getMessage(), + transport); + } + } + + private static String urlEncode(String v) { + return URLEncoder.encode(v, StandardCharsets.UTF_8); + } + + /** + * OData-compatible URL encoding for {@code $filter} values. + * + *

The stdlib {@link URLEncoder} is form-encoded: it emits {@code +} + * for spaces and {@code %27} for single quotes. SAP's OData v2 parser + * accepts {@code %20} for spaces but refuses {@code +} ("Invalid token + * detected at position N"), and expects literal single quotes around + * string literals, not percent-encoded. This method fixes both. + */ + private static String odataEncode(String v) { + return URLEncoder.encode(v, StandardCharsets.UTF_8) + .replace("+", "%20") + .replace("%27", "'"); + } + + private static String truncate(String s, int max) { + if (s == null) return ""; + return s.length() <= max ? s : s.substring(0, max) + "...(truncated)"; + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/AuditService.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/AuditService.java new file mode 100644 index 00000000..50e8d8bf --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/AuditService.java @@ -0,0 +1,47 @@ +package com.keploy.sapdemo.customer360.service; + +import com.keploy.sapdemo.customer360.persistence.AuditEvent; +import com.keploy.sapdemo.customer360.repository.AuditEventRepository; +import com.keploy.sapdemo.customer360.sap.CorrelationIdInterceptor; +import org.slf4j.MDC; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * Writes one row per service operation for compliance audit + usage analytics. + * + *

Written synchronously (no {@code @Async}) so the INSERT statement lands + * in Keploy's captured wire-protocol log on the same request path as the + * outbound SAP GETs. That determinism matters for replay. + */ +@Service +public class AuditService { + + private final AuditEventRepository repo; + + public AuditService(AuditEventRepository repo) { + this.repo = repo; + } + + @Transactional + public AuditEvent record(String customerId, String operation, Integer latencyMs) { + return repo.save(new AuditEvent( + customerId, + operation, + MDC.get(CorrelationIdInterceptor.MDC_KEY), + latencyMs + )); + } + + @Transactional(readOnly = true) + public List recent() { + return repo.findTop50ByOrderByHappenedAtDesc(); + } + + @Transactional(readOnly = true) + public List recentForCustomer(String customerId) { + return repo.findTop20ByCustomerIdOrderByHappenedAtDesc(customerId); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/Customer360AggregatorService.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/Customer360AggregatorService.java new file mode 100644 index 00000000..8eab1063 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/Customer360AggregatorService.java @@ -0,0 +1,190 @@ +package com.keploy.sapdemo.customer360.service; + +import com.keploy.sapdemo.customer360.model.BusinessPartner; +import com.keploy.sapdemo.customer360.model.BusinessPartnerAddress; +import com.keploy.sapdemo.customer360.model.BusinessPartnerRole; +import com.keploy.sapdemo.customer360.model.Customer360View; +import com.keploy.sapdemo.customer360.persistence.CustomerNote; +import com.keploy.sapdemo.customer360.persistence.CustomerTag; +import com.keploy.sapdemo.customer360.sap.CorrelationIdInterceptor; +import com.keploy.sapdemo.customer360.sap.SapApiException; +import com.keploy.sapdemo.customer360.sap.SapBusinessPartnerClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.Duration; +import java.time.Instant; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +/** + * Fan-out aggregator composing a 360° view from SAP + local Postgres. + * + *

Each inbound {@code GET /api/v1/customers/{id}/360} now produces: + *

+ *   1 inbound HTTP
+ *       │
+ *       ├─ 3 parallel HTTPS GETs to SAP OData
+ *       │     GET /A_BusinessPartner('{id}')
+ *       │     GET /A_BusinessPartner('{id}')/to_BusinessPartnerAddress
+ *       │     GET /A_BusinessPartner('{id}')/to_BusinessPartnerRole
+ *       │
+ *       ├─ 2 parallel Postgres SELECTs
+ *       │     SELECT … FROM customer_tag   WHERE customer_id = ?
+ *       │     SELECT … FROM customer_note  WHERE customer_id = ?
+ *       │
+ *       └─ 1 Postgres INSERT (audit)
+ *             INSERT INTO audit_event (…)
+ * 
+ * + *

That's the full story for Keploy: every call on the request path — + * HTTP and Postgres wire-protocol — is visible to eBPF on the host and + * gets captured into the replay mocks. UI test suites can only assert on + * the rendered tile; Keploy sees all six backend conversations. + * + *

Partial-failure policy: the SAP partner fetch is mandatory. + * Everything else (addresses, roles, tags, notes) is optional — failure + * degrades the view rather than the request. + */ +@Service +public class Customer360AggregatorService { + + private static final Logger log = LoggerFactory.getLogger(Customer360AggregatorService.class); + + private final SapBusinessPartnerClient sapClient; + private final TagService tagService; + private final NoteService noteService; + private final AuditService auditService; + private final Executor fanoutExecutor; + + @Value("${customer360.aggregate-timeout-seconds:25}") + private int aggregateTimeoutSeconds; + + @Value("${sap.api.base-url}") + private String dataSourceHint; + + public Customer360AggregatorService(SapBusinessPartnerClient sapClient, + TagService tagService, + NoteService noteService, + AuditService auditService, + @Qualifier("sapCallExecutor") Executor fanoutExecutor) { + this.sapClient = sapClient; + this.tagService = tagService; + this.noteService = noteService; + this.auditService = auditService; + this.fanoutExecutor = fanoutExecutor; + } + + public Customer360View aggregate(String customerId) { + Instant start = Instant.now(); + String correlationId = MDC.get(CorrelationIdInterceptor.MDC_KEY); + log.info("Aggregating 360 view for customerId={} correlationId={}", customerId, correlationId); + + // ---- Mandatory: SAP partner -------------------------------------- + BusinessPartner partner = sapClient.fetchPartner(customerId); + + // ---- Parallel fan-out: 2 SAP + 2 Postgres ------------------------ + CompletableFuture> addressesF = async(correlationId, + () -> safely("addresses", () -> sapClient.fetchAddresses(customerId))); + + CompletableFuture> rolesF = async(correlationId, + () -> safely("roles", () -> sapClient.fetchRoles(customerId))); + + CompletableFuture> tagsF = async(correlationId, + () -> safely("tags", () -> tagService.list(customerId))); + + CompletableFuture> notesF = async(correlationId, + () -> safely("notes", () -> noteService.list(customerId))); + + List addresses; + List roles; + List tags; + List notes; + try { + CompletableFuture.allOf(addressesF, rolesF, tagsF, notesF) + .get(aggregateTimeoutSeconds, TimeUnit.SECONDS); + addresses = addressesF.get(); + roles = rolesF.get(); + tags = tagsF.get(); + notes = notesF.get(); + } catch (TimeoutException e) { + log.warn("Aggregation timeout for bp={} after {}s — returning partial view", + customerId, aggregateTimeoutSeconds); + addresses = addressesF.getNow(List.of()); + roles = rolesF.getNow(List.of()); + tags = tagsF.getNow(List.of()); + notes = notesF.getNow(List.of()); + } catch (InterruptedException e) { + // Re-assert interrupt so callers higher up can observe it. + Thread.currentThread().interrupt(); + log.warn("Aggregation interrupted for bp={}: {}", customerId, e.getMessage()); + addresses = addressesF.getNow(List.of()); + roles = rolesF.getNow(List.of()); + tags = tagsF.getNow(List.of()); + notes = notesF.getNow(List.of()); + } catch (ExecutionException e) { + // Execution failed inside an async stage; the interrupt flag of + // the caller is unaffected, so do NOT call Thread.interrupt(). + log.warn("Aggregation failed for bp={}: {}", customerId, e.getMessage()); + addresses = addressesF.getNow(List.of()); + roles = rolesF.getNow(List.of()); + tags = tagsF.getNow(List.of()); + notes = notesF.getNow(List.of()); + } + + int elapsed = (int) Duration.between(start, Instant.now()).toMillis(); + + // ---- Audit INSERT (synchronous — part of the recorded path) ------ + auditService.record(customerId, "customer.360", elapsed); + + Customer360View view = new Customer360View(); + view.setCustomerId(customerId); + view.setPartner(partner); + view.setAddresses(addresses); + view.setRoles(roles); + view.setTags(tags); + view.setNotes(notes); + view.setAggregatedAt(Instant.now()); + view.setCorrelationId(correlationId); + view.setDataSource(dataSourceHint); + view.setElapsedMs(elapsed); + + log.info("360 aggregated bp={} addresses={} roles={} tags={} notes={} took={}ms", + customerId, addresses.size(), roles.size(), tags.size(), notes.size(), elapsed); + + return view; + } + + // ---- helpers ----------------------------------------------------------- + + private CompletableFuture> async(String correlationId, java.util.function.Supplier> supplier) { + return CompletableFuture.supplyAsync(() -> { + if (correlationId != null) MDC.put(CorrelationIdInterceptor.MDC_KEY, correlationId); + try { + return supplier.get(); + } finally { + MDC.remove(CorrelationIdInterceptor.MDC_KEY); + } + }, fanoutExecutor); + } + + private static List safely(String what, java.util.function.Supplier> supplier) { + try { + return supplier.get(); + } catch (SapApiException sap) { + log.warn("{} failed (SAP): {}", what, sap.getMessage()); + return List.of(); + } catch (RuntimeException e) { + log.warn("{} failed ({}): {}", what, e.getClass().getSimpleName(), e.getMessage()); + return List.of(); + } + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/CustomerService.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/CustomerService.java new file mode 100644 index 00000000..524c34e8 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/CustomerService.java @@ -0,0 +1,46 @@ +package com.keploy.sapdemo.customer360.service; + +import com.keploy.sapdemo.customer360.model.BusinessPartner; +import com.keploy.sapdemo.customer360.model.CustomerSummary; +import com.keploy.sapdemo.customer360.sap.SapBusinessPartnerClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Business-level facade for simple (single-endpoint) customer lookups. + * + *

The 360 aggregator lives in its own service because it has very + * different operational characteristics (parallelism, fan-out latency, + * partial-failure policy). + */ +@Service +public class CustomerService { + + private static final Logger log = LoggerFactory.getLogger(CustomerService.class); + + private final SapBusinessPartnerClient sapClient; + + public CustomerService(SapBusinessPartnerClient sapClient) { + this.sapClient = sapClient; + } + + public BusinessPartner getById(String id) { + log.debug("getById id={}", id); + return sapClient.fetchPartner(id); + } + + public List listCustomers(int top, int skip) { + log.debug("listCustomers top={} skip={}", top, skip); + return sapClient.listPartners(top, skip).stream() + .map(CustomerSummary::from) + .toList(); + } + + public long totalCount() { + log.debug("totalCount"); + return sapClient.fetchTotalCount(); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/NoteService.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/NoteService.java new file mode 100644 index 00000000..756b6dc0 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/NoteService.java @@ -0,0 +1,39 @@ +package com.keploy.sapdemo.customer360.service; + +import com.keploy.sapdemo.customer360.persistence.CustomerNote; +import com.keploy.sapdemo.customer360.repository.CustomerNoteRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class NoteService { + + private final CustomerNoteRepository repo; + + public NoteService(CustomerNoteRepository repo) { + this.repo = repo; + } + + @Transactional(readOnly = true) + public List list(String customerId) { + return repo.findAllByCustomerIdOrderByCreatedAtDesc(customerId); + } + + @Transactional + public CustomerNote add(String customerId, String body, String author) { + if (body == null || body.isBlank()) { + throw new IllegalArgumentException("note body must not be blank"); + } + if (body.length() > 2000) { + throw new IllegalArgumentException("note body must be ≤ 2000 chars"); + } + return repo.save(new CustomerNote(customerId, body.trim(), author)); + } + + @Transactional(readOnly = true) + public long count(String customerId) { + return repo.countByCustomerId(customerId); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/TagService.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/TagService.java new file mode 100644 index 00000000..2072efbc --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/service/TagService.java @@ -0,0 +1,56 @@ +package com.keploy.sapdemo.customer360.service; + +import com.keploy.sapdemo.customer360.persistence.CustomerTag; +import com.keploy.sapdemo.customer360.repository.CustomerTagRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class TagService { + + private static final Logger log = LoggerFactory.getLogger(TagService.class); + + private final CustomerTagRepository repo; + + public TagService(CustomerTagRepository repo) { + this.repo = repo; + } + + @Transactional(readOnly = true) + public List list(String customerId) { + return repo.findAllByCustomerIdOrderByCreatedAtDesc(customerId); + } + + @Transactional + public CustomerTag add(String customerId, String tag, String createdBy) { + if (tag == null || tag.isBlank()) { + throw new IllegalArgumentException("tag must not be blank"); + } + String normalised = tag.trim().toLowerCase(); + // Single-lookup idempotency: if the row exists, return it; otherwise + // insert. We retry the lookup on DataIntegrityViolationException to + // cover the narrow window where a concurrent insert beats us. + return repo.findByCustomerIdAndTag(customerId, normalised) + .orElseGet(() -> insertOrFetchExisting(customerId, normalised, createdBy)); + } + + private CustomerTag insertOrFetchExisting(String customerId, String tag, String createdBy) { + try { + return repo.save(new CustomerTag(customerId, tag, createdBy)); + } catch (DataIntegrityViolationException race) { + log.debug("tag add race on ({},{}); fetching existing", customerId, tag); + return repo.findByCustomerIdAndTag(customerId, tag) + .orElseThrow(() -> race); + } + } + + @Transactional + public boolean remove(String customerId, String tag) { + return repo.deleteByCustomerIdAndTag(customerId, tag.trim().toLowerCase()) > 0; + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/AuditController.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/AuditController.java new file mode 100644 index 00000000..307f3428 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/AuditController.java @@ -0,0 +1,41 @@ +package com.keploy.sapdemo.customer360.web; + +import com.keploy.sapdemo.customer360.persistence.AuditEvent; +import com.keploy.sapdemo.customer360.service.AuditService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/customers") +@Tag(name = "Audit", description = "Service-level access audit (Postgres read)") +public class AuditController { + + private static final Logger log = LoggerFactory.getLogger(AuditController.class); + + private final AuditService audit; + + public AuditController(AuditService audit) { + this.audit = audit; + } + + @Operation(summary = "Most recent 50 audit events across all customers", + description = "Postgres-only — no SAP call. Useful for compliance/ops dashboards.") + @GetMapping("/recent-views") + public ResponseEntity> recent() { + log.info("GET /customers/recent-views"); + List events = audit.recent(); + return ResponseEntity.ok(Map.of( + "items", events, + "count", events.size() + )); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/CustomerController.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/CustomerController.java new file mode 100644 index 00000000..a96162dc --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/CustomerController.java @@ -0,0 +1,100 @@ +package com.keploy.sapdemo.customer360.web; + +import com.keploy.sapdemo.customer360.model.BusinessPartner; +import com.keploy.sapdemo.customer360.model.Customer360View; +import com.keploy.sapdemo.customer360.model.CustomerSummary; +import com.keploy.sapdemo.customer360.service.Customer360AggregatorService; +import com.keploy.sapdemo.customer360.service.CustomerService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +/** + * Inbound REST surface. + * + *

Four endpoints mirror the typical consumption pattern of a Customer 360 + * service from downstream CRM / portal / analytics: + * + * + * + * + * + * + *
EndpointUse caseSAP calls
GET /api/v1/customersPaged list for UI grids1
GET /api/v1/customers/{id}Single-entity lookup1
GET /api/v1/customers/{id}/360Aggregated 360 view3 parallel
GET /api/v1/customers/countKPI tiles / metrics1
+ */ +@RestController +@RequestMapping("/api/v1/customers") +@Validated +@Tag(name = "Customers", description = "SAP Business Partner aggregation endpoints") +public class CustomerController { + + private static final Logger log = LoggerFactory.getLogger(CustomerController.class); + + // SAP Business Partner id is alphanumeric, up to 10 chars in the sandbox. + private static final String ID_REGEX = "^[0-9A-Za-z]{1,10}$"; + + private final CustomerService customerService; + private final Customer360AggregatorService aggregatorService; + + public CustomerController(CustomerService customerService, + Customer360AggregatorService aggregatorService) { + this.customerService = customerService; + this.aggregatorService = aggregatorService; + } + + @Operation(summary = "List customers (paged)") + @GetMapping + public ResponseEntity> list( + @RequestParam(defaultValue = "10") @Min(1) @Max(100) int top, + @RequestParam(defaultValue = "0") @Min(0) int skip + ) { + log.info("GET /customers top={} skip={}", top, skip); + List items = customerService.listCustomers(top, skip); + return ResponseEntity.ok(Map.of( + "items", items, + "page", Map.of("top", top, "skip", skip, "size", items.size()) + )); + } + + @Operation(summary = "Get total customer count (KPI tile)") + @GetMapping("/count") + public ResponseEntity> count() { + log.info("GET /customers/count"); + long total = customerService.totalCount(); + return ResponseEntity.ok(Map.of("total", total)); + } + + @Operation(summary = "Get single customer master data") + @GetMapping("/{id}") + public ResponseEntity getById( + @PathVariable @NotBlank @Pattern(regexp = ID_REGEX) String id + ) { + log.info("GET /customers/{}", id); + return ResponseEntity.ok(customerService.getById(id)); + } + + @Operation(summary = "Get aggregated Customer 360 view", + description = "Fan-out aggregator — triggers 3 parallel SAP OData calls per request.") + @GetMapping("/{id}/360") + public ResponseEntity get360( + @PathVariable @NotBlank @Pattern(regexp = ID_REGEX) String id + ) { + log.info("GET /customers/{}/360", id); + return ResponseEntity.ok(aggregatorService.aggregate(id)); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/GlobalExceptionHandler.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/GlobalExceptionHandler.java new file mode 100644 index 00000000..3d889e13 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/GlobalExceptionHandler.java @@ -0,0 +1,141 @@ +package com.keploy.sapdemo.customer360.web; + +import com.keploy.sapdemo.customer360.model.ProblemResponse; +import com.keploy.sapdemo.customer360.sap.CorrelationIdInterceptor; +import com.keploy.sapdemo.customer360.sap.SapApiException; +import io.github.resilience4j.circuitbreaker.CallNotPermittedException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ConstraintViolationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.dao.DataAccessException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * Converts uncaught exceptions into RFC 7807 problem responses. + * + *

Every error path populates: + *

    + *
  • the {@code X-Correlation-ID} response header (for cross-system tracing)
  • + *
  • the {@code X-Upstream-Status} header when an SAP upstream was + * responsible for the failure (Keploy captures this on replay so + * downstream tests can assert on SAP-side status transitions)
  • + *
+ */ +@RestControllerAdvice +public class GlobalExceptionHandler { + + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler(SapApiException.class) + public ResponseEntity handleSap(SapApiException ex, HttpServletRequest req) { + HttpStatus status = mapSapStatus(ex.getUpstreamStatus()); + ProblemResponse body = baseProblem(status, "SAP upstream error", ex.getMessage(), req); + body.setUpstreamStatus(ex.getUpstreamStatus().value()); + body.setSapErrorCode(ex.getSapErrorCode()); + + log.warn("SAP error surfaced to caller: status={} upstream={} detail={}", + status.value(), ex.getUpstreamStatus().value(), ex.getMessage()); + + return ResponseEntity.status(status) + .headers(commonHeaders(ex.getUpstreamStatus().value())) + .body(body); + } + + @ExceptionHandler(CallNotPermittedException.class) + public ResponseEntity handleCircuitOpen(CallNotPermittedException ex, + HttpServletRequest req) { + log.warn("Circuit breaker open, rejecting call: {}", ex.getMessage()); + ProblemResponse body = baseProblem( + HttpStatus.SERVICE_UNAVAILABLE, + "SAP upstream temporarily unavailable", + "Circuit breaker is open; retry after a short delay.", + req); + return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE) + .headers(commonHeaders(null)) + .body(body); + } + + @ExceptionHandler({ + ConstraintViolationException.class, + MethodArgumentNotValidException.class, + IllegalArgumentException.class, + HttpMessageNotReadableException.class + }) + public ResponseEntity handleValidation(Exception ex, HttpServletRequest req) { + ProblemResponse body = baseProblem(HttpStatus.BAD_REQUEST, "Validation failed", + ex.getMessage(), req); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .headers(commonHeaders(null)) + .body(body); + } + + @ExceptionHandler(DataAccessException.class) + public ResponseEntity handleDb(DataAccessException ex, HttpServletRequest req) { + log.warn("database error surfaced to caller", ex); + ProblemResponse body = baseProblem(HttpStatus.SERVICE_UNAVAILABLE, + "Database error", "Local persistence layer is unavailable.", req); + return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE) + .headers(commonHeaders(null)) + .body(body); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleUnexpected(Exception ex, HttpServletRequest req) { + String cid = MDC.get(CorrelationIdInterceptor.MDC_KEY); + // Full exception (message, stack, class) stays server-side only. Clients + // receive a generic message plus the correlation id, which they can + // quote back to operators when opening a ticket. + log.error("Unhandled exception [{}] path={} — check server logs", cid, req.getRequestURI(), ex); + ProblemResponse body = baseProblem(HttpStatus.INTERNAL_SERVER_ERROR, + "Internal Server Error", + "An unexpected error occurred. Quote the correlationId when contacting support.", + req); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .headers(commonHeaders(null)) + .body(body); + } + + // ----------------------------------------------------------------------- + + private static ProblemResponse baseProblem(HttpStatus status, String title, + String detail, HttpServletRequest req) { + ProblemResponse body = new ProblemResponse(); + body.setType("about:blank"); + body.setTitle(title); + body.setStatus(status.value()); + body.setDetail(detail); + body.setInstance(req.getRequestURI()); + body.setCorrelationId(MDC.get(CorrelationIdInterceptor.MDC_KEY)); + return body; + } + + private static HttpHeaders commonHeaders(Integer upstreamStatus) { + HttpHeaders h = new HttpHeaders(); + String cid = MDC.get(CorrelationIdInterceptor.MDC_KEY); + if (cid != null) { + h.set(CorrelationIdInterceptor.HEADER, cid); + } + if (upstreamStatus != null) { + h.set("X-Upstream-Status", String.valueOf(upstreamStatus)); + } + return h; + } + + private static HttpStatus mapSapStatus(HttpStatus upstream) { + // SAP 404 on a specific partner → 404 Not Found to our caller. + // SAP 401/403 → reflect as 502 (the caller didn't auth wrong, we did). + // SAP 4xx otherwise → 502 (bad gateway / upstream misconfig). + // SAP 5xx / timeouts → 502. + if (upstream == HttpStatus.NOT_FOUND) return HttpStatus.NOT_FOUND; + if (upstream == HttpStatus.TOO_MANY_REQUESTS) return HttpStatus.TOO_MANY_REQUESTS; + return HttpStatus.BAD_GATEWAY; + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/NoteController.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/NoteController.java new file mode 100644 index 00000000..dca39005 --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/NoteController.java @@ -0,0 +1,70 @@ +package com.keploy.sapdemo.customer360.web; + +import com.keploy.sapdemo.customer360.model.NoteRequest; +import com.keploy.sapdemo.customer360.persistence.CustomerNote; +import com.keploy.sapdemo.customer360.service.AuditService; +import com.keploy.sapdemo.customer360.service.NoteService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/customers/{customerId}/notes") +@Validated +@Tag(name = "Notes", description = "Free-text notes captured locally in Postgres") +public class NoteController { + + private static final Logger log = LoggerFactory.getLogger(NoteController.class); + + private static final String ID_REGEX = "^[0-9A-Za-z]{1,10}$"; + + private final NoteService notes; + private final AuditService audit; + + public NoteController(NoteService notes, AuditService audit) { + this.notes = notes; + this.audit = audit; + } + + @Operation(summary = "List notes for a customer (Postgres read)") + @GetMapping + public ResponseEntity> list( + @PathVariable @NotBlank @Pattern(regexp = ID_REGEX) String customerId + ) { + log.info("GET notes for bp={}", customerId); + List result = notes.list(customerId); + audit.record(customerId, "notes.list", null); + return ResponseEntity.ok(Map.of( + "items", result, + "count", result.size() + )); + } + + @Operation(summary = "Add a note to a customer (Postgres insert)") + @PostMapping + public ResponseEntity add( + @PathVariable @NotBlank @Pattern(regexp = ID_REGEX) String customerId, + @Valid @RequestBody NoteRequest req + ) { + log.info("POST note len={} for bp={}", req.getBody().length(), customerId); + String author = req.getAuthor() == null || req.getAuthor().isBlank() ? "api" : req.getAuthor(); + CustomerNote saved = notes.add(customerId, req.getBody(), author); + audit.record(customerId, "notes.add", null); + return ResponseEntity.ok(saved); + } +} diff --git a/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/TagController.java b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/TagController.java new file mode 100644 index 00000000..8609bcad --- /dev/null +++ b/sap-demo-java/src/main/java/com/keploy/sapdemo/customer360/web/TagController.java @@ -0,0 +1,81 @@ +package com.keploy.sapdemo.customer360.web; + +import com.keploy.sapdemo.customer360.model.TagRequest; +import com.keploy.sapdemo.customer360.persistence.CustomerTag; +import com.keploy.sapdemo.customer360.service.AuditService; +import com.keploy.sapdemo.customer360.service.TagService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/customers/{customerId}/tags") +@Validated +@Tag(name = "Tags", description = "Local labels attached to a BP — stored in Postgres, not SAP") +public class TagController { + + private static final Logger log = LoggerFactory.getLogger(TagController.class); + + private static final String ID_REGEX = "^[0-9A-Za-z]{1,10}$"; + + private final TagService tags; + private final AuditService audit; + + public TagController(TagService tags, AuditService audit) { + this.tags = tags; + this.audit = audit; + } + + @Operation(summary = "List tags on a customer (Postgres read)") + @GetMapping + public ResponseEntity> list( + @PathVariable @NotBlank @Pattern(regexp = ID_REGEX) String customerId + ) { + log.info("GET tags for bp={}", customerId); + List result = tags.list(customerId); + audit.record(customerId, "tags.list", null); + return ResponseEntity.ok(result); + } + + @Operation(summary = "Add a tag to a customer (Postgres insert)") + @PostMapping + public ResponseEntity add( + @PathVariable @NotBlank @Pattern(regexp = ID_REGEX) String customerId, + @Valid @RequestBody TagRequest req + ) { + log.info("POST tag={} for bp={}", req.getTag(), customerId); + String by = req.getCreatedBy() == null || req.getCreatedBy().isBlank() ? "api" : req.getCreatedBy(); + CustomerTag saved = tags.add(customerId, req.getTag(), by); + audit.record(customerId, "tags.add", null); + return ResponseEntity.ok(saved); + } + + @Operation(summary = "Remove a tag (Postgres delete)") + @DeleteMapping("/{tag}") + public ResponseEntity> remove( + @PathVariable @NotBlank @Pattern(regexp = ID_REGEX) String customerId, + @PathVariable @NotBlank String tag + ) { + log.info("DELETE tag={} for bp={}", tag, customerId); + String normalised = tag.trim().toLowerCase(); + boolean deleted = tags.remove(customerId, normalised); + audit.record(customerId, "tags.delete", null); + return ResponseEntity.ok(Map.of("deleted", deleted, "tag", normalised)); + } +} diff --git a/sap-demo-java/src/main/resources/application.yml b/sap-demo-java/src/main/resources/application.yml new file mode 100644 index 00000000..71de8051 --- /dev/null +++ b/sap-demo-java/src/main/resources/application.yml @@ -0,0 +1,178 @@ +spring: + application: + name: customer360 + jackson: + default-property-inclusion: non_null + serialization: + write-dates-as-timestamps: false + + # --- Postgres / JPA ---------------------------------------------------- + # The app persists tags, notes, and an audit log locally. In a RISE/BTP + # landscape this would be a hyperscaler-hosted Postgres or SAP HANA Cloud; + # for the demo we use stock Postgres, which Keploy's OSS core can record + # and replay at the wire-protocol level. + datasource: + url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/customer360} + username: ${SPRING_DATASOURCE_USERNAME:customer360} + password: ${SPRING_DATASOURCE_PASSWORD:customer360} + hikari: + maximum-pool-size: 10 + minimum-idle: 2 + connection-timeout: 10000 + pool-name: customer360-hikari + jpa: + hibernate: + ddl-auto: validate + open-in-view: false + properties: + hibernate: + jdbc: + time_zone: UTC + format_sql: false + flyway: + enabled: true + baseline-on-migrate: true + locations: classpath:db/migration + + # --- Cache ----------------------------------------------------------- + # Caffeine-backed caches for SAP master data. Typical BTP-extension + # caching TTL is 30s-5min; we use 60s for demo visibility. Keploy + # records only the first-uncached call per (method, argument) — exactly + # what happens in production traffic. + cache: + type: caffeine + cache-names: + - sap.partner + - sap.partners-page + - sap.addresses + - sap.roles + - sap.count + caffeine: + spec: maximumSize=5000,expireAfterWrite=60s + +server: + port: ${SERVER_PORT:8080} + # Graceful shutdown gives in-flight requests a chance to finish during + # rolling deploys on Kubernetes. + shutdown: graceful + forward-headers-strategy: native + compression: + enabled: false + http2: + enabled: true + tomcat: + mbeanregistry: + enabled: true + +# ---------------------------------------------------------------------------- +# SAP upstream configuration +# ---------------------------------------------------------------------------- +sap: + api: + # Defaults to the public SAP Business Accelerator Hub sandbox; override + # for a real tenant by setting SAP_API_BASE_URL (and providing a bearer + # token or API key for that tenant). + base-url: ${SAP_API_BASE_URL:https://sandbox.api.sap.com/s4hanacloud} + key: ${SAP_API_KEY:} + bearer-token: ${SAP_BEARER_TOKEN:} + connect-timeout-seconds: 10 + read-timeout-seconds: 30 + default-top: 10 + +customer360: + aggregate-timeout-seconds: 25 + +# ---------------------------------------------------------------------------- +# Resilience4j: retry + circuit breaker for SAP upstream calls +# ---------------------------------------------------------------------------- +resilience4j: + retry: + instances: + sapApi: + max-attempts: 3 + wait-duration: 500ms + enable-exponential-backoff: true + exponential-backoff-multiplier: 2 + retry-exceptions: + - org.springframework.web.client.ResourceAccessException + - java.net.SocketTimeoutException + ignore-exceptions: + - com.keploy.sapdemo.customer360.sap.SapApiException + circuitbreaker: + instances: + sapApi: + register-health-indicator: true + sliding-window-type: COUNT_BASED + sliding-window-size: 20 + minimum-number-of-calls: 10 + failure-rate-threshold: 60 + slow-call-rate-threshold: 70 + slow-call-duration-threshold: 20s + permitted-number-of-calls-in-half-open-state: 3 + wait-duration-in-open-state: 10s + automatic-transition-from-open-to-half-open-enabled: true + +# ---------------------------------------------------------------------------- +# Spring Boot Actuator — health, metrics, info +# /actuator/health is the Kubernetes liveness/readiness probe target. +# ---------------------------------------------------------------------------- +management: + endpoints: + web: + exposure: + include: health, info, metrics, prometheus + base-path: /actuator + endpoint: + health: + probes: + enabled: true + show-details: when_authorized + show-components: always + group: + liveness: + include: livenessState + readiness: + include: readinessState, circuitBreakers + health: + circuitbreakers: + enabled: true + db: + enabled: true + info: + env: + enabled: true + metrics: + tags: + application: ${spring.application.name} + distribution: + percentiles-histogram: + http.server.requests: true + percentiles: + http.server.requests: 0.5, 0.95, 0.99 +info: + app: + name: ${spring.application.name} + description: SAP Customer 360 aggregator — reference integration service + version: 1.0.0 + +# ---------------------------------------------------------------------------- +# OpenAPI / Swagger UI +# ---------------------------------------------------------------------------- +springdoc: + api-docs: + path: /v3/api-docs + swagger-ui: + path: /swagger-ui.html + operationsSorter: method + +# ---------------------------------------------------------------------------- +# Logging — levels only. The console/JSON patterns live in logback-spring.xml +# (which is the single source of truth; Boot's `logging.pattern.*` keys are +# ignored whenever logback-spring.xml is present, so duplicating them here +# invited drift). +# ---------------------------------------------------------------------------- +logging: + level: + root: INFO + com.keploy.sapdemo: INFO + org.springframework.web: INFO diff --git a/sap-demo-java/src/main/resources/db/migration/V1__init_schema.sql b/sap-demo-java/src/main/resources/db/migration/V1__init_schema.sql new file mode 100644 index 00000000..e0888527 --- /dev/null +++ b/sap-demo-java/src/main/resources/db/migration/V1__init_schema.sql @@ -0,0 +1,41 @@ +-- Customer 360 local schema. +-- +-- The app is a BTP-style extension: it enriches SAP Business Partner master +-- data with local-only concerns (tags, free-text notes, access audit log) +-- that never touch SAP. This separation is the "clean core" pattern — +-- local deltas live here; SAP stays canonical for master data. +-- +-- Tables: +-- customer_tag — user-assigned labels on a BP ("vip", "delinquent", etc.) +-- customer_note — free-text notes captured by CSRs during calls +-- audit_event — every read/write, for compliance + usage analytics + +CREATE TABLE customer_tag ( + id BIGSERIAL PRIMARY KEY, + customer_id VARCHAR(10) NOT NULL, + tag VARCHAR(64) NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_by VARCHAR(64) NOT NULL DEFAULT 'system', + CONSTRAINT uk_customer_tag UNIQUE (customer_id, tag) +); +CREATE INDEX idx_customer_tag_customer_id ON customer_tag(customer_id); + +CREATE TABLE customer_note ( + id BIGSERIAL PRIMARY KEY, + customer_id VARCHAR(10) NOT NULL, + body TEXT NOT NULL, + author VARCHAR(64) NOT NULL DEFAULT 'system', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +CREATE INDEX idx_customer_note_customer_id ON customer_note(customer_id); + +CREATE TABLE audit_event ( + id BIGSERIAL PRIMARY KEY, + customer_id VARCHAR(10), + operation VARCHAR(64) NOT NULL, + correlation_id VARCHAR(128), + latency_ms INTEGER, + happened_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +CREATE INDEX idx_audit_event_happened_at ON audit_event(happened_at DESC); +CREATE INDEX idx_audit_event_customer_id ON audit_event(customer_id); diff --git a/sap-demo-java/src/main/resources/logback-spring.xml b/sap-demo-java/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..cef2645f --- /dev/null +++ b/sap-demo-java/src/main/resources/logback-spring.xml @@ -0,0 +1,38 @@ + + + + + + + + + + ${LOG_PATTERN} + UTF-8 + + + + + + + + {"ts":"%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}","level":"%level","logger":"%logger{40}","correlationId":"%X{correlationId:-}","msg":"%replace(%msg){'\"','\\\"'}"}%n + + + + + + + + + + + + + + diff --git a/sap-demo-java/src/test/java/com/keploy/sapdemo/customer360/Customer360ApplicationTests.java b/sap-demo-java/src/test/java/com/keploy/sapdemo/customer360/Customer360ApplicationTests.java new file mode 100644 index 00000000..a22292c8 --- /dev/null +++ b/sap-demo-java/src/test/java/com/keploy/sapdemo/customer360/Customer360ApplicationTests.java @@ -0,0 +1,34 @@ +package com.keploy.sapdemo.customer360; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +/** + * Minimal context-load smoke test. Verifies the Spring wiring is correct — + * RestTemplate, interceptors, executor, Resilience4j decorators all bind. + * + *

This test expects a live Postgres instance on localhost:5432 + * (see docker-compose.yml). That is deliberate: the sample exists to + * validate that Keploy correctly captures real Postgres traffic — + * including the Flyway bootstrap queries — so swapping the datasource + * for H2 would hide exactly the wire-protocol behaviour we regress. + * Bring the compose stack up (`docker compose up -d postgres`) before + * running tests, or run via the CI pipeline where Postgres is provisioned. + * + *

The full integration test suite is intentionally out of scope for + * this reference service: the regression layer is provided by Keploy + * mocks recorded from real SAP traffic. + */ +@SpringBootTest +@TestPropertySource(properties = { + "sap.api.base-url=https://example.invalid", + "sap.api.key=test-key" +}) +class Customer360ApplicationTests { + + @Test + void contextLoads() { + // if Spring wires everything, we're good + } +} diff --git a/simple-java-dedup/.dockerignore b/simple-java-dedup/.dockerignore new file mode 100644 index 00000000..b482b67b --- /dev/null +++ b/simple-java-dedup/.dockerignore @@ -0,0 +1,5 @@ +** +!target/simple-java-dedup.jar +!target/classes/** +!target/keploy-sdk.jar +!target/jacocoagent.jar diff --git a/simple-java-dedup/.gitignore b/simple-java-dedup/.gitignore new file mode 100644 index 00000000..fb0c50a3 --- /dev/null +++ b/simple-java-dedup/.gitignore @@ -0,0 +1,7 @@ +target/ +test-results/ +coverage-reports/ +docker-compose-tmp.yaml +jacoco.exec +*.log +keploy-logs.txt diff --git a/simple-java-dedup/Dockerfile b/simple-java-dedup/Dockerfile new file mode 100644 index 00000000..454e5d55 --- /dev/null +++ b/simple-java-dedup/Dockerfile @@ -0,0 +1,18 @@ +ARG JAVA_VERSION=8 +FROM eclipse-temurin:${JAVA_VERSION}-jre + +WORKDIR /app + +RUN groupadd --gid 10001 appuser \ + && useradd --uid 10001 --gid 10001 --home-dir /home/appuser --create-home --shell /usr/sbin/nologin appuser + +COPY --chown=10001:10001 target/simple-java-dedup.jar /app/app.jar +COPY --chown=10001:10001 target/classes /app/classes +COPY --chown=10001:10001 target/keploy-sdk.jar /app/keploy-sdk.jar +COPY --chown=10001:10001 target/jacocoagent.jar /app/jacocoagent.jar + +ENV KEPLOY_JAVA_CLASS_DIRS=/app/classes + +EXPOSE 8080 +USER 10001:10001 +ENTRYPOINT ["java", "-javaagent:/app/keploy-sdk.jar", "-javaagent:/app/jacocoagent.jar=destfile=/tmp/jacoco.exec", "-jar", "/app/app.jar"] diff --git a/simple-java-dedup/README.md b/simple-java-dedup/README.md new file mode 100644 index 00000000..58ffb03d --- /dev/null +++ b/simple-java-dedup/README.md @@ -0,0 +1,50 @@ +# Simple Java Dynamic Deduplication Sample + +This is a small plain-Java HTTP service used to smoke-test Keploy Enterprise Java dynamic deduplication on Java 8 and Java 17. It uses only JDK APIs (`com.sun.net.httpserver.HttpServer`) and does not compile against the Keploy SDK. + +The checked-in fixtures exercise `/healthz`, `/grade`, `/shipping`, `/inventory`, and `/invoice`. They intentionally contain duplicate coverage paths: + +- `/grade?score=95` and `/grade?score=98` execute the same high-score branch. +- `/shipping?country=US&total=150` and `/shipping?country=US&total=175` execute the same free-shipping branch. +- `/inventory?sku=BOOK-1&quantity=3` and `/inventory?sku=BOOK-2&quantity=4` execute the same priority-reservation branch. +- `/invoice?customer=vip&subtotal=200` and `/invoice?customer=vip&subtotal=250` execute the same VIP-large discount branch. + +## Build + +```bash +mvn -B -DskipTests -Dkeploy.agent.version=2.0.6 clean package +``` + +## Native Dedup + +```bash +keploy test \ + -c "java -javaagent:target/keploy-sdk.jar -javaagent:target/jacocoagent.jar -jar target/simple-java-dedup.jar" \ + --path . --dedup --language java --delay 1 \ + --health-url "http://127.0.0.1:8080/healthz" \ + --health-poll-timeout 30s \ + --disableMockUpload --disableReportUpload + +keploy dedup --path . +``` + +## Docker Dedup + +```bash +JAVA_VERSION=17 docker compose build +keploy test \ + -c "docker compose up" \ + --container-name simple-java-dedup \ + --path . --dedup --language java --delay 10 \ + --health-url "http://127.0.0.1:8080/healthz" \ + --health-poll-timeout 30s \ + --disableMockUpload --disableReportUpload + +keploy dedup --path . +``` + +Keep the `-c` value as `docker compose up` so Keploy detects Docker Compose and mounts the shared `/tmp` socket volume used by Java dynamic deduplication. Pass `JAVA_VERSION`, `JAVA_DEDUP_IMAGE`, or port overrides in the shell environment instead of prefixing them inside the `-c` command. + +## Expected Result + +All 14 replayed fixtures should pass. Dedup should retain 10 test cases and mark 4 as duplicate, with exactly one duplicate from each intentional pair listed above. diff --git a/simple-java-dedup/dedupData.yaml b/simple-java-dedup/dedupData.yaml new file mode 100644 index 00000000..f09dee80 --- /dev/null +++ b/simple-java-dedup/dedupData.yaml @@ -0,0 +1,384 @@ +test-set-0: + test-1: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 36 + - 40 + - 41 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-2: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 47 + - 48 + - 51 + - 52 + - 53 + - 64 + - 65 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-3: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 47 + - 48 + - 51 + - 52 + - 53 + - 64 + - 65 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-4: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 47 + - 48 + - 51 + - 54 + - 55 + - 56 + - 64 + - 65 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-5: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 47 + - 48 + - 51 + - 54 + - 57 + - 61 + - 62 + - 64 + - 65 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-6: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 71 + - 72 + - 73 + - 76 + - 79 + - 80 + - 81 + - 86 + - 87 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-7: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 71 + - 72 + - 73 + - 76 + - 79 + - 80 + - 81 + - 86 + - 87 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-8: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 71 + - 72 + - 73 + - 76 + - 77 + - 78 + - 86 + - 87 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-9: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 93 + - 94 + - 95 + - 98 + - 99 + - 100 + - 108 + - 109 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-10: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 93 + - 94 + - 95 + - 98 + - 99 + - 100 + - 108 + - 109 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-11: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 93 + - 94 + - 95 + - 98 + - 101 + - 102 + - 103 + - 108 + - 109 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-12: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 115 + - 116 + - 117 + - 120 + - 121 + - 122 + - 133 + - 134 + - 135 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-13: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 115 + - 116 + - 117 + - 120 + - 121 + - 122 + - 133 + - 134 + - 135 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 + test-14: + src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java: + - 115 + - 116 + - 117 + - 120 + - 123 + - 126 + - 130 + - 131 + - 133 + - 134 + - 135 + - 139 + - 140 + - 143 + - 144 + - 145 + - 146 + - 149 + - 152 + - 156 + - 160 + - 168 + - 175 + - 176 + - 177 + - 178 + - 180 + - 182 + - 184 diff --git a/simple-java-dedup/docker-compose.yml b/simple-java-dedup/docker-compose.yml new file mode 100644 index 00000000..46bbceda --- /dev/null +++ b/simple-java-dedup/docker-compose.yml @@ -0,0 +1,10 @@ +services: + simple-java-dedup: + build: + context: . + args: + JAVA_VERSION: ${JAVA_VERSION:-8} + image: ${JAVA_DEDUP_IMAGE:-simple-java-dedup:local} + container_name: simple-java-dedup + ports: + - "${JAVA_DEDUP_HOST_PORT:-8080}:8080" diff --git a/simple-java-dedup/duplicates.yaml b/simple-java-dedup/duplicates.yaml new file mode 100644 index 00000000..012536fe --- /dev/null +++ b/simple-java-dedup/duplicates.yaml @@ -0,0 +1,5 @@ +test-set-0: +- test-13 +- test-3 +- test-7 +- test-9 diff --git a/simple-java-dedup/keploy.yml b/simple-java-dedup/keploy.yml new file mode 100644 index 00000000..a82fdb64 --- /dev/null +++ b/simple-java-dedup/keploy.yml @@ -0,0 +1,80 @@ +# Generated by Keploy (3-dev) +path: "" +appId: 0 +appName: "" +command: "" +templatize: + testSets: [] +port: 0 +proxyPort: 16789 +incomingProxyPort: 36789 +dnsPort: 26789 +debug: false +disableANSI: false +disableTele: false +generateGithubActions: false +containerName: "" +networkName: "" +buildDelay: 30 +test: + selectedTests: {} + ignoredTests: {} + globalNoise: + global: {} + test-sets: {} + replaceWith: + global: {} + test-sets: {} + delay: 5 + host: "localhost" + port: 0 + grpcPort: 0 + ssePort: 0 + protocol: + http: + port: 0 + sse: + port: 0 + grpc: + port: 0 + apiTimeout: 5 + skipCoverage: false + coverageReportPath: "" + ignoreOrdering: true + mongoPassword: "default@123" + language: "" + removeUnusedMocks: false + fallBackOnMiss: false + jacocoAgentPath: "" + basePath: "" + mocking: true + disableLineCoverage: false + disableMockUpload: false + useLocalMock: false + updateTemplate: false + mustPass: false + maxFailAttempts: 5 + maxFlakyChecks: 1 + protoFile: "" + protoDir: "" + protoInclude: [] + compareAll: false + updateTestMapping: false + disableAutoHeaderNoise: false + strictMockWindow: true + dedup: false + freezeTime: false + fuzzyMatch: false +record: + recordTimer: 0s + filters: [] + sync: false + memoryLimit: 0 +configPath: "" +bypassRules: [] +disableMapping: true +contract: + driven: "consumer" + mappings: + servicesMapping: {} + self: "s1" diff --git a/simple-java-dedup/keploy/.gitignore b/simple-java-dedup/keploy/.gitignore new file mode 100644 index 00000000..5137843b --- /dev/null +++ b/simple-java-dedup/keploy/.gitignore @@ -0,0 +1,2 @@ + +/reports/ diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-1.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-1.yaml new file mode 100644 index 00000000..2bef440f --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-1.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-1 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/healthz + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:11Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:11 GMT' + Content-Type: application/json + Content-Length: 15 + body: '{"status":"ok"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:11Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591151 + app_port: 8080 +curl: | + curl --request GET \ + --url http://127.0.0.1:8080/healthz \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-10.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-10.yaml new file mode 100644 index 00000000..413e726f --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-10.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/inventory?sku=BOOK-2&quantity=4 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:20Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:20 GMT' + Content-Type: application/json + Content-Length: 63 + body: '{"sku":"BOOK-2","quantity":4,"lane":"priority","reserved":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:20Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591160 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/inventory?sku=BOOK-2&quantity=4' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-11.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-11.yaml new file mode 100644 index 00000000..f8de11d0 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-11.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/inventory?sku=PEN-1&quantity=6 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:21Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:21 GMT' + Content-Type: application/json + Content-Length: 62 + body: '{"sku":"PEN-1","quantity":6,"lane":"standard","reserved":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:21Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591161 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/inventory?sku=PEN-1&quantity=6' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-12.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-12.yaml new file mode 100644 index 00000000..20db1cf7 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-12.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/invoice?customer=vip&subtotal=200 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:22Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:22 GMT' + Content-Type: application/json + Content-Length: 81 + body: '{"customer":"vip","subtotal":200,"discount":40,"total":160,"segment":"vip-large"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:22Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591162 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/invoice?customer=vip&subtotal=200' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-13.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-13.yaml new file mode 100644 index 00000000..bb817bd5 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-13.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-13 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/invoice?customer=vip&subtotal=250 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:23Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:23 GMT' + Content-Type: application/json + Content-Length: 81 + body: '{"customer":"vip","subtotal":250,"discount":40,"total":210,"segment":"vip-large"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:23Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591163 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/invoice?customer=vip&subtotal=250' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-14.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-14.yaml new file mode 100644 index 00000000..94e491f5 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-14.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-14 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/invoice?customer=guest&subtotal=70 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:24Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:24 GMT' + Content-Type: application/json + Content-Length: 79 + body: '{"customer":"guest","subtotal":70,"discount":0,"total":70,"segment":"standard"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:24Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591164 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/invoice?customer=guest&subtotal=70' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-2.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-2.yaml new file mode 100644 index 00000000..e24ac944 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-2.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/grade?score=95 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:12Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:12 GMT' + Content-Type: application/json + Content-Length: 46 + body: '{"score":95,"grade":"A","message":"excellent"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:12Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591152 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/grade?score=95' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-3.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-3.yaml new file mode 100644 index 00000000..8a3efd7d --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-3.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/grade?score=98 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:13Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:13 GMT' + Content-Type: application/json + Content-Length: 46 + body: '{"score":98,"grade":"A","message":"excellent"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:13Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591153 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/grade?score=98' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-4.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-4.yaml new file mode 100644 index 00000000..386fe604 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-4.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/grade?score=82 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:14Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:14 GMT' + Content-Type: application/json + Content-Length: 42 + body: '{"score":82,"grade":"B","message":"solid"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:14Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591154 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/grade?score=82' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-5.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-5.yaml new file mode 100644 index 00000000..dd496968 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-5.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/grade?score=42 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:15Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:15 GMT' + Content-Type: application/json + Content-Length: 42 + body: '{"score":42,"grade":"F","message":"retry"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:15Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591155 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/grade?score=42' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-6.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-6.yaml new file mode 100644 index 00000000..a3fff215 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-6.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/shipping?country=US&total=150 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:16Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:16 GMT' + Content-Type: application/json + Content-Length: 54 + body: '{"country":"US","total":150,"tier":"free","etaDays":2}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:16Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591156 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/shipping?country=US&total=150' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-7.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-7.yaml new file mode 100644 index 00000000..8024a0a6 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-7.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/shipping?country=US&total=175 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:17Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:17 GMT' + Content-Type: application/json + Content-Length: 54 + body: '{"country":"US","total":175,"tier":"free","etaDays":2}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:17Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591157 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/shipping?country=US&total=175' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-8.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-8.yaml new file mode 100644 index 00000000..82a15220 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-8.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/shipping?country=CA&total=60 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:18Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:18 GMT' + Content-Type: application/json + Content-Length: 62 + body: '{"country":"CA","total":60,"tier":"international","etaDays":9}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:18Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591158 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/shipping?country=CA&total=60' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/keploy/test-set-0/tests/test-9.yaml b/simple-java-dedup/keploy/test-set-0/tests/test-9.yaml new file mode 100644 index 00000000..d29ede34 --- /dev/null +++ b/simple-java-dedup/keploy/test-set-0/tests/test-9.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3-dev) +version: api.keploy.io/v1beta1 +kind: Http +name: test-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://127.0.0.1:8080/inventory?sku=BOOK-1&quantity=3 + header: + Host: '127.0.0.1:8080' + User-Agent: curl/8.19.0 + Accept: '*/*' + body: '' + timestamp: 2026-04-30T23:19:19Z + resp: + status_code: 200 + header: + Date: 'Thu, 30 Apr 2026 23:19:19 GMT' + Content-Type: application/json + Content-Length: 63 + body: '{"sku":"BOOK-1","quantity":3,"lane":"priority","reserved":true}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-04-30T23:19:19Z + objects: [] + assertions: + noise: + header.Date: [] + header.Content-Length: [] + created: 1777591159 + app_port: 8080 +curl: | + curl --request GET \ + --url 'http://127.0.0.1:8080/inventory?sku=BOOK-1&quantity=3' \ + --header 'Host: 127.0.0.1:8080' \ + --header 'User-Agent: curl/8.19.0' \ + --header 'Accept: */*' diff --git a/simple-java-dedup/pom.xml b/simple-java-dedup/pom.xml new file mode 100644 index 00000000..3acef6df --- /dev/null +++ b/simple-java-dedup/pom.xml @@ -0,0 +1,115 @@ + + + 4.0.0 + + io.keploy.samples + simple-java-dedup + 1.0.0 + jar + + simple-java-dedup + Small plain-Java sample for Keploy dynamic deduplication smoke tests. + + + 1.8 + 1.8 + UTF-8 + 0.8.12 + + + + simple-java-dedup + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + io.keploy.samples.simplededup.SimpleJavaDedupApplication + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + copy-jacoco-agent + package + + copy + + + + + org.jacoco + org.jacoco.agent + ${jacoco.version} + runtime + jar + ${project.build.directory} + jacocoagent.jar + + + + + + + + + + + + copy-keploy-agent + + + keploy.agent.version + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + copy-keploy-java-agent + package + + copy + + + + + io.keploy + keploy-sdk + ${keploy.agent.version} + ${project.build.directory} + keploy-sdk.jar + + + + + + + + + + + diff --git a/simple-java-dedup/src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java b/simple-java-dedup/src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java new file mode 100644 index 00000000..72e3aa9b --- /dev/null +++ b/simple-java-dedup/src/main/java/io/keploy/samples/simplededup/SimpleJavaDedupApplication.java @@ -0,0 +1,185 @@ +package io.keploy.samples.simplededup; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Executors; + +public final class SimpleJavaDedupApplication { + private SimpleJavaDedupApplication() { + } + + public static void main(String[] args) throws IOException { + int port = Integer.parseInt(System.getenv().getOrDefault("PORT", "8080")); + HttpServer server = HttpServer.create(new InetSocketAddress("0.0.0.0", port), 0); + server.createContext("/healthz", new HealthHandler()); + server.createContext("/grade", new GradeHandler()); + server.createContext("/shipping", new ShippingHandler()); + server.createContext("/inventory", new InventoryHandler()); + server.createContext("/invoice", new InvoiceHandler()); + server.setExecutor(Executors.newCachedThreadPool()); + server.start(); + System.out.println("simple-java-dedup listening on " + port); + } + + private static final class HealthHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + if (!"GET".equals(exchange.getRequestMethod())) { + respond(exchange, 405, "{\"error\":\"method_not_allowed\"}"); + return; + } + respond(exchange, 200, "{\"status\":\"ok\"}"); + } + } + + private static final class GradeHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + Map query = parseQuery(exchange.getRequestURI().getRawQuery()); + int score = parseInt(query.get("score"), 0); + String grade; + String message; + if (score >= 90) { + grade = "A"; + message = "excellent"; + } else if (score >= 75) { + grade = "B"; + message = "solid"; + } else if (score >= 50) { + grade = "C"; + message = "practice"; + } else { + grade = "F"; + message = "retry"; + } + respond(exchange, 200, "{\"score\":" + score + ",\"grade\":\"" + grade + "\",\"message\":\"" + message + "\"}"); + } + } + + private static final class ShippingHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + Map query = parseQuery(exchange.getRequestURI().getRawQuery()); + String country = query.getOrDefault("country", "US"); + int total = parseInt(query.get("total"), 0); + String tier; + int etaDays; + if (!"US".equalsIgnoreCase(country)) { + tier = "international"; + etaDays = 9; + } else if (total >= 100) { + tier = "free"; + etaDays = 2; + } else { + tier = "standard"; + etaDays = 5; + } + respond(exchange, 200, "{\"country\":\"" + country.toUpperCase() + "\",\"total\":" + total + ",\"tier\":\"" + tier + "\",\"etaDays\":" + etaDays + "}"); + } + } + + private static final class InventoryHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + Map query = parseQuery(exchange.getRequestURI().getRawQuery()); + String sku = query.getOrDefault("sku", "BOOK-1").toUpperCase(); + int quantity = parseInt(query.get("quantity"), 1); + String lane; + boolean reserved; + if (sku.startsWith("BOOK") && quantity <= 5) { + lane = "priority"; + reserved = true; + } else if (sku.startsWith("PEN") && quantity <= 10) { + lane = "standard"; + reserved = true; + } else { + lane = "manual-review"; + reserved = false; + } + respond(exchange, 200, "{\"sku\":\"" + sku + "\",\"quantity\":" + quantity + ",\"lane\":\"" + lane + "\",\"reserved\":" + reserved + "}"); + } + } + + private static final class InvoiceHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + Map query = parseQuery(exchange.getRequestURI().getRawQuery()); + String customer = query.getOrDefault("customer", "guest").toLowerCase(); + int subtotal = parseInt(query.get("subtotal"), 0); + int discount; + String segment; + if ("vip".equals(customer) && subtotal >= 200) { + discount = 40; + segment = "vip-large"; + } else if ("vip".equals(customer)) { + discount = 15; + segment = "vip"; + } else if (subtotal >= 100) { + discount = 10; + segment = "standard-large"; + } else { + discount = 0; + segment = "standard"; + } + int total = subtotal - discount; + respond(exchange, 200, "{\"customer\":\"" + customer + "\",\"subtotal\":" + subtotal + ",\"discount\":" + discount + ",\"total\":" + total + ",\"segment\":\"" + segment + "\"}"); + } + } + + private static Map parseQuery(String rawQuery) { + Map query = new HashMap(); + if (rawQuery == null || rawQuery.isEmpty()) { + return query; + } + String[] pairs = rawQuery.split("&"); + for (String pair : pairs) { + int equals = pair.indexOf('='); + if (equals < 0) { + query.put(decode(pair), ""); + } else { + query.put(decode(pair.substring(0, equals)), decode(pair.substring(equals + 1))); + } + } + return query; + } + + private static int parseInt(String value, int fallback) { + if (value == null || value.trim().isEmpty()) { + return fallback; + } + try { + return Integer.parseInt(value); + } catch (NumberFormatException ignored) { + return fallback; + } + } + + private static String decode(String value) { + try { + return URLDecoder.decode(value, StandardCharsets.UTF_8.name()); + } catch (Exception ignored) { + return value; + } + } + + private static void respond(HttpExchange exchange, int status, String body) throws IOException { + byte[] bytes = body.getBytes(StandardCharsets.UTF_8); + exchange.getResponseHeaders().set("Content-Type", "application/json"); + exchange.sendResponseHeaders(status, bytes.length); + OutputStream responseBody = exchange.getResponseBody(); + try { + responseBody.write(bytes); + } finally { + responseBody.close(); + } + } +} diff --git a/spring-aerospike/.gitignore b/spring-aerospike/.gitignore new file mode 100644 index 00000000..9401b3fa --- /dev/null +++ b/spring-aerospike/.gitignore @@ -0,0 +1,2 @@ +target/ +keploy/ diff --git a/spring-aerospike/Dockerfile b/spring-aerospike/Dockerfile new file mode 100644 index 00000000..4383858e --- /dev/null +++ b/spring-aerospike/Dockerfile @@ -0,0 +1,8 @@ +FROM eclipse-temurin:17-jdk +WORKDIR /app +RUN apt-get update && apt-get install -y maven && rm -rf /var/lib/apt/lists/* +COPY pom.xml /app/ +COPY src /app/src +RUN mvn -q -DskipTests package +EXPOSE 8090 +ENTRYPOINT ["java", "-jar", "target/spring-aerospike.jar"] diff --git a/spring-aerospike/README.md b/spring-aerospike/README.md new file mode 100644 index 00000000..dafeb9f3 --- /dev/null +++ b/spring-aerospike/README.md @@ -0,0 +1,144 @@ +# spring-aerospike — Aerospike-Java sample with Keploy record/replay + +A Spring Boot 2.7 service that talks to Aerospike CE over the +clear-text service port (3000) using the official +`aerospike-client-jdk8`. Recorded and replayed end-to-end with +Keploy via three bundled scripts that mirror the +`keploy/samples-go/aerospike-tls` shape one-to-one — same endpoints, +same test-set layout, same record-then-replay loop. + +What the sample demonstrates: + +* **Keploy records binary Aerospike protocol traffic** — Info, + AS_MSG (single-record PUT/GET/TOUCH/DELETE), BATCH_READ/WRITE, + SCAN, QUERY, UDF, CDT — and replays them from `mocks.yaml` + without needing the real cluster. +* **Replay stays deterministic at any concurrency the app exposes** — + single-client `/parallel`, multi-client round-robin, and per- + request fresh-client construction all pass cleanly. +* **A pipeline-friendly shape.** Three `scripts/script-{1,2,3}.sh` + entry points each record and replay one test-set independently, + so a CI matrix can call them as separate steps. + +## Layout + +``` +spring-aerospike/ +├── pom.xml # Spring Boot 2.7 + aerospike-client-jdk8 +├── src/main/java/com/example/aerospike/ +│ ├── SpringAerospikeApplication.java +│ ├── config/ # client + multi-client pool, warmup, policies +│ └── controller/ # one @RestController per endpoint group +├── src/main/resources/ +│ └── application.properties # port + Aerospike host/namespace/pool sizing +├── aerospike-conf/ +│ └── aerospike.conf # CE config: clear-text on 3000 +├── docker-compose.yml # Aerospike CE + the Spring Boot app +├── Dockerfile # eclipse-temurin 17 + mvn package +├── keploy.yml # Keploy CLI config (command, ports) +└── scripts/ + ├── common.sh # shared boot/build/record/replay/normalise + ├── script-1.sh # records + replays test-set-0 (CRUD) + ├── script-2.sh # records + replays test-set-1 (/parallel) + └── script-3.sh # records + replays test-set-2 (/multiclient + /freshclient) +``` + +There is no committed `keploy/` directory — the scripts produce it +from scratch every run. Each CI run validates the full +record-then-replay loop instead of replaying stale captures. + +## Endpoints + +| Method | Path | What it does | +| ------ | -------------------------- | ---------------------------------------------------------------------------- | +| GET | `/health` | `info build + namespaces` | +| POST | `/put` | single-record PUT | +| GET | `/get/{key}` | single-record GET | +| POST | `/batch/put` | sequential write loop | +| GET | `/batch/get?k=a&k=b` | BATCH_READ | +| POST | `/scan` | full namespace scan | +| POST | `/query` | secondary-index range query | +| POST | `/udf` | UDF_EXECUTE | +| POST | `/cdt/list/append` | CDT list append | +| POST | `/cdt/map/put` | CDT map put | +| POST | `/touch/{key}` | TOUCH | +| DELETE | `/key/{key}` | DELETE | +| POST | `/parallel?n=N&prefix=P` | fans out N threads, each PUT+GET on a unique key — **one shared client** | +| POST | `/multiclient?n=N&prefix=P`| same, but round-robins across **4 pre-built `AerospikeClient` instances** | +| POST | `/freshclient?n=N&prefix=P`| **each thread builds its own `AerospikeClient`** inside the request | + +## Run it manually + +```bash +# 1) Boot Aerospike CE on clear-text 3000. +docker compose up -d aerospike + +# 2) Build + run the Spring Boot app. +mvn -q -DskipTests package +java -jar target/spring-aerospike.jar + +# 3) Hit it. +curl -s localhost:8090/health +curl -s -XPOST localhost:8090/put -H 'Content-Type: application/json' \ + -d '{"key":"alice","bins":{"age":30}}' +curl -s localhost:8090/get/alice +curl -s -XPOST 'localhost:8090/parallel?n=24&prefix=run1' +curl -s -XPOST 'localhost:8090/multiclient?n=24&prefix=mc1' +curl -s -XPOST 'localhost:8090/freshclient?n=8&prefix=fc1' +``` + +## Record + replay with the scripts + +```bash +# Each script is self-contained: brings up Aerospike, builds the +# JAR, records, replays. Exit code is non-zero if any case fails on +# replay. +sudo ./scripts/script-1.sh # test-set-0: single-endpoint CRUD +sudo ./scripts/script-2.sh # test-set-1: /parallel n = 4..24 +sudo ./scripts/script-3.sh # test-set-2: /multiclient + /freshclient +``` + +Pipeline-friendly knobs (env vars): + +| Var | Default | What it does | +|--------------|---------------|---------------------------------------------------------------| +| `KEPLOY` | `sudo keploy` | binary + auth invocation. Override to `keploy` if root | +| `PORT` | `8090` | HTTP port the recorded sample listens on | +| `LOG_DIR` | `/tmp` | where to drop the keploy record log | +| `SKIP_DOCKER`| (unset) | `=1` skips `docker compose up -d aerospike` (already running) | +| `SKIP_BUILD` | (unset) | `=1` skips `mvn package` (JAR already in target/) | + +## Concurrency notes — why the warmup + retry matter + +Mocked replay through Keploy is roughly 10–20× faster than real +Aerospike for the same op. A burst of N concurrent threads on a +cold client pool then races to open N fresh sockets, and the +thread that loses the race surfaces as `MAX_RETRIES_EXCEEDED` at +the application — even though every peer in the same burst +succeeds. + +`AerospikeConfig` paints over this with four layered changes; +together they make `/parallel?n=24`, `/multiclient?n=24`, and +`/freshclient?n=8` replay clean on every run: + +1. **Sized pool** — `ClientPolicy.maxConnsPerNode = 256`. The + `OpeningConnectionThreshold` analogue is kept low (16) so a + sudden burst doesn't outpace upstream connect rate. +2. **Tolerant per-op policy** — `Policies.parallelWrite()` and + `Policies.parallelRead()` set `socketTimeout 10s`, `totalTimeout + 30s`, `maxRetries 10`, `sleepBetweenRetries 5ms`. +3. **Two-phase warmup** on the main client at startup: a sequential + prelude that walks the cluster past cold-start latencies, + followed by a parallel fill that puts idle connections in the + pool before the HTTP server accepts the first request. +4. **App-level retry wrapper** (`RetryHelper.doOp`) around each PUT + and GET in `/parallel`, `/multiclient`, and `/freshclient`. + +`/multiclient`'s extra clients are deliberately NOT warmed at +startup — a hundred concurrent dials at boot can stall a record- +time proxy. The retry wrapper covers their first burst instead. + +This sample is the Java counterpart of +[`keploy/samples-go/aerospike-tls`](https://github.com/keploy/samples-go/tree/main/aerospike-tls); +the script set is byte-for-byte the same shape so a single CI +matrix can drive both languages with the same harness. diff --git a/spring-aerospike/aerospike-conf/aerospike.conf b/spring-aerospike/aerospike-conf/aerospike.conf new file mode 100644 index 00000000..966fc2e1 --- /dev/null +++ b/spring-aerospike/aerospike-conf/aerospike.conf @@ -0,0 +1,45 @@ +# Aerospike CE config — clear-text on port 3000. + +service { + proto-fd-max 15000 + cluster-name spring-aerospike-sample +} + +logging { + console { + context any info + } +} + +network { + service { + address any + port 3000 + } + + heartbeat { + mode mesh + address local + port 3002 + interval 150 + timeout 10 + } + + fabric { + address local + port 3001 + } + + info { + port 3003 + } +} + +namespace test { + replication-factor 1 + default-ttl 30d + nsup-period 120 + storage-engine memory { + data-size 1G + } +} diff --git a/spring-aerospike/docker-compose.yml b/spring-aerospike/docker-compose.yml new file mode 100644 index 00000000..7eeef91b --- /dev/null +++ b/spring-aerospike/docker-compose.yml @@ -0,0 +1,42 @@ +# Aerospike CE on clear-text 3000 + the Spring Boot sample on 8090. +services: + aerospike: + image: aerospike/aerospike-server:7.2.0.1 + container_name: aerospike + networks: + - keploy-network + ports: + - "3000:3000" + volumes: + - ./aerospike-conf/aerospike.conf:/etc/aerospike/aerospike.conf:ro + entrypoint: ["/usr/bin/asd", "--foreground", "--config-file", "/etc/aerospike/aerospike.conf"] + command: [] + ulimits: + nofile: + soft: 65536 + hard: 65536 + healthcheck: + test: ["CMD", "asinfo", "-h", "127.0.0.1", "-p", "3000", "-v", "build"] + interval: 5s + timeout: 3s + retries: 20 + + app: + build: + context: . + dockerfile: Dockerfile + container_name: spring-aerospike + depends_on: + aerospike: + condition: service_healthy + environment: + AEROSPIKE_HOST: aerospike + AEROSPIKE_PORT: "3000" + LISTEN_PORT: "8090" + ports: + - "8090:8090" + networks: + - keploy-network + +networks: + keploy-network: diff --git a/spring-aerospike/keploy.yml b/spring-aerospike/keploy.yml new file mode 100644 index 00000000..283421a6 --- /dev/null +++ b/spring-aerospike/keploy.yml @@ -0,0 +1,51 @@ +path: "" +appId: 0 +appName: spring-aerospike +command: java -jar target/spring-aerospike.jar +templatize: + testSets: [] +port: 0 +dnsPort: 26789 +proxyPort: 16789 +incomingProxyPort: 36789 +debug: false +disableTele: false +disableANSI: false +containerName: "" +networkName: "" +buildDelay: 30 +test: + selectedTests: {} + globalNoise: + global: {} + test-sets: {} + delay: 15 + apiTimeout: 5 + skipCoverage: false + coverageReportPath: "" + ignoreOrdering: true + mongoPassword: default@123 + language: "" + removeUnusedMocks: false + fallBackOnMiss: false + jacocoAgentPath: "" + basePath: "" + mocking: true + ignoredTests: {} + strictMockWindow: true +record: + filters: [] + basePath: "" + recordTimer: 0s + metadata: "" + testCaseNaming: descriptive +report: + selectedTestSets: {} + showFullBody: false + reportPath: "" + summary: false + testCaseIDs: [] + format: "" +keployContainer: keploy-v3 +keployNetwork: keploy-network +cmdType: native diff --git a/spring-aerospike/pom.xml b/spring-aerospike/pom.xml new file mode 100644 index 00000000..e8641a33 --- /dev/null +++ b/spring-aerospike/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + + + + com.example + spring-aerospike + 0.0.1-SNAPSHOT + spring-aerospike + Aerospike-Java sample for Keploy record/replay + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + com.aerospike + aerospike-client-jdk8 + 9.0.5 + + + + + spring-aerospike + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/spring-aerospike/scripts/common.sh b/spring-aerospike/scripts/common.sh new file mode 100755 index 00000000..10276704 --- /dev/null +++ b/spring-aerospike/scripts/common.sh @@ -0,0 +1,157 @@ +#!/usr/bin/env bash +# Shared helpers for scripts/script-*.sh. +# +# Each script-N.sh sources this file and then calls: +# run_test_set +# where is a shell function that fires the HTTP requests +# the test-set should capture. +# +# Layered behaviour: +# - Boots Aerospike CE via docker compose if not already up. +# - Builds the Spring Boot JAR. +# - Starts `keploy record` in the background; waits for the app to +# answer /health before firing the curls. +# - SIGINTs keploy when curls are done. +# - Normalises the recorded test-set path to ./keploy/. +# - Adds `body.duration: []` to noise on any /parallel, /multiclient +# or /freshclient test (their responses carry wall-clock duration +# that drifts every run). +# - Replays the test-set and exits non-zero if any case fails. + +set -euo pipefail + +: "${KEPLOY:=sudo keploy}" +: "${PORT:=8090}" +: "${LOG_DIR:=/tmp}" +: "${SKIP_DOCKER:=}" +: "${SKIP_BUILD:=}" + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +bring_up_aerospike() { + [ -n "${SKIP_DOCKER:-}" ] && return 0 + echo "==> docker compose up -d aerospike" + docker compose up -d aerospike + for _ in $(seq 1 30); do + if docker compose ps aerospike --format '{{.Health}}' 2>/dev/null | grep -q healthy; then + return 0 + fi + sleep 2 + done + echo "ERROR: aerospike never reported healthy" >&2 + docker compose logs aerospike | tail -30 >&2 + return 1 +} + +build_app() { + [ -n "${SKIP_BUILD:-}" ] && return 0 + echo "==> mvn -q -DskipTests package" + mvn -q -DskipTests package +} + +wait_for_app_ready() { + echo "==> waiting for the sample to answer on :$PORT" + for _ in $(seq 1 120); do + if curl -sf -o /dev/null --max-time 1 "http://127.0.0.1:$PORT/health"; then + sleep 3 + return 0 + fi + sleep 1 + done + echo "ERROR: app never answered /health" >&2 + return 1 +} + +stop_keploy() { + sudo pkill -SIGINT keploy 2>/dev/null || true + for _ in $(seq 1 15); do + if ! pgrep -af "keploy record" >/dev/null 2>&1; then return 0; fi + sleep 1 + done + echo "WARN: keploy didn't exit on SIGINT, killing" + sudo pkill -KILL keploy 2>/dev/null || true +} + +# After record, keploy may have written ./keploy/keploy/test-set-N +# (nested) instead of ./keploy/test-set-N (flat), and it auto-numbers +# the fresh recording off whatever already exists under ./keploy/. +# Normalise: flatten the nested case, then rename whichever fresh +# test-set-* we got to the requested target. +normalise_recording() { + local target="$1" + if [ -d "./keploy/keploy" ]; then + sudo chown -R "$(id -u):$(id -g)" ./keploy/keploy + for d in ./keploy/keploy/test-set-*; do + [ -d "$d" ] || continue + mv "$d" "./keploy/" + done + rmdir ./keploy/keploy 2>/dev/null || true + fi + [ -d "./keploy/$target" ] && return 0 + + local newest="" newest_mtime=0 + for d in ./keploy/test-set-*; do + [ -d "$d" ] || continue + local m + m=$(stat -c %Y "$d") + if [ "$m" -gt "$newest_mtime" ]; then + newest="$d"; newest_mtime="$m" + fi + done + if [ -n "$newest" ]; then + mv "$newest" "./keploy/$target" + return 0 + fi + echo "ERROR: $target was not recorded — check $LOG_DIR/keploy-record-$target.log" >&2 + return 1 +} + +apply_duration_noise() { + local target="$1" + local applied=0 + for f in ./keploy/"$target"/tests/post-parallel-*.yaml \ + ./keploy/"$target"/tests/post-multiclient-*.yaml \ + ./keploy/"$target"/tests/post-freshclient-*.yaml; do + [ -e "$f" ] || continue + if ! grep -q "body.duration:" "$f"; then + sed -i 's|header.Date: \[\]|header.Date: []\n body.duration: []|' "$f" + applied=$((applied+1)) + fi + done + [ "$applied" -gt 0 ] && echo "==> applied body.duration noise to $applied test(s)" + return 0 +} + +run_test_set() { + local target="$1" + local curl_fn="$2" + + bring_up_aerospike + build_app + + echo "==> clearing any stale ./keploy/$target" + sudo rm -rf "./keploy/$target" + + local log="$LOG_DIR/keploy-record-$target.log" + echo "==> starting keploy record (logging to $log)" + $KEPLOY record > "$log" 2>&1 & + local keploy_pid=$! + trap 'stop_keploy' EXIT + + wait_for_app_ready + echo "==> firing curls for $target" + $curl_fn + sleep 3 + + echo "==> stopping keploy record" + stop_keploy + trap - EXIT + wait "$keploy_pid" 2>/dev/null || true + + normalise_recording "$target" + apply_duration_noise "$target" + + echo "==> $KEPLOY test --test-sets $target" + $KEPLOY test --test-sets "$target" +} diff --git a/spring-aerospike/scripts/script-1.sh b/spring-aerospike/scripts/script-1.sh new file mode 100755 index 00000000..4c4c74ea --- /dev/null +++ b/spring-aerospike/scripts/script-1.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# script-1.sh — record + replay test-set-0. +# +# Captures the single-endpoint CRUD coverage: +# GET /health POST /put GET /get POST /batch/put GET /batch/get +# POST /touch DELETE /key + +set -euo pipefail +source "$(dirname "$0")/common.sh" + +curls_test_set_0() { + curl -sf -o /dev/null "http://127.0.0.1:$PORT/health" + sleep 1 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/put" \ + -H 'Content-Type: application/json' \ + -d '{"key":"alice","bins":{"age":30,"name":"Alice"}}' + sleep 1 + curl -sf -o /dev/null "http://127.0.0.1:$PORT/get/alice" + sleep 1 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/batch/put" \ + -H 'Content-Type: application/json' \ + -d '[{"key":"a","bins":{"n":1}},{"key":"b","bins":{"n":2}}]' + sleep 1 + curl -s -o /dev/null "http://127.0.0.1:$PORT/batch/get?k=a&k=b" || true + sleep 1 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/touch/alice" + sleep 1 + curl -sf -o /dev/null -XDELETE "http://127.0.0.1:$PORT/key/alice" +} + +run_test_set test-set-0 curls_test_set_0 diff --git a/spring-aerospike/scripts/script-2.sh b/spring-aerospike/scripts/script-2.sh new file mode 100755 index 00000000..ecee9ce4 --- /dev/null +++ b/spring-aerospike/scripts/script-2.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# script-2.sh — record + replay test-set-1: /parallel n = 4..24. + +set -euo pipefail +source "$(dirname "$0")/common.sh" + +curls_test_set_1() { + curl -sf -o /dev/null "http://127.0.0.1:$PORT/health" + sleep 1 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/parallel?n=4&prefix=run1" + sleep 2 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/parallel?n=8&prefix=run2" + sleep 2 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/parallel?n=12&prefix=run3" + sleep 2 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/parallel?n=24&prefix=run4" +} + +run_test_set test-set-1 curls_test_set_1 diff --git a/spring-aerospike/scripts/script-3.sh b/spring-aerospike/scripts/script-3.sh new file mode 100755 index 00000000..c49a5bb0 --- /dev/null +++ b/spring-aerospike/scripts/script-3.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# script-3.sh — record + replay test-set-2: /multiclient + /freshclient. + +set -euo pipefail +source "$(dirname "$0")/common.sh" + +curls_test_set_2() { + curl -sf -o /dev/null "http://127.0.0.1:$PORT/health" + sleep 1 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/multiclient?n=4&prefix=mc1" + sleep 2 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/multiclient?n=8&prefix=mc2" + sleep 2 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/multiclient?n=12&prefix=mc3" + sleep 2 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/multiclient?n=24&prefix=mc4" + sleep 3 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/freshclient?n=4&prefix=fc1" + sleep 3 + curl -sf -o /dev/null -XPOST "http://127.0.0.1:$PORT/freshclient?n=8&prefix=fc2" +} + +run_test_set test-set-2 curls_test_set_2 diff --git a/spring-aerospike/src/main/java/com/example/aerospike/SpringAerospikeApplication.java b/spring-aerospike/src/main/java/com/example/aerospike/SpringAerospikeApplication.java new file mode 100644 index 00000000..a8e751d6 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/SpringAerospikeApplication.java @@ -0,0 +1,11 @@ +package com.example.aerospike; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringAerospikeApplication { + public static void main(String[] args) { + SpringApplication.run(SpringAerospikeApplication.class, args); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/config/AerospikeConfig.java b/spring-aerospike/src/main/java/com/example/aerospike/config/AerospikeConfig.java new file mode 100644 index 00000000..b9ca17a9 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/config/AerospikeConfig.java @@ -0,0 +1,125 @@ +package com.example.aerospike.config; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.Host; +import com.aerospike.client.Key; +import com.aerospike.client.policy.ClientPolicy; +import com.aerospike.client.policy.Policy; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Builds the main Aerospike client used by every controller, plus a small + * bank of 4 additional clients that {@code /multiclient} round-robins over. + * + *

Mirrors the Go sample's main.go: same pool sizing, same warmup + * shape — sequential prelude to walk the proxy past cold-start TLS, + * then a parallel fill to actually populate the pool so the first + * {@code /parallel} burst hits warm connections. + */ +@Configuration +public class AerospikeConfig implements DisposableBean { + + private static final Logger log = LoggerFactory.getLogger(AerospikeConfig.class); + + private final AerospikeProperties props; + private AerospikeClient main; + private List multi; + + public AerospikeConfig(AerospikeProperties props) { + this.props = props; + } + + public ClientPolicy buildClientPolicy() { + ClientPolicy policy = new ClientPolicy(); + // Pin to seed: single-node CE setups don't have peers worth + // discovering and the discovery loop just adds noise. + policy.failIfNotConnected = true; + policy.connPoolsPerNode = 1; + policy.maxConnsPerNode = props.getConnectionQueueSize(); + policy.asyncMaxConnsPerNode = props.getConnectionQueueSize(); + // Hold concurrent-open low so a burst doesn't outpace stunnel / + // the proxy's TLS handshake rate. The Go sample uses the same + // 16 ceiling for the same reason. + policy.asyncMaxConnsPerNode = props.getOpeningConnectionThreshold(); + return policy; + } + + @Bean + public AerospikeClient aerospikeClient() { + ClientPolicy policy = buildClientPolicy(); + Host host = new Host(props.getHost(), props.getPort()); + main = new AerospikeClient(policy, host); + warmup(main, props.getWarmup().getSequential(), props.getWarmup().getParallel()); + return main; + } + + @Bean + public List multiAerospikeClients() { + ClientPolicy policy = buildClientPolicy(); + Host host = new Host(props.getHost(), props.getPort()); + List bank = new ArrayList<>(4); + for (int i = 0; i < 4; i++) { + bank.add(new AerospikeClient(policy, host)); + } + multi = Collections.unmodifiableList(bank); + return multi; + } + + /** + * Issues {@code seq} sequential Exists round-trips followed by + * {@code par} concurrent ones. The sequential leg walks the proxy + * past cold-start latency; the parallel leg actually puts {@code par} + * idle connections into the pool. Without phase 2, only a single + * connection ever sits in the pool because the Aerospike client + * returns a used connection to the next op's acquirer. + */ + private void warmup(AerospikeClient client, int seq, int par) { + Policy pol = new Policy(); + pol.socketTimeout = 10_000; + pol.totalTimeout = 30_000; + pol.maxRetries = 5; + pol.sleepBetweenRetries = 5; + try { + for (int i = 0; i < seq; i++) { + Key k = new Key(props.getNamespace(), props.getSet(), "warmup-seq-" + i); + client.exists(pol, k); + } + if (par > 0) { + Thread[] threads = new Thread[par]; + for (int i = 0; i < par; i++) { + final int idx = i; + threads[i] = new Thread(() -> { + try { + Key k = new Key(props.getNamespace(), props.getSet(), + "warmup-par-" + idx); + client.exists(pol, k); + } catch (Throwable t) { + // warmup is best-effort; the retry wrappers in /parallel + // cover any pool slot that didn't make it. + } + }); + threads[i].start(); + } + for (Thread t : threads) { + t.join(); + } + } + } catch (Throwable t) { + log.warn("warmup failed (non-fatal): {}", t.toString()); + } + } + + @Override + public void destroy() { + if (main != null) main.close(); + if (multi != null) multi.forEach(AerospikeClient::close); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/config/AerospikeProperties.java b/spring-aerospike/src/main/java/com/example/aerospike/config/AerospikeProperties.java new file mode 100644 index 00000000..98de037d --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/config/AerospikeProperties.java @@ -0,0 +1,40 @@ +package com.example.aerospike.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "aerospike") +public class AerospikeProperties { + private String host = "127.0.0.1"; + private int port = 3000; + private String namespace = "test"; + private String set = "demo"; + private int connectionQueueSize = 256; + private int openingConnectionThreshold = 16; + private Warmup warmup = new Warmup(); + + public String getHost() { return host; } + public void setHost(String host) { this.host = host; } + public int getPort() { return port; } + public void setPort(int port) { this.port = port; } + public String getNamespace() { return namespace; } + public void setNamespace(String namespace) { this.namespace = namespace; } + public String getSet() { return set; } + public void setSet(String set) { this.set = set; } + public int getConnectionQueueSize() { return connectionQueueSize; } + public void setConnectionQueueSize(int v) { this.connectionQueueSize = v; } + public int getOpeningConnectionThreshold() { return openingConnectionThreshold; } + public void setOpeningConnectionThreshold(int v) { this.openingConnectionThreshold = v; } + public Warmup getWarmup() { return warmup; } + public void setWarmup(Warmup warmup) { this.warmup = warmup; } + + public static class Warmup { + private int sequential = 8; + private int parallel = 32; + public int getSequential() { return sequential; } + public void setSequential(int v) { this.sequential = v; } + public int getParallel() { return parallel; } + public void setParallel(int v) { this.parallel = v; } + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/config/Policies.java b/spring-aerospike/src/main/java/com/example/aerospike/config/Policies.java new file mode 100644 index 00000000..753110a2 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/config/Policies.java @@ -0,0 +1,33 @@ +package com.example.aerospike.config; + +import com.aerospike.client.policy.Policy; +import com.aerospike.client.policy.WritePolicy; + +/** + * Per-op policy helpers used by /parallel, /multiclient, /freshclient + * to ride out the cold-pool burst the Go sample's parallelWrite/Read + * policies were tuned for. Generous timeouts + retries + sleep gives + * the pool time to recycle connections across cooperative goroutine- + * equivalents (threads). + */ +public final class Policies { + private Policies() {} + + public static WritePolicy parallelWrite() { + WritePolicy p = new WritePolicy(); + p.socketTimeout = 10_000; + p.totalTimeout = 30_000; + p.maxRetries = 10; + p.sleepBetweenRetries = 5; + return p; + } + + public static Policy parallelRead() { + Policy p = new Policy(); + p.socketTimeout = 10_000; + p.totalTimeout = 30_000; + p.maxRetries = 10; + p.sleepBetweenRetries = 5; + return p; + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/controller/AdvancedController.java b/spring-aerospike/src/main/java/com/example/aerospike/controller/AdvancedController.java new file mode 100644 index 00000000..a0cbf320 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/controller/AdvancedController.java @@ -0,0 +1,82 @@ +package com.example.aerospike.controller; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.Key; +import com.aerospike.client.Record; +import com.aerospike.client.Value; +import com.aerospike.client.cdt.ListOperation; +import com.aerospike.client.cdt.MapOperation; +import com.aerospike.client.cdt.MapPolicy; +import com.aerospike.client.query.Filter; +import com.aerospike.client.query.RecordSet; +import com.aerospike.client.query.Statement; +import com.example.aerospike.config.AerospikeProperties; +import com.example.aerospike.dto.PutRequest; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * The four extra endpoints that the Go sample carries — /scan, + * /query, /udf, /cdt/list/append, /cdt/map/put. The scripts don't + * exercise these, but ports of the Go sample include them for parity. + */ +@RestController +public class AdvancedController { + + private final AerospikeClient client; + private final AerospikeProperties props; + + public AdvancedController(AerospikeClient client, AerospikeProperties props) { + this.client = client; + this.props = props; + } + + @PostMapping("/scan") + public Map scan() { + int[] count = {0}; + client.scanAll(null, props.getNamespace(), props.getSet(), (key, record) -> count[0]++); + return Map.of("scanned", count[0]); + } + + @PostMapping("/query") + public Map query() { + Statement stmt = new Statement(); + stmt.setNamespace(props.getNamespace()); + stmt.setSetName(props.getSet()); + stmt.setFilter(Filter.range("age", 0, 99)); + int count = 0; + try (RecordSet rs = client.query(null, stmt)) { + while (rs.next()) { + count++; + } + } + return Map.of("matched", count); + } + + @PostMapping("/udf") + public Map udf(@RequestBody PutRequest req) { + Key k = new Key(props.getNamespace(), props.getSet(), req.getKey()); + Object out = client.execute(null, k, "transform", "apply", Value.get("bin"), Value.get(1)); + return Map.of("result", out == null ? "null" : out.toString()); + } + + @PostMapping("/cdt/list/append") + public Map cdtListAppend(@RequestBody PutRequest req) { + Key k = new Key(props.getNamespace(), props.getSet(), req.getKey()); + Object v = req.getBins() == null ? null : req.getBins().get("value"); + client.operate(null, k, ListOperation.append("items", Value.get(v))); + return Map.of("status", "appended"); + } + + @PostMapping("/cdt/map/put") + public Map cdtMapPut(@RequestBody PutRequest req) { + Key k = new Key(props.getNamespace(), props.getSet(), req.getKey()); + Map bins = req.getBins() == null ? new HashMap<>() : req.getBins(); + Value mapKey = Value.get(bins.get("mapKey")); + Value mapVal = Value.get(bins.get("mapVal")); + client.operate(null, k, MapOperation.put(MapPolicy.Default, "mapBin", mapKey, mapVal)); + return Map.of("status", "put"); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/controller/CrudController.java b/spring-aerospike/src/main/java/com/example/aerospike/controller/CrudController.java new file mode 100644 index 00000000..9ec8d328 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/controller/CrudController.java @@ -0,0 +1,95 @@ +package com.example.aerospike.controller; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.AerospikeException; +import com.aerospike.client.Bin; +import com.aerospike.client.Key; +import com.aerospike.client.Record; +import com.example.aerospike.config.AerospikeProperties; +import com.example.aerospike.dto.PutRequest; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +public class CrudController { + + private final AerospikeClient client; + private final AerospikeProperties props; + + public CrudController(AerospikeClient client, AerospikeProperties props) { + this.client = client; + this.props = props; + } + + @PostMapping("/put") + public Map put(@RequestBody PutRequest req) { + Key k = new Key(props.getNamespace(), props.getSet(), req.getKey()); + Bin[] bins = toBins(req.getBins()); + client.put(null, k, bins); + return Map.of("status", "ok"); + } + + @GetMapping("/get/{key}") + public Map get(@PathVariable("key") String key) { + Key k = new Key(props.getNamespace(), props.getSet(), key); + Record rec = client.get(null, k); + if (rec == null) { + throw new AerospikeException("record not found: " + key); + } + return rec.bins; + } + + @PostMapping("/batch/put") + public Map batchPut(@RequestBody List body) { + for (PutRequest p : body) { + Key k = new Key(props.getNamespace(), props.getSet(), p.getKey()); + client.put(null, k, toBins(p.getBins())); + } + return Map.of("written", body.size()); + } + + @GetMapping("/batch/get") + public List> batchGet(@RequestParam("k") List keys) { + Key[] batch = new Key[keys.size()]; + for (int i = 0; i < keys.size(); i++) { + batch[i] = new Key(props.getNamespace(), props.getSet(), keys.get(i)); + } + Record[] records = client.get(null, batch); + List> out = new ArrayList<>(records.length); + for (Record r : records) { + out.add(r == null ? null : r.bins); + } + return out; + } + + private static Bin[] toBins(Map bins) { + if (bins == null) return new Bin[0]; + Bin[] out = new Bin[bins.size()]; + int i = 0; + for (Map.Entry e : bins.entrySet()) { + out[i++] = toBin(e.getKey(), e.getValue()); + } + return out; + } + + /** + * Coerce JSON-decoded values into Aerospike Bin values. The + * Aerospike Java client's Bin constructor is overloaded but + * doesn't accept {@code Number} — pick the concrete numeric type + * Jackson handed us (Integer / Long / Double) and unwrap. + */ + static Bin toBin(String name, Object value) { + if (value instanceof Integer) return new Bin(name, (Integer) value); + if (value instanceof Long) return new Bin(name, (Long) value); + if (value instanceof Double) return new Bin(name, (Double) value); + if (value instanceof Float) return new Bin(name, (Float) value); + if (value instanceof Boolean) return new Bin(name, ((Boolean) value) ? 1 : 0); + if (value instanceof List) return new Bin(name, (List) value); + if (value instanceof Map) return new Bin(name, (Map) value); + return new Bin(name, value == null ? null : value.toString()); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/controller/FreshClientController.java b/spring-aerospike/src/main/java/com/example/aerospike/controller/FreshClientController.java new file mode 100644 index 00000000..db067f3a --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/controller/FreshClientController.java @@ -0,0 +1,101 @@ +package com.example.aerospike.controller; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.Bin; +import com.aerospike.client.Host; +import com.aerospike.client.Key; +import com.aerospike.client.Record; +import com.aerospike.client.policy.ClientPolicy; +import com.aerospike.client.policy.Policy; +import com.aerospike.client.policy.WritePolicy; +import com.example.aerospike.config.AerospikeConfig; +import com.example.aerospike.config.AerospikeProperties; +import com.example.aerospike.config.Policies; +import com.example.aerospike.util.RetryHelper; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.concurrent.*; + +@RestController +public class FreshClientController { + + private final AerospikeConfig config; + private final AerospikeProperties props; + private final WritePolicy wp = Policies.parallelWrite(); + private final Policy rp = Policies.parallelRead(); + private final Semaphore concurrencyCap = new Semaphore(4); + + public FreshClientController(AerospikeConfig config, AerospikeProperties props) { + this.config = config; + this.props = props; + } + + @PostMapping("/freshclient") + public Map freshClient(@RequestParam(value = "n", defaultValue = "4") int n, + @RequestParam(value = "prefix", defaultValue = "fc") String prefix) { + if (n <= 0) n = 4; + if (n > 16) n = 16; + + ClientPolicy cp = config.buildClientPolicy(); + Host host = new Host(props.getHost(), props.getPort()); + + ExecutorService pool = Executors.newFixedThreadPool(n); + Map[] out = new Map[n]; + CountDownLatch done = new CountDownLatch(n); + long start = System.nanoTime(); + for (int i = 0; i < n; i++) { + final int idx = i; + pool.submit(() -> { + try { + concurrencyCap.acquire(); + try { + String key = prefix + "-" + idx; + try (AerospikeClient c = new AerospikeClient(cp, host)) { + Key k = new Key(props.getNamespace(), props.getSet(), key); + Bin[] bins = { new Bin("idx", idx), new Bin("tag", prefix) }; + try { + RetryHelper.doOp(5, 10, () -> c.put(wp, k, bins)); + } catch (Exception e) { + out[idx] = Map.of("key", key, "error", "put: " + e.getMessage()); + return; + } + Record[] recRef = new Record[1]; + try { + RetryHelper.doOp(5, 10, () -> recRef[0] = c.get(rp, k)); + } catch (Exception e) { + out[idx] = Map.of("key", key, "error", "get: " + e.getMessage()); + return; + } + out[idx] = recRef[0] == null + ? Map.of("key", key, "error", "get: record not found") + : Map.of("key", key, "bins", recRef[0].bins); + } catch (Exception e) { + out[idx] = Map.of("key", key, "error", "newclient: " + e.getMessage()); + } + } finally { + concurrencyCap.release(); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + done.countDown(); + } + }); + } + try { + done.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + pool.shutdown(); + long durNanos = System.nanoTime() - start; + return Map.of( + "workers", n, + "prefix", prefix, + "concurrency", 4, + "duration", String.format("%.6fms", durNanos / 1_000_000.0), + "results", Arrays.asList(out) + ); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/controller/HealthController.java b/spring-aerospike/src/main/java/com/example/aerospike/controller/HealthController.java new file mode 100644 index 00000000..08e44def --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/controller/HealthController.java @@ -0,0 +1,26 @@ +package com.example.aerospike.controller; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.cluster.Node; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +public class HealthController { + private final AerospikeClient client; + + public HealthController(AerospikeClient client) { + this.client = client; + } + + @GetMapping("/health") + public Map health() { + Node[] nodes = client.getNodes(); + return Map.of( + "nodes", nodes.length, + "namespaces", "test" + ); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/controller/MaintenanceController.java b/spring-aerospike/src/main/java/com/example/aerospike/controller/MaintenanceController.java new file mode 100644 index 00000000..62376559 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/controller/MaintenanceController.java @@ -0,0 +1,34 @@ +package com.example.aerospike.controller; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.Key; +import com.example.aerospike.config.AerospikeProperties; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +public class MaintenanceController { + + private final AerospikeClient client; + private final AerospikeProperties props; + + public MaintenanceController(AerospikeClient client, AerospikeProperties props) { + this.client = client; + this.props = props; + } + + @PostMapping("/touch/{key}") + public Map touch(@PathVariable("key") String key) { + Key k = new Key(props.getNamespace(), props.getSet(), key); + client.touch(null, k); + return Map.of("status", "touched"); + } + + @DeleteMapping("/key/{key}") + public Map delete(@PathVariable("key") String key) { + Key k = new Key(props.getNamespace(), props.getSet(), key); + boolean deleted = client.delete(null, k); + return Map.of("deleted", deleted); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/controller/MultiClientController.java b/spring-aerospike/src/main/java/com/example/aerospike/controller/MultiClientController.java new file mode 100644 index 00000000..0a4e9ca1 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/controller/MultiClientController.java @@ -0,0 +1,88 @@ +package com.example.aerospike.controller; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.Bin; +import com.aerospike.client.Key; +import com.aerospike.client.Record; +import com.aerospike.client.policy.Policy; +import com.aerospike.client.policy.WritePolicy; +import com.example.aerospike.config.AerospikeProperties; +import com.example.aerospike.config.Policies; +import com.example.aerospike.util.RetryHelper; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.concurrent.*; + +@RestController +public class MultiClientController { + + private final List clients; + private final AerospikeProperties props; + private final WritePolicy wp = Policies.parallelWrite(); + private final Policy rp = Policies.parallelRead(); + + public MultiClientController(List multiAerospikeClients, + AerospikeProperties props) { + this.clients = multiAerospikeClients; + this.props = props; + } + + @PostMapping("/multiclient") + public Map multiClient(@RequestParam(value = "n", defaultValue = "8") int n, + @RequestParam(value = "prefix", defaultValue = "mc") String prefix) { + if (clients.isEmpty()) { + throw new IllegalStateException("no multi-clients configured"); + } + if (n <= 0) n = 8; + if (n > 128) n = 128; + + ExecutorService pool = Executors.newFixedThreadPool(n); + Map[] out = new Map[n]; + CountDownLatch done = new CountDownLatch(n); + long start = System.nanoTime(); + for (int i = 0; i < n; i++) { + final int idx = i; + final AerospikeClient c = clients.get(i % clients.size()); + pool.submit(() -> { + try { + String key = prefix + "-" + idx; + Key k = new Key(props.getNamespace(), props.getSet(), key); + Bin[] bins = { new Bin("idx", idx), new Bin("tag", prefix) }; + try { + RetryHelper.doOp(5, 10, () -> c.put(wp, k, bins)); + } catch (Exception e) { + out[idx] = Map.of("key", key, "error", "put: " + e.getMessage()); + return; + } + Record[] recRef = new Record[1]; + try { + RetryHelper.doOp(5, 10, () -> recRef[0] = c.get(rp, k)); + } catch (Exception e) { + out[idx] = Map.of("key", key, "error", "get: " + e.getMessage()); + return; + } + out[idx] = recRef[0] == null + ? Map.of("key", key, "error", "get: record not found") + : Map.of("key", key, "bins", recRef[0].bins); + } finally { + done.countDown(); + } + }); + } + try { + done.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + pool.shutdown(); + long durNanos = System.nanoTime() - start; + return Map.of( + "workers", n, + "prefix", prefix, + "clients", clients.size(), + "duration", String.format("%.6fms", durNanos / 1_000_000.0), + "results", Arrays.asList(out) + ); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/controller/ParallelController.java b/spring-aerospike/src/main/java/com/example/aerospike/controller/ParallelController.java new file mode 100644 index 00000000..7fd8410f --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/controller/ParallelController.java @@ -0,0 +1,88 @@ +package com.example.aerospike.controller; + +import com.aerospike.client.AerospikeClient; +import com.aerospike.client.Bin; +import com.aerospike.client.Key; +import com.aerospike.client.Record; +import com.aerospike.client.policy.Policy; +import com.aerospike.client.policy.WritePolicy; +import com.example.aerospike.config.AerospikeProperties; +import com.example.aerospike.config.Policies; +import com.example.aerospike.util.RetryHelper; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.concurrent.*; + +@RestController +public class ParallelController { + + private final AerospikeClient client; + private final AerospikeProperties props; + private final WritePolicy wp = Policies.parallelWrite(); + private final Policy rp = Policies.parallelRead(); + + public ParallelController(AerospikeClient client, AerospikeProperties props) { + this.client = client; + this.props = props; + } + + @PostMapping("/parallel") + public Map parallel(@RequestParam(value = "n", defaultValue = "8") int n, + @RequestParam(value = "prefix", defaultValue = "p") String prefix) { + if (n <= 0) n = 8; + if (n > 128) n = 128; + return runBurst(n, prefix, client); + } + + Map runBurst(int n, String prefix, AerospikeClient client) { + ExecutorService pool = Executors.newFixedThreadPool(n); + Map[] out = new Map[n]; + CountDownLatch done = new CountDownLatch(n); + long start = System.nanoTime(); + for (int i = 0; i < n; i++) { + final int idx = i; + pool.submit(() -> { + try { + String key = prefix + "-" + idx; + Key k = new Key(props.getNamespace(), props.getSet(), key); + Bin[] bins = new Bin[] { + new Bin("idx", idx), + new Bin("tag", prefix), + }; + try { + RetryHelper.doOp(5, 10, () -> client.put(wp, k, bins)); + } catch (Exception e) { + out[idx] = Map.of("key", key, "error", "put: " + e.getMessage()); + return; + } + Record[] recRef = new Record[1]; + try { + RetryHelper.doOp(5, 10, () -> recRef[0] = client.get(rp, k)); + } catch (Exception e) { + out[idx] = Map.of("key", key, "error", "get: " + e.getMessage()); + return; + } + out[idx] = recRef[0] == null + ? Map.of("key", key, "error", "get: record not found") + : Map.of("key", key, "bins", recRef[0].bins); + } finally { + done.countDown(); + } + }); + } + try { + done.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + pool.shutdown(); + long durNanos = System.nanoTime() - start; + return Map.of( + "workers", n, + "prefix", prefix, + "duration", String.format("%.6fms", durNanos / 1_000_000.0), + "results", Arrays.asList(out) + ); + } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/dto/PutRequest.java b/spring-aerospike/src/main/java/com/example/aerospike/dto/PutRequest.java new file mode 100644 index 00000000..67834e6f --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/dto/PutRequest.java @@ -0,0 +1,13 @@ +package com.example.aerospike.dto; + +import java.util.Map; + +public class PutRequest { + private String key; + private Map bins; + + public String getKey() { return key; } + public void setKey(String key) { this.key = key; } + public Map getBins() { return bins; } + public void setBins(Map bins) { this.bins = bins; } +} diff --git a/spring-aerospike/src/main/java/com/example/aerospike/util/RetryHelper.java b/spring-aerospike/src/main/java/com/example/aerospike/util/RetryHelper.java new file mode 100644 index 00000000..b0aa0ff7 --- /dev/null +++ b/spring-aerospike/src/main/java/com/example/aerospike/util/RetryHelper.java @@ -0,0 +1,39 @@ +package com.example.aerospike.util; + +/** + * App-level retry wrapper for /parallel, /multiclient, /freshclient. + * Mirrors the Go sample's parallelDo: attempts the operation up to + * {@code attempts} times with {@code backoffMs} between attempts. + * The Aerospike client's MaxRetries handles per-op connection retries, + * but this outer loop gives the pool more time to recycle connections + * returned by cooperative threads in the same burst. + */ +public final class RetryHelper { + private RetryHelper() {} + + @FunctionalInterface + public interface ThrowingOp { + void run() throws Exception; + } + + public static void doOp(int attempts, int backoffMs, ThrowingOp op) throws Exception { + Exception last = null; + for (int i = 0; i < attempts; i++) { + try { + op.run(); + return; + } catch (Exception e) { + last = e; + if (backoffMs > 0) { + try { + Thread.sleep(backoffMs); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw ie; + } + } + } + } + throw last; + } +} diff --git a/spring-aerospike/src/main/resources/application.properties b/spring-aerospike/src/main/resources/application.properties new file mode 100644 index 00000000..b9336b61 --- /dev/null +++ b/spring-aerospike/src/main/resources/application.properties @@ -0,0 +1,14 @@ +server.port=${LISTEN_PORT:8090} + +aerospike.host=${AEROSPIKE_HOST:127.0.0.1} +aerospike.port=${AEROSPIKE_PORT:3000} +aerospike.namespace=test +aerospike.set=demo +aerospike.connection-queue-size=256 +aerospike.opening-connection-threshold=16 +aerospike.warmup.sequential=8 +aerospike.warmup.parallel=32 + +# Quiet down Spring's banner noise; keploy log capture parses well-formed lines. +spring.main.banner-mode=off +logging.level.root=INFO diff --git a/spring-boot-product-catalog/.dockerignore b/spring-boot-product-catalog/.dockerignore new file mode 100644 index 00000000..91c89b03 --- /dev/null +++ b/spring-boot-product-catalog/.dockerignore @@ -0,0 +1,6 @@ +target/ +keploy/ +.git/ +.idea/ +*.iml +HELP.md diff --git a/spring-boot-product-catalog/.gitattributes b/spring-boot-product-catalog/.gitattributes new file mode 100644 index 00000000..3b41682a --- /dev/null +++ b/spring-boot-product-catalog/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/spring-boot-product-catalog/.gitignore b/spring-boot-product-catalog/.gitignore new file mode 100644 index 00000000..553d239d --- /dev/null +++ b/spring-boot-product-catalog/.gitignore @@ -0,0 +1,37 @@ +target/ +.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +# keploy runtime artifacts +agent-debug.log +**/agent-debug.log +docker-compose-tmp.yaml diff --git a/spring-boot-product-catalog/.mvn/wrapper/maven-wrapper.properties b/spring-boot-product-catalog/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..216df058 --- /dev/null +++ b/spring-boot-product-catalog/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip diff --git a/spring-boot-product-catalog/Dockerfile b/spring-boot-product-catalog/Dockerfile new file mode 100644 index 00000000..e2fedcb0 --- /dev/null +++ b/spring-boot-product-catalog/Dockerfile @@ -0,0 +1,26 @@ +# syntax=docker/dockerfile:1 + +# ---- Build stage: compile & package with a pinned JDK 21 (reproducible on any host) ---- +FROM eclipse-temurin:21-jdk AS build +WORKDIR /app + +# Copy the Maven wrapper first so dependency resolution can be cached. +COPY .mvn/ .mvn/ +COPY mvnw pom.xml ./ +RUN ./mvnw -B -q dependency:go-offline + +# Now copy sources and build the fat jar (skip tests — they need a live DB). +COPY src ./src +RUN ./mvnw -B -q -DskipTests clean package + +# ---- Run stage: slim JRE image ---- +FROM eclipse-temurin:21-jre +WORKDIR /app +# curl is used by the docker-compose healthcheck. Also create a non-root user to run the JVM. +RUN apt-get update && apt-get install -y --no-install-recommends curl \ + && rm -rf /var/lib/apt/lists/* \ + && addgroup --system spring && adduser --system --ingroup spring spring +COPY --from=build /app/target/*.jar app.jar +EXPOSE 8080 +USER spring:spring +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/spring-boot-product-catalog/README.md b/spring-boot-product-catalog/README.md new file mode 100644 index 00000000..4ddb25ae --- /dev/null +++ b/spring-boot-product-catalog/README.md @@ -0,0 +1,301 @@ +# Product Catalog — Spring Boot + PostgreSQL + +A product-catalog REST API built with [Spring Boot](https://spring.io) and +[PostgreSQL](https://www.postgresql.org/), used to show Keploy replacing hand-written API +tests. Instead of JUnit fixtures, mocks, and assertions, Keploy **records real traffic +once** — capturing every downstream Postgres call as a mock — and replays it as a +regression suite that needs no database at all. + +**Note** :- Issue Creation is disabled on this Repository, please visit [here](https://github.com/keploy/keploy/issues/new/choose) to submit Issue. + +## What this sample shows + +The recorded suite committed under `keploy/products-crud/` contains: + +- **63 test cases** covering the full CRUD lifecycle, category filtering, the inventory summary, stock adjustments, and 404/400/409 edge cases +- **214 Postgres mocks**, so the database is stubbed on replay and the tests run anywhere +- **Zero hand-written assertions** — the recorded responses *are* the assertions +- **Auto-detected noise** — Keploy marks non-deterministic fields (`createdAt`, the `Date` header) itself + +The payoff is `docker-compose.keploy.yml`, an app-only Compose file with no `postgres` +service at all. The suite still passes green, because every database call is served from +the recorded mocks. + +| Traditional | Keploy | +|-------------|--------| +| Write test clients + assertions by hand | Record real traffic once | +| Manage a test database / fixtures | Downstream calls captured as mocks | +| Mocks drift from reality | Mocks *are* reality (recorded from the real DB) | +| Tests need infra to run | Replay is dependency-free | + +## Architecture + +```mermaid +flowchart LR + Seed[seed.sh / curl] -->|HTTP| App[Spring Boot
Product Catalog] + App -->|JDBC| PG[(PostgreSQL 17)] + Keploy[keploy-v3
eBPF proxy] -.->|records inbound HTTP
as test cases| App + Keploy -.->|records outbound JDBC
as mocks| PG +``` + +Keploy sits in the network path via eBPF and records both sides at once: inbound HTTP +becomes test cases, outbound JDBC becomes mocks. The application needs no code changes. + +## Pre-requisites + +- [Docker](https://docs.docker.com/get-docker/) and Docker Compose — the app and database both run in containers +- No local Java or Maven needed; the multi-stage `Dockerfile` builds with a pinned Temurin 21 JDK + +## Quick Keploy Installation + +Based on your OS and preference (Docker/Native), you can set up Keploy using the one-click +installation method: + +```sh +curl -O https://raw.githubusercontent.com/keploy/keploy/main/keploy.sh && source keploy.sh +``` + +## Setup the Product Catalog App + +Clone the repository and start the stack: + +```bash +git clone https://github.com/keploy/samples-java && cd samples-java/spring-boot-product-catalog + +docker compose up --build +``` + +The API is now on `http://localhost:8080`. Tear down later with `docker compose down -v`. + +## About the API + +| Method | Path | Description | Success | +|----------|-------------------------------|----------------------------------------------------|----------------| +| `POST` | `/api/products` | Create a product | `201` + `Location` | +| `GET` | `/api/products` | List all products (optional `?category=`) | `200` | +| `GET` | `/api/products/summary` | Inventory rollup (optional `?lowStockThreshold=`) | `200` | +| `GET` | `/api/products/{id}` | Fetch one product | `200` / `404` | +| `PUT` | `/api/products/{id}` | Replace a product | `200` / `404` | +| `PATCH` | `/api/products/{id}/stock` | Adjust stock by a `delta` | `200` / `404` / `409` | +| `DELETE` | `/api/products/{id}` | Delete a product | `204` / `404` | + +A product has `name` (required, ≤120 chars), `description` (optional, ≤1000 chars), +`price` (required, > 0), `stockQuantity` (required, ≥ 0), and `category`. Validation +failures return `400` with a structured `fieldErrors` map, which is what produces the +recorded 400 traffic. + +> The committed test set covers all seven endpoints — full CRUD, category filters, the +> inventory `/summary` rollup, `/{id}/stock` adjustments (including the `409` over-decrement), +> and the `404`/`400` paths. Re-running `keploy record` with `./seed.sh` regenerates it. + +## Capture the testcases + +Keploy brings the whole stack up itself in record mode. In **terminal A**: + +```bash +keploy record -c "docker compose up" \ + --cmd-type docker-compose \ + --container-name catalog-app \ + -n product-catalog_default \ + --metadata "name=products-crud,description=full CRUD + filters + summary + stock + 404 + 400 validation" +``` + +### Generate testcases + +To generate testcases we just need to **make some API calls.** You can use +[Postman](https://www.postman.com/), [Hoppscotch](https://hoppscotch.io/), or simply +`curl`. + +These seven calls exercise every endpoint once, in a natural order — create, read, update, +adjust, delete — so a single pass records a coherent CRUD suite. + +**1. Create a product** (`POST /api/products`): + +```bash +curl --location --request POST 'http://localhost:8080/api/products' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "name": "Mechanical Keyboard", + "description": "65% hot-swappable", + "price": 129.99, + "stockQuantity": 40, + "category": "peripherals" +}' +``` + +This returns the created product. `createdAt` is automatically ignored during testing +because it will always be different. + +```json +{ + "id": 1, + "name": "Mechanical Keyboard", + "description": "65% hot-swappable", + "price": 129.99, + "stockQuantity": 40, + "category": "peripherals", + "createdAt": "2026-08-05T09:41:12.483Z" +} +``` + +**2. List the catalog, optionally filtered by category** (`GET /api/products`): + +```bash +curl --location --request GET 'http://localhost:8080/api/products' +curl --location --request GET 'http://localhost:8080/api/products?category=peripherals' +``` + +**3. Roll up inventory** (`GET /api/products/summary`) — counts totals and flags anything +at or below the low-stock threshold: + +```bash +curl --location --request GET 'http://localhost:8080/api/products/summary?lowStockThreshold=15' +``` + +**4. Fetch a single product by id** (`GET /api/products/{id}`): + +```bash +curl --location --request GET 'http://localhost:8080/api/products/1' +``` + +**5. Replace a product** (`PUT /api/products/{id}`): + +```bash +curl --location --request PUT 'http://localhost:8080/api/products/1' \ +--header 'Content-Type: application/json' \ +--data-raw '{"name":"Keyboard v2","price":149.99,"stockQuantity":35,"category":"peripherals"}' +``` + +**6. Adjust stock by a delta** (`PATCH /api/products/{id}/stock`) — a negative delta ships +units, a positive delta restocks; driving stock below zero returns `409`: + +```bash +curl --location --request PATCH 'http://localhost:8080/api/products/1/stock' \ +--header 'Content-Type: application/json' \ +--data-raw '{"delta":-5}' +``` + +**7. Delete a product** (`DELETE /api/products/{id}`): + +```bash +curl --location --request DELETE 'http://localhost:8080/api/products/1' +``` + +Record an error path or two as well, so the suite covers the `404` and `400` branches: + +```bash +curl --location --request GET 'http://localhost:8080/api/products/99999' +curl --location --request POST 'http://localhost:8080/api/products' \ +--header 'Content-Type: application/json' \ +--data-raw '{"name":"","price":-5}' +``` + +Or skip the manual calls and run the bundled traffic generator, which drives the whole +workload — 12 products across 6 categories, every read path, updates, deletes, and the +404/400 cases — in one shot. This is exactly what produced the committed 63-case suite: + +```bash +./seed.sh +``` + +Then stop the recording with `Ctrl+C` in terminal A. Keploy writes test cases to +`keploy/products-crud/tests/` and the recorded Postgres interactions to +`keploy/products-crud/mocks.yaml`. + +Now, let's see the magic! 🪄💫 + +## Run the test cases + +```bash +keploy test -c "docker compose up" \ + --cmd-type docker-compose \ + --container-name catalog-app \ + -n product-catalog_default \ + --mappings \ + --delay 20 +``` + +Expected: + +``` + "products-crud" Total: 63 Passed: 63 Failed: 0 +``` + +This will run the testcases and generate the report in the `keploy/reports` folder. + +Two flags matter here, and both are already set as defaults in `keploy.yml`: + +- `--mappings` pins each test case to only the mocks it recorded, which keeps stateful + reads (list-after-delete, get-after-update) correct. +- `--delay 20` waits for the app to finish booting before the first test fires. Spring + Boot takes about 13 seconds; too short a delay races startup and reports `got=0` on the + first case. + +### Bonus: replay with no database at all + +`docker-compose.keploy.yml` is an app-only Compose file — there is literally no `postgres` +service in it. Keploy serves every database call from the recorded mocks, so the app boots +and passes the full suite with the database entirely absent: + +```bash +keploy test -c "docker compose -f docker-compose.keploy.yml up" \ + --cmd-type docker-compose --container-name catalog-app -n product-catalog_default \ + --mappings --delay 20 +``` + +## What Keploy generated + +``` +keploy/ +└── products-crud/ + ├── config.yaml # test-set metadata (name, description, mock hash) + ├── mappings.yaml # which mocks belong to which test case + ├── mocks.yaml # 214 PostgresV3 mocks + 2 DNS + └── tests/ + ├── post-api-products-*.yaml # 12 creates + 8 validation 400s + ├── get-api-products-*.yaml # list + category filters + post-delete lists + ├── get-api-products-by-id-*.yaml # reads + 404s + ├── get-api-products-summary-*.yaml # inventory rollup (default + threshold) + ├── put-api-products-by-id-*.yaml # updates + invalid + 404 + ├── patch-api-products-by-id-stock-*.yaml # stock adjust + 409 over-decrement + 404 + └── delete-api-products-by-id-*.yaml +``` + +A recorded test case is just the request plus the expected response, with the +non-deterministic fields marked as noise automatically: + +```yaml +kind: Http +name: post-api-products-1 +spec: + req: { method: POST, url: .../api/products, body: '{"name":"Mechanical Keyboard",...}' } + resp: { status_code: 201, body: '{"id":1,"name":"Mechanical Keyboard",...,"createdAt":"..."}' } + assertions: + noise: + body.createdAt: [] # Keploy detected this is non-deterministic + header.Date: [] +``` + +## Troubleshooting + +- **First test case fails with `got=0`.** The delay was too short and the request raced + Spring Boot's startup. Raise `--delay`. +- **Replay fails on stateful reads.** Make sure `--mappings` is on, otherwise a + list-after-delete test can be served mocks recorded from a different point in time. +- **`network product-catalog_default not found`.** Compose derives the network from the + project name, which this sample pins via `name: product-catalog` in + `docker-compose.yml`. If you renamed the project, pass your own name to `-n`. + +## Files + +| Path | Purpose | +|---|---| +| `src/main/java/io/keploy/productcatalog/` | Application source — controller, service, JPA repository, DTOs, exception handler | +| `src/main/resources/application.properties` | Datasource and JPA configuration | +| `pom.xml` | Spring Boot, Java 21, Spring Data JPA, validation, Actuator, Postgres driver | +| `Dockerfile` | Multi-stage build: Temurin 21 JDK → JRE runtime | +| `docker-compose.yml` | App + Postgres, for running and recording | +| `docker-compose.keploy.yml` | App only, no database — for the dependency-free replay | +| `keploy.yml` | Keploy config: Compose command, container/network names, noise rules | +| `keploy/products-crud/` | The recorded test set: 63 test cases + mocks | +| `seed.sh` | Traffic generator used during `keploy record` | diff --git a/spring-boot-product-catalog/docker-compose.keploy.yml b/spring-boot-product-catalog/docker-compose.keploy.yml new file mode 100644 index 00000000..f88473cd --- /dev/null +++ b/spring-boot-product-catalog/docker-compose.keploy.yml @@ -0,0 +1,17 @@ +# App-only compose for the Keploy replay demo — NOTICE: there is NO postgres service here. +# Keploy serves every database call from the mocks it recorded, so the Spring Boot app +# boots and passes its whole test suite with the database entirely absent. +name: product-catalog + +services: + app: + build: . + container_name: catalog-app + environment: + # Still points at "postgres" — but nothing is running there. Keploy intercepts the + # connection and replays the recorded Postgres traffic instead. + SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/catalog + SPRING_DATASOURCE_USERNAME: catalog + SPRING_DATASOURCE_PASSWORD: catalog + ports: + - "8080:8080" diff --git a/spring-boot-product-catalog/docker-compose.yml b/spring-boot-product-catalog/docker-compose.yml new file mode 100644 index 00000000..50495849 --- /dev/null +++ b/spring-boot-product-catalog/docker-compose.yml @@ -0,0 +1,48 @@ +# Pinned so the Compose network is always product-catalog_default, whatever the +# clone directory is called — Keploy is passed that exact name via -n. +name: product-catalog + +services: + postgres: + image: postgres:17-alpine + container_name: catalog-postgres + environment: + POSTGRES_DB: catalog + POSTGRES_USER: catalog + POSTGRES_PASSWORD: catalog + ports: + - "5432:5432" + volumes: + - catalog-pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U catalog -d catalog"] + interval: 3s + timeout: 3s + retries: 10 + + app: + build: . + container_name: catalog-app + depends_on: + postgres: + condition: service_healthy + environment: + SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/catalog + SPRING_DATASOURCE_USERNAME: catalog + SPRING_DATASOURCE_PASSWORD: catalog + ports: + - "8080:8080" + healthcheck: + # Uses the curl installed in the runtime image + Actuator's readiness probe. + # Makes `docker compose up --wait` block until the app is actually ready, not just running. + # Deliberately the readiness probe (not /actuator/health): the aggregate health endpoint + # runs the JDBC `db` indicator on every poll, which Keploy would record as extra Postgres + # mocks during `keploy record`. The readiness group doesn't touch the DB, so capture stays clean. + test: ["CMD-SHELL", "curl -fsS http://localhost:8080/actuator/health/readiness || exit 1"] + interval: 5s + timeout: 3s + retries: 12 + start_period: 15s + +volumes: + catalog-pgdata: diff --git a/spring-boot-product-catalog/keploy.yml b/spring-boot-product-catalog/keploy.yml new file mode 100755 index 00000000..75f9f929 --- /dev/null +++ b/spring-boot-product-catalog/keploy.yml @@ -0,0 +1,109 @@ +# Generated by Keploy (3.5.95), trimmed to the keys this sample actually needs. +path: "" +appName: product-catalog +appId: 0 +command: docker compose up +templatize: + testSets: [] +port: 0 +e2e: false +dnsPort: 26789 +proxyPort: 16789 +incomingProxyPort: 36789 +debug: false +disableTele: false +disableANSI: false +jsonOutput: false +# The app runs in Compose; `name: product-catalog` is pinned in docker-compose.yml +# so this network name holds no matter what the clone directory is called. +containerName: catalog-app +networkName: product-catalog_default +buildDelay: 30 +test: + selectedTests: {} + globalNoise: + global: + # Keploy already auto-marks these per test case; repeating them + # globally keeps a re-recorded suite deterministic too. + body.createdAt: [] + header.Date: [] + test-sets: {} + replaceWith: + global: + url: {} + port: {} + test-sets: {} + # Spring Boot needs ~13s to boot; a shorter delay races the first test case + # and reports got=0 on it. + delay: 20 + host: localhost + port: 0 + apiTimeout: 5 + skipCoverage: false + coverageReportPath: "" + ignoreOrdering: false + language: "" + removeUnusedMocks: false + preserveFailedMocks: false + fallBackOnMiss: false + jacocoAgentPath: "" + basePath: "" + mocking: true + ignoredTests: {} + disableLineCoverage: false + disableMockUpload: true + useLocalMock: false + updateTemplate: false + mustPass: false + maxFailAttempts: 5 + maxFlakyChecks: 1 + compareAll: false + schemaMatch: false + updateTestMapping: false + disableAutoHeaderNoise: false + strictMockWindow: true + # Pins each test case to the mocks recorded for it, so stateful reads + # (list-after-delete, get-after-update) replay against the right DB state. + mappings: true +record: + filters: [] + basePath: "" + recordTimer: 0s + metadata: "" + testCaseNaming: descriptive + sync: false + enableSampling: 0 + memoryLimit: 0 + globalPassthrough: false + tlsPrivateKeyPath: "" +report: + selectedTestSets: {} + showFullBody: false + reportPath: "" + summary: false + testCaseIDs: [] + format: "" +disableMapping: false +retryPassing: false +configPath: "" +bypassRules: [] +generateGithubActions: false +keployContainer: keploy-v3 +keployNetwork: keploy-network +cmdType: docker-compose +contract: + services: [] + tests: [] + path: "" + download: false + generate: false + driven: consumer + mappings: + servicesMapping: {} + self: s1 +inCi: false +serverPort: 0 +mockDownload: + registryIds: [] + +# Visit [https://keploy.io/docs/running-keploy/configuration-file/] to learn about using keploy through configuration file. diff --git a/spring-boot-product-catalog/keploy/.gitignore b/spring-boot-product-catalog/keploy/.gitignore new file mode 100644 index 00000000..f5dbb873 --- /dev/null +++ b/spring-boot-product-catalog/keploy/.gitignore @@ -0,0 +1,2 @@ +/reports/ +**/agent-debug.log diff --git a/spring-boot-product-catalog/keploy/products-crud/config.yaml b/spring-boot-product-catalog/keploy/products-crud/config.yaml new file mode 100644 index 00000000..188b0966 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/config.yaml @@ -0,0 +1,10 @@ +preScript: "" +postScript: "" +appCommand: "" +template: {} +metadata: + description: full CRUD + filters + summary + stock + 404 + 400 validation + name: products-crud +mockRegistry: + mock: 2517f87149abc3ccafc3d8762d703d85cc9f2f4d83e9b4fe43c7a2aed1f513e5 + app: spring-boot-product-catalog diff --git a/spring-boot-product-catalog/keploy/products-crud/mappings.yaml b/spring-boot-product-catalog/keploy/products-crud/mappings.yaml new file mode 100644 index 00000000..cebb1673 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/mappings.yaml @@ -0,0 +1,978 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: TestMocksMapping +test_set_id: products-crud +tests: + - id: patch-api-products-by-id-stock-4 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-214 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.520345388Z" + resTimestampMock: "2026-08-13T09:46:00.520597388Z" + - name: mock-182 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.087674721Z" + resTimestampMock: "2026-08-13T09:46:00.087823305Z" + - id: post-api-products-9 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-74 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.442446721Z" + resTimestampMock: "2026-08-13T09:45:59.442681096Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-4 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-59 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.330286721Z" + resTimestampMock: "2026-08-13T09:45:59.330690221Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-5 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-101 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.604683346Z" + resTimestampMock: "2026-08-13T09:45:59.604990929Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-12 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-122 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.717363554Z" + resTimestampMock: "2026-08-13T09:45:59.717544971Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: delete-api-products-by-id-2 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-171 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.033019513Z" + resTimestampMock: "2026-08-13T09:46:00.033451721Z" + - name: mock-172 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.034976471Z" + resTimestampMock: "2026-08-13T09:46:00.035378138Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-1 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-50 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.242688804Z" + resTimestampMock: "2026-08-13T09:45:59.244165138Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: put-api-products-by-id-3 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-160 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.978739805Z" + resTimestampMock: "2026-08-13T09:45:59.979050013Z" + - name: mock-161 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.980330721Z" + resTimestampMock: "2026-08-13T09:45:59.980626471Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-6 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-65 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.377705304Z" + resTimestampMock: "2026-08-13T09:45:59.378268013Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-10 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-77 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.462385096Z" + resTimestampMock: "2026-08-13T09:45:59.462678804Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: put-api-products-by-id-4 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-187 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.137730971Z" + resTimestampMock: "2026-08-13T09:46:00.138072513Z" + - name: mock-182 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.087674721Z" + resTimestampMock: "2026-08-13T09:46:00.087823305Z" + - id: post-api-products-7 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-68 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.399967471Z" + resTimestampMock: "2026-08-13T09:45:59.400274346Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-2 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-92 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.558165638Z" + resTimestampMock: "2026-08-13T09:45:59.558430763Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-5 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-128 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.806136971Z" + resTimestampMock: "2026-08-13T09:45:59.806834013Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-7 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-134 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.840822263Z" + resTimestampMock: "2026-08-13T09:45:59.841445179Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: delete-api-products-by-id-3 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-190 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.159081513Z" + resTimestampMock: "2026-08-13T09:46:00.159500138Z" + - name: mock-182 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.087674721Z" + resTimestampMock: "2026-08-13T09:46:00.087823305Z" + - id: get-api-products-by-id-13 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-150 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.934575721Z" + resTimestampMock: "2026-08-13T09:45:59.934864846Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: patch-api-products-by-id-stock-1 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-199 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.432930805Z" + resTimestampMock: "2026-08-13T09:46:00.433200221Z" + - name: mock-200 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.445759138Z" + resTimestampMock: "2026-08-13T09:46:00.446296763Z" + - name: mock-201 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.447324305Z" + resTimestampMock: "2026-08-13T09:46:00.44747918Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-summary-1 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-193 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.380702263Z" + resTimestampMock: "2026-08-13T09:46:00.381017596Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-11 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-119 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.703006429Z" + resTimestampMock: "2026-08-13T09:45:59.703179304Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-1 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-44 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.463240637Z" + resTimestampMock: "2026-08-13T09:45:58.464764304Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-3 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-86 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.516738471Z" + resTimestampMock: "2026-08-13T09:45:59.517151804Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-17 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-184 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.115346638Z" + resTimestampMock: "2026-08-13T09:46:00.115546055Z" + - name: mock-182 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.087674721Z" + resTimestampMock: "2026-08-13T09:46:00.087823305Z" + - id: get-api-products-by-id-1 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-89 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.541106388Z" + resTimestampMock: "2026-08-13T09:45:59.542199221Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: patch-api-products-by-id-stock-2 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-204 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.461620596Z" + resTimestampMock: "2026-08-13T09:46:00.461885346Z" + - name: mock-205 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.463485013Z" + resTimestampMock: "2026-08-13T09:46:00.463766471Z" + - name: mock-206 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.464294888Z" + resTimestampMock: "2026-08-13T09:46:00.464403971Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-15 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-164 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.993979555Z" + resTimestampMock: "2026-08-13T09:45:59.994307638Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: put-api-products-by-id-2 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-153 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.949134513Z" + resTimestampMock: "2026-08-13T09:45:59.949418721Z" + - name: mock-154 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.950757888Z" + resTimestampMock: "2026-08-13T09:45:59.951063055Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-10 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-143 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.898216221Z" + resTimestampMock: "2026-08-13T09:45:59.898536013Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: delete-api-products-by-id-1 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-167 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.008477805Z" + resTimestampMock: "2026-08-13T09:46:00.008664096Z" + - name: mock-168 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.012685055Z" + resTimestampMock: "2026-08-13T09:46:00.01297943Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-4 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-125 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.787801013Z" + resTimestampMock: "2026-08-13T09:45:59.788765221Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-3 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-56 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.307666179Z" + resTimestampMock: "2026-08-13T09:45:59.308300221Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-16 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-181 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.086245596Z" + resTimestampMock: "2026-08-13T09:46:00.086518805Z" + - name: mock-182 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.087674721Z" + resTimestampMock: "2026-08-13T09:46:00.087823305Z" + - id: put-api-products-by-id-1 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-146 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.913866555Z" + resTimestampMock: "2026-08-13T09:45:59.914004263Z" + - name: mock-147 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.91978993Z" + resTimestampMock: "2026-08-13T09:45:59.920424013Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-2 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-53 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.284791221Z" + resTimestampMock: "2026-08-13T09:45:59.285229846Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-12 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-178 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.069462346Z" + resTimestampMock: "2026-08-13T09:46:00.069844971Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-2 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-47 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.138719137Z" + resTimestampMock: "2026-08-13T09:45:59.139324054Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-10 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-116 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.687381888Z" + resTimestampMock: "2026-08-13T09:45:59.687778554Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-8 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-137 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.861238638Z" + resTimestampMock: "2026-08-13T09:45:59.861740221Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-9 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-140 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.879603596Z" + resTimestampMock: "2026-08-13T09:45:59.880145805Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-summary-2 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-196 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.413012763Z" + resTimestampMock: "2026-08-13T09:46:00.41326593Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-7 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-107 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.637462971Z" + resTimestampMock: "2026-08-13T09:45:59.637713221Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-4 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-98 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.588257763Z" + resTimestampMock: "2026-08-13T09:45:59.588703346Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-5 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-62 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.355783513Z" + resTimestampMock: "2026-08-13T09:45:59.356389304Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-3 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-95 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.571915888Z" + resTimestampMock: "2026-08-13T09:45:59.572319054Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-6 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-131 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.823253346Z" + resTimestampMock: "2026-08-13T09:45:59.823699013Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-11 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-175 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.050273138Z" + resTimestampMock: "2026-08-13T09:46:00.050609263Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-14 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-157 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.963993221Z" + resTimestampMock: "2026-08-13T09:45:59.964279013Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-9 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-113 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.667092179Z" + resTimestampMock: "2026-08-13T09:45:59.667462929Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-8 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-71 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.421243138Z" + resTimestampMock: "2026-08-13T09:45:59.421645054Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-8 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-110 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.652106054Z" + resTimestampMock: "2026-08-13T09:45:59.652475388Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: post-api-products-11 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-80 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.480590679Z" + resTimestampMock: "2026-08-13T09:45:59.480760721Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: get-api-products-by-id-6 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-104 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.621036346Z" + resTimestampMock: "2026-08-13T09:45:59.621431679Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" + - id: patch-api-products-by-id-stock-3 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-209 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.479606638Z" + resTimestampMock: "2026-08-13T09:46:00.479921846Z" + - name: mock-210 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.481882138Z" + resTimestampMock: "2026-08-13T09:46:00.482213555Z" + - name: mock-211 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.496005596Z" + resTimestampMock: "2026-08-13T09:46:00.496579513Z" + - name: mock-182 + kind: PostgresV3 + timestamp: 1786614360 + reqTimestampMock: "2026-08-13T09:46:00.087674721Z" + resTimestampMock: "2026-08-13T09:46:00.087823305Z" + - id: post-api-products-12 + mock_entries: + - name: mock-43 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.462503137Z" + resTimestampMock: "2026-08-13T09:45:58.462900429Z" + - name: mock-83 + kind: PostgresV3 + timestamp: 1786614359 + reqTimestampMock: "2026-08-13T09:45:59.498965304Z" + resTimestampMock: "2026-08-13T09:45:59.499153013Z" + - name: mock-45 + kind: PostgresV3 + timestamp: 1786614358 + reqTimestampMock: "2026-08-13T09:45:58.478294762Z" + resTimestampMock: "2026-08-13T09:45:58.478561137Z" diff --git a/spring-boot-product-catalog/keploy/products-crud/mocks.yaml b/spring-boot-product-catalog/keploy/products-crud/mocks.yaml new file mode 100644 index 00000000..106706fa --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/mocks.yaml @@ -0,0 +1,11460 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: DNS +name: mock-0 +spec: + metadata: + name: DNS + qtype: AAAA + type: config + request: + name: postgres. + qtype: 28 + qclass: 1 + response: + rcode: 0 + authoritative: false + recursionAvailable: true + truncated: false + reqTimestampMock: 2026-08-13T09:45:39.436932711Z + resTimestampMock: 2026-08-13T09:45:39.437430503Z +--- +version: api.keploy.io/v1beta1 +kind: DNS +name: mock-1 +spec: + metadata: + name: DNS + qtype: A + type: config + request: + name: postgres. + qtype: 1 + qclass: 1 + response: + rcode: 0 + authoritative: false + recursionAvailable: true + truncated: false + answers: + - "postgres.\t600\tIN\tA\t172.19.0.3" + reqTimestampMock: 2026-08-13T09:45:39.436932711Z + resTimestampMock: 2026-08-13T09:45:39.437879295Z +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-2 +spec: + metadata: + connID: "0" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:39.462432961Z + resTimestampMock: 2026-08-13T09:45:39.462815295Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-3 +spec: + metadata: + connID: "0" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 75 + backendSecretKey: -458198094 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:39.46472992Z + resTimestampMock: 2026-08-13T09:45:39.530146836Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-4 +spec: + metadata: + class: SESSION + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:0:2026-08-13T09:45:39.549475878Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.549475878Z + resTimestampMock: 2026-08-13T09:45:39.549988336Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-5 +spec: + metadata: + class: SESSION + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:b489be1e1f6837f103918e513e0e4decd0c9cb470a8a898f373730416545b5d1 + sqlNormalized: SHOW TRANSACTION ISOLATION LEVEL + invocationId: sha256:b489be1e1f6837f103918e513e0e4decd0c9cb470a8a898f373730416545b5d1:0:2026-08-13T09:45:39.558074795Z:2 + precedingTxState: idle + response: + rowDescription: + - name: transaction_isolation + typeOid: 25 + typeSize: -1 + typeMod: -1 + rows: + - - read committed + commandComplete: SHOW + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.558074795Z + resTimestampMock: 2026-08-13T09:45:39.558453545Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-6 +spec: + metadata: + class: CATALOG + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: CATALOG + lifetime: session + sqlAstHash: sha256:af513b7fc519fd88cbd287b36a1a06a6477206fece5f4d129540fd9d2ecd7aaa + sqlNormalized: select string_agg(word, $1) from pg_catalog.pg_get_keywords() where word <> ALL ($2::text[]) + invocationId: sha256:af513b7fc519fd88cbd287b36a1a06a6477206fece5f4d129540fd9d2ecd7aaa:0:2026-08-13T09:45:39.575150461Z:3 + precedingTxState: idle + response: + rowDescription: + - name: string_agg + typeOid: 25 + typeSize: -1 + typeMod: -1 + rows: + - - abort,absent,access,aggregate,also,analyse,analyze,attach,backward,bit,cache,checkpoint,class,cluster,columns,comment,comments,compression,concurrently,conditional,configuration,conflict,connection,content,conversion,copy,cost,csv,current_catalog,current_schema,database,delimiter,delimiters,depends,detach,dictionary,disable,discard,do,document,empty,enable,encoding,encrypted,enum,error,event,exclusive,explain,expression,extension,family,finalize,force,format,forward,freeze,functions,generated,greatest,groups,handler,header,if,ilike,immutable,implicit,import,include,indent,index,indexes,inherit,inherits,inline,instead,isnull,json,json_array,json_arrayagg,json_exists,json_object,json_objectagg,json_query,json_scalar,json_serialize,json_table,json_value,keep,keys,label,leakproof,least,limit,listen,load,location,lock,locked,logged,mapping,materialized,merge_action,mode,move,nested,nfc,nfd,nfkc,nfkd,nothing,notify,notnull,nowait,off,offset,oids,omit,operator,owned,owner,parallel,parser,passing,password,plan,plans,policy,prepared,procedural,procedures,program,publication,quote,quotes,reassign,recheck,refresh,reindex,rename,replace,replica,reset,restrict,returning,routines,rule,scalar,schemas,sequences,server,setof,share,show,skip,snapshot,stable,standalone,statistics,stdin,stdout,storage,stored,strict,string,strip,subscription,support,sysid,tables,tablespace,target,temp,template,text,truncate,trusted,types,unconditional,unencrypted,unlisten,unlogged,until,vacuum,valid,validate,validator,variadic,verbose,version,views,volatile,whitespace,wrapper,xml,xmlattributes,xmlconcat,xmlelement,xmlexists,xmlforest,xmlnamespaces,xmlparse,xmlpi,xmlroot,xmlserialize,xmltable,yes + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.575150461Z + resTimestampMock: 2026-08-13T09:45:39.577023211Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-7 +spec: + metadata: + class: VALIDATION + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: VALIDATION + lifetime: session + sqlAstHash: sha256:f0a8e37c2db38f7af30066abf3a0f2e05fdd4ef9bb13acc0c53842c726937bf9 + sqlNormalized: select version() + invocationId: sha256:f0a8e37c2db38f7af30066abf3a0f2e05fdd4ef9bb13acc0c53842c726937bf9:0:2026-08-13T09:45:39.589070253Z:4 + precedingTxState: idle + response: + rowDescription: + - name: version + typeOid: 25 + typeSize: -1 + typeMod: -1 + rows: + - - PostgreSQL 17.10 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.589070253Z + resTimestampMock: 2026-08-13T09:45:39.58933492Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-8 +spec: + metadata: + class: VALIDATION + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: VALIDATION + lifetime: session + sqlAstHash: sha256:a0dd9013c5be0ecf56e918b289f5d109a7e646ce68a44f269f4885d0ec385608 + sqlNormalized: select current_schema() + invocationId: sha256:a0dd9013c5be0ecf56e918b289f5d109a7e646ce68a44f269f4885d0ec385608:0:2026-08-13T09:45:39.601659337Z:5 + precedingTxState: idle + response: + rowDescription: + - name: current_schema + typeOid: 19 + typeSize: 64 + typeMod: -1 + rows: + - - public + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.601659337Z + resTimestampMock: 2026-08-13T09:45:39.602068795Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-9 +spec: + metadata: + class: VALIDATION + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: VALIDATION + lifetime: session + sqlAstHash: sha256:a35a118a41caa512dda6164b2454bc37f9f46d5f32535588c29a7b79bf8eb680 + sqlNormalized: select current_catalog + invocationId: sha256:a35a118a41caa512dda6164b2454bc37f9f46d5f32535588c29a7b79bf8eb680:0:2026-08-13T09:45:39.602282128Z:6 + precedingTxState: idle + response: + rowDescription: + - name: current_catalog + typeOid: 19 + typeSize: 64 + typeMod: -1 + rows: + - - catalog + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.602282128Z + resTimestampMock: 2026-08-13T09:45:39.602446795Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-10 +spec: + metadata: + class: CATALOG + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: CATALOG + lifetime: session + sqlAstHash: sha256:7563dbca6c43bce5f3912757a488487b302ceacf4ae7783bc7e6036bdd379777 + sqlNormalized: SELECT setting FROM pg_catalog.pg_settings WHERE name=$1 + invocationId: sha256:7563dbca6c43bce5f3912757a488487b302ceacf4ae7783bc7e6036bdd379777:0:2026-08-13T09:45:39.603158003Z:7 + precedingTxState: idle + response: + rowDescription: + - name: setting + tableOid: 12104 + colAttrNum: 2 + typeOid: 25 + typeSize: -1 + typeMod: -1 + rows: + - - read committed + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.603158003Z + resTimestampMock: 2026-08-13T09:45:39.60427942Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-11 +spec: + metadata: + class: SESSION + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:b489be1e1f6837f103918e513e0e4decd0c9cb470a8a898f373730416545b5d1 + sqlNormalized: SHOW TRANSACTION ISOLATION LEVEL + invocationId: sha256:b489be1e1f6837f103918e513e0e4decd0c9cb470a8a898f373730416545b5d1:0:2026-08-13T09:45:39.604516753Z:8 + precedingTxState: idle + response: + rowDescription: + - name: transaction_isolation + typeOid: 25 + typeSize: -1 + typeMod: -1 + rows: + - - read committed + commandComplete: SHOW + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.604516753Z + resTimestampMock: 2026-08-13T09:45:39.604638837Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-12 +spec: + metadata: + connID: "2" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:39.674804753Z + resTimestampMock: 2026-08-13T09:45:39.67556042Z +connectionId: "2" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-13 +spec: + metadata: + connID: "2" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 76 + backendSecretKey: -1857667527 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:39.675828587Z + resTimestampMock: 2026-08-13T09:45:39.712329003Z +connectionId: "2" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-14 +spec: + metadata: + class: SESSION + connID: "2" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:2:2026-08-13T09:45:39.712876837Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.712876837Z + resTimestampMock: 2026-08-13T09:45:39.713240837Z +connectionId: "2" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-15 +spec: + metadata: + connID: "4" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:39.746176253Z + resTimestampMock: 2026-08-13T09:45:39.746660628Z +connectionId: "4" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-16 +spec: + metadata: + connID: "4" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 77 + backendSecretKey: -578951070 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:39.746761837Z + resTimestampMock: 2026-08-13T09:45:39.77446617Z +connectionId: "4" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-17 +spec: + metadata: + class: SESSION + connID: "4" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:4:2026-08-13T09:45:39.775561837Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.775561837Z + resTimestampMock: 2026-08-13T09:45:39.776286045Z +connectionId: "4" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-18 +spec: + metadata: + connID: "6" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:39.80919342Z + resTimestampMock: 2026-08-13T09:45:39.80978692Z +connectionId: "6" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-19 +spec: + metadata: + connID: "6" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 78 + backendSecretKey: -1404647821 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:39.810038837Z + resTimestampMock: 2026-08-13T09:45:39.817861337Z +connectionId: "6" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-20 +spec: + metadata: + class: SESSION + connID: "6" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:6:2026-08-13T09:45:39.818251337Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.818251337Z + resTimestampMock: 2026-08-13T09:45:39.818657045Z +connectionId: "6" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-21 +spec: + metadata: + connID: "8" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:39.87255317Z + resTimestampMock: 2026-08-13T09:45:39.872908795Z +connectionId: "8" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-22 +spec: + metadata: + connID: "8" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 79 + backendSecretKey: 1559597812 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:39.873070628Z + resTimestampMock: 2026-08-13T09:45:39.881388795Z +connectionId: "8" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-23 +spec: + metadata: + class: SESSION + connID: "8" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:8:2026-08-13T09:45:39.881850795Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.881850795Z + resTimestampMock: 2026-08-13T09:45:39.882398045Z +connectionId: "8" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-24 +spec: + metadata: + connID: "10" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:39.915181212Z + resTimestampMock: 2026-08-13T09:45:39.915639378Z +connectionId: "10" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-25 +spec: + metadata: + connID: "10" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 80 + backendSecretKey: 1151561097 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:39.915707378Z + resTimestampMock: 2026-08-13T09:45:39.922841795Z +connectionId: "10" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-26 +spec: + metadata: + class: SESSION + connID: "10" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:10:2026-08-13T09:45:39.923318087Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.923318087Z + resTimestampMock: 2026-08-13T09:45:39.923801045Z +connectionId: "10" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-27 +spec: + metadata: + connID: "12" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:39.959078878Z + resTimestampMock: 2026-08-13T09:45:39.96026042Z +connectionId: "12" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-28 +spec: + metadata: + connID: "12" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 81 + backendSecretKey: 1222989541 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:39.961023045Z + resTimestampMock: 2026-08-13T09:45:39.968325128Z +connectionId: "12" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-29 +spec: + metadata: + class: SESSION + connID: "12" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:12:2026-08-13T09:45:39.968380795Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:39.968380795Z + resTimestampMock: 2026-08-13T09:45:39.968695587Z +connectionId: "12" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-30 +spec: + metadata: + connID: "14" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:40.001712087Z + resTimestampMock: 2026-08-13T09:45:40.00229767Z +connectionId: "14" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-31 +spec: + metadata: + connID: "14" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 82 + backendSecretKey: -740292158 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:40.002546378Z + resTimestampMock: 2026-08-13T09:45:40.010890337Z +connectionId: "14" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-32 +spec: + metadata: + class: SESSION + connID: "14" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:14:2026-08-13T09:45:40.01210367Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:40.01210367Z + resTimestampMock: 2026-08-13T09:45:40.012440545Z +connectionId: "14" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-33 +spec: + metadata: + connID: "16" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:40.044170503Z + resTimestampMock: 2026-08-13T09:45:40.04471492Z +connectionId: "16" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-34 +spec: + metadata: + connID: "16" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 83 + backendSecretKey: 650859782 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:40.04488992Z + resTimestampMock: 2026-08-13T09:45:40.050463128Z +connectionId: "16" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-35 +spec: + metadata: + class: SESSION + connID: "16" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:16:2026-08-13T09:45:40.05106092Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:40.05106092Z + resTimestampMock: 2026-08-13T09:45:40.051327003Z +connectionId: "16" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-36 +spec: + metadata: + connID: "18" + lifetime: connection + tls_stage: prelude + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + reqTimestampMock: 2026-08-13T09:45:40.084322003Z + resTimestampMock: 2026-08-13T09:45:40.084735045Z +connectionId: "18" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-37 +spec: + metadata: + connID: "18" + lifetime: connection + type: config + postgresV3: + type: session + session: + protocolVersion: "3.0" + sslResponse: "N" + serverVersion: "17.10" + parameterStatus: + DateStyle: ISO, MDY + IntervalStyle: postgres + TimeZone: Etc/UTC + application_name: "" + client_encoding: UTF8 + default_transaction_read_only: "off" + in_hot_standby: "off" + integer_datetimes: "on" + is_superuser: "on" + scram_iterations: "4096" + server_encoding: UTF8 + server_version: "17.10" + session_authorization: catalog + standard_conforming_strings: "on" + backendProcessID: 84 + backendSecretKey: 1983525856 + observedAuthMode: scram + reqTimestampMock: 2026-08-13T09:45:40.08496742Z + resTimestampMock: 2026-08-13T09:45:40.089722962Z +connectionId: "18" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-38 +spec: + metadata: + class: SESSION + connID: "18" + lifetime: session + type: config + postgresV3: + type: query + query: + class: SESSION + lifetime: session + sqlAstHash: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8 + sqlNormalized: SET application_name = $1 + invocationId: sha256:69a7b8f573d7c802c166f56395068540d33d508d9e3ba0d15b473590abaddab8:18:2026-08-13T09:45:40.090403587Z:1 + precedingTxState: idle + response: + commandComplete: SET + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:40.090403587Z + resTimestampMock: 2026-08-13T09:45:40.090775628Z +connectionId: "18" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-39 +spec: + metadata: + class: CATALOG + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: CATALOG + lifetime: session + sqlAstHash: sha256:310dd72f6f1f2491f33fdba09cde16346c26fa93a51996e0a7d71260fb04d9ce + sqlNormalized: select * from information_schema.sequences + invocationId: sha256:310dd72f6f1f2491f33fdba09cde16346c26fa93a51996e0a7d71260fb04d9ce:0:2026-08-13T09:45:40.29334942Z:9 + precedingTxState: idle + response: + rowDescription: + - name: sequence_catalog + tableOid: 13495 + colAttrNum: 1 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: sequence_schema + tableOid: 13495 + colAttrNum: 2 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: sequence_name + tableOid: 13495 + colAttrNum: 3 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: data_type + tableOid: 13495 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: -1 + - name: numeric_precision + tableOid: 13495 + colAttrNum: 5 + typeOid: 23 + typeSize: 4 + typeMod: -1 + - name: numeric_precision_radix + tableOid: 13495 + colAttrNum: 6 + typeOid: 23 + typeSize: 4 + typeMod: -1 + - name: numeric_scale + tableOid: 13495 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + - name: start_value + tableOid: 13495 + colAttrNum: 8 + typeOid: 1043 + typeSize: -1 + typeMod: -1 + - name: minimum_value + tableOid: 13495 + colAttrNum: 9 + typeOid: 1043 + typeSize: -1 + typeMod: -1 + - name: maximum_value + tableOid: 13495 + colAttrNum: 10 + typeOid: 1043 + typeSize: -1 + typeMod: -1 + - name: increment + tableOid: 13495 + colAttrNum: 11 + typeOid: 1043 + typeSize: -1 + typeMod: -1 + - name: cycle_option + tableOid: 13495 + colAttrNum: 12 + typeOid: 1043 + typeSize: -1 + typeMod: 7 + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:40.29334942Z + resTimestampMock: 2026-08-13T09:45:40.295945129Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-40 +spec: + metadata: + class: CATALOG + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: CATALOG + lifetime: session + sqlAstHash: sha256:3415713d7702e09dde25ce7a909e13e28677566d5a38fa8d24e5cae553ad30ed + sqlNormalized: "SELECT current_database() AS \"TABLE_CAT\", n.nspname AS \"TABLE_SCHEM\", c.relname AS \"TABLE_NAME\", CASE n.nspname ~ $3 OR n.nspname = $4 WHEN $5 THEN CASE WHEN n.nspname = $6 OR n.nspname = $7 THEN CASE c.relkind WHEN $8 THEN $9 WHEN $10 THEN $11 WHEN $12 THEN $13 ELSE $14 END WHEN n.nspname = $15 THEN CASE c.relkind WHEN $16 THEN $17 WHEN $18 THEN $19 ELSE $20 END ELSE CASE c.relkind WHEN $21 THEN $22 WHEN $23 THEN $24 WHEN $25 THEN $26 WHEN $27 THEN $28 WHEN $29 THEN $30 ELSE $31 END END WHEN $32 THEN CASE c.relkind WHEN $33 THEN $34 WHEN $35 THEN $36 WHEN $37 THEN $38 WHEN $39 then $40 WHEN $41 THEN $42 WHEN $43 THEN $44 WHEN $45 THEN $46 WHEN $47 THEN $48 WHEN $49 THEN $50 ELSE $51 END ELSE $52 END AS \"TABLE_TYPE\", d.description AS \"REMARKS\", $53 as \"TYPE_CAT\", $54 as \"TYPE_SCHEM\", $55 as \"TYPE_NAME\", $56 AS \"SELF_REFERENCING_COL_NAME\", $57 AS \"REF_GENERATION\" FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = $58 and d.classoid = $59::regclass) WHERE c.relnamespace = n.oid AND n.nspname LIKE $1 AND c.relname LIKE $2 AND ($60 OR ( c.relkind = $61 AND n.nspname !~ $62 AND n.nspname <> $63 ) OR ( c.relkind = $64 AND n.nspname <> $65 AND n.nspname <> $66 ) OR ( c.relkind = $67 ) OR ( c.relkind = $68 AND n.nspname !~ $69 AND n.nspname <> $70 ) ) ORDER BY \"TABLE_TYPE\",\"TABLE_SCHEM\",\"TABLE_NAME\" " + paramOids: + - 1043 + - 1043 + invocationId: sha256:3415713d7702e09dde25ce7a909e13e28677566d5a38fa8d24e5cae553ad30ed:0:2026-08-13T09:45:40.302790337Z:10 + precedingTxState: idle + bindValues: + - !!binary cHVibGlj + - !!binary JQ== + bindFormats: + - 0 + - 0 + response: + rowDescription: + - name: TABLE_CAT + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: TABLE_SCHEM + tableOid: 2615 + colAttrNum: 2 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: TABLE_NAME + tableOid: 1259 + colAttrNum: 2 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: TABLE_TYPE + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: REMARKS + tableOid: 2609 + colAttrNum: 4 + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: TYPE_CAT + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: TYPE_SCHEM + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: TYPE_NAME + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: SELF_REFERENCING_COL_NAME + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: REF_GENERATION + typeOid: 25 + typeSize: -1 + typeMod: -1 + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:40.302790337Z + resTimestampMock: 2026-08-13T09:45:40.306708962Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-41 +spec: + metadata: + class: CATALOG + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: CATALOG + lifetime: session + sqlAstHash: sha256:f6cb238ae2fa5e21bdfb322ef234c2e2f41a4aa2036237b49fc8d3499cf3f108 + sqlNormalized: "SELECT * FROM (SELECT current_database() AS current_database, n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = $3 AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,t.typtypmod,row_number() OVER (PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, nullif(a.attidentity, $4) as attidentity,nullif(a.attgenerated, $5) as attgenerated,pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS adsrc,dsc.description,t.typbasetype,t.typtype FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) JOIN pg_catalog.pg_attribute a ON (a.attrelid=c.oid) JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef def ON (a.attrelid=def.adrelid AND a.attnum = def.adnum) LEFT JOIN pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum = dsc.objsubid) LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND dc.relname=$6) LEFT JOIN pg_catalog.pg_namespace dn ON (dc.relnamespace=dn.oid AND dn.nspname=$7) WHERE c.relkind in ($8,$9,$10,$11,$12) and a.attnum > $13 AND NOT a.attisdropped AND n.nspname LIKE $1) c WHERE $14 AND attname LIKE $2 ORDER BY nspname,c.relname,attnum " + paramOids: + - 1043 + - 1043 + invocationId: sha256:f6cb238ae2fa5e21bdfb322ef234c2e2f41a4aa2036237b49fc8d3499cf3f108:0:2026-08-13T09:45:40.307738879Z:11 + precedingTxState: idle + bindValues: + - !!binary cHVibGlj + - !!binary JQ== + bindFormats: + - 0 + - 0 + response: + rowDescription: + - name: current_database + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: nspname + tableOid: 2615 + colAttrNum: 2 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: relname + tableOid: 1259 + colAttrNum: 2 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: attname + tableOid: 1249 + colAttrNum: 2 + typeOid: 19 + typeSize: 64 + typeMod: -1 + - name: atttypid + tableOid: 1249 + colAttrNum: 3 + typeOid: 26 + typeSize: 4 + typeMod: -1 + - name: attnotnull + typeOid: 16 + typeSize: 1 + typeMod: -1 + - name: atttypmod + tableOid: 1249 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + - name: attlen + tableOid: 1249 + colAttrNum: 4 + typeOid: 21 + typeSize: 2 + typeMod: -1 + - name: typtypmod + tableOid: 1247 + colAttrNum: 27 + typeOid: 23 + typeSize: 4 + typeMod: -1 + - name: attnum + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: attidentity + typeOid: 18 + typeSize: 1 + typeMod: -1 + - name: attgenerated + typeOid: 18 + typeSize: 1 + typeMod: -1 + - name: adsrc + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: description + tableOid: 2609 + colAttrNum: 4 + typeOid: 25 + typeSize: -1 + typeMod: -1 + - name: typbasetype + tableOid: 1247 + colAttrNum: 26 + typeOid: 26 + typeSize: 4 + typeMod: -1 + - name: typtype + tableOid: 1247 + colAttrNum: 7 + typeOid: 18 + typeSize: 1 + typeMod: -1 + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:40.307738879Z + resTimestampMock: 2026-08-13T09:45:40.311350545Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-42 +spec: + metadata: + class: DDL + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: DDL + lifetime: session + sqlAstHash: sha256:25f6e8bd80295e5521078514fb0d3ecf3c6b71d1d0b0c3c4a73d00625410afe1 + sqlNormalized: create table products (id bigint generated by default as identity, category varchar(255), created_at timestamp(6) with time zone not null, description varchar(1000), name varchar(120) not null, price numeric(12,2) not null, stock_quantity integer not null, primary key (id)) + invocationId: sha256:25f6e8bd80295e5521078514fb0d3ecf3c6b71d1d0b0c3c4a73d00625410afe1:0:2026-08-13T09:45:40.313998045Z:12 + precedingTxState: idle + response: + commandComplete: CREATE TABLE + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:40.313998045Z + resTimestampMock: 2026-08-13T09:45:40.317528962Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-43 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:58.462503137Z:13 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:58.462503137Z + resTimestampMock: 2026-08-13T09:45:58.462900429Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-44 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 order by p1_0.id + invocationId: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780:0:2026-08-13T09:45:58.463240637Z:14 + precedingTxState: in_tx + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:58.463240637Z + resTimestampMock: 2026-08-13T09:45:58.464764304Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-45 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:58.478294762Z:15 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:58.478294762Z + resTimestampMock: 2026-08-13T09:45:58.478561137Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-46 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.138673054Z:16 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.138673054Z + resTimestampMock: 2026-08-13T09:45:59.138902304Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-47 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 order by p1_0.id + invocationId: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780:0:2026-08-13T09:45:59.138719137Z:17 + precedingTxState: in_tx + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.138719137Z + resTimestampMock: 2026-08-13T09:45:59.139324054Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-48 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.140284679Z:18 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.140284679Z + resTimestampMock: 2026-08-13T09:45:59.140499971Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-49 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.242688804Z:19 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.242688804Z + resTimestampMock: 2026-08-13T09:45:59.242842721Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-50 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.242688804Z:20 + precedingTxState: in_tx + bindValues: + - !!binary cGVyaXBoZXJhbHM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS4yMzAwODQrMDA= + - !!binary NjUlIGhvdC1zd2FwcGFibGU= + - !!binary TWVjaGFuaWNhbCBLZXlib2FyZA== + - !!binary AAIAAAAAAAIAgSas + - !!binary AAAAKA== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 1 + - peripherals + - 2026-08-13T09:45:59.230084Z + - 65% hot-swappable + - Mechanical Keyboard + - int: "12999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 40 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.242688804Z + resTimestampMock: 2026-08-13T09:45:59.244165138Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-51 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.254054888Z:21 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.254054888Z + resTimestampMock: 2026-08-13T09:45:59.254722221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-52 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.284791221Z:22 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.284791221Z + resTimestampMock: 2026-08-13T09:45:59.285037929Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-53 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.284791221Z:23 + precedingTxState: in_tx + bindValues: + - !!binary cGVyaXBoZXJhbHM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS4yODQyOTgrMDA= + - !!binary Ny1pbi0xIGFsdW1pbml1bQ== + - !!binary VVNCLUMgSHVi + - !!binary AAIAAAAAAAIAJxOI + - !!binary AAAAZA== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 2 + - peripherals + - 2026-08-13T09:45:59.284298Z + - 7-in-1 aluminium + - USB-C Hub + - int: "3950" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 100 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.284791221Z + resTimestampMock: 2026-08-13T09:45:59.285229846Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-54 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.286481221Z:24 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.286481221Z + resTimestampMock: 2026-08-13T09:45:59.286945638Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-55 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.307609304Z:25 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.307609304Z + resTimestampMock: 2026-08-13T09:45:59.307816429Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-56 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.307666179Z:26 + precedingTxState: in_tx + bindValues: + - !!binary cGVyaXBoZXJhbHM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS4zMDcyMTMrMDA= + - !!binary ZXJnb25vbWljLCAyLjRHSHo= + - !!binary V2lyZWxlc3MgTW91c2U= + - !!binary AAIAAAAAAAIAGCas + - !!binary AAAAlg== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 3 + - peripherals + - 2026-08-13T09:45:59.307213Z + - ergonomic, 2.4GHz + - Wireless Mouse + - int: "2499" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 150 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.307666179Z + resTimestampMock: 2026-08-13T09:45:59.308300221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-57 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.309149513Z:27 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.309149513Z + resTimestampMock: 2026-08-13T09:45:59.309482929Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-58 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.330171596Z:28 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.330171596Z + resTimestampMock: 2026-08-13T09:45:59.330403971Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-59 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.330286721Z:29 + precedingTxState: in_tx + bindValues: + - !!binary bW9uaXRvcnM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS4zMjk0NjUrMDA= + - !!binary SVBTLCA2MEh6 + - !!binary MjctaW5jaCA0SyBNb25pdG9y + - !!binary AAEAAAAAAAIBSQ== + - !!binary AAAAGQ== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 4 + - monitors + - 2026-08-13T09:45:59.329465Z + - IPS, 60Hz + - 27-inch 4K Monitor + - int: "32900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 25 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.330286721Z + resTimestampMock: 2026-08-13T09:45:59.330690221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-60 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.331816471Z:30 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.331816471Z + resTimestampMock: 2026-08-13T09:45:59.332365429Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-61 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.354995013Z:31 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.354995013Z + resTimestampMock: 2026-08-13T09:45:59.355278388Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-62 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.355783513Z:32 + precedingTxState: in_tx + bindValues: + - !!binary bW9uaXRvcnM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS4zNTQ0OTIrMDA= + - !!binary Y3VydmVkLCAxNDRIeg== + - !!binary MzQtaW5jaCBVbHRyYXdpZGUgTW9uaXRvcg== + - !!binary AAEAAAAAAAICVw== + - !!binary AAAADA== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 5 + - monitors + - 2026-08-13T09:45:59.354492Z + - curved, 144Hz + - 34-inch Ultrawide Monitor + - int: "59900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 12 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.355783513Z + resTimestampMock: 2026-08-13T09:45:59.356389304Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-63 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.357318388Z:33 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.357318388Z + resTimestampMock: 2026-08-13T09:45:59.357688846Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-64 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.377126804Z:34 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.377126804Z + resTimestampMock: 2026-08-13T09:45:59.377427304Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-65 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.377705304Z:35 + precedingTxState: in_tx + bindValues: + - !!binary YWNjZXNzb3JpZXM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS4zNzY1NDYrMDA= + - !!binary YWx1bWluaXVtLCBhZGp1c3RhYmxl + - !!binary TGFwdG9wIFN0YW5k + - !!binary AAIAAAAAAAIAIiUc + - !!binary AAAAUA== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 6 + - accessories + - 2026-08-13T09:45:59.376546Z + - aluminium, adjustable + - Laptop Stand + - int: "3495" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 80 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.377705304Z + resTimestampMock: 2026-08-13T09:45:59.378268013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-66 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.378951179Z:36 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.378951179Z + resTimestampMock: 2026-08-13T09:45:59.379725596Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-67 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.399664638Z:37 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.399664638Z + resTimestampMock: 2026-08-13T09:45:59.399831096Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-68 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.399967471Z:38 + precedingTxState: in_tx + bindValues: + - !!binary YXVkaW8= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS4zOTkyMDkrMDA= + - !!binary b3Zlci1lYXIsIEJUIDUuMw== + - !!binary Tm9pc2UtQ2FuY2VsbGluZyBIZWFkcGhvbmVz + - !!binary AAIAAAAAAAIAxyas + - !!binary AAAAPA== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 7 + - audio + - 2026-08-13T09:45:59.399209Z + - over-ear, BT 5.3 + - Noise-Cancelling Headphones + - int: "19999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 60 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.399967471Z + resTimestampMock: 2026-08-13T09:45:59.400274346Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-69 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.401144013Z:39 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.401144013Z + resTimestampMock: 2026-08-13T09:45:59.401778346Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-70 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.420832346Z:40 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.420832346Z + resTimestampMock: 2026-08-13T09:45:59.421104804Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-71 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.421243138Z:41 + precedingTxState: in_tx + bindValues: + - !!binary cGVyaXBoZXJhbHM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS40MjA0MDQrMDA= + - !!binary YXV0by1mb2N1cw== + - !!binary MTA4MHAgV2ViY2Ft + - !!binary AAEAAAAAAAIAOw== + - !!binary AAAALQ== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 8 + - peripherals + - 2026-08-13T09:45:59.420404Z + - auto-focus + - 1080p Webcam + - int: "5900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 45 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.421243138Z + resTimestampMock: 2026-08-13T09:45:59.421645054Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-72 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.422698638Z:42 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.422698638Z + resTimestampMock: 2026-08-13T09:45:59.423541513Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-73 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.442175263Z:43 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.442175263Z + resTimestampMock: 2026-08-13T09:45:59.442317138Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-74 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.442446721Z:44 + precedingTxState: in_tx + bindValues: + - !!binary c3RvcmFnZQ== + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS40NDE3OTYrMDA= + - !!binary VVNCIDMuMiBHZW4y + - !!binary RXh0ZXJuYWwgU1NEIDFUQg== + - !!binary AAIAAAAAAAIAbSas + - !!binary AAAARg== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 9 + - storage + - 2026-08-13T09:45:59.441796Z + - USB 3.2 Gen2 + - External SSD 1TB + - int: "10999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 70 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.442446721Z + resTimestampMock: 2026-08-13T09:45:59.442681096Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-75 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.443486346Z:45 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.443486346Z + resTimestampMock: 2026-08-13T09:45:59.443979429Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-76 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.462140596Z:46 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.462140596Z + resTimestampMock: 2026-08-13T09:45:59.462265388Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-77 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.462385096Z:47 + precedingTxState: in_tx + bindValues: + - !!binary YWNjZXNzb3JpZXM= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS40NjE3NjErMDA= + - !!binary OTAweDQwMG1t + - !!binary RGVzayBNYXQgWEw= + - !!binary AAIAAAAAAAIAEyas + - !!binary AAAAyA== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 10 + - accessories + - 2026-08-13T09:45:59.461761Z + - 900x400mm + - Desk Mat XL + - int: "1999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 200 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.462385096Z + resTimestampMock: 2026-08-13T09:45:59.462678804Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-78 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.463304596Z:48 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.463304596Z + resTimestampMock: 2026-08-13T09:45:59.463626263Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-79 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.480373596Z:49 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.480373596Z + resTimestampMock: 2026-08-13T09:45:59.480495221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-80 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.480590679Z:50 + precedingTxState: in_tx + bindValues: + - !!binary YXVkaW8= + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS40ODAwMjkrMDA= + - !!binary Y2FyZGlvaWQsIHBsdWctYW5kLXBsYXk= + - !!binary VVNCIE1pY3JvcGhvbmU= + - !!binary AAEAAAAAAAIAWQ== + - !!binary AAAAIw== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 11 + - audio + - 2026-08-13T09:45:59.480029Z + - cardioid, plug-and-play + - USB Microphone + - int: "8900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 35 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.480590679Z + resTimestampMock: 2026-08-13T09:45:59.480760721Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-81 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.481380138Z:51 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.481380138Z + resTimestampMock: 2026-08-13T09:45:59.481716263Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-82 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.498687846Z:52 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.498687846Z + resTimestampMock: 2026-08-13T09:45:59.498848013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-83 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6 + sqlNormalized: "insert into products (category,created_at,description,name,price,stock_quantity) values ($1,$2,$3,$4,$5,$6)\nRETURNING *" + paramOids: + - 1043 + - 0 + - 1043 + - 1043 + - 1700 + - 23 + invocationId: sha256:3228dd720ec6861d81492ae96062eb07f7dca1d0a2c02b42095ee389b77990d6:0:2026-08-13T09:45:59.498965304Z:53 + precedingTxState: in_tx + bindValues: + - !!binary Y29tcHV0ZXJz + - !!binary MjAyNi0wOC0xMyAwOTo0NTo1OS40OTgzMzErMDA= + - !!binary MTZHQiBSQU0sIDUxMkdCIFNTRA== + - !!binary MTQtaW5jaCBMYXB0b3A= + - !!binary AAEAAAAAAAIESw== + - !!binary AAAADw== + bindFormats: + - 0 + - 0 + - 0 + - 0 + - 1 + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 12 + - computers + - 2026-08-13T09:45:59.498331Z + - 16GB RAM, 512GB SSD + - 14-inch Laptop + - int: "109900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 15 + commandComplete: INSERT 0 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.498965304Z + resTimestampMock: 2026-08-13T09:45:59.499153013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-84 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.499781013Z:54 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.499781013Z + resTimestampMock: 2026-08-13T09:45:59.500176346Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-85 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.516738471Z:55 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.516738471Z + resTimestampMock: 2026-08-13T09:45:59.516961179Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-86 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 order by p1_0.id + invocationId: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780:0:2026-08-13T09:45:59.516738471Z:56 + precedingTxState: in_tx + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 1 + - peripherals + - 2026-08-13T09:45:59.230084Z + - 65% hot-swappable + - Mechanical Keyboard + - int: "12999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 40 + - - 2 + - peripherals + - 2026-08-13T09:45:59.284298Z + - 7-in-1 aluminium + - USB-C Hub + - int: "3950" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 100 + - - 3 + - peripherals + - 2026-08-13T09:45:59.307213Z + - ergonomic, 2.4GHz + - Wireless Mouse + - int: "2499" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 150 + - - 4 + - monitors + - 2026-08-13T09:45:59.329465Z + - IPS, 60Hz + - 27-inch 4K Monitor + - int: "32900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 25 + - - 5 + - monitors + - 2026-08-13T09:45:59.354492Z + - curved, 144Hz + - 34-inch Ultrawide Monitor + - int: "59900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 12 + - - 6 + - accessories + - 2026-08-13T09:45:59.376546Z + - aluminium, adjustable + - Laptop Stand + - int: "3495" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 80 + - - 7 + - audio + - 2026-08-13T09:45:59.399209Z + - over-ear, BT 5.3 + - Noise-Cancelling Headphones + - int: "19999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 60 + - - 8 + - peripherals + - 2026-08-13T09:45:59.420404Z + - auto-focus + - 1080p Webcam + - int: "5900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 45 + - - 9 + - storage + - 2026-08-13T09:45:59.441796Z + - USB 3.2 Gen2 + - External SSD 1TB + - int: "10999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 70 + - - 10 + - accessories + - 2026-08-13T09:45:59.461761Z + - 900x400mm + - Desk Mat XL + - int: "1999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 200 + - - 11 + - audio + - 2026-08-13T09:45:59.480029Z + - cardioid, plug-and-play + - USB Microphone + - int: "8900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 35 + - - 12 + - computers + - 2026-08-13T09:45:59.498331Z + - 16GB RAM, 512GB SSD + - 14-inch Laptop + - int: "109900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 15 + commandComplete: SELECT 12 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.516738471Z + resTimestampMock: 2026-08-13T09:45:59.517151804Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-87 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.521397138Z:57 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.521397138Z + resTimestampMock: 2026-08-13T09:45:59.521536554Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-88 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.541106388Z:58 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.541106388Z + resTimestampMock: 2026-08-13T09:45:59.541379346Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-89 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.541106388Z:59 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 1 + - peripherals + - 2026-08-13T09:45:59.230084Z + - 65% hot-swappable + - Mechanical Keyboard + - int: "12999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 40 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.541106388Z + resTimestampMock: 2026-08-13T09:45:59.542199221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-90 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.544205471Z:60 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.544205471Z + resTimestampMock: 2026-08-13T09:45:59.544415971Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-91 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.558116471Z:61 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.558116471Z + resTimestampMock: 2026-08-13T09:45:59.558289679Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-92 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.558165638Z:62 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAI= + bindFormats: + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 2 + - peripherals + - 2026-08-13T09:45:59.284298Z + - 7-in-1 aluminium + - USB-C Hub + - int: "3950" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 100 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.558165638Z + resTimestampMock: 2026-08-13T09:45:59.558430763Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-93 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.559070013Z:63 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.559070013Z + resTimestampMock: 2026-08-13T09:45:59.559214596Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-94 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.571873513Z:64 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.571873513Z + resTimestampMock: 2026-08-13T09:45:59.572073971Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-95 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.571915888Z:65 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAM= + bindFormats: + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 3 + - peripherals + - 2026-08-13T09:45:59.307213Z + - ergonomic, 2.4GHz + - Wireless Mouse + - int: "2499" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 150 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.571915888Z + resTimestampMock: 2026-08-13T09:45:59.572319054Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-96 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.573726846Z:66 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.573726846Z + resTimestampMock: 2026-08-13T09:45:59.573972929Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-97 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.588257763Z:67 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.588257763Z + resTimestampMock: 2026-08-13T09:45:59.588452263Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-98 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.588257763Z:68 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAQ= + bindFormats: + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 4 + - monitors + - 2026-08-13T09:45:59.329465Z + - IPS, 60Hz + - 27-inch 4K Monitor + - int: "32900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 25 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.588257763Z + resTimestampMock: 2026-08-13T09:45:59.588703346Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-99 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.590160388Z:69 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.590160388Z + resTimestampMock: 2026-08-13T09:45:59.590419013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-100 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.604644304Z:70 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.604644304Z + resTimestampMock: 2026-08-13T09:45:59.604814596Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-101 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.604683346Z:71 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAU= + bindFormats: + - 1 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 5 + - monitors + - 2026-08-13T09:45:59.354492Z + - curved, 144Hz + - 34-inch Ultrawide Monitor + - int: "59900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 12 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.604683346Z + resTimestampMock: 2026-08-13T09:45:59.604990929Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-102 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.605977513Z:72 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.605977513Z + resTimestampMock: 2026-08-13T09:45:59.606397721Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-103 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.621036346Z:73 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.621036346Z + resTimestampMock: 2026-08-13T09:45:59.621206054Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-104 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.621036346Z:74 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAY= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 6 + - format: 0 + bytes: + - 97 + - 99 + - 99 + - 101 + - 115 + - 115 + - 111 + - 114 + - 105 + - 101 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 5 + - 226 + - 162 + - format: 0 + bytes: + - 97 + - 108 + - 117 + - 109 + - 105 + - 110 + - 105 + - 117 + - 109 + - 44 + - 32 + - 97 + - 100 + - 106 + - 117 + - 115 + - 116 + - 97 + - 98 + - 108 + - 101 + - format: 0 + bytes: + - 76 + - 97 + - 112 + - 116 + - 111 + - 112 + - 32 + - 83 + - 116 + - 97 + - 110 + - 100 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 34 + - 37 + - 28 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 80 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.621036346Z + resTimestampMock: 2026-08-13T09:45:59.621431679Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-105 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.624423179Z:75 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.624423179Z + resTimestampMock: 2026-08-13T09:45:59.624723888Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-106 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.637462971Z:76 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.637462971Z + resTimestampMock: 2026-08-13T09:45:59.637580304Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-107 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.637462971Z:77 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAc= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 7 + - format: 0 + bytes: + - 97 + - 117 + - 100 + - 105 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 59 + - 41 + - format: 0 + bytes: + - 111 + - 118 + - 101 + - 114 + - 45 + - 101 + - 97 + - 114 + - 44 + - 32 + - 66 + - 84 + - 32 + - 53 + - 46 + - 51 + - format: 0 + bytes: + - 78 + - 111 + - 105 + - 115 + - 101 + - 45 + - 67 + - 97 + - 110 + - 99 + - 101 + - 108 + - 108 + - 105 + - 110 + - 103 + - 32 + - 72 + - 101 + - 97 + - 100 + - 112 + - 104 + - 111 + - 110 + - 101 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 199 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 60 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.637462971Z + resTimestampMock: 2026-08-13T09:45:59.637713221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-108 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.638459763Z:78 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.638459763Z + resTimestampMock: 2026-08-13T09:45:59.638586554Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-109 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.652059513Z:79 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.652059513Z + resTimestampMock: 2026-08-13T09:45:59.652319513Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-110 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.652106054Z:80 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAg= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 8 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 141 + - 244 + - format: 0 + bytes: + - 97 + - 117 + - 116 + - 111 + - 45 + - 102 + - 111 + - 99 + - 117 + - 115 + - format: 0 + bytes: + - 49 + - 48 + - 56 + - 48 + - 112 + - 32 + - 87 + - 101 + - 98 + - 99 + - 97 + - 109 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 59 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 45 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.652106054Z + resTimestampMock: 2026-08-13T09:45:59.652475388Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-111 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.653244013Z:81 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.653244013Z + resTimestampMock: 2026-08-13T09:45:59.653378221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-112 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.667045388Z:82 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.667045388Z + resTimestampMock: 2026-08-13T09:45:59.667344471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-113 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.667092179Z:83 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAk= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 9 + - format: 0 + bytes: + - 115 + - 116 + - 111 + - 114 + - 97 + - 103 + - 101 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 225 + - 132 + - format: 0 + bytes: + - 85 + - 83 + - 66 + - 32 + - 51 + - 46 + - 50 + - 32 + - 71 + - 101 + - 110 + - 50 + - format: 0 + bytes: + - 69 + - 120 + - 116 + - 101 + - 114 + - 110 + - 97 + - 108 + - 32 + - 83 + - 83 + - 68 + - 32 + - 49 + - 84 + - 66 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 109 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 70 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.667092179Z + resTimestampMock: 2026-08-13T09:45:59.667462929Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-114 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.670252638Z:84 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.670252638Z + resTimestampMock: 2026-08-13T09:45:59.670467929Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-115 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.687322429Z:85 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.687322429Z + resTimestampMock: 2026-08-13T09:45:59.687580471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-116 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.687381888Z:86 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAo= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 10 + - format: 0 + bytes: + - 97 + - 99 + - 99 + - 101 + - 115 + - 115 + - 111 + - 114 + - 105 + - 101 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 7 + - 47 + - 129 + - format: 0 + bytes: + - 57 + - 48 + - 48 + - 120 + - 52 + - 48 + - 48 + - 109 + - 109 + - format: 0 + bytes: + - 68 + - 101 + - 115 + - 107 + - 32 + - 77 + - 97 + - 116 + - 32 + - 88 + - 76 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 19 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 200 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.687381888Z + resTimestampMock: 2026-08-13T09:45:59.687778554Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-117 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.689050846Z:87 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.689050846Z + resTimestampMock: 2026-08-13T09:45:59.689196638Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-118 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.702963763Z:88 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.702963763Z + resTimestampMock: 2026-08-13T09:45:59.703100471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-119 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.703006429Z:89 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAs= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 11 + - format: 0 + bytes: + - 97 + - 117 + - 100 + - 105 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 7 + - 118 + - 221 + - format: 0 + bytes: + - 99 + - 97 + - 114 + - 100 + - 105 + - 111 + - 105 + - 100 + - 44 + - 32 + - 112 + - 108 + - 117 + - 103 + - 45 + - 97 + - 110 + - 100 + - 45 + - 112 + - 108 + - 97 + - 121 + - format: 0 + bytes: + - 85 + - 83 + - 66 + - 32 + - 77 + - 105 + - 99 + - 114 + - 111 + - 112 + - 104 + - 111 + - 110 + - 101 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 89 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 35 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.703006429Z + resTimestampMock: 2026-08-13T09:45:59.703179304Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-120 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.703766054Z:90 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.703766054Z + resTimestampMock: 2026-08-13T09:45:59.703882679Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-121 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.717316138Z:91 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.717316138Z + resTimestampMock: 2026-08-13T09:45:59.717454179Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-122 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.717363554Z:92 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAw= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 12 + - format: 0 + bytes: + - 99 + - 111 + - 109 + - 112 + - 117 + - 116 + - 101 + - 114 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 7 + - 190 + - 91 + - format: 0 + bytes: + - 49 + - 54 + - 71 + - 66 + - 32 + - 82 + - 65 + - 77 + - 44 + - 32 + - 53 + - 49 + - 50 + - 71 + - 66 + - 32 + - 83 + - 83 + - 68 + - format: 0 + bytes: + - 49 + - 52 + - 45 + - 105 + - 110 + - 99 + - 104 + - 32 + - 76 + - 97 + - 112 + - 116 + - 111 + - 112 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 4 + - 75 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 15 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.717363554Z + resTimestampMock: 2026-08-13T09:45:59.717544971Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-123 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.718590138Z:93 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.718590138Z + resTimestampMock: 2026-08-13T09:45:59.718759138Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-124 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.787377054Z:94 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.787377054Z + resTimestampMock: 2026-08-13T09:45:59.787551096Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-125 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:45:59.787801013Z:95 + precedingTxState: in_tx + bindValues: + - !!binary cGVyaXBoZXJhbHM= + bindFormats: + - 0 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 1 + - peripherals + - 2026-08-13T09:45:59.230084Z + - 65% hot-swappable + - Mechanical Keyboard + - int: "12999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 40 + - - 2 + - peripherals + - 2026-08-13T09:45:59.284298Z + - 7-in-1 aluminium + - USB-C Hub + - int: "3950" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 100 + - - 3 + - peripherals + - 2026-08-13T09:45:59.307213Z + - ergonomic, 2.4GHz + - Wireless Mouse + - int: "2499" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 150 + - - 8 + - peripherals + - 2026-08-13T09:45:59.420404Z + - auto-focus + - 1080p Webcam + - int: "5900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 45 + commandComplete: SELECT 4 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.787801013Z + resTimestampMock: 2026-08-13T09:45:59.788765221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-126 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.791736096Z:96 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.791736096Z + resTimestampMock: 2026-08-13T09:45:59.791914429Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-127 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.806136971Z:97 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.806136971Z + resTimestampMock: 2026-08-13T09:45:59.806427304Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-128 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:45:59.806136971Z:98 + precedingTxState: in_tx + bindValues: + - !!binary bW9uaXRvcnM= + bindFormats: + - 0 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 4 + - monitors + - 2026-08-13T09:45:59.329465Z + - IPS, 60Hz + - 27-inch 4K Monitor + - int: "32900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 25 + - - 5 + - monitors + - 2026-08-13T09:45:59.354492Z + - curved, 144Hz + - 34-inch Ultrawide Monitor + - int: "59900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 12 + commandComplete: SELECT 2 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.806136971Z + resTimestampMock: 2026-08-13T09:45:59.806834013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-129 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.808384096Z:99 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.808384096Z + resTimestampMock: 2026-08-13T09:45:59.808519013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-130 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.823253346Z:100 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.823253346Z + resTimestampMock: 2026-08-13T09:45:59.823455554Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-131 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:45:59.823253346Z:101 + precedingTxState: in_tx + bindValues: + - !!binary YWNjZXNzb3JpZXM= + bindFormats: + - 0 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 6 + - accessories + - 2026-08-13T09:45:59.376546Z + - aluminium, adjustable + - Laptop Stand + - int: "3495" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 80 + - - 10 + - accessories + - 2026-08-13T09:45:59.461761Z + - 900x400mm + - Desk Mat XL + - int: "1999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 200 + commandComplete: SELECT 2 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.823253346Z + resTimestampMock: 2026-08-13T09:45:59.823699013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-132 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.824738554Z:102 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.824738554Z + resTimestampMock: 2026-08-13T09:45:59.825020179Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-133 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.840436471Z:103 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.840436471Z + resTimestampMock: 2026-08-13T09:45:59.840608929Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-134 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:45:59.840822263Z:104 + precedingTxState: in_tx + bindValues: + - !!binary YXVkaW8= + bindFormats: + - 0 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 7 + - audio + - 2026-08-13T09:45:59.399209Z + - over-ear, BT 5.3 + - Noise-Cancelling Headphones + - int: "19999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 60 + - - 11 + - audio + - 2026-08-13T09:45:59.480029Z + - cardioid, plug-and-play + - USB Microphone + - int: "8900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 35 + commandComplete: SELECT 2 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.840822263Z + resTimestampMock: 2026-08-13T09:45:59.841445179Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-135 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.843244554Z:105 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.843244554Z + resTimestampMock: 2026-08-13T09:45:59.843536763Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-136 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.861144513Z:106 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.861144513Z + resTimestampMock: 2026-08-13T09:45:59.861450013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-137 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:45:59.861238638Z:107 + precedingTxState: in_tx + bindValues: + - !!binary c3RvcmFnZQ== + bindFormats: + - 0 + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 9 + - storage + - 2026-08-13T09:45:59.441796Z + - USB 3.2 Gen2 + - External SSD 1TB + - int: "10999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 70 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.861238638Z + resTimestampMock: 2026-08-13T09:45:59.861740221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-138 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.862951471Z:108 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.862951471Z + resTimestampMock: 2026-08-13T09:45:59.863226763Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-139 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.879603596Z:109 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.879603596Z + resTimestampMock: 2026-08-13T09:45:59.879834805Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-140 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:45:59.879603596Z:110 + precedingTxState: in_tx + bindValues: + - !!binary Y29tcHV0ZXJz + bindFormats: + - 0 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 12 + - format: 0 + bytes: + - 99 + - 111 + - 109 + - 112 + - 117 + - 116 + - 101 + - 114 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 7 + - 190 + - 91 + - format: 0 + bytes: + - 49 + - 54 + - 71 + - 66 + - 32 + - 82 + - 65 + - 77 + - 44 + - 32 + - 53 + - 49 + - 50 + - 71 + - 66 + - 32 + - 83 + - 83 + - 68 + - format: 0 + bytes: + - 49 + - 52 + - 45 + - 105 + - 110 + - 99 + - 104 + - 32 + - 76 + - 97 + - 112 + - 116 + - 111 + - 112 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 4 + - 75 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 15 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.879603596Z + resTimestampMock: 2026-08-13T09:45:59.880145805Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-141 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.88116043Z:111 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.88116043Z + resTimestampMock: 2026-08-13T09:45:59.881329638Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-142 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.898216221Z:112 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.898216221Z + resTimestampMock: 2026-08-13T09:45:59.898348263Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-143 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:45:59.898216221Z:113 + precedingTxState: in_tx + bindValues: + - !!binary Z2FtaW5n + bindFormats: + - 0 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.898216221Z + resTimestampMock: 2026-08-13T09:45:59.898536013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-144 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.899382388Z:114 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.899382388Z + resTimestampMock: 2026-08-13T09:45:59.899493888Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-145 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.913624596Z:115 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.913624596Z + resTimestampMock: 2026-08-13T09:45:59.913727471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-146 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.913866555Z:116 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 54 + - 53 + - 37 + - 32 + - 104 + - 111 + - 116 + - 45 + - 115 + - 119 + - 97 + - 112 + - 112 + - 97 + - 98 + - 108 + - 101 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 129 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 40 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.913866555Z + resTimestampMock: 2026-08-13T09:45:59.914004263Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-147 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:0eccdc80934ad13a21d207d4a3c49c1fea511bb6982d08d267330d85326e9bee + sqlNormalized: update products set category=$1,description=$2,name=$3,price=$4,stock_quantity=$5 where id=$6 + paramOids: + - 1043 + - 1043 + - 1043 + - 1700 + - 23 + - 20 + invocationId: sha256:0eccdc80934ad13a21d207d4a3c49c1fea511bb6982d08d267330d85326e9bee:0:2026-08-13T09:45:59.91978993Z:117 + precedingTxState: in_tx + bindValues: + - !!binary cGVyaXBoZXJhbHM= + - !!binary NzUlIGxheW91dCwgUkdC + - !!binary TWVjaGFuaWNhbCBLZXlib2FyZCB2Mg== + - !!binary AAIAAAAAAAIAlSas + - !!binary AAAAIw== + - !!binary AAAAAAAAAAE= + bindFormats: + - 0 + - 0 + - 0 + - 1 + - 1 + - 1 + response: + commandComplete: UPDATE 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.91978993Z + resTimestampMock: 2026-08-13T09:45:59.920424013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-148 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.921440221Z:118 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.921440221Z + resTimestampMock: 2026-08-13T09:45:59.922118638Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-149 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.934575721Z:119 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.934575721Z + resTimestampMock: 2026-08-13T09:45:59.93470668Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-150 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.934575721Z:120 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 35 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.934575721Z + resTimestampMock: 2026-08-13T09:45:59.934864846Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-151 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.935408305Z:121 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.935408305Z + resTimestampMock: 2026-08-13T09:45:59.935595638Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-152 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.949134513Z:122 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.949134513Z + resTimestampMock: 2026-08-13T09:45:59.94927693Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-153 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.949134513Z:123 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAQ= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 4 + - format: 0 + bytes: + - 109 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 5 + - 42 + - 185 + - format: 0 + bytes: + - 73 + - 80 + - 83 + - 44 + - 32 + - 54 + - 48 + - 72 + - 122 + - format: 0 + bytes: + - 50 + - 55 + - 45 + - 105 + - 110 + - 99 + - 104 + - 32 + - 52 + - 75 + - 32 + - 77 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 1 + - 73 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 25 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.949134513Z + resTimestampMock: 2026-08-13T09:45:59.949418721Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-154 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:0eccdc80934ad13a21d207d4a3c49c1fea511bb6982d08d267330d85326e9bee + sqlNormalized: update products set category=$1,description=$2,name=$3,price=$4,stock_quantity=$5 where id=$6 + paramOids: + - 1043 + - 1043 + - 1043 + - 1700 + - 23 + - 20 + invocationId: sha256:0eccdc80934ad13a21d207d4a3c49c1fea511bb6982d08d267330d85326e9bee:0:2026-08-13T09:45:59.950757888Z:124 + precedingTxState: in_tx + bindValues: + - !!binary bW9uaXRvcnM= + - !!binary SVBTLCA2MEh6LCBIRFI0MDA= + - !!binary MjctaW5jaCA0SyBNb25pdG9y + - !!binary AAEAAAAAAAIBKw== + - !!binary AAAAHg== + - !!binary AAAAAAAAAAQ= + bindFormats: + - 0 + - 0 + - 0 + - 1 + - 1 + - 1 + response: + commandComplete: UPDATE 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.950757888Z + resTimestampMock: 2026-08-13T09:45:59.951063055Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-155 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.95123618Z:125 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.95123618Z + resTimestampMock: 2026-08-13T09:45:59.951590305Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-156 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.963993221Z:126 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.963993221Z + resTimestampMock: 2026-08-13T09:45:59.964137055Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-157 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.963993221Z:127 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAQ= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 4 + - format: 0 + bytes: + - 109 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 5 + - 42 + - 185 + - format: 0 + bytes: + - 73 + - 80 + - 83 + - 44 + - 32 + - 54 + - 48 + - 72 + - 122 + - 44 + - 32 + - 72 + - 68 + - 82 + - 52 + - 48 + - 48 + - format: 0 + bytes: + - 50 + - 55 + - 45 + - 105 + - 110 + - 99 + - 104 + - 32 + - 52 + - 75 + - 32 + - 77 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 1 + - 43 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 30 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.963993221Z + resTimestampMock: 2026-08-13T09:45:59.964279013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-158 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.965101555Z:128 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.965101555Z + resTimestampMock: 2026-08-13T09:45:59.965207471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-159 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.978739805Z:129 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.978739805Z + resTimestampMock: 2026-08-13T09:45:59.978895721Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-160 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.978739805Z:130 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAc= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 7 + - format: 0 + bytes: + - 97 + - 117 + - 100 + - 105 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 59 + - 41 + - format: 0 + bytes: + - 111 + - 118 + - 101 + - 114 + - 45 + - 101 + - 97 + - 114 + - 44 + - 32 + - 66 + - 84 + - 32 + - 53 + - 46 + - 51 + - format: 0 + bytes: + - 78 + - 111 + - 105 + - 115 + - 101 + - 45 + - 67 + - 97 + - 110 + - 99 + - 101 + - 108 + - 108 + - 105 + - 110 + - 103 + - 32 + - 72 + - 101 + - 97 + - 100 + - 112 + - 104 + - 111 + - 110 + - 101 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 199 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 60 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.978739805Z + resTimestampMock: 2026-08-13T09:45:59.979050013Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-161 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:0eccdc80934ad13a21d207d4a3c49c1fea511bb6982d08d267330d85326e9bee + sqlNormalized: update products set category=$1,description=$2,name=$3,price=$4,stock_quantity=$5 where id=$6 + paramOids: + - 1043 + - 1043 + - 1043 + - 1700 + - 23 + - 20 + invocationId: sha256:0eccdc80934ad13a21d207d4a3c49c1fea511bb6982d08d267330d85326e9bee:0:2026-08-13T09:45:59.980330721Z:131 + precedingTxState: in_tx + bindValues: + - !!binary YXVkaW8= + - !!binary b3Zlci1lYXIsIEJUIDUuMywgQU5DKw== + - !!binary Tm9pc2UtQ2FuY2VsbGluZyBIZWFkcGhvbmVzIFBybw== + - !!binary AAIAAAAAAAIA+Sas + - !!binary AAAAMg== + - !!binary AAAAAAAAAAc= + bindFormats: + - 0 + - 0 + - 0 + - 1 + - 1 + - 1 + response: + commandComplete: UPDATE 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.980330721Z + resTimestampMock: 2026-08-13T09:45:59.980626471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-162 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.98083918Z:132 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.98083918Z + resTimestampMock: 2026-08-13T09:45:59.981231471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-163 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:45:59.993979555Z:133 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.993979555Z + resTimestampMock: 2026-08-13T09:45:59.99414693Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-164 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:45:59.993979555Z:134 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAc= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 7 + - format: 0 + bytes: + - 97 + - 117 + - 100 + - 105 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 59 + - 41 + - format: 0 + bytes: + - 111 + - 118 + - 101 + - 114 + - 45 + - 101 + - 97 + - 114 + - 44 + - 32 + - 66 + - 84 + - 32 + - 53 + - 46 + - 51 + - 44 + - 32 + - 65 + - 78 + - 67 + - 43 + - format: 0 + bytes: + - 78 + - 111 + - 105 + - 115 + - 101 + - 45 + - 67 + - 97 + - 110 + - 99 + - 101 + - 108 + - 108 + - 105 + - 110 + - 103 + - 32 + - 72 + - 101 + - 97 + - 100 + - 112 + - 104 + - 111 + - 110 + - 101 + - 115 + - 32 + - 80 + - 114 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 249 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 50 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.993979555Z + resTimestampMock: 2026-08-13T09:45:59.994307638Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-165 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:45:59.995213096Z:135 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:45:59.995213096Z + resTimestampMock: 2026-08-13T09:45:59.995332388Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-166 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.008422638Z:136 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.008422638Z + resTimestampMock: 2026-08-13T09:46:00.008575346Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-167 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.008477805Z:137 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAM= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 3 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 4 + - 211 + - 205 + - format: 0 + bytes: + - 101 + - 114 + - 103 + - 111 + - 110 + - 111 + - 109 + - 105 + - 99 + - 44 + - 32 + - 50 + - 46 + - 52 + - 71 + - 72 + - 122 + - format: 0 + bytes: + - 87 + - 105 + - 114 + - 101 + - 108 + - 101 + - 115 + - 115 + - 32 + - 77 + - 111 + - 117 + - 115 + - 101 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 24 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 150 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.008477805Z + resTimestampMock: 2026-08-13T09:46:00.008664096Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-168 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:88e6e38d3ea613d24eefe3a4ec18d71c65703e72674f5dfab01b814f5cf4c412 + sqlNormalized: delete from products where id=$1 + paramOids: + - 20 + invocationId: sha256:88e6e38d3ea613d24eefe3a4ec18d71c65703e72674f5dfab01b814f5cf4c412:0:2026-08-13T09:46:00.012685055Z:138 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAM= + bindFormats: + - 1 + response: + commandComplete: DELETE 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.012685055Z + resTimestampMock: 2026-08-13T09:46:00.01297943Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-169 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.014154805Z:139 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.014154805Z + resTimestampMock: 2026-08-13T09:46:00.015060805Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-170 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.033019513Z:140 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.033019513Z + resTimestampMock: 2026-08-13T09:46:00.033308846Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-171 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.033019513Z:141 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAo= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 10 + - format: 0 + bytes: + - 97 + - 99 + - 99 + - 101 + - 115 + - 115 + - 111 + - 114 + - 105 + - 101 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 7 + - 47 + - 129 + - format: 0 + bytes: + - 57 + - 48 + - 48 + - 120 + - 52 + - 48 + - 48 + - 109 + - 109 + - format: 0 + bytes: + - 68 + - 101 + - 115 + - 107 + - 32 + - 77 + - 97 + - 116 + - 32 + - 88 + - 76 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 19 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 200 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.033019513Z + resTimestampMock: 2026-08-13T09:46:00.033451721Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-172 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:88e6e38d3ea613d24eefe3a4ec18d71c65703e72674f5dfab01b814f5cf4c412 + sqlNormalized: delete from products where id=$1 + paramOids: + - 20 + invocationId: sha256:88e6e38d3ea613d24eefe3a4ec18d71c65703e72674f5dfab01b814f5cf4c412:0:2026-08-13T09:46:00.034976471Z:142 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAo= + bindFormats: + - 1 + response: + commandComplete: DELETE 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.034976471Z + resTimestampMock: 2026-08-13T09:46:00.035378138Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-173 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.035567013Z:143 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.035567013Z + resTimestampMock: 2026-08-13T09:46:00.035953596Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-174 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.050222221Z:144 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.050222221Z + resTimestampMock: 2026-08-13T09:46:00.050409263Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-175 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 order by p1_0.id + invocationId: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780:0:2026-08-13T09:46:00.050273138Z:145 + precedingTxState: in_tx + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 1 + - peripherals + - 2026-08-13T09:45:59.230084Z + - 75% layout, RGB + - Mechanical Keyboard v2 + - int: "14999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 35 + - - 2 + - peripherals + - 2026-08-13T09:45:59.284298Z + - 7-in-1 aluminium + - USB-C Hub + - int: "3950" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 100 + - - 4 + - monitors + - 2026-08-13T09:45:59.329465Z + - IPS, 60Hz, HDR400 + - 27-inch 4K Monitor + - int: "29900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 30 + - - 5 + - monitors + - 2026-08-13T09:45:59.354492Z + - curved, 144Hz + - 34-inch Ultrawide Monitor + - int: "59900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 12 + - - 6 + - accessories + - 2026-08-13T09:45:59.376546Z + - aluminium, adjustable + - Laptop Stand + - int: "3495" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 80 + - - 7 + - audio + - 2026-08-13T09:45:59.399209Z + - over-ear, BT 5.3, ANC+ + - Noise-Cancelling Headphones Pro + - int: "24999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 50 + - - 8 + - peripherals + - 2026-08-13T09:45:59.420404Z + - auto-focus + - 1080p Webcam + - int: "5900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 45 + - - 9 + - storage + - 2026-08-13T09:45:59.441796Z + - USB 3.2 Gen2 + - External SSD 1TB + - int: "10999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 70 + - - 11 + - audio + - 2026-08-13T09:45:59.480029Z + - cardioid, plug-and-play + - USB Microphone + - int: "8900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 35 + - - 12 + - computers + - 2026-08-13T09:45:59.498331Z + - 16GB RAM, 512GB SSD + - 14-inch Laptop + - int: "109900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 15 + commandComplete: SELECT 10 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.050273138Z + resTimestampMock: 2026-08-13T09:46:00.050609263Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-176 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.052886555Z:146 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.052886555Z + resTimestampMock: 2026-08-13T09:46:00.053098888Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-177 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.069462346Z:147 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.069462346Z + resTimestampMock: 2026-08-13T09:46:00.069679096Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-178 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where upper(p1_0.category)=upper($1) order by p1_0.id + paramOids: + - 1043 + invocationId: sha256:d648457f5371a87c3694f645684b8e3406d9898f01a44915577c13e3e1138435:0:2026-08-13T09:46:00.069462346Z:148 + precedingTxState: in_tx + bindValues: + - !!binary cGVyaXBoZXJhbHM= + bindFormats: + - 0 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 35 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 4 + - 122 + - 74 + - format: 0 + bytes: + - 55 + - 45 + - 105 + - 110 + - 45 + - 49 + - 32 + - 97 + - 108 + - 117 + - 109 + - 105 + - 110 + - 105 + - 117 + - 109 + - format: 0 + bytes: + - 85 + - 83 + - 66 + - 45 + - 67 + - 32 + - 72 + - 117 + - 98 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 39 + - 19 + - 136 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 100 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 8 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 141 + - 244 + - format: 0 + bytes: + - 97 + - 117 + - 116 + - 111 + - 45 + - 102 + - 111 + - 99 + - 117 + - 115 + - format: 0 + bytes: + - 49 + - 48 + - 56 + - 48 + - 112 + - 32 + - 87 + - 101 + - 98 + - 99 + - 97 + - 109 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 59 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 45 + commandComplete: SELECT 3 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.069462346Z + resTimestampMock: 2026-08-13T09:46:00.069844971Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-179 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.071406013Z:149 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.071406013Z + resTimestampMock: 2026-08-13T09:46:00.071604221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-180 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.08619768Z:150 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.08619768Z + resTimestampMock: 2026-08-13T09:46:00.086342138Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-181 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.086245596Z:151 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAABhp8= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.086245596Z + resTimestampMock: 2026-08-13T09:46:00.086518805Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-182 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338 + sqlNormalized: ROLLBACK + invocationId: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338:0:2026-08-13T09:46:00.087674721Z:152 + precedingTxState: in_tx + response: + commandComplete: ROLLBACK + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.087674721Z + resTimestampMock: 2026-08-13T09:46:00.087823305Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-183 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.115305305Z:153 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.115305305Z + resTimestampMock: 2026-08-13T09:46:00.115448888Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-184 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.115346638Z:154 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAM= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.115346638Z + resTimestampMock: 2026-08-13T09:46:00.115546055Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-185 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338 + sqlNormalized: ROLLBACK + invocationId: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338:0:2026-08-13T09:46:00.116055763Z:155 + precedingTxState: in_tx + response: + commandComplete: ROLLBACK + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.116055763Z + resTimestampMock: 2026-08-13T09:46:00.116305513Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-186 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.137674846Z:156 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.137674846Z + resTimestampMock: 2026-08-13T09:46:00.137843721Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-187 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.137730971Z:157 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAABhp8= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.137730971Z + resTimestampMock: 2026-08-13T09:46:00.138072513Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-188 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338 + sqlNormalized: ROLLBACK + invocationId: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338:0:2026-08-13T09:46:00.138626138Z:158 + precedingTxState: in_tx + response: + commandComplete: ROLLBACK + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.138626138Z + resTimestampMock: 2026-08-13T09:46:00.139443305Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-189 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.159033138Z:159 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.159033138Z + resTimestampMock: 2026-08-13T09:46:00.159304055Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-190 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.159081513Z:160 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAABWzg= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.159081513Z + resTimestampMock: 2026-08-13T09:46:00.159500138Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-191 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338 + sqlNormalized: ROLLBACK + invocationId: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338:0:2026-08-13T09:46:00.160079471Z:161 + precedingTxState: in_tx + response: + commandComplete: ROLLBACK + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.160079471Z + resTimestampMock: 2026-08-13T09:46:00.160191305Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-192 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.380634096Z:162 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.380634096Z + resTimestampMock: 2026-08-13T09:46:00.380816471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-193 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 order by p1_0.id + invocationId: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780:0:2026-08-13T09:46:00.380702263Z:163 + precedingTxState: in_tx + response: + rowDescription: + - name: id + tableOid: 16386 + colAttrNum: 1 + typeOid: 20 + typeSize: 8 + typeMod: -1 + - name: category + tableOid: 16386 + colAttrNum: 2 + typeOid: 1043 + typeSize: -1 + typeMod: 259 + - name: created_at + tableOid: 16386 + colAttrNum: 3 + typeOid: 1184 + typeSize: 8 + typeMod: 6 + - name: description + tableOid: 16386 + colAttrNum: 4 + typeOid: 1043 + typeSize: -1 + typeMod: 1004 + - name: name + tableOid: 16386 + colAttrNum: 5 + typeOid: 1043 + typeSize: -1 + typeMod: 124 + - name: price + tableOid: 16386 + colAttrNum: 6 + typeOid: 1700 + typeSize: -1 + typeMod: 786438 + - name: stock_quantity + tableOid: 16386 + colAttrNum: 7 + typeOid: 23 + typeSize: 4 + typeMod: -1 + rows: + - - 1 + - peripherals + - 2026-08-13T09:45:59.230084Z + - 75% layout, RGB + - Mechanical Keyboard v2 + - int: "14999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 35 + - - 2 + - peripherals + - 2026-08-13T09:45:59.284298Z + - 7-in-1 aluminium + - USB-C Hub + - int: "3950" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 100 + - - 4 + - monitors + - 2026-08-13T09:45:59.329465Z + - IPS, 60Hz, HDR400 + - 27-inch 4K Monitor + - int: "29900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 30 + - - 5 + - monitors + - 2026-08-13T09:45:59.354492Z + - curved, 144Hz + - 34-inch Ultrawide Monitor + - int: "59900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 12 + - - 6 + - accessories + - 2026-08-13T09:45:59.376546Z + - aluminium, adjustable + - Laptop Stand + - int: "3495" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 80 + - - 7 + - audio + - 2026-08-13T09:45:59.399209Z + - over-ear, BT 5.3, ANC+ + - Noise-Cancelling Headphones Pro + - int: "24999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 50 + - - 8 + - peripherals + - 2026-08-13T09:45:59.420404Z + - auto-focus + - 1080p Webcam + - int: "5900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 45 + - - 9 + - storage + - 2026-08-13T09:45:59.441796Z + - USB 3.2 Gen2 + - External SSD 1TB + - int: "10999" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 70 + - - 11 + - audio + - 2026-08-13T09:45:59.480029Z + - cardioid, plug-and-play + - USB Microphone + - int: "8900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 35 + - - 12 + - computers + - 2026-08-13T09:45:59.498331Z + - 16GB RAM, 512GB SSD + - 14-inch Laptop + - int: "109900" + exp: -2 + nan: false + infinitymodifier: 0 + valid: true + - 15 + commandComplete: SELECT 10 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.380702263Z + resTimestampMock: 2026-08-13T09:46:00.381017596Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-194 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.38403893Z:164 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.38403893Z + resTimestampMock: 2026-08-13T09:46:00.384242096Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-195 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN READ ONLY + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.412728805Z:165 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.412728805Z + resTimestampMock: 2026-08-13T09:46:00.412904138Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-196 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 order by p1_0.id + invocationId: sha256:72cc674a23c11c9d2a3d4092b5ce7a0fc9166827d41bf29b67be2031a74a5780:0:2026-08-13T09:46:00.413012763Z:166 + precedingTxState: in_tx + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 35 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 4 + - 122 + - 74 + - format: 0 + bytes: + - 55 + - 45 + - 105 + - 110 + - 45 + - 49 + - 32 + - 97 + - 108 + - 117 + - 109 + - 105 + - 110 + - 105 + - 117 + - 109 + - format: 0 + bytes: + - 85 + - 83 + - 66 + - 45 + - 67 + - 32 + - 72 + - 117 + - 98 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 39 + - 19 + - 136 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 100 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 4 + - format: 0 + bytes: + - 109 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 5 + - 42 + - 185 + - format: 0 + bytes: + - 73 + - 80 + - 83 + - 44 + - 32 + - 54 + - 48 + - 72 + - 122 + - 44 + - 32 + - 72 + - 68 + - 82 + - 52 + - 48 + - 48 + - format: 0 + bytes: + - 50 + - 55 + - 45 + - 105 + - 110 + - 99 + - 104 + - 32 + - 52 + - 75 + - 32 + - 77 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 1 + - 43 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 30 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 5 + - format: 0 + bytes: + - 109 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 5 + - 140 + - 124 + - format: 0 + bytes: + - 99 + - 117 + - 114 + - 118 + - 101 + - 100 + - 44 + - 32 + - 49 + - 52 + - 52 + - 72 + - 122 + - format: 0 + bytes: + - 51 + - 52 + - 45 + - 105 + - 110 + - 99 + - 104 + - 32 + - 85 + - 108 + - 116 + - 114 + - 97 + - 119 + - 105 + - 100 + - 101 + - 32 + - 77 + - 111 + - 110 + - 105 + - 116 + - 111 + - 114 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 2 + - 87 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 12 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 6 + - format: 0 + bytes: + - 97 + - 99 + - 99 + - 101 + - 115 + - 115 + - 111 + - 114 + - 105 + - 101 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 5 + - 226 + - 162 + - format: 0 + bytes: + - 97 + - 108 + - 117 + - 109 + - 105 + - 110 + - 105 + - 117 + - 109 + - 44 + - 32 + - 97 + - 100 + - 106 + - 117 + - 115 + - 116 + - 97 + - 98 + - 108 + - 101 + - format: 0 + bytes: + - 76 + - 97 + - 112 + - 116 + - 111 + - 112 + - 32 + - 83 + - 116 + - 97 + - 110 + - 100 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 34 + - 37 + - 28 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 80 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 7 + - format: 0 + bytes: + - 97 + - 117 + - 100 + - 105 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 59 + - 41 + - format: 0 + bytes: + - 111 + - 118 + - 101 + - 114 + - 45 + - 101 + - 97 + - 114 + - 44 + - 32 + - 66 + - 84 + - 32 + - 53 + - 46 + - 51 + - 44 + - 32 + - 65 + - 78 + - 67 + - 43 + - format: 0 + bytes: + - 78 + - 111 + - 105 + - 115 + - 101 + - 45 + - 67 + - 97 + - 110 + - 99 + - 101 + - 108 + - 108 + - 105 + - 110 + - 103 + - 32 + - 72 + - 101 + - 97 + - 100 + - 112 + - 104 + - 111 + - 110 + - 101 + - 115 + - 32 + - 80 + - 114 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 249 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 50 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 8 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 141 + - 244 + - format: 0 + bytes: + - 97 + - 117 + - 116 + - 111 + - 45 + - 102 + - 111 + - 99 + - 117 + - 115 + - format: 0 + bytes: + - 49 + - 48 + - 56 + - 48 + - 112 + - 32 + - 87 + - 101 + - 98 + - 99 + - 97 + - 109 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 59 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 45 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 9 + - format: 0 + bytes: + - 115 + - 116 + - 111 + - 114 + - 97 + - 103 + - 101 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 6 + - 225 + - 132 + - format: 0 + bytes: + - 85 + - 83 + - 66 + - 32 + - 51 + - 46 + - 50 + - 32 + - 71 + - 101 + - 110 + - 50 + - format: 0 + bytes: + - 69 + - 120 + - 116 + - 101 + - 114 + - 110 + - 97 + - 108 + - 32 + - 83 + - 83 + - 68 + - 32 + - 49 + - 84 + - 66 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 109 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 70 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 11 + - format: 0 + bytes: + - 97 + - 117 + - 100 + - 105 + - 111 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 7 + - 118 + - 221 + - format: 0 + bytes: + - 99 + - 97 + - 114 + - 100 + - 105 + - 111 + - 105 + - 100 + - 44 + - 32 + - 112 + - 108 + - 117 + - 103 + - 45 + - 97 + - 110 + - 100 + - 45 + - 112 + - 108 + - 97 + - 121 + - format: 0 + bytes: + - 85 + - 83 + - 66 + - 32 + - 77 + - 105 + - 99 + - 114 + - 111 + - 112 + - 104 + - 111 + - 110 + - 101 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 89 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 35 + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 12 + - format: 0 + bytes: + - 99 + - 111 + - 109 + - 112 + - 117 + - 116 + - 101 + - 114 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 7 + - 190 + - 91 + - format: 0 + bytes: + - 49 + - 54 + - 71 + - 66 + - 32 + - 82 + - 65 + - 77 + - 44 + - 32 + - 53 + - 49 + - 50 + - 71 + - 66 + - 32 + - 83 + - 83 + - 68 + - format: 0 + bytes: + - 49 + - 52 + - 45 + - 105 + - 110 + - 99 + - 104 + - 32 + - 76 + - 97 + - 112 + - 116 + - 111 + - 112 + - format: 1 + bytes: + - 0 + - 1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 4 + - 75 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 15 + commandComplete: SELECT 10 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.413012763Z + resTimestampMock: 2026-08-13T09:46:00.41326593Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-197 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.414755055Z:167 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.414755055Z + resTimestampMock: 2026-08-13T09:46:00.41493318Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-198 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.432930805Z:168 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.432930805Z + resTimestampMock: 2026-08-13T09:46:00.433110638Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-199 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.432930805Z:169 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 35 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.432930805Z + resTimestampMock: 2026-08-13T09:46:00.433200221Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-200 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3938a5e51e5d48f58ec54c7aff7d2bd3724556a9f04975b298620cbea33389fd + sqlNormalized: update products p1_0 set stock_quantity=(p1_0.stock_quantity+$1) where p1_0.id=$2 and (p1_0.stock_quantity+$3)>=$4 + paramOids: + - 23 + - 20 + - 23 + invocationId: sha256:3938a5e51e5d48f58ec54c7aff7d2bd3724556a9f04975b298620cbea33389fd:0:2026-08-13T09:46:00.445759138Z:170 + precedingTxState: in_tx + bindValues: + - !!binary ////+w== + - !!binary AAAAAAAAAAE= + - !!binary ////+w== + bindFormats: + - 1 + - 1 + - 1 + response: + commandComplete: UPDATE 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.445759138Z + resTimestampMock: 2026-08-13T09:46:00.446296763Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-201 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.447324305Z:171 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 30 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.447324305Z + resTimestampMock: 2026-08-13T09:46:00.44747918Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-202 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.448157763Z:172 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.448157763Z + resTimestampMock: 2026-08-13T09:46:00.448487846Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-203 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.461563805Z:173 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.461563805Z + resTimestampMock: 2026-08-13T09:46:00.461703055Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-204 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.461620596Z:174 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 30 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.461620596Z + resTimestampMock: 2026-08-13T09:46:00.461885346Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-205 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3938a5e51e5d48f58ec54c7aff7d2bd3724556a9f04975b298620cbea33389fd + sqlNormalized: update products p1_0 set stock_quantity=(p1_0.stock_quantity+$1) where p1_0.id=$2 and (p1_0.stock_quantity+$3)>=$4 + paramOids: + - 23 + - 20 + - 23 + invocationId: sha256:3938a5e51e5d48f58ec54c7aff7d2bd3724556a9f04975b298620cbea33389fd:0:2026-08-13T09:46:00.463485013Z:175 + precedingTxState: in_tx + bindValues: + - !!binary AAAAZA== + - !!binary AAAAAAAAAAE= + - !!binary AAAAZA== + bindFormats: + - 1 + - 1 + - 1 + response: + commandComplete: UPDATE 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.463485013Z + resTimestampMock: 2026-08-13T09:46:00.463766471Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-206 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.464294888Z:176 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 130 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.464294888Z + resTimestampMock: 2026-08-13T09:46:00.464403971Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-207 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439 + sqlNormalized: COMMIT + invocationId: sha256:cd3c36208f26fbef67b62d1116148a76e1eee8b227747c2256be5d249d69a439:0:2026-08-13T09:46:00.464928513Z:177 + precedingTxState: in_tx + response: + commandComplete: COMMIT + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.464928513Z + resTimestampMock: 2026-08-13T09:46:00.465250055Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-208 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.479606638Z:178 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.479606638Z + resTimestampMock: 2026-08-13T09:46:00.47974093Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-209 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.479606638Z:179 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + rows: + - - format: 1 + bytes: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - format: 0 + bytes: + - 112 + - 101 + - 114 + - 105 + - 112 + - 104 + - 101 + - 114 + - 97 + - 108 + - 115 + - format: 1 + bytes: + - 0 + - 2 + - 251 + - 233 + - 87 + - 3 + - 166 + - 132 + - format: 0 + bytes: + - 55 + - 53 + - 37 + - 32 + - 108 + - 97 + - 121 + - 111 + - 117 + - 116 + - 44 + - 32 + - 82 + - 71 + - 66 + - format: 0 + bytes: + - 77 + - 101 + - 99 + - 104 + - 97 + - 110 + - 105 + - 99 + - 97 + - 108 + - 32 + - 75 + - 101 + - 121 + - 98 + - 111 + - 97 + - 114 + - 100 + - 32 + - 118 + - 50 + - format: 1 + bytes: + - 0 + - 2 + - 0 + - 0 + - 0 + - 0 + - 0 + - 2 + - 0 + - 149 + - 38 + - 172 + - format: 1 + bytes: + - 0 + - 0 + - 0 + - 130 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.479606638Z + resTimestampMock: 2026-08-13T09:46:00.479921846Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-210 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:3938a5e51e5d48f58ec54c7aff7d2bd3724556a9f04975b298620cbea33389fd + sqlNormalized: update products p1_0 set stock_quantity=(p1_0.stock_quantity+$1) where p1_0.id=$2 and (p1_0.stock_quantity+$3)>=$4 + paramOids: + - 23 + - 20 + - 23 + invocationId: sha256:3938a5e51e5d48f58ec54c7aff7d2bd3724556a9f04975b298620cbea33389fd:0:2026-08-13T09:46:00.481882138Z:180 + precedingTxState: in_tx + bindValues: + - !!binary //55YQ== + - !!binary AAAAAAAAAAE= + - !!binary //55YQ== + bindFormats: + - 1 + - 1 + - 1 + response: + commandComplete: UPDATE 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.481882138Z + resTimestampMock: 2026-08-13T09:46:00.482213555Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-211 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:254801e1e89bac2c4da78db63df9072dc6e671614b56257f551f3f0c1074bc1e + sqlNormalized: select count(*) from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:254801e1e89bac2c4da78db63df9072dc6e671614b56257f551f3f0c1074bc1e:0:2026-08-13T09:46:00.496005596Z:181 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAAAAAE= + bindFormats: + - 1 + response: + rowDescription: + - name: count + typeOid: 20 + typeSize: 8 + typeMod: -1 + rows: + - - 1 + commandComplete: SELECT 1 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.496005596Z + resTimestampMock: 2026-08-13T09:46:00.496579513Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-212 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338 + sqlNormalized: ROLLBACK + invocationId: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338:0:2026-08-13T09:46:00.49871093Z:182 + precedingTxState: in_tx + response: + commandComplete: ROLLBACK + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.49871093Z + resTimestampMock: 2026-08-13T09:46:00.498872805Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-213 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8 + sqlNormalized: BEGIN + invocationId: sha256:83b556f1ffe78c1283dfa0a60cb7a032029891447cb14af2bb30a4e13b08e2e8:0:2026-08-13T09:46:00.520345388Z:183 + precedingTxState: idle + response: + commandComplete: BEGIN + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.520345388Z + resTimestampMock: 2026-08-13T09:46:00.52048493Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-214 +spec: + metadata: + class: APP + connID: "0" + lifetime: perTest + type: mocks + postgresV3: + type: query + query: + class: APP + lifetime: perTest + sqlAstHash: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65 + sqlNormalized: select p1_0.id,p1_0.category,p1_0.created_at,p1_0.description,p1_0.name,p1_0.price,p1_0.stock_quantity from products p1_0 where p1_0.id=$1 + paramOids: + - 20 + invocationId: sha256:f6906d60b464001858cdc4f2a8d3fa2e43aec2e414078b3f3a5b8dffa4257f65:0:2026-08-13T09:46:00.520345388Z:184 + precedingTxState: in_tx + bindValues: + - !!binary AAAAAAABhp8= + bindFormats: + - 1 + resultFormats: + - 1 + - 0 + - 1 + - 0 + - 0 + - 1 + - 1 + response: + commandComplete: SELECT 0 + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.520345388Z + resTimestampMock: 2026-08-13T09:46:00.520597388Z +connectionId: "0" +--- +version: api.keploy.io/v1beta1 +kind: PostgresV3 +name: mock-215 +spec: + metadata: + class: TX + connID: "0" + lifetime: session + type: config + postgresV3: + type: query + query: + class: TX + lifetime: session + sqlAstHash: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338 + sqlNormalized: ROLLBACK + invocationId: sha256:cf2f9b5d15a69e62c120b1649c7b9916d06f96e4dbf83b4e6fee004915384338:0:2026-08-13T09:46:00.521004346Z:185 + precedingTxState: in_tx + response: + commandComplete: ROLLBACK + sideEffects: {} + reqTimestampMock: 2026-08-13T09:46:00.521004346Z + resTimestampMock: 2026-08-13T09:46:00.521316805Z +connectionId: "0" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-1.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-1.yaml new file mode 100644 index 00000000..c891812a --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-1.yaml @@ -0,0 +1,38 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: delete-api-products-by-id-1 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/3 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.006322596Z + resp: + status_code: 204 + header: + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: "" + status_message: No Content + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.016106721Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://localhost:8080/api/products/3 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-2.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-2.yaml new file mode 100644 index 00000000..8ef7cfc1 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-2.yaml @@ -0,0 +1,38 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: delete-api-products-by-id-2 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/10 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.030624096Z + resp: + status_code: 204 + header: + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: "" + status_message: No Content + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.036596263Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://localhost:8080/api/products/10 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-3.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-3.yaml new file mode 100644 index 00000000..8f499fc1 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/delete-api-products-by-id-3.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: delete-api-products-by-id-3 +spec: + metadata: {} + req: + method: DELETE + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/88888 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.157014263Z + resp: + status_code: 404 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":404,"error":"Not Found","message":"Product 88888 not found"}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.161648555Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request DELETE \ + --url http://localhost:8080/api/products/88888 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-1.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-1.yaml new file mode 100644 index 00000000..b2de169c --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-1.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-1 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:58.075310804Z + resp: + status_code: 200 + header: + Content-Length: "2" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:58 GMT + body: '[]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:58.536684971Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614358 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-10.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-10.yaml new file mode 100644 index 00000000..a7658128 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-10.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=gaming + url_params: + category: gaming + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.895803055Z + resp: + status_code: 200 + header: + Content-Length: "2" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.900507221Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=gaming \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-11.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-11.yaml new file mode 100644 index 00000000..e392b9e4 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-11.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.047595096Z + resp: + status_code: 200 + header: + Content-Length: "1688" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '[{"id":1,"name":"Mechanical Keyboard v2","description":"75% layout, RGB","price":149.99,"stockQuantity":35,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"},{"id":2,"name":"USB-C Hub","description":"7-in-1 aluminium","price":39.50,"stockQuantity":100,"category":"peripherals","createdAt":"2026-08-13T09:45:59.284298Z"},{"id":4,"name":"27-inch 4K Monitor","description":"IPS, 60Hz, HDR400","price":299.00,"stockQuantity":30,"category":"monitors","createdAt":"2026-08-13T09:45:59.329465Z"},{"id":5,"name":"34-inch Ultrawide Monitor","description":"curved, 144Hz","price":599.00,"stockQuantity":12,"category":"monitors","createdAt":"2026-08-13T09:45:59.354492Z"},{"id":6,"name":"Laptop Stand","description":"aluminium, adjustable","price":34.95,"stockQuantity":80,"category":"accessories","createdAt":"2026-08-13T09:45:59.376546Z"},{"id":7,"name":"Noise-Cancelling Headphones Pro","description":"over-ear, BT 5.3, ANC+","price":249.99,"stockQuantity":50,"category":"audio","createdAt":"2026-08-13T09:45:59.399209Z"},{"id":8,"name":"1080p Webcam","description":"auto-focus","price":59.00,"stockQuantity":45,"category":"peripherals","createdAt":"2026-08-13T09:45:59.420404Z"},{"id":9,"name":"External SSD 1TB","description":"USB 3.2 Gen2","price":109.99,"stockQuantity":70,"category":"storage","createdAt":"2026-08-13T09:45:59.441796Z"},{"id":11,"name":"USB Microphone","description":"cardioid, plug-and-play","price":89.00,"stockQuantity":35,"category":"audio","createdAt":"2026-08-13T09:45:59.480029Z"},{"id":12,"name":"14-inch Laptop","description":"16GB RAM, 512GB SSD","price":1099.00,"stockQuantity":15,"category":"computers","createdAt":"2026-08-13T09:45:59.498331Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.054597513Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-12.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-12.yaml new file mode 100644 index 00000000..1700914b --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-12.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=peripherals + url_params: + category: peripherals + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.066984221Z + resp: + status_code: 200 + header: + Content-Length: "495" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '[{"id":1,"name":"Mechanical Keyboard v2","description":"75% layout, RGB","price":149.99,"stockQuantity":35,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"},{"id":2,"name":"USB-C Hub","description":"7-in-1 aluminium","price":39.50,"stockQuantity":100,"category":"peripherals","createdAt":"2026-08-13T09:45:59.284298Z"},{"id":8,"name":"1080p Webcam","description":"auto-focus","price":59.00,"stockQuantity":45,"category":"peripherals","createdAt":"2026-08-13T09:45:59.420404Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.073723596Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=peripherals \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-2.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-2.yaml new file mode 100644 index 00000000..26fdb5e8 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-2.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.134663804Z + resp: + status_code: 200 + header: + Content-Length: "2" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.141810971Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-3.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-3.yaml new file mode 100644 index 00000000..b465724b --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-3.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.514448513Z + resp: + status_code: 200 + header: + Content-Length: "1995" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[{"id":1,"name":"Mechanical Keyboard","description":"65% hot-swappable","price":129.99,"stockQuantity":40,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"},{"id":2,"name":"USB-C Hub","description":"7-in-1 aluminium","price":39.50,"stockQuantity":100,"category":"peripherals","createdAt":"2026-08-13T09:45:59.284298Z"},{"id":3,"name":"Wireless Mouse","description":"ergonomic, 2.4GHz","price":24.99,"stockQuantity":150,"category":"peripherals","createdAt":"2026-08-13T09:45:59.307213Z"},{"id":4,"name":"27-inch 4K Monitor","description":"IPS, 60Hz","price":329.00,"stockQuantity":25,"category":"monitors","createdAt":"2026-08-13T09:45:59.329465Z"},{"id":5,"name":"34-inch Ultrawide Monitor","description":"curved, 144Hz","price":599.00,"stockQuantity":12,"category":"monitors","createdAt":"2026-08-13T09:45:59.354492Z"},{"id":6,"name":"Laptop Stand","description":"aluminium, adjustable","price":34.95,"stockQuantity":80,"category":"accessories","createdAt":"2026-08-13T09:45:59.376546Z"},{"id":7,"name":"Noise-Cancelling Headphones","description":"over-ear, BT 5.3","price":199.99,"stockQuantity":60,"category":"audio","createdAt":"2026-08-13T09:45:59.399209Z"},{"id":8,"name":"1080p Webcam","description":"auto-focus","price":59.00,"stockQuantity":45,"category":"peripherals","createdAt":"2026-08-13T09:45:59.420404Z"},{"id":9,"name":"External SSD 1TB","description":"USB 3.2 Gen2","price":109.99,"stockQuantity":70,"category":"storage","createdAt":"2026-08-13T09:45:59.441796Z"},{"id":10,"name":"Desk Mat XL","description":"900x400mm","price":19.99,"stockQuantity":200,"category":"accessories","createdAt":"2026-08-13T09:45:59.461761Z"},{"id":11,"name":"USB Microphone","description":"cardioid, plug-and-play","price":89.00,"stockQuantity":35,"category":"audio","createdAt":"2026-08-13T09:45:59.480029Z"},{"id":12,"name":"14-inch Laptop","description":"16GB RAM, 512GB SSD","price":1099.00,"stockQuantity":15,"category":"computers","createdAt":"2026-08-13T09:45:59.498331Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.523892263Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-4.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-4.yaml new file mode 100644 index 00000000..0b98665e --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-4.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=peripherals + url_params: + category: peripherals + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.730453929Z + resp: + status_code: 200 + header: + Content-Length: "662" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[{"id":1,"name":"Mechanical Keyboard","description":"65% hot-swappable","price":129.99,"stockQuantity":40,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"},{"id":2,"name":"USB-C Hub","description":"7-in-1 aluminium","price":39.50,"stockQuantity":100,"category":"peripherals","createdAt":"2026-08-13T09:45:59.284298Z"},{"id":3,"name":"Wireless Mouse","description":"ergonomic, 2.4GHz","price":24.99,"stockQuantity":150,"category":"peripherals","createdAt":"2026-08-13T09:45:59.307213Z"},{"id":8,"name":"1080p Webcam","description":"auto-focus","price":59.00,"stockQuantity":45,"category":"peripherals","createdAt":"2026-08-13T09:45:59.420404Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.793465304Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=peripherals \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-5.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-5.yaml new file mode 100644 index 00000000..d38a78e2 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-5.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=monitors + url_params: + category: monitors + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.803908138Z + resp: + status_code: 200 + header: + Content-Length: "334" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[{"id":4,"name":"27-inch 4K Monitor","description":"IPS, 60Hz","price":329.00,"stockQuantity":25,"category":"monitors","createdAt":"2026-08-13T09:45:59.329465Z"},{"id":5,"name":"34-inch Ultrawide Monitor","description":"curved, 144Hz","price":599.00,"stockQuantity":12,"category":"monitors","createdAt":"2026-08-13T09:45:59.354492Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.809909763Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=monitors \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-6.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-6.yaml new file mode 100644 index 00000000..89ca2142 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-6.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=accessories + url_params: + category: accessories + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.820486554Z + resp: + status_code: 200 + header: + Content-Length: "328" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[{"id":6,"name":"Laptop Stand","description":"aluminium, adjustable","price":34.95,"stockQuantity":80,"category":"accessories","createdAt":"2026-08-13T09:45:59.376546Z"},{"id":10,"name":"Desk Mat XL","description":"900x400mm","price":19.99,"stockQuantity":200,"category":"accessories","createdAt":"2026-08-13T09:45:59.461761Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.826067888Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=accessories \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-7.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-7.yaml new file mode 100644 index 00000000..640763a2 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-7.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=audio + url_params: + category: audio + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.837360388Z + resp: + status_code: 200 + header: + Content-Length: "343" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[{"id":7,"name":"Noise-Cancelling Headphones","description":"over-ear, BT 5.3","price":199.99,"stockQuantity":60,"category":"audio","createdAt":"2026-08-13T09:45:59.399209Z"},{"id":11,"name":"USB Microphone","description":"cardioid, plug-and-play","price":89.00,"stockQuantity":35,"category":"audio","createdAt":"2026-08-13T09:45:59.480029Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.845592638Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=audio \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-8.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-8.yaml new file mode 100644 index 00000000..271412a4 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-8.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=storage + url_params: + category: storage + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.858410888Z + resp: + status_code: 200 + header: + Content-Length: "162" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[{"id":9,"name":"External SSD 1TB","description":"USB 3.2 Gen2","price":109.99,"stockQuantity":70,"category":"storage","createdAt":"2026-08-13T09:45:59.441796Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.86475443Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=storage \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-9.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-9.yaml new file mode 100644 index 00000000..bdce039e --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-9.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products?category=computers + url_params: + category: computers + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.876746263Z + resp: + status_code: 200 + header: + Content-Length: "171" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '[{"id":12,"name":"14-inch Laptop","description":"16GB RAM, 512GB SSD","price":1099.00,"stockQuantity":15,"category":"computers","createdAt":"2026-08-13T09:45:59.498331Z"}]' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.883312346Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products?category=computers \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-1.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-1.yaml new file mode 100644 index 00000000..bf1a102f --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-1.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-1 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/1 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.534145096Z + resp: + status_code: 200 + header: + Content-Length: "172" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":1,"name":"Mechanical Keyboard","description":"65% hot-swappable","price":129.99,"stockQuantity":40,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.546138971Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/1 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-10.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-10.yaml new file mode 100644 index 00000000..8783121b --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-10.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-10 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/10 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.685192388Z + resp: + status_code: 200 + header: + Content-Length: "157" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":10,"name":"Desk Mat XL","description":"900x400mm","price":19.99,"stockQuantity":200,"category":"accessories","createdAt":"2026-08-13T09:45:59.461761Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.690895554Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/10 \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-11.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-11.yaml new file mode 100644 index 00000000..5de628d9 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-11.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-11 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/11 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.701376263Z + resp: + status_code: 200 + header: + Content-Length: "167" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":11,"name":"USB Microphone","description":"cardioid, plug-and-play","price":89.00,"stockQuantity":35,"category":"audio","createdAt":"2026-08-13T09:45:59.480029Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.705104138Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/11 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-12.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-12.yaml new file mode 100644 index 00000000..45527dd6 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-12.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-12 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/12 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.715407804Z + resp: + status_code: 200 + header: + Content-Length: "169" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":12,"name":"14-inch Laptop","description":"16GB RAM, 512GB SSD","price":1099.00,"stockQuantity":15,"category":"computers","createdAt":"2026-08-13T09:45:59.498331Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.719879013Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/12 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-13.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-13.yaml new file mode 100644 index 00000000..9086c0aa --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-13.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-13 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/1 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.933068096Z + resp: + status_code: 200 + header: + Content-Length: "173" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":1,"name":"Mechanical Keyboard v2","description":"75% layout, RGB","price":149.99,"stockQuantity":35,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.937145888Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/1 \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-14.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-14.yaml new file mode 100644 index 00000000..cdf7c64b --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-14.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-14 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/4 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.962275346Z + resp: + status_code: 200 + header: + Content-Length: "168" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":4,"name":"27-inch 4K Monitor","description":"IPS, 60Hz, HDR400","price":299.00,"stockQuantity":30,"category":"monitors","createdAt":"2026-08-13T09:45:59.329465Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.96618193Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/4 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-15.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-15.yaml new file mode 100644 index 00000000..86829ae2 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-15.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-15 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/7 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.992347055Z + resp: + status_code: 200 + header: + Content-Length: "183" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":7,"name":"Noise-Cancelling Headphones Pro","description":"over-ear, BT 5.3, ANC+","price":249.99,"stockQuantity":50,"category":"audio","createdAt":"2026-08-13T09:45:59.399209Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.996277763Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/7 \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-16.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-16.yaml new file mode 100644 index 00000000..73ef9023 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-16.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-16 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/99999 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.084461596Z + resp: + status_code: 404 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":404,"error":"Not Found","message":"Product 99999 not found"}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.095372888Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/99999 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-17.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-17.yaml new file mode 100644 index 00000000..3477f8d7 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-17.yaml @@ -0,0 +1,39 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-17 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/3 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.113740346Z + resp: + status_code: 404 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":404,"error":"Not Found","message":"Product 3 not found"}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.117790346Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/3 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-2.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-2.yaml new file mode 100644 index 00000000..f5002fa3 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-2.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/2 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.556217138Z + resp: + status_code: 200 + header: + Content-Length: "161" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":2,"name":"USB-C Hub","description":"7-in-1 aluminium","price":39.50,"stockQuantity":100,"category":"peripherals","createdAt":"2026-08-13T09:45:59.284298Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.560162804Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/2 \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-3.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-3.yaml new file mode 100644 index 00000000..46a53e25 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-3.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-3 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/3 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.570290804Z + resp: + status_code: 200 + header: + Content-Length: "167" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":3,"name":"Wireless Mouse","description":"ergonomic, 2.4GHz","price":24.99,"stockQuantity":150,"category":"peripherals","createdAt":"2026-08-13T09:45:59.307213Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.575119971Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/3 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-4.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-4.yaml new file mode 100644 index 00000000..767d77c3 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-4.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-4 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/4 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.585763096Z + resp: + status_code: 200 + header: + Content-Length: "160" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":4,"name":"27-inch 4K Monitor","description":"IPS, 60Hz","price":329.00,"stockQuantity":25,"category":"monitors","createdAt":"2026-08-13T09:45:59.329465Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.591937513Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/4 \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-5.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-5.yaml new file mode 100644 index 00000000..ebc286fe --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-5.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-5 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/5 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.603063054Z + resp: + status_code: 200 + header: + Content-Length: "171" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":5,"name":"34-inch Ultrawide Monitor","description":"curved, 144Hz","price":599.00,"stockQuantity":12,"category":"monitors","createdAt":"2026-08-13T09:45:59.354492Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.608060096Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/5 \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-6.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-6.yaml new file mode 100644 index 00000000..0c2721fd --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-6.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-6 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/6 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.618740179Z + resp: + status_code: 200 + header: + Content-Length: "168" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":6,"name":"Laptop Stand","description":"aluminium, adjustable","price":34.95,"stockQuantity":80,"category":"accessories","createdAt":"2026-08-13T09:45:59.376546Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.626343763Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/6 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-7.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-7.yaml new file mode 100644 index 00000000..d805ca8f --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-7.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-7 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/7 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.635955388Z + resp: + status_code: 200 + header: + Content-Length: "173" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":7,"name":"Noise-Cancelling Headphones","description":"over-ear, BT 5.3","price":199.99,"stockQuantity":60,"category":"audio","createdAt":"2026-08-13T09:45:59.399209Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.639838513Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/7 \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-8.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-8.yaml new file mode 100644 index 00000000..56adb1e9 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-8.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-8 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/8 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.650170513Z + resp: + status_code: 200 + header: + Content-Length: "157" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":8,"name":"1080p Webcam","description":"auto-focus","price":59.00,"stockQuantity":45,"category":"peripherals","createdAt":"2026-08-13T09:45:59.420404Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.654396721Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/8 \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-9.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-9.yaml new file mode 100644 index 00000000..041e9270 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-by-id-9.yaml @@ -0,0 +1,41 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-by-id-9 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/9 + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:45:59.665269638Z + resp: + status_code: 200 + header: + Content-Length: "160" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":9,"name":"External SSD 1TB","description":"USB 3.2 Gen2","price":109.99,"stockQuantity":70,"category":"storage","createdAt":"2026-08-13T09:45:59.441796Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.671888888Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/9 \ + --header 'Accept: */*' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-summary-1.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-summary-1.yaml new file mode 100644 index 00000000..03de02d4 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-summary-1.yaml @@ -0,0 +1,40 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-summary-1 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/summary + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.37699143Z + resp: + status_code: 200 + header: + Content-Length: "632" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"totalProducts":10,"totalStockUnits":472,"totalInventoryValue":70607.45,"lowStockThreshold":5,"lowStockProducts":[],"categories":[{"category":"computers","productCount":1,"stockUnits":15,"inventoryValue":16485.00},{"category":"monitors","productCount":2,"stockUnits":42,"inventoryValue":16158.00},{"category":"audio","productCount":2,"stockUnits":85,"inventoryValue":15614.50},{"category":"peripherals","productCount":3,"stockUnits":180,"inventoryValue":11854.65},{"category":"storage","productCount":1,"stockUnits":70,"inventoryValue":7699.30},{"category":"accessories","productCount":1,"stockUnits":80,"inventoryValue":2796.00}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.392971555Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/summary \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-summary-2.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-summary-2.yaml new file mode 100644 index 00000000..576276e5 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/get-api-products-summary-2.yaml @@ -0,0 +1,42 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: get-api-products-summary-2 +spec: + metadata: {} + req: + method: GET + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/summary?lowStockThreshold=15 + url_params: + lowStockThreshold: "15" + header: + Accept: '*/*' + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: "" + timestamp: 2026-08-13T09:46:00.410088513Z + resp: + status_code: 200 + header: + Content-Length: "677" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"totalProducts":10,"totalStockUnits":472,"totalInventoryValue":70607.45,"lowStockThreshold":15,"lowStockProducts":["34-inch Ultrawide Monitor","14-inch Laptop"],"categories":[{"category":"computers","productCount":1,"stockUnits":15,"inventoryValue":16485.00},{"category":"monitors","productCount":2,"stockUnits":42,"inventoryValue":16158.00},{"category":"audio","productCount":2,"stockUnits":85,"inventoryValue":15614.50},{"category":"peripherals","productCount":3,"stockUnits":180,"inventoryValue":11854.65},{"category":"storage","productCount":1,"stockUnits":70,"inventoryValue":7699.30},{"category":"accessories","productCount":1,"stockUnits":80,"inventoryValue":2796.00}]}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.416176638Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: | + curl --request GET \ + --url http://localhost:8080/api/products/summary?lowStockThreshold=15 \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-1.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-1.yaml new file mode 100644 index 00000000..5974ad02 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-1.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: patch-api-products-by-id-stock-1 +spec: + metadata: {} + req: + method: PATCH + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/1/stock + header: + Accept: '*/*' + Content-Length: "12" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"delta":-5}' + timestamp: 2026-08-13T09:46:00.42716218Z + resp: + status_code: 200 + header: + Content-Length: "173" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"id":1,"name":"Mechanical Keyboard v2","description":"75% layout, RGB","price":149.99,"stockQuantity":30,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.449570805Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request PATCH \ + --url http://localhost:8080/api/products/1/stock \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"delta\":-5}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-2.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-2.yaml new file mode 100644 index 00000000..abf4c5fa --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-2.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: patch-api-products-by-id-stock-2 +spec: + metadata: {} + req: + method: PATCH + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/1/stock + header: + Accept: '*/*' + Content-Length: "13" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"delta":100}' + timestamp: 2026-08-13T09:46:00.45932843Z + resp: + status_code: 200 + header: + Content-Length: "174" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"id":1,"name":"Mechanical Keyboard v2","description":"75% layout, RGB","price":149.99,"stockQuantity":130,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.466155471Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request PATCH \ + --url http://localhost:8080/api/products/1/stock \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"delta\":100}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-3.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-3.yaml new file mode 100644 index 00000000..9b42a215 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-3.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: patch-api-products-by-id-stock-3 +spec: + metadata: {} + req: + method: PATCH + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/1/stock + header: + Accept: '*/*' + Content-Length: "16" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"delta":-99999}' + timestamp: 2026-08-13T09:46:00.476814138Z + resp: + status_code: 409 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":409,"error":"Conflict","message":"Cannot adjust stock of product 1 by -99999: only 130 in stock"}' + status_message: Conflict + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.500331555Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request PATCH \ + --url http://localhost:8080/api/products/1/stock \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"delta\":-99999}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-4.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-4.yaml new file mode 100644 index 00000000..16b4a90e --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/patch-api-products-by-id-stock-4.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: patch-api-products-by-id-stock-4 +spec: + metadata: {} + req: + method: PATCH + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/99999/stock + header: + Accept: '*/*' + Content-Length: "11" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"delta":1}' + timestamp: 2026-08-13T09:46:00.518180263Z + resp: + status_code: 404 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":404,"error":"Not Found","message":"Product 99999 not found"}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.523323388Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request PATCH \ + --url http://localhost:8080/api/products/99999/stock \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"delta\":1}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-1.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-1.yaml new file mode 100644 index 00000000..2d305300 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-1.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-1 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "123" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Mechanical Keyboard","description":"65% hot-swappable","price":129.99,"stockQuantity":40,"category":"peripherals"}' + timestamp: 2026-08-13T09:45:59.153460179Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/1 + body: '{"id":1,"name":"Mechanical Keyboard","description":"65% hot-swappable","price":129.99,"stockQuantity":40,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230083679Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.264043263Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data "{\"name\":\"Mechanical Keyboard\",\"description\":\"65% hot-swappable\",\"price\":129.99,\"stockQuantity\":40,\"category\":\"peripherals\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-10.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-10.yaml new file mode 100644 index 00000000..17ee924f --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-10.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-10 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "107" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Desk Mat XL","description":"900x400mm","price":19.99,"stockQuantity":200,"category":"accessories"}' + timestamp: 2026-08-13T09:45:59.459791054Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/10 + body: '{"id":10,"name":"Desk Mat XL","description":"900x400mm","price":19.99,"stockQuantity":200,"category":"accessories","createdAt":"2026-08-13T09:45:59.461760679Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.464792721Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"name\":\"Desk Mat XL\",\"description\":\"900x400mm\",\"price\":19.99,\"stockQuantity\":200,\"category\":\"accessories\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-11.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-11.yaml new file mode 100644 index 00000000..76bd48bd --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-11.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-11 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "117" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"USB Microphone","description":"cardioid, plug-and-play","price":89.00,"stockQuantity":35,"category":"audio"}' + timestamp: 2026-08-13T09:45:59.478350721Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/11 + body: '{"id":11,"name":"USB Microphone","description":"cardioid, plug-and-play","price":89.00,"stockQuantity":35,"category":"audio","createdAt":"2026-08-13T09:45:59.480029138Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.483107179Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"name\":\"USB Microphone\",\"description\":\"cardioid, plug-and-play\",\"price\":89.00,\"stockQuantity\":35,\"category\":\"audio\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-12.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-12.yaml new file mode 100644 index 00000000..eaed7ea3 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-12.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-12 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "119" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"14-inch Laptop","description":"16GB RAM, 512GB SSD","price":1099.00,"stockQuantity":15,"category":"computers"}' + timestamp: 2026-08-13T09:45:59.496611138Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/12 + body: '{"id":12,"name":"14-inch Laptop","description":"16GB RAM, 512GB SSD","price":1099.00,"stockQuantity":15,"category":"computers","createdAt":"2026-08-13T09:45:59.498330804Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.501281888Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"name\":\"14-inch Laptop\",\"description\":\"16GB RAM, 512GB SSD\",\"price\":1099.00,\"stockQuantity\":15,\"category\":\"computers\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-13.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-13.yaml new file mode 100644 index 00000000..71fb3974 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-13.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-13 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "58" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"","price":10.00,"stockQuantity":5,"category":"x"}' + timestamp: 2026-08-13T09:46:00.177821971Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"name":"name is required"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.186976388Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data "{\"name\":\"\",\"price\":10.00,\"stockQuantity\":5,\"category\":\"x\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-14.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-14.yaml new file mode 100644 index 00000000..dee6023b --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-14.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-14 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "48" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"price":10.00,"stockQuantity":5,"category":"x"}' + timestamp: 2026-08-13T09:46:00.20438493Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"name":"name is required"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.207385638Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data "{\"price\":10.00,\"stockQuantity\":5,\"category\":\"x\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-15.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-15.yaml new file mode 100644 index 00000000..bf9a79a8 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-15.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-15 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "61" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Bad","price":-5.00,"stockQuantity":5,"category":"x"}' + timestamp: 2026-08-13T09:46:00.223426888Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"price":"price must be greater than 0"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.226115846Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --data "{\"name\":\"Bad\",\"price\":-5.00,\"stockQuantity\":5,\"category\":\"x\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-16.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-16.yaml new file mode 100644 index 00000000..a9e4854e --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-16.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-16 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "57" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Bad","price":0,"stockQuantity":5,"category":"x"}' + timestamp: 2026-08-13T09:46:00.246215763Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"price":"price must be greater than 0"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.250559763Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data "{\"name\":\"Bad\",\"price\":0,\"stockQuantity\":5,\"category\":\"x\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-17.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-17.yaml new file mode 100644 index 00000000..89944be2 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-17.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-17 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "47" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Bad","stockQuantity":5,"category":"x"}' + timestamp: 2026-08-13T09:46:00.27361768Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"price":"price is required"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.277011138Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"Bad\",\"stockQuantity\":5,\"category\":\"x\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-18.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-18.yaml new file mode 100644 index 00000000..b5cfec10 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-18.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-18 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "43" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Bad","price":10.00,"category":"x"}' + timestamp: 2026-08-13T09:46:00.301164305Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"stockQuantity":"stockQuantity is required"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.304566596Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"Bad\",\"price\":10.00,\"category\":\"x\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-19.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-19.yaml new file mode 100644 index 00000000..d2573bc2 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-19.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-19 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "62" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Bad","price":10.00,"stockQuantity":-3,"category":"x"}' + timestamp: 2026-08-13T09:46:00.32082993Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"stockQuantity":"stockQuantity cannot be negative"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.324059388Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"Bad\",\"price\":10.00,\"stockQuantity\":-3,\"category\":\"x\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-2.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-2.yaml new file mode 100644 index 00000000..e7c2eec3 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-2.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-2 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "112" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"USB-C Hub","description":"7-in-1 aluminium","price":39.50,"stockQuantity":100,"category":"peripherals"}' + timestamp: 2026-08-13T09:45:59.281913221Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/2 + body: '{"id":2,"name":"USB-C Hub","description":"7-in-1 aluminium","price":39.50,"stockQuantity":100,"category":"peripherals","createdAt":"2026-08-13T09:45:59.284298263Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.288404679Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"USB-C Hub\",\"description\":\"7-in-1 aluminium\",\"price\":39.50,\"stockQuantity\":100,\"category\":\"peripherals\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-20.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-20.yaml new file mode 100644 index 00000000..506e958d --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-20.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-20 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "22" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"","price":-1}' + timestamp: 2026-08-13T09:46:00.339305555Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"name":"name is required","price":"price must be greater than 0","stockQuantity":"stockQuantity is required"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.341798096Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"\",\"price\":-1}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-3.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-3.yaml new file mode 100644 index 00000000..89de93cd --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-3.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-3 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "118" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Wireless Mouse","description":"ergonomic, 2.4GHz","price":24.99,"stockQuantity":150,"category":"peripherals"}' + timestamp: 2026-08-13T09:45:59.304616554Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/3 + body: '{"id":3,"name":"Wireless Mouse","description":"ergonomic, 2.4GHz","price":24.99,"stockQuantity":150,"category":"peripherals","createdAt":"2026-08-13T09:45:59.307212554Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.311768888Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"Wireless Mouse\",\"description\":\"ergonomic, 2.4GHz\",\"price\":24.99,\"stockQuantity\":150,\"category\":\"peripherals\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-4.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-4.yaml new file mode 100644 index 00000000..a2f26ec1 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-4.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-4 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "111" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"27-inch 4K Monitor","description":"IPS, 60Hz","price":329.00,"stockQuantity":25,"category":"monitors"}' + timestamp: 2026-08-13T09:45:59.327379846Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/4 + body: '{"id":4,"name":"27-inch 4K Monitor","description":"IPS, 60Hz","price":329.00,"stockQuantity":25,"category":"monitors","createdAt":"2026-08-13T09:45:59.329465221Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.333671013Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"name\":\"27-inch 4K Monitor\",\"description\":\"IPS, 60Hz\",\"price\":329.00,\"stockQuantity\":25,\"category\":\"monitors\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-5.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-5.yaml new file mode 100644 index 00000000..343cee9e --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-5.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-5 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "122" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"34-inch Ultrawide Monitor","description":"curved, 144Hz","price":599.00,"stockQuantity":12,"category":"monitors"}' + timestamp: 2026-08-13T09:45:59.351684471Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/5 + body: '{"id":5,"name":"34-inch Ultrawide Monitor","description":"curved, 144Hz","price":599.00,"stockQuantity":12,"category":"monitors","createdAt":"2026-08-13T09:45:59.354492221Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.359127971Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --data "{\"name\":\"34-inch Ultrawide Monitor\",\"description\":\"curved, 144Hz\",\"price\":599.00,\"stockQuantity\":12,\"category\":\"monitors\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-6.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-6.yaml new file mode 100644 index 00000000..a7360b04 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-6.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-6 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "119" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Laptop Stand","description":"aluminium, adjustable","price":34.95,"stockQuantity":80,"category":"accessories"}' + timestamp: 2026-08-13T09:45:59.374416929Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/6 + body: '{"id":6,"name":"Laptop Stand","description":"aluminium, adjustable","price":34.95,"stockQuantity":80,"category":"accessories","createdAt":"2026-08-13T09:45:59.376546263Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.382022388Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"Laptop Stand\",\"description\":\"aluminium, adjustable\",\"price\":34.95,\"stockQuantity\":80,\"category\":\"accessories\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-7.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-7.yaml new file mode 100644 index 00000000..a3738578 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-7.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-7 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "124" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Noise-Cancelling Headphones","description":"over-ear, BT 5.3","price":199.99,"stockQuantity":60,"category":"audio"}' + timestamp: 2026-08-13T09:45:59.397159513Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/7 + body: '{"id":7,"name":"Noise-Cancelling Headphones","description":"over-ear, BT 5.3","price":199.99,"stockQuantity":60,"category":"audio","createdAt":"2026-08-13T09:45:59.399209471Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.403686679Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"name\":\"Noise-Cancelling Headphones\",\"description\":\"over-ear, BT 5.3\",\"price\":199.99,\"stockQuantity\":60,\"category\":\"audio\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-8.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-8.yaml new file mode 100644 index 00000000..47c88ce2 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-8.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-8 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "108" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"1080p Webcam","description":"auto-focus","price":59.00,"stockQuantity":45,"category":"peripherals"}' + timestamp: 2026-08-13T09:45:59.418272221Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/8 + body: '{"id":8,"name":"1080p Webcam","description":"auto-focus","price":59.00,"stockQuantity":45,"category":"peripherals","createdAt":"2026-08-13T09:45:59.420404096Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.425402096Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --data "{\"name\":\"1080p Webcam\",\"description\":\"auto-focus\",\"price\":59.00,\"stockQuantity\":45,\"category\":\"peripherals\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-9.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-9.yaml new file mode 100644 index 00000000..7fee7695 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/post-api-products-9.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: post-api-products-9 +spec: + metadata: {} + req: + method: POST + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products + header: + Accept: '*/*' + Content-Length: "111" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"External SSD 1TB","description":"USB 3.2 Gen2","price":109.99,"stockQuantity":70,"category":"storage"}' + timestamp: 2026-08-13T09:45:59.439828471Z + resp: + status_code: 201 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + Location: http://localhost:8080/api/products/9 + body: '{"id":9,"name":"External SSD 1TB","description":"USB 3.2 Gen2","price":109.99,"stockQuantity":70,"category":"storage","createdAt":"2026-08-13T09:45:59.441795846Z"}' + status_message: Created + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.445536054Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request POST \ + --url http://localhost:8080/api/products \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"External SSD 1TB\",\"description\":\"USB 3.2 Gen2\",\"price\":109.99,\"stockQuantity\":70,\"category\":\"storage\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-1.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-1.yaml new file mode 100644 index 00000000..b41f5f10 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-1.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: put-api-products-by-id-1 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/1 + header: + Accept: '*/*' + Content-Length: "124" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Mechanical Keyboard v2","description":"75% layout, RGB","price":149.99,"stockQuantity":35,"category":"peripherals"}' + timestamp: 2026-08-13T09:45:59.911332221Z + resp: + status_code: 200 + header: + Content-Length: "173" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":1,"name":"Mechanical Keyboard v2","description":"75% layout, RGB","price":149.99,"stockQuantity":35,"category":"peripherals","createdAt":"2026-08-13T09:45:59.230084Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.923781471Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request PUT \ + --url http://localhost:8080/api/products/1 \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"name\":\"Mechanical Keyboard v2\",\"description\":\"75% layout, RGB\",\"price\":149.99,\"stockQuantity\":35,\"category\":\"peripherals\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-2.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-2.yaml new file mode 100644 index 00000000..63cbf691 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-2.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: put-api-products-by-id-2 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/4 + header: + Accept: '*/*' + Content-Length: "119" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"27-inch 4K Monitor","description":"IPS, 60Hz, HDR400","price":299.00,"stockQuantity":30,"category":"monitors"}' + timestamp: 2026-08-13T09:45:59.946764596Z + resp: + status_code: 200 + header: + Content-Length: "168" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":4,"name":"27-inch 4K Monitor","description":"IPS, 60Hz, HDR400","price":299.00,"stockQuantity":30,"category":"monitors","createdAt":"2026-08-13T09:45:59.329465Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.952565471Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request PUT \ + --url http://localhost:8080/api/products/4 \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --data "{\"name\":\"27-inch 4K Monitor\",\"description\":\"IPS, 60Hz, HDR400\",\"price\":299.00,\"stockQuantity\":30,\"category\":\"monitors\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-3.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-3.yaml new file mode 100644 index 00000000..15e8cef9 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-3.yaml @@ -0,0 +1,45 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: put-api-products-by-id-3 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/7 + header: + Accept: '*/*' + Content-Length: "134" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"Noise-Cancelling Headphones Pro","description":"over-ear, BT 5.3, ANC+","price":249.99,"stockQuantity":50,"category":"audio"}' + timestamp: 2026-08-13T09:45:59.975931638Z + resp: + status_code: 200 + header: + Content-Length: "183" + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:45:59 GMT + body: '{"id":7,"name":"Noise-Cancelling Headphones Pro","description":"over-ear, BT 5.3, ANC+","price":249.99,"stockQuantity":50,"category":"audio","createdAt":"2026-08-13T09:45:59.399209Z"}' + status_message: OK + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:45:59.982355638Z + objects: [] + assertions: + noise: + body.createdAt: [] + header.Date: [] + created: 1786614359 + app_port: 8080 +curl: |- + curl --request PUT \ + --url http://localhost:8080/api/products/7 \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --data "{\"name\":\"Noise-Cancelling Headphones Pro\",\"description\":\"over-ear, BT 5.3, ANC+\",\"price\":249.99,\"stockQuantity\":50,\"category\":\"audio\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-4.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-4.yaml new file mode 100644 index 00000000..e3908cfd --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-4.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: put-api-products-by-id-4 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/99999 + header: + Accept: '*/*' + Content-Length: "65" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"ghost","price":1.00,"stockQuantity":1,"category":"none"}' + timestamp: 2026-08-13T09:46:00.135012221Z + resp: + status_code: 404 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":404,"error":"Not Found","message":"Product 99999 not found"}' + status_message: Not Found + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.14096393Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request PUT \ + --url http://localhost:8080/api/products/99999 \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"ghost\",\"price\":1.00,\"stockQuantity\":1,\"category\":\"none\"}" diff --git a/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-5.yaml b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-5.yaml new file mode 100644 index 00000000..a48cdd79 --- /dev/null +++ b/spring-boot-product-catalog/keploy/products-crud/tests/put-api-products-by-id-5.yaml @@ -0,0 +1,43 @@ +# Generated by Keploy (3.5.95) +version: api.keploy.io/v1beta1 +kind: Http +name: put-api-products-by-id-5 +spec: + metadata: {} + req: + method: PUT + proto_major: 1 + proto_minor: 1 + url: http://localhost:8080/api/products/1 + header: + Accept: '*/*' + Content-Length: "41" + Content-Type: application/json + Host: localhost:8080 + User-Agent: curl/8.7.1 + body: '{"name":"","price":-9,"stockQuantity":-1}' + timestamp: 2026-08-13T09:46:00.35755493Z + resp: + status_code: 400 + header: + Content-Type: application/json + Date: Thu, 13 Aug 2026 09:46:00 GMT + body: '{"status":400,"error":"Bad Request","message":"Validation failed","fieldErrors":{"name":"name is required","price":"price must be greater than 0","stockQuantity":"stockQuantity cannot be negative"}}' + status_message: Bad Request + proto_major: 0 + proto_minor: 0 + timestamp: 2026-08-13T09:46:00.360385638Z + objects: [] + assertions: + noise: + header.Date: [] + created: 1786614360 + app_port: 8080 +curl: |- + curl --request PUT \ + --url http://localhost:8080/api/products/1 \ + --header 'Content-Type: application/json' \ + --header 'Host: localhost:8080' \ + --header 'User-Agent: curl/8.7.1' \ + --header 'Accept: */*' \ + --data "{\"name\":\"\",\"price\":-9,\"stockQuantity\":-1}" diff --git a/spring-boot-product-catalog/mvnw b/spring-boot-product-catalog/mvnw new file mode 100755 index 00000000..bd8896bf --- /dev/null +++ b/spring-boot-product-catalog/mvnw @@ -0,0 +1,295 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.4 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" + +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi +fi + +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi + +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/spring-boot-product-catalog/mvnw.cmd b/spring-boot-product-catalog/mvnw.cmd new file mode 100644 index 00000000..92450f93 --- /dev/null +++ b/spring-boot-product-catalog/mvnw.cmd @@ -0,0 +1,189 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.4 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' + +$MAVEN_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/spring-boot-product-catalog/pom.xml b/spring-boot-product-catalog/pom.xml new file mode 100644 index 00000000..beaa2048 --- /dev/null +++ b/spring-boot-product-catalog/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 4.1.0 + + + io.keploy + product-catalog + 0.0.1-SNAPSHOT + product-catalog + Spring Boot + PostgreSQL product catalog REST API, used as a Keploy record-and-replay sample + + 21 + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + + org.postgresql + postgresql + runtime + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-boot-product-catalog/seed.sh b/spring-boot-product-catalog/seed.sh new file mode 100755 index 00000000..6f3189d5 --- /dev/null +++ b/spring-boot-product-catalog/seed.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash +# Traffic generator for Keploy recording. +# +# Drives the Product Catalog API through a rich, realistic workload so the recorded +# Keploy suite is broad: ~60+ test cases covering the full CRUD lifecycle across several +# categories, filtering, the inventory summary, stock adjustments, and a wide range of +# 400 (validation), 404 (not-found), and 409 (insufficient-stock) paths. +# Ids returned by POST are chained into later GET/PUT/DELETE calls so the suite is coherent. +set -euo pipefail + +BASE="${BASE:-http://localhost:8080}" + +# --- helpers ----------------------------------------------------------------- +# grep -m1 stops after the first match and exits 0 (no SIGPIPE from a downstream `head`), +# so it stays well-behaved under `set -e` + `pipefail`. +id_of() { grep -m1 -o '"id":[0-9]*' | cut -d: -f2; } + +CREATED=() # ids of products created, in order + +# create '' -> prints response, appends new id to CREATED +create() { + local json="$1" body id + if ! body=$(curl -fsS -X POST "$BASE/api/products" -H 'Content-Type: application/json' -d "$json"); then + echo " ERROR: create request failed for: $json" >&2 + exit 1 + fi + echo " created: $body" + id=$(printf '%s' "$body" | id_of || true) + if [ -z "$id" ]; then + echo " ERROR: no id in create response: $body" >&2 + exit 1 + fi + CREATED+=("$id") +} + +# expect '