From 280e5f5c4ee66ddb24a9411169f8df21b68564fe Mon Sep 17 00:00:00 2001 From: Aykhan Shahsuvarov Date: Sun, 8 Jun 2025 20:55:45 +0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Add=20EXAMPLES.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EXAMPLES.md | 934 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 934 insertions(+) create mode 100644 EXAMPLES.md diff --git a/EXAMPLES.md b/EXAMPLES.md new file mode 100644 index 0000000..d021603 --- /dev/null +++ b/EXAMPLES.md @@ -0,0 +1,934 @@ +# Dodo Usage Examples + +This document provides comprehensive examples of using Dodo with various configuration combinations. Each example includes three methods: CLI usage, YAML configuration, and JSON configuration. + +## Table of Contents + +1. [Basic HTTP Stress Testing](#1-basic-http-stress-testing) +2. [POST Request with Form Data](#2-post-request-with-form-data) +3. [API Testing with Authentication](#3-api-testing-with-authentication) +4. [Testing with Custom Headers and Cookies](#4-testing-with-custom-headers-and-cookies) +5. [Load Testing with Proxy Rotation](#5-load-testing-with-proxy-rotation) +6. [JSON API Testing with Dynamic Data](#6-json-api-testing-with-dynamic-data) +7. [File Upload Testing](#7-file-upload-testing) +8. [E-commerce Cart Testing](#8-e-commerce-cart-testing) +9. [GraphQL API Testing](#9-graphql-api-testing) +10. [WebSocket-style HTTP Testing](#10-websocket-style-http-testing) +11. [Multi-tenant Application Testing](#11-multi-tenant-application-testing) +12. [Rate Limiting Testing](#12-rate-limiting-testing) + +--- + +## 1. Basic HTTP Stress Testing + +Test a simple website with basic GET requests to measure performance under load. + +### CLI Usage + +```bash +dodo -u https://httpbin.org/get \ + -m GET \ + -d 5 \ + -r 100 \ + -t 5s \ + -o 30s \ + --skip-verify=false \ + -y +``` + +### YAML Configuration + +```yaml +method: "GET" +url: "https://httpbin.org/get" +yes: true +timeout: "5s" +dodos: 5 +requests: 100 +duration: "30s" +skip_verify: false +``` + +### JSON Configuration + +```json +{ + "method": "GET", + "url": "https://httpbin.org/get", + "yes": true, + "timeout": "5s", + "dodos": 5, + "requests": 100, + "duration": "30s", + "skip_verify": false +} +``` + +--- + +## 2. POST Request with Form Data + +Test form submission endpoints with randomized form data. + +### CLI Usage + +```bash +dodo -u https://httpbin.org/post \ + -m POST \ + -d 3 \ + -r 50 \ + -t 10s \ + --skip-verify=false \ + -H "Content-Type:application/x-www-form-urlencoded" \ + -b "username={{ fakeit_Username }}&password={{ fakeit_Password true true true true true 12 }}&email={{ fakeit_Email }}" \ + -b "username={{ fakeit_Username }}&password={{ fakeit_Password true true true true true 8 }}&email={{ fakeit_Email }}" \ + -y +``` + +### YAML Configuration + +```yaml +method: "POST" +url: "https://httpbin.org/post" +yes: true +timeout: "10s" +dodos: 3 +requests: 50 +skip_verify: false + +headers: + - Content-Type: "application/x-www-form-urlencoded" + +body: + - "username={{ fakeit_Username }}&password={{ fakeit_Password true true true true true 12 }}&email={{ fakeit_Email }}" + - "username={{ fakeit_Username }}&password={{ fakeit_Password true true true true true 8 }}&email={{ fakeit_Email }}" +``` + +### JSON Configuration + +```json +{ + "method": "POST", + "url": "https://httpbin.org/post", + "yes": true, + "timeout": "10s", + "dodos": 3, + "requests": 50, + "skip_verify": false, + "headers": [{ "Content-Type": "application/x-www-form-urlencoded" }], + "body": [ + "username={{ fakeit_Username }}&password={{ fakeit_Password true true true true true 12 }}&email={{ fakeit_Email }}", + "username={{ fakeit_Username }}&password={{ fakeit_Password true true true true true 8 }}&email={{ fakeit_Email }}" + ] +} +``` + +--- + +## 3. API Testing with Authentication + +Test protected API endpoints with various authentication methods. + +### CLI Usage + +```bash +dodo -u https://httpbin.org/bearer \ + -m GET \ + -d 4 \ + -r 200 \ + -t 8s \ + --skip-verify=false \ + -H "Authorization:Bearer {{ fakeit_LetterN 32 }}" \ + -H "User-Agent:{{ fakeit_UserAgent }}" \ + -H "X-Request-ID:{{ fakeit_Int }}" \ + -H "Accept:application/json" \ + -p "api_version=v1" \ + -p "format=json" \ + -p "client_id=mobile" -p "client_id=web" -p "client_id=desktop" \ + -y +``` + +### YAML Configuration + +```yaml +method: "GET" +url: "https://httpbin.org/bearer" +yes: true +timeout: "8s" +dodos: 4 +requests: 200 +skip_verify: false + +params: + - api_version: "v1" + - format: "json" + - client_id: ["mobile", "web", "desktop"] + +headers: + - Authorization: "Bearer {{ fakeit_LetterN 32 }}" + - User-Agent: "{{ fakeit_UserAgent }}" + - X-Request-ID: "{{ fakeit_Int }}" + - Accept: "application/json" +``` + +### JSON Configuration + +```json +{ + "method": "GET", + "url": "https://httpbin.org/bearer", + "yes": true, + "timeout": "8s", + "dodos": 4, + "requests": 200, + "skip_verify": false, + "params": [ + { "api_version": "v1" }, + { "format": "json" }, + { "client_id": ["mobile", "web", "desktop"] } + ], + "headers": [ + { "Authorization": "Bearer {{ fakeit_LetterN 32 }}" }, + { "User-Agent": "{{ fakeit_UserAgent }}" }, + { "X-Request-ID": "{{ fakeit_Int }}" }, + { "Accept": "application/json" } + ] +} +``` + +--- + +## 4. Testing with Custom Headers and Cookies + +Test applications that require specific headers and session cookies. + +### CLI Usage + +```bash +dodo -u https://httpbin.org/cookies \ + -m GET \ + -d 6 \ + -r 75 \ + -t 5s \ + --skip-verify=false \ + -H 'Accept-Language:{{ strings_Join "," (fakeit_LanguageAbbreviation) (fakeit_LanguageAbbreviation) (fakeit_LanguageAbbreviation) }}' \ + -H "X-Forwarded-For:{{ fakeit_IPv4Address }}" \ + -H "X-Real-IP:{{ fakeit_IPv4Address }}" \ + -H "Accept-Encoding:gzip" -H "Accept-Encoding:deflate" -H "Accept-Encoding:br" \ + -c "session_id={{ fakeit_UUID }}" \ + -c 'user_pref={{ fakeit_RandomString "a1" "b2" "c3" }}' \ + -c "theme=dark" -c "theme=light" -c "theme=auto" \ + -c "lang=en" -c "lang=es" -c "lang=fr" -c "lang=de" \ + -y +``` + +### YAML Configuration + +```yaml +method: "GET" +url: "https://httpbin.org/cookies" +yes: true +timeout: "5s" +dodos: 6 +requests: 75 +skip_verify: false + +headers: + - Accept-Language: '{{ strings_Join "," (fakeit_LanguageAbbreviation) (fakeit_LanguageAbbreviation) (fakeit_LanguageAbbreviation) }}' + - X-Forwarded-For: "{{ fakeit_IPv4Address }}" + - X-Real-IP: "{{ fakeit_IPv4Address }}" + - Accept-Encoding: ["gzip", "deflate", "br"] + +cookies: + - session_id: "{{ fakeit_UUID }}" + - user_pref: '{{ fakeit_RandomString "a1" "b2" "c3" }}' + - theme: ["dark", "light", "auto"] + - lang: ["en", "es", "fr", "de"] +``` + +### JSON Configuration + +```json +{ + "method": "GET", + "url": "https://httpbin.org/cookies", + "yes": true, + "timeout": "5s", + "dodos": 6, + "requests": 75, + "skip_verify": false, + "headers": [ + { + "Accept-Language": "{{ strings_Join \",\" (fakeit_LanguageAbbreviation) (fakeit_LanguageAbbreviation) (fakeit_LanguageAbbreviation) }}" + }, + { "X-Forwarded-For": "{{ fakeit_IPv4Address }}" }, + { "X-Real-IP": "{{ fakeit_IPv4Address }}" }, + { "Accept-Encoding": ["gzip", "deflate", "br"] } + ], + "cookies": [ + { "session_id": "{{ fakeit_UUID }}" }, + { "user_pref": "{{ fakeit_RandomString \"a1\" \"b2\" \"c3\" }}" }, + { "theme": ["dark", "light", "auto"] }, + { "lang": ["en", "es", "fr", "de"] } + ] +} +``` + +--- + +## 5. Load Testing with Proxy Rotation + +Test through multiple proxies for distributed load testing. + +### CLI Usage + +```bash +dodo -u https://httpbin.org/ip \ + -m GET \ + -d 8 \ + -r 300 \ + -t 15s \ + --skip-verify=false \ + -x "http://proxy1.example.com:8080" \ + -x "http://proxy2.example.com:8080" \ + -x "socks5://proxy3.example.com:1080" \ + -x "http://username:password@proxy4.example.com:8080" \ + -H "User-Agent:{{ fakeit_UserAgent }}" \ + -H "Accept:application/json" \ + -y +``` + +### YAML Configuration + +```yaml +method: "GET" +url: "https://httpbin.org/ip" +yes: true +timeout: "15s" +dodos: 8 +requests: 300 +skip_verify: false + +proxy: + - "http://proxy1.example.com:8080" + - "http://proxy2.example.com:8080" + - "socks5://proxy3.example.com:1080" + - "http://username:password@proxy4.example.com:8080" + +headers: + - User-Agent: "{{ fakeit_UserAgent }}" + - Accept: "application/json" +``` + +### JSON Configuration + +```json +{ + "method": "GET", + "url": "https://httpbin.org/ip", + "yes": true, + "timeout": "15s", + "dodos": 8, + "requests": 300, + "skip_verify": false, + "proxy": [ + "http://proxy1.example.com:8080", + "http://proxy2.example.com:8080", + "socks5://proxy3.example.com:1080", + "http://username:password@proxy4.example.com:8080" + ], + "headers": [ + { "User-Agent": "{{ fakeit_UserAgent }}" }, + { "Accept": "application/json" } + ] +} +``` + +--- + +## 6. JSON API Testing with Dynamic Data + +Test REST APIs with realistic JSON payloads. + +### CLI Usage + +```bash +dodo -u https://httpbin.org/post \ + -m POST \ + -d 5 \ + -r 150 \ + -t 12s \ + --skip-verify=false \ + -H "Content-Type:application/json" \ + -H "Accept:application/json" \ + -H "X-API-Version:2023-10-01" \ + -b '{"user_id":{{ fakeit_Uint }},"name":"{{ fakeit_Name }}","email":"{{ fakeit_Email }}","created_at":"{{ fakeit_Date }}"}' \ + -b '{"product_id":{{ fakeit_Uint }},"name":"{{ fakeit_ProductName }}","price":{{ fakeit_Price 10 1000 }},"category":"{{ fakeit_ProductCategory }}"}' \ + -b '{"order_id":"{{ fakeit_UUID }}","items":[{"id":{{ fakeit_Uint }},"quantity":{{ fakeit_IntRange 1 10 }}}],"total":{{ fakeit_Price 50 500 }}}' \ + -y +``` + +### YAML Configuration + +```yaml +method: "POST" +url: "https://httpbin.org/post" +yes: true +timeout: "12s" +dodos: 5 +requests: 150 +skip_verify: false + +headers: + - Content-Type: "application/json" + - Accept: "application/json" + - X-API-Version: "2023-10-01" + +body: + - '{"user_id":{{ fakeit_Uint }},"name":"{{ fakeit_Name }}","email":"{{ fakeit_Email }}","created_at":"{{ fakeit_Date }}"}' + - '{"product_id":{{ fakeit_Uint }},"name":"{{ fakeit_ProductName }}","price":{{ fakeit_Price 10 1000 }},"category":"{{ fakeit_ProductCategory }}"}' + - '{"order_id":"{{ fakeit_UUID }}","items":[{"id":{{ fakeit_Uint }},"quantity":{{ fakeit_IntRange 1 10 }}}],"total":{{ fakeit_Price 50 500 }}}' +``` + +### JSON Configuration + +```json +{ + "method": "POST", + "url": "https://httpbin.org/post", + "yes": true, + "timeout": "12s", + "dodos": 5, + "requests": 150, + "skip_verify": false, + "headers": [ + { "Content-Type": "application/json" }, + { "Accept": "application/json" }, + { "X-API-Version": "2023-10-01" } + ], + "body": [ + "{\"user_id\":{{ fakeit_Uint }},\"name\":\"{{ fakeit_Name }}\",\"email\":\"{{ fakeit_Email }}\",\"created_at\":\"{{ fakeit_Date }}\"}", + "{\"product_id\":{{ fakeit_Uint }},\"name\":\"{{ fakeit_ProductName }}\",\"price\":{{ fakeit_Price 10 1000 }},\"category\":\"{{ fakeit_ProductCategory }}\"}", + "{\"order_id\":\"{{ fakeit_UUID }}\",\"items\":[{\"id\":{{ fakeit_Uint }},\"quantity\":{{ fakeit_IntRange 1 10 }}}],\"total\":{{ fakeit_Price 50 500 }}}" + ] +} +``` + +--- + +## 7. File Upload Testing + +Test file upload endpoints with multipart form data. + +### CLI Usage + +```bash +dodo -u https://httpbin.org/post \ + -m POST \ + -d 3 \ + -r 25 \ + -t 30s \ + --skip-verify=false \ + -H "X-Upload-Source:dodo-test" \ + -H "User-Agent:{{ fakeit_UserAgent }}" \ + -b '{{ body_FormData (dict_Str "filename" (fakeit_UUID) "content" (fakeit_Paragraph 3 5 10 " ")) }}' \ + -b '{{ body_FormData (dict_Str "file" (fakeit_UUID) "description" (fakeit_Sentence 10) "category" "image") }}' \ + -y +``` + +### YAML Configuration + +```yaml +method: "POST" +url: "https://httpbin.org/post" +yes: true +timeout: "30s" +dodos: 3 +requests: 25 +skip_verify: false + +headers: + - X-Upload-Source: "dodo-test" + - User-Agent: "{{ fakeit_UserAgent }}" + +body: + - '{{ body_FormData (dict_Str "filename" (fakeit_UUID) "content" (fakeit_Paragraph 3 5 10 " ")) }}' + - '{{ body_FormData (dict_Str "file" (fakeit_UUID) "description" (fakeit_Sentence 10) "category" "image") }}' +``` + +### JSON Configuration + +```json +{ + "method": "POST", + "url": "https://httpbin.org/post", + "yes": true, + "timeout": "30s", + "dodos": 3, + "requests": 25, + "skip_verify": false, + "headers": [ + { "X-Upload-Source": "dodo-test" }, + { "User-Agent": "{{ fakeit_UserAgent }}" } + ], + "body": [ + "{{ body_FormData (dict_Str \"filename\" (fakeit_UUID) \"content\" (fakeit_Paragraph 3 5 10 \" \")) }}", + "{{ body_FormData (dict_Str \"file\" (fakeit_UUID) \"description\" (fakeit_Sentence 10) \"category\" \"image\") }}" + ] +} +``` + +--- + +## 8. E-commerce Cart Testing + +Test shopping cart operations with realistic product data. + +### CLI Usage + +```bash +dodo -u https://api.example-shop.com/cart \ + -m POST \ + -d 10 \ + -r 500 \ + -t 8s \ + --skip-verify=false \ + -H "Content-Type:application/json" \ + -H "Authorization:Bearer {{ fakeit_LetterN 32 }}" \ + -H "X-Client-Version:1.2.3" \ + -H "User-Agent:{{ fakeit_UserAgent }}" \ + -c "cart_session={{ fakeit_UUID }}" \ + -c "user_pref=guest" -c "user_pref=member" -c "user_pref=premium" \ + -c "region=US" -c "region=EU" -c "region=ASIA" \ + -p "currency=USD" -p "currency=EUR" -p "currency=GBP" \ + -p "locale=en-US" -p "locale=en-GB" -p "locale=de-DE" -p "locale=fr-FR" \ + -b '{"action":"add","product_id":"{{ fakeit_UUID }}","quantity":{{ fakeit_IntRange 1 5 }},"user_id":"{{ fakeit_UUID }}"}' \ + -b '{"action":"remove","product_id":"{{ fakeit_UUID }}","user_id":"{{ fakeit_UUID }}"}' \ + -b '{"action":"update","product_id":"{{ fakeit_UUID }}","quantity":{{ fakeit_IntRange 1 10 }},"user_id":"{{ fakeit_UUID }}"}' \ + -y +``` + +### YAML Configuration + +```yaml +method: "POST" +url: "https://api.example-shop.com/cart" +yes: true +timeout: "8s" +dodos: 10 +requests: 500 +skip_verify: false + +headers: + - Content-Type: "application/json" + - Authorization: "Bearer {{ fakeit_LetterN 32 }}" + - X-Client-Version: "1.2.3" + - User-Agent: "{{ fakeit_UserAgent }}" + +cookies: + - cart_session: "{{ fakeit_UUID }}" + - user_pref: ["guest", "member", "premium"] + - region: ["US", "EU", "ASIA"] + +params: + - currency: ["USD", "EUR", "GBP"] + - locale: ["en-US", "en-GB", "de-DE", "fr-FR"] + +body: + - '{"action":"add","product_id":"{{ fakeit_UUID }}","quantity":{{ fakeit_IntRange 1 5 }},"user_id":"{{ fakeit_UUID }}"}' + - '{"action":"remove","product_id":"{{ fakeit_UUID }}","user_id":"{{ fakeit_UUID }}"}' + - '{"action":"update","product_id":"{{ fakeit_UUID }}","quantity":{{ fakeit_IntRange 1 10 }},"user_id":"{{ fakeit_UUID }}"}' +``` + +### JSON Configuration + +```json +{ + "method": "POST", + "url": "https://api.example-shop.com/cart", + "yes": true, + "timeout": "8s", + "dodos": 10, + "requests": 500, + "skip_verify": false, + "headers": [ + { "Content-Type": "application/json" }, + { "Authorization": "Bearer {{ fakeit_LetterN 32 }}" }, + { "X-Client-Version": "1.2.3" }, + { "User-Agent": "{{ fakeit_UserAgent }}" } + ], + "cookies": [ + { "cart_session": "{{ fakeit_UUID }}" }, + { "user_pref": ["guest", "member", "premium"] }, + { "region": ["US", "EU", "ASIA"] } + ], + "params": [ + { "currency": ["USD", "EUR", "GBP"] }, + { "locale": ["en-US", "en-GB", "de-DE", "fr-FR"] } + ], + "body": [ + "{\"action\":\"add\",\"product_id\":\"{{ fakeit_UUID }}\",\"quantity\":{{ fakeit_IntRange 1 5 }},\"user_id\":\"{{ fakeit_UUID }}\"}", + "{\"action\":\"remove\",\"product_id\":\"{{ fakeit_UUID }}\",\"user_id\":\"{{ fakeit_UUID }}\"}", + "{\"action\":\"update\",\"product_id\":\"{{ fakeit_UUID }}\",\"quantity\":{{ fakeit_IntRange 1 10 }},\"user_id\":\"{{ fakeit_UUID }}\"}" + ] +} +``` + +--- + +## 9. GraphQL API Testing + +Test GraphQL endpoints with various queries and mutations. + +### CLI Usage + +```bash +dodo -u https://api.example.com/graphql \ + -m POST \ + -d 4 \ + -r 100 \ + -t 10s \ + --skip-verify=false \ + -H "Content-Type:application/json" \ + -H "Authorization:Bearer {{ fakeit_UUID }}" \ + -H "X-GraphQL-Client:dodo-test" \ + -b '{"query":"query GetUser($id: ID!) { user(id: $id) { id name email } }","variables":{"id":"{{ fakeit_UUID }}"}}' \ + -b '{"query":"query GetPosts($limit: Int) { posts(limit: $limit) { id title content } }","variables":{"limit":{{ fakeit_IntRange 5 20 }}}}' \ + -b '{"query":"mutation CreatePost($input: PostInput!) { createPost(input: $input) { id title } }","variables":{"input":{"title":"{{ fakeit_Sentence 5 }}","content":"{{ fakeit_Paragraph 2 3 5 " "}}","authorId":"{{ fakeit_UUID }}"}}}' \ + -y +``` + +### YAML Configuration + +```yaml +method: "POST" +url: "https://api.example.com/graphql" +yes: true +timeout: "10s" +dodos: 4 +requests: 100 +skip_verify: false + +headers: + - Content-Type: "application/json" + - Authorization: "Bearer {{ fakeit_UUID }}" + - X-GraphQL-Client: "dodo-test" + +body: + - '{"query":"query GetUser($id: ID!) { user(id: $id) { id name email } }","variables":{"id":"{{ fakeit_UUID }}"}}' + - '{"query":"query GetPosts($limit: Int) { posts(limit: $limit) { id title content } }","variables":{"limit":{{ fakeit_IntRange 5 20 }}}}' + - '{"query":"mutation CreatePost($input: PostInput!) { createPost(input: $input) { id title } }","variables":{"input":{"title":"{{ fakeit_Sentence 5 }}","content":"{{ fakeit_Paragraph 2 3 5 " "}}","authorId":"{{ fakeit_UUID }}"}}}' +``` + +### JSON Configuration + +```json +{ + "method": "POST", + "url": "https://api.example.com/graphql", + "yes": true, + "timeout": "10s", + "dodos": 4, + "requests": 100, + "skip_verify": false, + "headers": [ + { "Content-Type": "application/json" }, + { "Authorization": "Bearer {{ fakeit_UUID }}" }, + { "X-GraphQL-Client": "dodo-test" } + ], + "body": [ + "{\"query\":\"query GetUser($id: ID!) { user(id: $id) { id name email } }\",\"variables\":{\"id\":\"{{ fakeit_UUID }}\"}}", + "{\"query\":\"query GetPosts($limit: Int) { posts(limit: $limit) { id title content } }\",\"variables\":{\"limit\":{{ fakeit_IntRange 5 20 }}}}", + "{\"query\":\"mutation CreatePost($input: PostInput!) { createPost(input: $input) { id title } }\",\"variables\":{\"input\":{\"title\":\"{{ fakeit_Sentence 5 }}\",\"content\":\"{{ fakeit_Paragraph 2 3 5 \\\" \\\"}}\",\"authorId\":\"{{ fakeit_UUID }}\"}}}" + ] +} +``` + +--- + +## 10. WebSocket-style HTTP Testing + +Test real-time applications with WebSocket-like HTTP endpoints. + +### CLI Usage + +```bash +dodo -u https://api.realtime-app.com/events \ + -m POST \ + -d 15 \ + -r 1000 \ + -t 5s \ + -o 60s \ + --skip-verify=false \ + -H "Content-Type:application/json" \ + -H "X-Event-Type:{{ fakeit_LetterNN 4 12 }}" \ + -H "Connection:keep-alive" \ + -H "Cache-Control:no-cache" \ + -c "connection_id={{ fakeit_UUID }}" \ + -c "session_token={{ fakeit_UUID }}" \ + -p "channel=general" -p "channel=notifications" -p "channel=alerts" -p "channel=updates" \ + -p "version=v1" -p "version=v2" \ + -b '{"event":"{{ fakeit_Word }}","data":{"timestamp":"{{ fakeit_Date }}","user_id":"{{ fakeit_UUID }}","message":"{{ fakeit_Sentence 8 }}"}}' \ + -b '{"event":"ping","data":{"timestamp":"{{ fakeit_Date }}","client_id":"{{ fakeit_UUID }}"}}' \ + -b '{"event":"status_update","data":{"status":"{{ fakeit_Word }}","user_id":"{{ fakeit_UUID }}","timestamp":"{{ fakeit_Date }}"}}' \ + -y +``` + +### YAML Configuration + +```yaml +method: "POST" +url: "https://api.realtime-app.com/events" +yes: true +timeout: "5s" +dodos: 15 +requests: 1000 +duration: "60s" +skip_verify: false + +headers: + - Content-Type: "application/json" + - X-Event-Type: "{{ fakeit_LetterNN 4 12 }}" + - Connection: "keep-alive" + - Cache-Control: "no-cache" + +cookies: + - connection_id: "{{ fakeit_UUID }}" + - session_token: "{{ fakeit_UUID }}" + +params: + - channel: ["general", "notifications", "alerts", "updates"] + - version: ["v1", "v2"] + +body: + - '{"event":"{{ fakeit_Word }}","data":{"timestamp":"{{ fakeit_Date }}","user_id":"{{ fakeit_UUID }}","message":"{{ fakeit_Sentence 8 }}"}}' + - '{"event":"ping","data":{"timestamp":"{{ fakeit_Date }}","client_id":"{{ fakeit_UUID }}"}}' + - '{"event":"status_update","data":{"status":"{{ fakeit_Word }}","user_id":"{{ fakeit_UUID }}","timestamp":"{{ fakeit_Date }}"}}' +``` + +### JSON Configuration + +```json +{ + "method": "POST", + "url": "https://api.realtime-app.com/events", + "yes": true, + "timeout": "5s", + "dodos": 15, + "requests": 1000, + "duration": "60s", + "skip_verify": false, + "headers": [ + { "Content-Type": "application/json" }, + { "X-Event-Type": "{{ fakeit_LetterNN 4 12 }}" }, + { "Connection": "keep-alive" }, + { "Cache-Control": "no-cache" } + ], + "cookies": [ + { "connection_id": "{{ fakeit_UUID }}" }, + { "session_token": "{{ fakeit_UUID }}" } + ], + "params": [ + { "channel": ["general", "notifications", "alerts", "updates"] }, + { "version": ["v1", "v2"] } + ], + "body": [ + "{\"event\":\"{{ fakeit_Word }}\",\"data\":{\"timestamp\":\"{{ fakeit_Date }}\",\"user_id\":\"{{ fakeit_UUID }}\",\"message\":\"{{ fakeit_Sentence 8 }}\"}}", + "{\"event\":\"ping\",\"data\":{\"timestamp\":\"{{ fakeit_Date }}\",\"client_id\":\"{{ fakeit_UUID }}\"}}", + "{\"event\":\"status_update\",\"data\":{\"status\":\"{{ fakeit_Word }}\",\"user_id\":\"{{ fakeit_UUID }}\",\"timestamp\":\"{{ fakeit_Date }}\"}}" + ] +} +``` + +--- + +## 11. Multi-tenant Application Testing + +Test SaaS applications with tenant-specific configurations. + +### CLI Usage + +```bash +dodo -u https://app.saas-platform.com/api/data \ + -m GET \ + -d 12 \ + -r 600 \ + -t 15s \ + --skip-verify=false \ + -H "X-Tenant-ID:{{ fakeit_UUID }}" \ + -H "Authorization:Bearer {{ fakeit_LetterN 64 }}" \ + -H "X-Client-Type:web" -H "X-Client-Type:mobile" -H "X-Client-Type:api" \ + -H "Accept:application/json" \ + -c "tenant_session={{ fakeit_UUID }}" \ + -c "user_role=admin" -c "user_role=user" -c "user_role=viewer" \ + -c "subscription_tier=free" -c "subscription_tier=pro" -c "subscription_tier=enterprise" \ + -p "page={{ fakeit_IntRange 1 10 }}" \ + -p "limit={{ fakeit_IntRange 10 100 }}" \ + -p "sort=created_at" -p "sort=updated_at" -p "sort=name" \ + -p "order=asc" -p "order=desc" \ + -p "filter_by=active" -p "filter_by=inactive" -p "filter_by=pending" \ + -y +``` + +### YAML Configuration + +```yaml +method: "GET" +url: "https://app.saas-platform.com/api/data" +yes: true +timeout: "15s" +dodos: 12 +requests: 600 +skip_verify: false + +headers: + - X-Tenant-ID: "{{ fakeit_UUID }}" + - Authorization: "Bearer {{ fakeit_LetterN 64 }}" + - X-Client-Type: ["web", "mobile", "api"] + - Accept: "application/json" + +cookies: + - tenant_session: "{{ fakeit_UUID }}" + - user_role: ["admin", "user", "viewer"] + - subscription_tier: ["free", "pro", "enterprise"] + +params: + - page: "{{ fakeit_IntRange 1 10 }}" + - limit: "{{ fakeit_IntRange 10 100 }}" + - sort: ["created_at", "updated_at", "name"] + - order: ["asc", "desc"] + - filter_by: ["active", "inactive", "pending"] +``` + +### JSON Configuration + +```json +{ + "method": "GET", + "url": "https://app.saas-platform.com/api/data", + "yes": true, + "timeout": "15s", + "dodos": 12, + "requests": 600, + "skip_verify": false, + "headers": [ + { "X-Tenant-ID": "{{ fakeit_UUID }}" }, + { "Authorization": "Bearer {{ fakeit_LetterN 64 }}" }, + { "X-Client-Type": ["web", "mobile", "api"] }, + { "Accept": "application/json" } + ], + "cookies": [ + { "tenant_session": "{{ fakeit_UUID }}" }, + { "user_role": ["admin", "user", "viewer"] }, + { "subscription_tier": ["free", "pro", "enterprise"] } + ], + "params": [ + { "page": "{{ fakeit_IntRange 1 10 }}" }, + { "limit": "{{ fakeit_IntRange 10 100 }}" }, + { "sort": ["created_at", "updated_at", "name"] }, + { "order": ["asc", "desc"] }, + { "filter_by": ["active", "inactive", "pending"] } + ] +} +``` + +--- + +## 12. Rate Limiting Testing + +Test API rate limits and throttling mechanisms. + +### CLI Usage + +```bash +dodo -u https://api.rate-limited.com/endpoint \ + -m GET \ + -d 20 \ + -r 2000 \ + -t 3s \ + -o 120s \ + --skip-verify=false \ + -H "X-API-Key:{{ fakeit_UUID }}" \ + -H "X-Client-ID:{{ fakeit_UUID }}" \ + -H "X-Rate-Limit-Test:true" \ + -H "User-Agent:{{ fakeit_UserAgent }}" \ + -c "rate_limit_bucket={{ fakeit_UUID }}" \ + -c "client_tier=tier1" -c "client_tier=tier2" -c "client_tier=tier3" \ + -p "burst_test=true" \ + -p "client_type=premium" -p "client_type=standard" -p "client_type=free" \ + -p "request_id={{ fakeit_UUID }}" \ + -y +``` + +### YAML Configuration + +```yaml +method: "GET" +url: "https://api.rate-limited.com/endpoint" +yes: true +timeout: "3s" +dodos: 20 +requests: 2000 +duration: "120s" +skip_verify: false + +headers: + - X-API-Key: "{{ fakeit_UUID }}" + - X-Client-ID: "{{ fakeit_UUID }}" + - X-Rate-Limit-Test: "true" + - User-Agent: "{{ fakeit_UserAgent }}" + +params: + - burst_test: "true" + - client_type: ["premium", "standard", "free"] + - request_id: "{{ fakeit_UUID }}" + +cookies: + - rate_limit_bucket: "{{ fakeit_UUID }}" + - client_tier: ["tier1", "tier2", "tier3"] +``` + +### JSON Configuration + +```json +{ + "method": "GET", + "url": "https://api.rate-limited.com/endpoint", + "yes": true, + "timeout": "3s", + "dodos": 20, + "requests": 2000, + "duration": "120s", + "skip_verify": false, + "headers": [ + { "X-API-Key": "{{ fakeit_UUID }}" }, + { "X-Client-ID": "{{ fakeit_UUID }}" }, + { "X-Rate-Limit-Test": "true" }, + { "User-Agent": "{{ fakeit_UserAgent }}" } + ], + "params": [ + { "burst_test": "true" }, + { "client_type": ["premium", "standard", "free"] }, + { "request_id": "{{ fakeit_UUID }}" } + ], + "cookies": [ + { "rate_limit_bucket": "{{ fakeit_UUID }}" }, + { "client_tier": ["tier1", "tier2", "tier3"] } + ] +} +``` + +--- + +## Notes + +- All examples use template functions for dynamic data generation +- Adjust `dodos`, `requests`, `duration`, and `timeout` values based on your testing requirements +- Use `skip_verify: true` for testing with self-signed certificates +- Set `yes: true` to skip confirmation prompts in automated testing +- Template functions like `{{ fakeit_* }}` generate random realistic data for each request +- Multiple values in arrays (e.g., `["value1", "value2"]`) will be randomly selected per request +- Use the `body_FormData` function for multipart form uploads +- Proxy configurations support HTTP, SOCKS5, and SOCKS5H protocols + +For more template functions and advanced configuration options, refer to the main documentation and `utils/templates.go`.