cratestack-cli 0.6.3

Rust-native schema-first framework for typed HTTP APIs, generated clients, and backend services.
#![cfg(test)]

use super::Severity;
use super::test_support::{categories, diff};

#[test]
fn model_removal_is_breaking() {
    let prev = r#"
model Account {
  id Int @id
}

model Invoice {
  id Int @id
}
"#;
    let next = r#"
model Account {
  id Int @id
}
"#;
    let result = diff(prev, next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["model_removed"]
    );
}

#[test]
fn new_model_is_additive() {
    let prev = r#"
model Account {
  id Int @id
}
"#;
    let next = r#"
model Account {
  id Int @id
}

model Invoice {
  id Int @id
}
"#;
    let result = diff(prev, next);
    assert!(!result.has_breaking());
    assert_eq!(categories(&result, Severity::Additive), vec!["model_added"]);
}

#[test]
fn field_removal_is_breaking() {
    let prev = r#"
model Account {
  id Int @id
  note String?
}
"#;
    let next = r#"
model Account {
  id Int @id
}
"#;
    let result = diff(prev, next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["field_removed"]
    );
}

#[test]
fn field_retype_is_breaking() {
    let prev = r#"
model Account {
  id Int @id
  balance Int
}
"#;
    let next = r#"
model Account {
  id Int @id
  balance String
}
"#;
    let result = diff(prev, next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["field_retyped"]
    );
}

#[test]
fn new_optional_field_is_additive() {
    let prev = r#"
model Account {
  id Int @id
}
"#;
    let next = r#"
model Account {
  id Int @id
  note String?
}
"#;
    let result = diff(prev, next);
    assert!(!result.has_breaking());
    assert_eq!(categories(&result, Severity::Additive), vec!["field_added"]);
}

#[test]
fn new_required_field_without_default_is_breaking() {
    let prev = r#"
model Account {
  id Int @id
}
"#;
    let next = r#"
model Account {
  id Int @id
  verified Boolean
}
"#;
    let result = diff(prev, next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["field_added_required"]
    );
}

#[test]
fn new_required_field_with_default_is_additive() {
    let prev = r#"
model Account {
  id Int @id
}
"#;
    let next = r#"
model Account {
  id Int @id
  verified Boolean @default(false)
}
"#;
    let result = diff(prev, next);
    assert!(!result.has_breaking());
    assert_eq!(categories(&result, Severity::Additive), vec!["field_added"]);
}

#[test]
fn widening_field_arity_to_optional_is_additive() {
    let prev = r#"
model Account {
  id Int @id
  balance Int
}
"#;
    let next = r#"
model Account {
  id Int @id
  balance Int?
}
"#;
    let result = diff(prev, next);
    assert!(!result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Additive),
        vec!["field_arity_changed"]
    );
}

#[test]
fn narrowing_field_arity_to_required_is_breaking() {
    let prev = r#"
model Account {
  id Int @id
  note String?
}
"#;
    let next = r#"
model Account {
  id Int @id
  note String
}
"#;
    let result = diff(prev, next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["field_arity_changed"]
    );
}