cratestack-cli 0.7.10

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};

const BASE_MODEL: &str = "model Account {\n  id Int @id\n}\n";

#[test]
fn procedure_removal_is_breaking() {
    let prev = format!("{BASE_MODEL}\nprocedure ping(nonce: String): String\n");
    let next = BASE_MODEL.to_owned();

    let result = diff(&prev, &next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["procedure_removed"]
    );
}

#[test]
fn new_procedure_is_additive() {
    let prev = BASE_MODEL.to_owned();
    let next = format!("{BASE_MODEL}\nprocedure ping(nonce: String): String\n");

    let result = diff(&prev, &next);
    assert!(!result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Additive),
        vec!["procedure_added"]
    );
}

#[test]
fn procedure_return_type_change_is_breaking() {
    let prev = format!("{BASE_MODEL}\nprocedure getCount(): Int\n");
    let next = format!("{BASE_MODEL}\nprocedure getCount(): String\n");

    let result = diff(&prev, &next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["procedure_return_type_changed"]
    );
}

#[test]
fn procedure_kind_change_is_breaking() {
    let prev = format!("{BASE_MODEL}\nprocedure sync(id: Int): String\n");
    let next = format!("{BASE_MODEL}\nmutation procedure sync(id: Int): String\n");

    let result = diff(&prev, &next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["procedure_kind_changed"]
    );
}

#[test]
fn procedure_arg_removed_is_breaking() {
    let prev = format!("{BASE_MODEL}\nprocedure getUser(id: Int): String\n");
    let next = format!("{BASE_MODEL}\nprocedure getUser(): String\n");

    let result = diff(&prev, &next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["procedure_arg_removed"]
    );
}

#[test]
fn procedure_arg_added_required_is_breaking() {
    let prev = format!("{BASE_MODEL}\nprocedure getUser(id: Int): String\n");
    let next =
        format!("{BASE_MODEL}\nprocedure getUser(id: Int, includeArchived: Boolean): String\n");

    let result = diff(&prev, &next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["procedure_arg_added_required"]
    );
}

#[test]
fn procedure_arg_added_optional_is_additive() {
    let prev = format!("{BASE_MODEL}\nprocedure getUser(id: Int): String\n");
    let next =
        format!("{BASE_MODEL}\nprocedure getUser(id: Int, includeArchived: Boolean?): String\n");

    let result = diff(&prev, &next);
    assert!(!result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Additive),
        vec!["procedure_arg_added"]
    );
}

#[test]
fn procedure_arg_retype_is_breaking() {
    let prev = format!("{BASE_MODEL}\nprocedure getUser(id: Int): String\n");
    let next = format!("{BASE_MODEL}\nprocedure getUser(id: String): String\n");

    let result = diff(&prev, &next);
    assert!(result.has_breaking());
    assert_eq!(
        categories(&result, Severity::Breaking),
        vec!["procedure_arg_retyped"]
    );
}