#[cfg(test)]
mod tests {
use aex::http::protocol::media_type::{MediaType, SubMediaType};
use std::path::Path;
#[test]
fn test_as_str() {
assert_eq!(MediaType::Text.as_str(), "text");
assert_eq!(MediaType::Image.as_str(), "image");
assert_eq!(MediaType::Audio.as_str(), "audio");
assert_eq!(MediaType::Video.as_str(), "video");
assert_eq!(MediaType::Application.as_str(), "application");
assert_eq!(MediaType::Multipart.as_str(), "multipart");
assert_eq!(MediaType::Message.as_str(), "message");
assert_eq!(MediaType::Font.as_str(), "font");
assert_eq!(MediaType::Model.as_str(), "model");
assert_eq!(MediaType::Unknown.as_str(), "unknown");
}
#[test]
fn test_from_str_exact() {
let all_pairs = [
("text", MediaType::Text),
("image", MediaType::Image),
("audio", MediaType::Audio),
("video", MediaType::Video),
("application", MediaType::Application),
("multipart", MediaType::Multipart),
("message", MediaType::Message),
("font", MediaType::Font),
("model", MediaType::Model),
("unknown", MediaType::Unknown),
];
for (s, ty) in all_pairs.iter() {
assert_eq!(MediaType::from_str(s), *ty);
assert_eq!(MediaType::from_str(&s.to_uppercase()), *ty);
assert_eq!(MediaType::from_str(&s.to_ascii_lowercase()), *ty);
}
assert_eq!(MediaType::from_str("foobar"), MediaType::Unknown);
assert_eq!(MediaType::from_str(""), MediaType::Unknown);
}
#[test]
fn test_fromstr_trait() {
let ty: MediaType = "text".parse().unwrap();
assert_eq!(ty, MediaType::Text);
let ty: MediaType = "IMAGE".parse().unwrap();
assert_eq!(ty, MediaType::Image);
let ty: MediaType = "unknown_type".parse().unwrap();
assert_eq!(ty, MediaType::Unknown);
}
#[test]
fn test_guess() {
let cases = [
("index.html", "text/html"),
("style.htm", "text/html"),
("main.css", "text/css"),
("app.js", "application/javascript"),
("data.json", "application/json"),
("logo.png", "image/png"),
("photo.jpg", "image/jpeg"),
("photo.jpeg", "image/jpeg"),
("anim.gif", "image/gif"),
("readme.txt", "text/plain"),
("icon.svg", "image/svg+xml"),
("favicon.ico", "image/x-icon"),
("file.unknownext", "application/octet-stream"),
("noextension", "application/octet-stream"),
];
for (filename, expected) in cases.iter() {
let path = Path::new(filename);
assert_eq!(MediaType::guess(path), *expected);
}
}
#[test]
fn test_media_type_as_str_and_from_str() {
let types = [
(MediaType::Text, "text"),
(MediaType::Image, "image"),
(MediaType::Audio, "audio"),
(MediaType::Video, "video"),
(MediaType::Application, "application"),
(MediaType::Multipart, "multipart"),
(MediaType::Message, "message"),
(MediaType::Font, "font"),
(MediaType::Model, "model"),
(MediaType::Unknown, "unknown"),
];
for (mt, s) in types {
assert_eq!(mt.as_str(), s);
assert_eq!(MediaType::from_str(&s.to_uppercase()), mt);
assert_eq!(MediaType::from_str(s), mt);
}
assert_eq!(MediaType::from_str("something/random"), MediaType::Unknown);
}
#[test]
fn test_media_type_helpers() {
assert!(MediaType::Application.is_application());
assert!(MediaType::Text.is_text());
assert!(MediaType::Multipart.is_multipart());
assert!(MediaType::Audio.is_type(MediaType::Audio));
assert!(!MediaType::Text.is_application());
assert!(!MediaType::Image.is_text());
assert!(!MediaType::Video.is_multipart());
}
#[test]
fn test_media_type_guess() {
let cases = [
("index.html", "text/html"),
("style.css", "text/css"),
("app.js", "application/javascript"),
("data.json", "application/json"),
("image.png", "image/png"),
("photo.jpg", "image/jpeg"),
("photo.jpeg", "image/jpeg"),
("anim.gif", "image/gif"),
("readme.txt", "text/plain"),
("logo.svg", "image/svg+xml"),
("favicon.ico", "image/x-icon"),
("file.unknown", "application/octet-stream"),
("no_extension", "application/octet-stream"),
];
for (file, expected) in cases {
assert_eq!(MediaType::guess(Path::new(file)), expected);
}
}
#[test]
fn test_sub_media_type_as_str() {
let cases = [
(SubMediaType::Json, "json"),
(SubMediaType::UrlEncoded, "x-www-form-urlencoded"),
(SubMediaType::OctetStream, "octet-stream"),
(SubMediaType::Xml, "xml"),
(SubMediaType::Pdf, "pdf"),
(SubMediaType::Zip, "zip"),
(SubMediaType::Javascript, "javascript"),
(SubMediaType::FormData, "form-data"),
(SubMediaType::Mixed, "mixed"),
(SubMediaType::Plain, "plain"),
(SubMediaType::Html, "html"),
(SubMediaType::Css, "css"),
(SubMediaType::Csv, "csv"),
(SubMediaType::Png, "png"),
(SubMediaType::Jpeg, "jpeg"),
(SubMediaType::Gif, "gif"),
(SubMediaType::Webp, "webp"),
(SubMediaType::Svg, "svg+xml"),
(SubMediaType::Icon, "x-icon"),
(SubMediaType::Wasm, "wasm"),
(SubMediaType::Unknown, "unknown"),
];
for (smt, s) in cases {
assert_eq!(smt.as_str(), s);
}
}
#[test]
fn test_sub_media_type_from_str() {
assert_eq!(SubMediaType::from_str("JSON"), SubMediaType::Json);
assert_eq!(
SubMediaType::from_str("x-javascript"),
SubMediaType::Javascript
);
assert_eq!(SubMediaType::from_str("jpg"), SubMediaType::Jpeg);
assert_eq!(
SubMediaType::from_str("text/plain; charset=utf-8"),
SubMediaType::Plain
);
assert_eq!(
SubMediaType::from_str("invalid/subtype"),
SubMediaType::Unknown
);
assert_eq!("wasm".parse::<SubMediaType>().unwrap(), SubMediaType::Wasm);
}
#[test]
fn test_sub_media_type_top_level_mapping() {
assert_eq!(SubMediaType::Json.top_level(), MediaType::Application);
assert_eq!(SubMediaType::FormData.top_level(), MediaType::Multipart);
assert_eq!(SubMediaType::Html.top_level(), MediaType::Text);
assert_eq!(SubMediaType::Png.top_level(), MediaType::Image);
assert_eq!(SubMediaType::Unknown.top_level(), MediaType::Unknown);
}
#[test]
fn test_sub_media_type_boolean_helpers() {
assert!(SubMediaType::UrlEncoded.is_url_encoded());
assert!(SubMediaType::FormData.is_form_data());
assert!(SubMediaType::Json.is_json());
assert!(SubMediaType::Html.is_web_resource());
assert!(SubMediaType::Css.is_web_resource());
assert!(SubMediaType::Javascript.is_web_resource());
assert!(!SubMediaType::Plain.is_web_resource());
assert!(SubMediaType::Png.is_image());
assert!(SubMediaType::Jpeg.is_image());
assert!(SubMediaType::Gif.is_image());
assert!(SubMediaType::Webp.is_image());
assert!(SubMediaType::Svg.is_image());
assert!(!SubMediaType::Icon.is_image());
assert!(SubMediaType::Mixed.is_type(SubMediaType::Mixed));
}
#[test]
fn test_media_type_exhaustive() {
let all_variants = [
(MediaType::Text, "text"),
(MediaType::Image, "image"),
(MediaType::Audio, "audio"),
(MediaType::Video, "video"),
(MediaType::Application, "application"),
(MediaType::Multipart, "multipart"),
(MediaType::Message, "message"),
(MediaType::Font, "font"),
(MediaType::Model, "model"),
(MediaType::Unknown, "unknown"),
];
for (variant, s) in all_variants {
assert_eq!(variant.as_str(), s);
let upper = s.to_uppercase();
assert_eq!(MediaType::from_str(&upper), variant);
let parsed: MediaType = s.parse().unwrap();
assert_eq!(parsed, variant);
}
assert_eq!(MediaType::from_str("not_a_type"), MediaType::Unknown);
assert_eq!(MediaType::from_str(""), MediaType::Unknown);
}
#[test]
fn test_sub_media_type_exhaustive_as_str() {
let all_variants = [
(SubMediaType::Json, "json"),
(SubMediaType::UrlEncoded, "x-www-form-urlencoded"),
(SubMediaType::OctetStream, "octet-stream"),
(SubMediaType::Xml, "xml"),
(SubMediaType::Pdf, "pdf"),
(SubMediaType::Zip, "zip"),
(SubMediaType::Javascript, "javascript"),
(SubMediaType::FormData, "form-data"),
(SubMediaType::Mixed, "mixed"),
(SubMediaType::Plain, "plain"),
(SubMediaType::Html, "html"),
(SubMediaType::Css, "css"),
(SubMediaType::Csv, "csv"),
(SubMediaType::Png, "png"),
(SubMediaType::Jpeg, "jpeg"),
(SubMediaType::Gif, "gif"),
(SubMediaType::Webp, "webp"),
(SubMediaType::Svg, "svg+xml"),
(SubMediaType::Icon, "x-icon"),
(SubMediaType::Wasm, "wasm"),
(SubMediaType::Unknown, "unknown"),
];
for (variant, s) in all_variants {
assert_eq!(variant.as_str(), s);
}
}
#[test]
fn test_sub_media_type_exhaustive_from_str() {
let cases = [
("json", SubMediaType::Json),
("x-www-form-urlencoded", SubMediaType::UrlEncoded),
("form-data", SubMediaType::FormData),
("octet-stream", SubMediaType::OctetStream),
("xml", SubMediaType::Xml),
("html", SubMediaType::Html),
("plain", SubMediaType::Plain),
("css", SubMediaType::Css),
("javascript", SubMediaType::Javascript),
("x-javascript", SubMediaType::Javascript), ("png", SubMediaType::Png),
("jpeg", SubMediaType::Jpeg),
("jpg", SubMediaType::Jpeg), ("gif", SubMediaType::Gif),
("webp", SubMediaType::Webp),
("svg+xml", SubMediaType::Svg),
("x-icon", SubMediaType::Icon),
("pdf", SubMediaType::Pdf),
("zip", SubMediaType::Zip),
("wasm", SubMediaType::Wasm),
("mixed", SubMediaType::Mixed),
("csv", SubMediaType::Csv),
];
for (input, expected) in cases {
assert_eq!(SubMediaType::from_str(input), expected);
}
assert_eq!(SubMediaType::from_str("text/plain"), SubMediaType::Plain);
assert_eq!(
SubMediaType::from_str("application/json; charset=utf-8"),
SubMediaType::Json
);
assert_eq!(SubMediaType::from_str(" IMAGE/PNG "), SubMediaType::Png);
assert_eq!(
SubMediaType::from_str("unknown_type"),
SubMediaType::Unknown
);
assert_eq!(SubMediaType::from_str(""), SubMediaType::Unknown);
}
#[test]
fn test_media_type_guess_all_extensions() {
let cases = [
("t.html", "text/html"),
("t.htm", "text/html"),
("t.css", "text/css"),
("t.js", "application/javascript"),
("t.json", "application/json"),
("t.png", "image/png"),
("t.jpg", "image/jpeg"),
("t.jpeg", "image/jpeg"),
("t.gif", "image/gif"),
("t.txt", "text/plain"),
("t.svg", "image/svg+xml"),
("t.ico", "image/x-icon"),
("t.other", "application/octet-stream"), ("no_ext", "application/octet-stream"), ];
for (path, expected) in cases {
assert_eq!(MediaType::guess(Path::new(path)), expected);
}
}
#[test]
fn test_sub_media_type_boolean_logic_exhaustive() {
assert!(SubMediaType::UrlEncoded.is_url_encoded());
assert!(!SubMediaType::Json.is_url_encoded());
assert!(SubMediaType::FormData.is_form_data());
assert!(!SubMediaType::Mixed.is_form_data());
assert!(SubMediaType::Json.is_json());
assert!(!SubMediaType::Xml.is_json());
assert!(SubMediaType::Html.is_web_resource());
assert!(SubMediaType::Css.is_web_resource());
assert!(SubMediaType::Javascript.is_web_resource());
assert!(!SubMediaType::Plain.is_web_resource());
assert!(SubMediaType::Png.is_image());
assert!(SubMediaType::Jpeg.is_image());
assert!(SubMediaType::Gif.is_image());
assert!(SubMediaType::Webp.is_image());
assert!(SubMediaType::Svg.is_image());
assert!(!SubMediaType::Icon.is_image()); }
#[test]
fn test_sub_media_type_top_level_exhaustive() {
let mapping = [
(SubMediaType::Json, MediaType::Application),
(SubMediaType::UrlEncoded, MediaType::Application),
(SubMediaType::OctetStream, MediaType::Application),
(SubMediaType::Xml, MediaType::Application),
(SubMediaType::Pdf, MediaType::Application),
(SubMediaType::Zip, MediaType::Application),
(SubMediaType::Javascript, MediaType::Application),
(SubMediaType::Wasm, MediaType::Application),
(SubMediaType::FormData, MediaType::Multipart),
(SubMediaType::Mixed, MediaType::Multipart),
(SubMediaType::Plain, MediaType::Text),
(SubMediaType::Html, MediaType::Text),
(SubMediaType::Css, MediaType::Text),
(SubMediaType::Csv, MediaType::Text),
(SubMediaType::Png, MediaType::Image),
(SubMediaType::Jpeg, MediaType::Image),
(SubMediaType::Gif, MediaType::Image),
(SubMediaType::Webp, MediaType::Image),
(SubMediaType::Svg, MediaType::Image),
(SubMediaType::Icon, MediaType::Image),
(SubMediaType::Unknown, MediaType::Unknown),
];
for (sub, top) in mapping {
assert_eq!(sub.top_level(), top, "Mapping failed for {:?}", sub);
}
}
#[test]
fn test_media_type_boolean_logic_exhaustive() {
assert!(MediaType::Application.is_application());
assert!(!MediaType::Text.is_application());
assert!(MediaType::Text.is_text());
assert!(!MediaType::Video.is_text());
assert!(MediaType::Multipart.is_multipart());
assert!(!MediaType::Image.is_multipart());
}
}