🚨 Anatomy of a 3 AM Production Crisis: A Testing Tale
🎭 The Scene:
// The innocent-looking code that ruined everyone's night
const getDomainUrl = (config: BackendConfig) => {
return config.domain; // What could go wrong? Everything.
};
🔍 Let's Debug Together: The Case of the Phantom Redirect
🚨 The Crime Scene
Dashboard users land at
undefined/rest-path
after a "harmless" config change
- Suspect: A sneaky backend configuration tweak
- Weapon: Missing validation for domain paths
- Motive: "It worked in dev!" 🤦
Unit testing
describe('Domain Configuration', () => {
it('should reject missing domain configuration', () => {
const emptyConfig = {} as BackendConfig;
expect(() => getDomainUrl(emptyConfig)).toThrow();
});
});
Code
const getDomainUrl = (config: BackendConfig): string => {
if (!config.domain) {
throw new DomainConfigError('Domain URL is required');
}
if (!isValidDomainUrl(config.domain)) {
throw new DomainConfigError('Invalid domain URL format');
}
return config.domain;
};
Component Testing
describe('RedirectHandler', () => {
it('should handle domain configuration gracefully', () => {
const mockConfig = {};
const { getByTestId } = render(<RedirectHandler config={mockConfig} />);
expect(getByTestId('config-error')).toBeInTheDocument();
expect(captureError).toHaveBeenCalledWith(expect.any(DomainConfigError));
});
});
Code
const RedirectHandler: React.FC<{ config: BackendConfig }> = ({ config }) => {
const [error, setError] = useState<string>();
const navigate = useNavigate();
useEffect(() => {
try {
const domainUrl = getDomainUrl(config);
// Safely handle navigation
navigate(`${domainUrl}/rest-path`);
} catch (e) {
if (e instanceof DomainConfigError) {
setError(e.message);
// Log to monitoring system
captureError(e);
}
}
}, [config, navigate]);
if (error) {
return (
<ErrorBoundary>
<ConfigurationError
message={error}
retry={() => window.location.reload()}
/>
</ErrorBoundary>
);
}
return <LoadingSpinner />;
};
🛠️ The Evolution of Robust Domain Configuration
🎯 What Changed?
-
Prevention Layers:
- Custom error types (
InvalidDomainException
) - Domain validation before redirect logic
- Error boundaries to catch misconfigurations
- Custom error types (
-
Test-First Approach:
- Wrote failing test for missing config first
- Added domain validation logic
- Simulated edge cases (malformed URLs, empty configs)
-
Better Error UX:
- User-friendly message: "Oops! We hit a snag – try again?"
- Retry button with auto-logging for engineers
- Integrated error tracking (Sentry/Datadog)
🚀 The Results
- No more undefined redirects
- Clear error tracking
- Happy users (and developers who can sleep at night!)
🎯 The Tale of Two Developers: TDD vs. "We'll Test Later"
🐇 Bugs Bunny (Traditional):
- 3 AM: Debugging while production burns
- Result: Chasing midnight bugs, endless firefighting
⭐ Iron Man (TDD):
"Test first, code with confidence."
- Result: Deploys and sleeps soundly
- Secret Weapon: Tests act as code armor
🔄 The Real Difference:
Same deadline, drastically different outcomes.
While Bugs Bunny chases production bugs at midnight, Iron Man’s approach means:
🛡️ Prevention > Cure
- Catches bugs before they reach production
- Each test is a shield against future issues
- No more 3 AM emergency fixes
🎯 Design That Makes Sense
- Tests force you to think before coding
- Code becomes naturally modular
- Refactoring becomes a breeze
📚 Code That Tells a Story
- Tests document how things should work
- New team members get up to speed faster
- Requirements are crystal clear