dsh_api 0.10.0

DSH resource management API client
Documentation
use dsh_api::parse::{parse_basic_authentication_string, parse_function, parse_function1, parse_function2, AuthString, ImageString};
use std::str::FromStr;

#[test]
fn test_display_auth_string() {
  assert_eq!(
    AuthString::basic(Some("my-realm"), "my-username").to_string(),
    "basic@my-realm:my-username".to_string()
  );
  assert_eq!(AuthString::basic(None::<String>, "my-username").to_string(), "basic@my-username".to_string());
  assert_eq!(
    AuthString::fwd("https://my-authentication-service.com", Some("my-headers")).to_string(),
    "fwd@https://my-authentication-service.com@my-headers".to_string()
  );
  assert_eq!(
    AuthString::fwd("https://my-authentication-service.com", None::<String>).to_string(),
    "fwd@https://my-authentication-service.com".to_string()
  );
  assert_eq!(AuthString::system_fwd("view,manage").to_string(), "sys-fwd@view,manage".to_string());
}

#[test]
fn test_parse_auth_string() {
  assert_eq!(
    AuthString::from_str("basic-auth@my-realm:my-username:$password-hash/"),
    Ok(AuthString::basic(Some("my-realm"), "my-username"))
  );
  assert_eq!(
    AuthString::from_str("basic-auth@my-username:$password-hash/"),
    Ok(AuthString::basic(None::<String>, "my-username"))
  );
  assert_eq!(
    AuthString::from_str("my-realm:my-username:$password-hash/"),
    Ok(AuthString::basic(Some("my-realm"), "my-username"))
  );
  assert_eq!(
    AuthString::from_str("my-username:$password-hash/"),
    Ok(AuthString::basic(None::<String>, "my-username"))
  );
  assert_eq!(
    AuthString::from_str("fwd-auth@https://my-authentication-service.com@my-headers"),
    Ok(AuthString::fwd("https://my-authentication-service.com", Some("my-headers".to_string())))
  );
  assert_eq!(AuthString::from_str("system-fwd-auth@view,manage"), Ok(AuthString::system_fwd("view,manage")));
}

#[test]
fn test_image_string() {
  let registry_image = ImageString::registry("my-tenant".to_string(), "my-image".to_string(), "0.0.1".to_string());
  assert_eq!(registry_image.id(), "my-image".to_string());
  assert_eq!(registry_image.source(), "harbor");
  assert_eq!(registry_image.tenant(), "my-tenant".to_string());
  assert_eq!(registry_image.version(), "0.0.1".to_string());
  let app_image = ImageString::app(
    "draft".to_string(),
    "kpn".to_string(),
    "my-tenant".to_string(),
    "my-image".to_string(),
    "0.0.1".to_string(),
  );
  assert_eq!(app_image.id(), "my-image".to_string());
  assert_eq!(app_image.source(), "app-catalog");
  assert_eq!(app_image.tenant(), "my-tenant".to_string());
  assert_eq!(app_image.version(), "0.0.1".to_string());
}

#[test]
fn test_display_image_string() {
  let registry_image = ImageString::registry("my-tenant".to_string(), "my-image".to_string(), "0.0.1".to_string());
  assert_eq!(registry_image.to_string(), "registry:my-tenant:my-image:0.0.1".to_string());
  let app_image = ImageString::app(
    "draft".to_string(),
    "kpn".to_string(),
    "my-tenant".to_string(),
    "my-image".to_string(),
    "0.0.1".to_string(),
  );
  assert_eq!(app_image.to_string(), "app:draft:kpn:my-tenant:my-image:0.0.1".to_string());
}

#[test]
fn test_parse_image_string() {
  assert_eq!(
    ImageString::from("registry.cp.kpn-dsh.com/my-tenant/my-image:0.0.1"),
    ImageString::registry("my-tenant".to_string(), "my-image".to_string(), "0.0.1".to_string())
  );
  assert_eq!(
    ImageString::from("APPCATALOG_REGISTRY/dsh-appcatalog/tenant/my-tenant/1234/1234/draft/kpn/my-image:0.0.1"),
    ImageString::app(
      "draft".to_string(),
      "kpn".to_string(),
      "my-tenant".to_string(),
      "my-image".to_string(),
      "0.0.1".to_string()
    )
  );
  assert_eq!(
    ImageString::from("APPCATALOG_REGISTRY/dsh-appcatalog/tenant/my-tenant/1234/1234/release/klarrio/whoami:1.6.1"),
    ImageString::app(
      "release".to_string(),
      "klarrio".to_string(),
      "my-tenant".to_string(),
      "whoami".to_string(),
      "1.6.1".to_string()
    )
  );
  assert_eq!(
    ImageString::from("registry.cp.kpn-dsh.com/greenbox-dev/postgres:pooria.20241211.1"),
    ImageString::registry("greenbox-dev".to_string(), "postgres".to_string(), "pooria.20241211.1".to_string())
  );
  assert_eq!(ImageString::from("registry/greenbox-dev/postgres:pooria.20241211.1"), ImageString::Unrecognized {
    image: "registry/greenbox-dev/postgres:pooria.20241211.1".to_string()
  });
}

