use crate::csaf_traits::{CsafTrait, DocumentReferenceTrait, DocumentTrait, TrackingTrait};
use crate::schema::csaf2_1::schema::CategoryOfReference;
use crate::validation::ValidationError;
use regex::Regex;
use std::sync::LazyLock;
pub fn test_6_2_11_missing_canonical_url(doc: &impl CsafTrait) -> Result<(), Vec<ValidationError>> {
let expected_filename = generate_filename(doc.get_document().get_tracking().get_id());
if let Some(references) = doc.get_document().get_references() {
for reference in references {
if CategoryOfReference::Self_ == reference.get_category()
&& reference.get_url().starts_with("https://")
&& reference.get_url().ends_with(&expected_filename)
{
return Ok(());
}
}
}
Err(vec![MISSING_CANONICAL_URL.clone()])
}
fn generate_filename(tracking_id: &str) -> String {
let lowercase_id = tracking_id.to_lowercase();
static INVALID_CHARS: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"[^+\-a-z0-9]+").unwrap());
let cleaned_id = INVALID_CHARS.replace_all(&lowercase_id, "_");
format!("{cleaned_id}.json")
}
static MISSING_CANONICAL_URL: LazyLock<ValidationError> = LazyLock::new(|| ValidationError {
message: "Document is missing a canonical URL".to_string(),
instance_path: "/document/references".to_string(),
});
crate::test_validation::impl_validator!(ValidatorForTest6_2_11, test_6_2_11_missing_canonical_url);
#[cfg(test)]
mod tests {
use super::*;
use crate::csaf2_0::testcases::TESTS_2_0;
use crate::csaf2_1::testcases::TESTS_2_1;
#[test]
fn test_test_6_2_11() {
let err = Err(vec![MISSING_CANONICAL_URL.clone()]);
let ok = Ok(());
TESTS_2_0.test_6_2_11.expect(err.clone(), ok.clone());
TESTS_2_1
.test_6_2_11
.expect(err.clone(), err.clone(), err, ok.clone(), ok.clone(), ok);
}
#[test]
fn test_generate_filename() {
assert_eq!(
generate_filename("OASIS_CSAF_TC-CSAF_2.0-2021-6-2-11-01"),
"oasis_csaf_tc-csaf_2_0-2021-6-2-11-01.json"
);
assert_eq!(generate_filename("2022_#01-A"), "2022_01-a.json");
assert_eq!(generate_filename("test###value"), "test_value.json");
assert_eq!(generate_filename("Test+123-456"), "test+123-456.json");
}
}