Skip to main content

Network Simulation

Fakelab can simulate real-world network conditions such as latency, random failures, timeouts, and offline mode. This is useful for testing loading states, retry logic, and poor network UX without changing frontend code.

Overview

Network simulation helps you test how your application behaves under various network conditions, ensuring a robust user experience even when the network is unreliable.

Configuration

Basic Network Options

type NetworkErrorOptions = {
statusCodes?: ErrorStatusCode[];
messages?: Record<ErrorStatusCode, string>;
};

type NetworkBehaviourOptions = {
delay?: number | [number, number];
errorRate?: number;
timeoutRate?: number;
offline?: boolean;
errors?: NetworkErrorOptions;
};

export type NetworkOptions = NetworkBehaviourOptions & {
preset?: string;
presets?: Record<string, NetworkBehaviourOptions>;
};

Basic Example

// fakelab.config.ts
import { defineConfig } from "fakelab";

export default defineConfig({
sourcePath: ["./fixtures"],
network: {
delay: [300, 1200], // Random delay between 300ms and 1200ms
errorRate: 0.1, // 10% chance of errors
timeoutRate: 0.05, // 5% chance of timeouts
},
});

Network Options

Delay

Simulate network latency with fixed or random delays.

// Fixed delay
network: {
delay: 500, // Always 500ms delay
}

// Random delay range
network: {
delay: [300, 1200], // Random delay between 300ms and 1200ms
}

Error Rate

Simulate random network errors.

network: {
errorRate: 0.1, // 10% chance of returning an error
errors: {
statusCodes: [400, 404, 500] // Random error status code
messages: {
400: "Bad request",
404: "Not found",
500: "Server error"
} // Custom messages per status code
}
}

Timeout Rate

Simulate request timeouts.

network: {
timeoutRate: 0.05, // 5% chance of timing out
}

Offline Mode

Force all requests to fail (simulating offline state).

network: {
offline: true, // All requests will fail
}

Network Presets

Define reusable network presets for different scenarios.

Defining Presets

// fakelab.config.ts
import { defineConfig } from "fakelab";

export default defineConfig({
sourcePath: ["./fixtures"],
network: {
presets: {
wifi: {
delay: [50, 200],
errorRate: 0.01,
},
"3g": {
delay: [500, 2000],
errorRate: 0.05,
},
"slow-3g": {
delay: [2000, 5000],
errorRate: 0.1,
},
offline: {
offline: true,
},
unreliable: {
delay: [100, 500],
errorRate: 0.3,
timeoutRate: 0.2,
},
},
preset: "wifi", // Use the wifi preset
},
});

Using Presets

network: {
preset: "slow-3g", // Activate the slow-3g preset
}

Preset Override

When both inline network options and a preset are defined, inline options always take precedence and override the preset values.

network: {
presets: {
wifi: {
delay: [50, 200],
errorRate: 0.01,
},
},
preset: "wifi",
delay: [1000, 3000], // This overrides the wifi preset delay
}

Common Use Cases

Testing Loading States

network: {
delay: [1000, 3000], // Simulate slow network
}

This helps you test:

  • Loading spinners
  • Skeleton screens
  • Progress indicators

Testing Error Handling

network: {
errorRate: 0.2, // 20% chance of errors
}

This helps you test:

  • Error messages
  • Retry logic
  • Fallback UI

Testing Timeout Handling

network: {
timeoutRate: 0.1, // 10% chance of timeouts
}

This helps you test:

  • Timeout error handling
  • Request cancellation
  • User feedback

Testing Offline Mode

network: {
offline: true,
}

This helps you test:

  • Offline detection
  • Cached data display
  • Offline messaging

Example Scenarios

Development Environment

// fakelab.config.ts
export default defineConfig({
sourcePath: ["./fixtures"],
network: {
delay: [100, 300], // Fast, realistic delays
errorRate: 0.01, // Rare errors
},
});

Testing Environment

// fakelab.config.ts
export default defineConfig({
sourcePath: ["./fixtures"],
network: {
presets: {
"test-fast": { delay: 0 },
"test-slow": { delay: [2000, 5000] },
"test-unreliable": { errorRate: 0.5 },
},
preset: "test-fast", // Fast for most tests
},
});

Production-like Testing

// fakelab.config.ts
export default defineConfig({
sourcePath: ["./fixtures"],
network: {
delay: [200, 800], // Realistic production delays
errorRate: 0.02, // Occasional errors
timeoutRate: 0.01, // Rare timeouts
},
});

Best Practices

  1. Use Presets - Define presets for common scenarios
  2. Test Edge Cases - Use high error/timeout rates to test error handling
  3. Match Real Conditions - Use realistic delay ranges based on your target network
  4. Document Presets - Document what each preset simulates