Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/visible/cruel/llms.txt

Use this file to discover all available pages before exploring further.

Profiles allow you to save and reuse chaos configurations, making it easy to switch between different testing scenarios.

Create a profile

import { cruel } from "cruel"

// Define a testing profile
cruel.profile("testing", {
  fail: 0.2,
  delay: [100, 500],
  timeout: 0.05,
})

// Define a production profile
cruel.profile("production", {
  fail: 0.01,
  delay: [10, 50],
})

// Define a stress test profile
cruel.profile("stress", {
  fail: 0.5,
  delay: [1000, 5000],
  timeout: 0.2,
  jitter: 1000,
})

Use a profile

// Activate a profile
cruel.useProfile("testing")

// All wrapped functions now use this profile
const api = cruel(fetch)
await api("https://api.example.com")

// Switch to different profile
cruel.useProfile("stress")
await api("https://api.example.com") // Much more chaos

Environment-based profiles

import { cruel } from "cruel"

// Set up profiles
cruel.profile("development", cruel.presets.development)
cruel.profile("staging", cruel.presets.staging)
cruel.profile("production", cruel.presets.production)

// Activate based on environment
const env = process.env.NODE_ENV || "development"
cruel.useProfile(env)

Feature-specific profiles

import { cruel } from "cruel"

// API testing profile
cruel.profile("api-testing", {
  fail: 0.1,
  delay: [100, 500],
  timeout: 0.05,
})

// Database testing profile
cruel.profile("db-testing", {
  fail: 0.05,
  delay: [50, 200],
  timeout: 0.02,
})

// Stream testing profile
cruel.profile("stream-testing", {
  fail: 0.1,
  delay: [200, 1000],
  corrupt: 0.05,
})

// Use different profiles for different tests
test("API handles failures", () => {
  cruel.useProfile("api-testing")
  // Test API
})

test("Database handles failures", () => {
  cruel.useProfile("db-testing")
  // Test database
})

Team profiles

// profiles.ts - Shared team configurations
import { cruel } from "cruel"

export const profiles = {
  backend: {
    fail: 0.1,
    delay: [100, 500],
  },
  frontend: {
    fail: 0.05,
    delay: [50, 200],
  },
  integration: {
    fail: 0.2,
    delay: [200, 1000],
    timeout: 0.1,
  },
}

// Register all profiles
Object.entries(profiles).forEach(([name, config]) => {
  cruel.profile(name, config)
})
// test.ts - Use team profiles
import { cruel } from "cruel"
import "./profiles"

test("backend integration", () => {
  cruel.useProfile("backend")
  // Tests
})

Dynamic profiles

import { cruel } from "cruel"

// Create profile from environment variables
const customProfile = {
  fail: parseFloat(process.env.CHAOS_FAIL || "0.1"),
  delay: [
    parseInt(process.env.CHAOS_DELAY_MIN || "100"),
    parseInt(process.env.CHAOS_DELAY_MAX || "500"),
  ] as [number, number],
  timeout: parseFloat(process.env.CHAOS_TIMEOUT || "0.05"),
}

cruel.profile("custom", customProfile)
cruel.useProfile("custom")

Reset profiles

// Reset clears all profiles
cruel.reset()

// Need to recreate profiles after reset
cruel.profile("testing", { fail: 0.1 })
Profiles are stored globally and persist until cruel.reset() is called.
Combine profiles with presets to create comprehensive testing configurations.

Build docs developers (and LLMs) love