oas3-gen 0.22.0

A rust type generator for OpenAPI v3.1.x specification.
use oas3::spec::Response;

use crate::generator::ast::{StatusCodeToken, status_codes::status_code_to_variant_name};

#[test]
fn test_from_openapi_specific_codes() {
  let cases = [
    ("200", StatusCodeToken::Ok200),
    ("201", StatusCodeToken::Created201),
    ("204", StatusCodeToken::NoContent204),
    ("400", StatusCodeToken::BadRequest400),
    ("404", StatusCodeToken::NotFound404),
    ("500", StatusCodeToken::InternalServerError500),
  ];
  for (input, expected) in cases {
    assert_eq!(StatusCodeToken::from_openapi(input), expected, "failed for {input}");
  }
}

#[test]
fn test_from_openapi_wildcards() {
  let cases = [
    ("1XX", StatusCodeToken::Informational1XX),
    ("1xx", StatusCodeToken::Informational1XX),
    ("2XX", StatusCodeToken::Success2XX),
    ("2xx", StatusCodeToken::Success2XX),
    ("4XX", StatusCodeToken::ClientError4XX),
    ("5XX", StatusCodeToken::ServerError5XX),
  ];
  for (input, expected) in cases {
    assert_eq!(StatusCodeToken::from_openapi(input), expected, "failed for {input}");
  }
}

#[test]
fn test_from_openapi_default_and_unknown() {
  assert_eq!(StatusCodeToken::from_openapi("default"), StatusCodeToken::Default);
  assert_eq!(StatusCodeToken::from_openapi("418"), StatusCodeToken::Unknown(418));
  assert_eq!(StatusCodeToken::from_openapi("invalid"), StatusCodeToken::Default);
}

#[test]
fn test_code() {
  assert_eq!(StatusCodeToken::Ok200.code(), Some(200));
  assert_eq!(StatusCodeToken::NotFound404.code(), Some(404));
  assert_eq!(StatusCodeToken::Unknown(418).code(), Some(418));
  assert_eq!(StatusCodeToken::Success2XX.code(), None);
  assert_eq!(StatusCodeToken::Default.code(), None);
}

#[test]
fn test_variant_name() {
  assert_eq!(StatusCodeToken::Ok200.variant_name(), "Ok");
  assert_eq!(StatusCodeToken::NotFound404.variant_name(), "NotFound");
  assert_eq!(StatusCodeToken::Success2XX.variant_name(), "Success");
  assert_eq!(StatusCodeToken::Default.variant_name(), "Unknown");
}

#[test]
fn test_display() {
  assert_eq!(StatusCodeToken::Ok200.to_string(), "200");
  assert_eq!(StatusCodeToken::Success2XX.to_string(), "2XX");
  assert_eq!(StatusCodeToken::Unknown(418).to_string(), "418");
  assert_eq!(StatusCodeToken::Default.to_string(), "default");
}

#[test]
fn test_is_success() {
  assert!(StatusCodeToken::Ok200.is_success());
  assert!(StatusCodeToken::Created201.is_success());
  assert!(StatusCodeToken::Success2XX.is_success());
  assert!(!StatusCodeToken::NotFound404.is_success());
  assert!(!StatusCodeToken::Default.is_success());
}

fn make_response(description: Option<&str>) -> Response {
  Response {
    description: description.map(ToString::to_string),
    ..Default::default()
  }
}

#[test]
fn test_known_status_codes() {
  let cases = [
    (StatusCodeToken::Ok200, "Ok"),
    (StatusCodeToken::Created201, "Created"),
    (StatusCodeToken::NotFound404, "NotFound"),
    (StatusCodeToken::InternalServerError500, "InternalServerError"),
  ];
  for (token, expected) in cases {
    let result = status_code_to_variant_name(token, &make_response(None));
    assert_eq!(result.to_string(), expected, "failed for {token:?}");
  }
}

#[test]
fn test_wildcard_status_codes() {
  let cases = [
    (StatusCodeToken::Informational1XX, "Informational"),
    (StatusCodeToken::Success2XX, "Success"),
    (StatusCodeToken::Redirection3XX, "Redirection"),
    (StatusCodeToken::ClientError4XX, "ClientError"),
    (StatusCodeToken::ServerError5XX, "ServerError"),
  ];
  for (token, expected) in cases {
    let result = status_code_to_variant_name(token, &make_response(None));
    assert_eq!(result.to_string(), expected, "failed for {token:?}");
  }
}

#[test]
fn test_default_status_code() {
  let result = status_code_to_variant_name(StatusCodeToken::Default, &make_response(None));
  assert_eq!(result.to_string(), "Unknown");
}

#[test]
fn test_unknown_with_description() {
  let response = make_response(Some("I'm a teapot"));
  let result = status_code_to_variant_name(StatusCodeToken::Unknown(418), &response);
  assert_eq!(result.to_string(), "ImATeapot");
}

#[test]
fn test_unknown_without_description() {
  let result = status_code_to_variant_name(StatusCodeToken::Unknown(418), &make_response(None));
  assert_eq!(result.to_string(), "Status418");
}