// file: crates/ksp-worker-api/unit_tests/identity.rs // version: 1 #[test] fn pre_002_identity_accepts_safe_codes_at_exact_bounds() { let worker_id = crate::WorkerId::new("a".repeat(crate::MAX_WORKER_ID_BYTES)); let kind = crate::WorkerKindCode::new("continuous.raw:example-1"); assert!(worker_id.is_ok()); assert!(kind.is_ok()); let worker_id = match worker_id { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; let kind = match kind { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; assert_eq!(worker_id.as_str().len(), crate::MAX_WORKER_ID_BYTES); assert_eq!(kind.as_str(), "continuous.raw:example-1"); return; } #[test] fn pre_002_identity_rejects_empty_oversized_and_unsafe_values() { for value in [ std::string::String::new(), "a".repeat(crate::MAX_WORKER_ID_BYTES + 1), "unsafe/value".to_string(), "unsafe\\value".to_string(), "space value".to_string(), "unicode-é".to_string(), ] { let rejected = crate::WorkerId::new(value); assert!(rejected.is_err()); let error = match rejected { std::result::Result::Err(value) => value, std::result::Result::Ok(_) => continue, }; assert_eq!(error.code(), crate::ERROR_CODE_WORKER_ID_INVALID); assert_eq!(error.context().len(), 1); assert_eq!(error.context()[0].key(), "field"); assert_eq!(error.context()[0].value(), "worker_id"); } for value in [std::string::String::new(), "b".repeat(crate::MAX_WORKER_KIND_CODE_BYTES + 1), "worker kind".to_string()] { let rejected = crate::WorkerKindCode::new(value); assert!(rejected.is_err()); let error = match rejected { std::result::Result::Err(value) => value, std::result::Result::Ok(_) => continue, }; assert_eq!(error.code(), crate::ERROR_CODE_WORKER_KIND_INVALID); assert_eq!(error.context()[0].value(), "worker_kind"); } return; } #[test] fn pre_002_private_validator_uses_exact_safe_code_alphabet() { assert!(super::valid_worker_code("AZaz09_.:-", 10)); for rejected in ["slash/value", "back\\slash", "space value", "line\nbreak", "é"] { assert!(!super::valid_worker_code(rejected, crate::MAX_WORKER_ID_BYTES)); } return; }