Skip to main content

pulith_fetch/segment/
validation.rs

1/// Returns `true` if the HTTP status code indicates a redirect.
2///
3/// # Recognized Redirect Codes
4///
5/// - 301: Moved Permanently
6/// - 302: Found
7/// - 303: See Other
8/// - 307: Temporary Redirect
9/// - 308: Permanent Redirect
10///
11/// # Examples
12///
13/// ```
14/// use pulith_fetch::is_redirect;
15///
16/// assert!(is_redirect(301));
17/// assert!(is_redirect(302));
18/// assert!(!is_redirect(200));
19/// assert!(!is_redirect(404));
20/// ```
21pub fn is_redirect(status: u16) -> bool {
22    matches!(status, 301 | 302 | 303 | 307 | 308)
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_is_redirect_all_codes() {
31        // Test all recognized redirect codes
32        assert!(is_redirect(301)); // Moved Permanently
33        assert!(is_redirect(302)); // Found
34        assert!(is_redirect(303)); // See Other
35        assert!(is_redirect(307)); // Temporary Redirect
36        assert!(is_redirect(308)); // Permanent Redirect
37    }
38
39    #[test]
40    fn test_is_redirect_success_codes() {
41        // Common success codes should not be redirects
42        assert!(!is_redirect(200)); // OK
43        assert!(!is_redirect(201)); // Created
44        assert!(!is_redirect(204)); // No Content
45    }
46
47    #[test]
48    fn test_is_redirect_client_error_codes() {
49        // Client error codes should not be redirects
50        assert!(!is_redirect(400)); // Bad Request
51        assert!(!is_redirect(401)); // Unauthorized
52        assert!(!is_redirect(403)); // Forbidden
53        assert!(!is_redirect(404)); // Not Found
54        assert!(!is_redirect(429)); // Too Many Requests
55    }
56
57    #[test]
58    fn test_is_redirect_server_error_codes() {
59        // Server error codes should not be redirects
60        assert!(!is_redirect(500)); // Internal Server Error
61        assert!(!is_redirect(502)); // Bad Gateway
62        assert!(!is_redirect(503)); // Service Unavailable
63        assert!(!is_redirect(504)); // Gateway Timeout
64    }
65
66    #[test]
67    fn test_is_redirect_informational_codes() {
68        // Informational codes should not be redirects
69        assert!(!is_redirect(100)); // Continue
70        assert!(!is_redirect(101)); // Switching Protocols
71        assert!(!is_redirect(102)); // Processing
72    }
73
74    #[test]
75    fn test_is_redirect_edge_cases() {
76        // Edge cases around redirect codes
77        assert!(!is_redirect(300)); // Multiple Choices (not in our list)
78        assert!(!is_redirect(304)); // Not Modified
79        assert!(!is_redirect(305)); // Use Proxy (deprecated)
80        assert!(!is_redirect(306)); // (Unused)
81    }
82
83    #[test]
84    fn test_is_redirect_invalid_codes() {
85        // Invalid HTTP status codes
86        assert!(!is_redirect(0));
87        assert!(!is_redirect(99));
88        assert!(!is_redirect(600));
89        assert!(!is_redirect(1000));
90    }
91
92    #[test]
93    fn test_is_redirect_comprehensive_coverage() {
94        // Test a comprehensive range of status codes
95        let redirect_codes = [301, 302, 303, 307, 308];
96        let non_redirect_codes = [
97            100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 304, 305, 306,
98            400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416,
99            417, 418, 421, 422, 423, 424, 425, 426, 428, 429, 431, 451, 500, 501, 502, 503, 504,
100            505, 506, 507, 508, 510, 511,
101        ];
102
103        for code in &redirect_codes {
104            assert!(is_redirect(*code), "Code {} should be a redirect", code);
105        }
106
107        for code in &non_redirect_codes {
108            assert!(
109                !is_redirect(*code),
110                "Code {} should NOT be a redirect",
111                code
112            );
113        }
114    }
115}