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
- Use Presets - Define presets for common scenarios
- Test Edge Cases - Use high error/timeout rates to test error handling
- Match Real Conditions - Use realistic delay ranges based on your target network
- Document Presets - Document what each preset simulates