use bms_table::BmsTableHtml;
#[test]
fn extract_bmstable_from_meta_name_returns_url() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta name="bmstable" content="header.json">
</head>
<body>
<h1>BMS Table</h1>
</body>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn extract_bmstable_from_meta_property_returns_url() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta property="bmstable" content="https://example.com/header.json">
</head>
<body></body>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "https://example.com/header.json");
}
#[test]
fn no_bmstable_returns_error() {
let html = r"
<!DOCTYPE html>
<html>
<head>
<title>BMS Table</title>
</head>
<body>
<h1>BMS Table</h1>
</body>
</html>
";
let result = BmsTableHtml::extract_url(html);
assert!(result.is_err());
}
#[test]
fn multiple_bmstable_metas_returns_first() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta name="bmstable" content="first.json">
<meta name="bmstable" content="second.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "first.json");
}
#[test]
fn matching_meta_before_non_matching_returns_correct_url() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta name="other" content="other.json">
<meta name="bmstable" content="header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn empty_content_returns_error() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta name="bmstable" content="">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_err());
}
#[test]
fn case_insensitive_tags_parsed_correctly() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<META NAME="BMSTABLE" CONTENT="header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn mixed_case_meta_name_parsed_correctly() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<Meta Name="Bmstable" Content="header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn single_quoted_attributes_parsed_correctly() {
let html = r"
<!DOCTYPE html>
<html>
<head>
<meta name='bmstable' content='header.json'>
</head>
</html>
";
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn reversed_attribute_order_parsed_correctly() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta content="header.json" name="bmstable">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn extra_attributes_do_not_interfere() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" name="bmstable" content="header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn commented_out_meta_tag_is_ignored() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<!-- <meta name="bmstable" content="ignored.json"> -->
<meta name="bmstable" content="real.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "real.json");
}
#[test]
fn meta_only_in_comment_returns_error() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<!-- <meta name="bmstable" content="ignored.json"> -->
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_err());
}
#[test]
fn self_closing_meta_tag_parsed_correctly() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta name="bmstable" content="header.json" />
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn url_with_special_chars_parsed_correctly() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta name="bmstable" content="https://example.com/path/to/header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
let url = result.unwrap();
assert_eq!(url, "https://example.com/path/to/header.json");
}
#[test]
fn property_attribute_mixed_case_parsed_correctly() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<META PROPERTY="BMSTABLE" CONTENT="header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}
#[test]
fn only_bmstable_content_attribute_returns_error() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta content="header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_err());
}
#[test]
fn empty_html_string_returns_error() {
let result = BmsTableHtml::extract_url("");
assert!(result.is_err());
}
#[test]
fn whitespace_only_html_returns_error() {
let result = BmsTableHtml::extract_url(" \n \t ");
assert!(result.is_err());
}
#[test]
fn multiline_attribute_parsed_correctly() {
let html = r#"
<!DOCTYPE html>
<html>
<head>
<meta name="bmstable"
content="header.json">
</head>
</html>
"#;
let result = BmsTableHtml::extract_url(html);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "header.json");
}