#[test]
fn test_parse_function1() {
  let valids_under_test = vec![
    ("{function('par')}", "function", "par"),
    ("{function('p.a_r-1')}", "function", "p.a_r-1"),
    ("{ function( 'par' ) }", "function", "par"),
    ("{function('')}", "function", ""),
  ];
  for (valid_string, function, parameter) in valids_under_test {
    assert_eq!(parse_function1(valid_string, function), Ok(parameter));
  }
  let invalids_under_test = vec![
    ("{function('par')}", "other"),
    ("{('par')}", ""),
    ("{function(par)}", "function"),
    ("{function('p$ar')}", "function"),
    ("{function()}", "function"),
    ("{function('par1','par2')}", "function"),
  ];
  for (invalid_string, function) in invalids_under_test {
    assert!(parse_function1(invalid_string, function).is_err_and(|error| error == format!("invalid {} string (\"{}\")", function, invalid_string)));
  }
}

#[test]
fn test_parse_function2() {
  let valids_under_test = vec![
    ("{function('par1','par2')}", "function", ("par1", "par2")),
    ("{function('p.a_r-1','p.a_r-2')}", "function", ("p.a_r-1", "p.a_r-2")),
    ("{ function( 'par1' , 'par2' ) }", "function", ("par1", "par2")),
    ("{function('','')}", "function", ("", "")),
  ];
  for (valid_string, function, parameter) in valids_under_test {
    assert_eq!(parse_function2(valid_string, function), Ok(parameter));
  }
  let invalids_under_test = vec![
    ("{function('par1','par2')}", "other"),
    ("{('par1','par2')}", ""),
    ("{function(par1,par2)}", "function"),
    ("{function('par1',par2)}", "function"),
    ("{function(par1,'par2')}", "function"),
    ("{function('p$ar1','p$ar2')}", "function"),
    ("{function('par1','p$ar2')}", "function"),
    ("{function('p$ar1','par2')}", "function"),
    ("{function()}", "function"),
    ("{function('par')}", "function"),
  ];
  for (invalid_string, function) in invalids_under_test {
    assert!(parse_function2(invalid_string, function).is_err_and(|error| error == format!("invalid {} string (\"{}\")", function, invalid_string)));
  }
}

#[test]
fn test_parse_function() {
  let valids_under_test = vec![
    ("{function('par')}", "function", ("par", None)),
    ("{function('p.a_r-1')}", "function", ("p.a_r-1", None)),
    ("{ function( 'par' ) }", "function", ("par", None)),
    ("{function('')}", "function", ("", None)),
    ("{function('par1','par2')}", "function", ("par1", Some("par2"))),
    ("{function('p.a_r-1','p.a_r-2')}", "function", ("p.a_r-1", Some("p.a_r-2"))),
    ("{ function( 'par1' , 'par2' ) }", "function", ("par1", Some("par2"))),
    ("{function('','')}", "function", ("", Some(""))),
  ];
  for (valid_string, function, parameter) in valids_under_test {
    assert_eq!(parse_function(valid_string, function), Ok(parameter));
  }
  let invalids_under_test = vec![
    ("{function('par')}", "other"),
    ("{('par')}", ""),
    ("{function(par)}", "function"),
    ("{function('p$ar')}", "function"),
    ("{function()}", "function"),
    ("{function('par1','par2')}", "other"),
    ("{('par1','par2')}", ""),
    ("{function(par1,par2)}", "function"),
    ("{function('par1',par2)}", "function"),
    ("{function(par1,'par2')}", "function"),
    ("{function('p$ar1','p$ar2')}", "function"),
    ("{function('par1','p$ar2')}", "function"),
    ("{function('p$ar1','par2')}", "function"),
    ("{function()}", "function"),
  ];
  for (invalid_string, function) in invalids_under_test {
    assert!(parse_function(invalid_string, function).is_err_and(|error| error == format!("invalid {} string (\"{}\")", function, invalid_string)));
  }
}

#[test]
fn test_parse_basic_authentication_string() {
  assert_eq!(
    parse_basic_authentication_string("my-realm:my-username:$password-hash/"),
    Ok(AuthString::basic(Some("my-realm"), "my-username"))
  );
  assert_eq!(
    parse_basic_authentication_string("my-username:$password-hash/"),
    Ok(AuthString::basic(None::<String>, "my-username"))
  );
}