sql-gen 0.2.3

A CLI tool for generating models based on a SQL Database using SQLx
use crate::core::{
    models::rust::{
        enum_typename_attribute, enum_variant_rename_attribute, RustDbSetEnum, RustDbSetEnumVariant,
    },
    writers::test_helpers::format_rust_content_string,
};

#[test]
fn should_write_empty_enum_to_string() {
    let content = RustDbSetEnum {
        name: "Weather".to_string(),
        ..Default::default()
    };
    assert_eq!(content.to_string().trim(), "pub enum Weather {}")
}

#[test]
fn should_write_empty_enum_with_comments_to_string() {
    let content = RustDbSetEnum {
        name: "Weather".to_string(),
        comment: Some("A weather enum".to_string()),
        ..Default::default()
    };
    assert_eq!(
        content.to_string(),
        format_rust_content_string(
            r#"
            /// A weather enum
            pub enum Weather {}
            "#
        )
    )
}

#[test]
fn should_write_enum_with_attributes_to_string() {
    let content = RustDbSetEnum {
        name: "Weather".to_string(),
        attributes: vec![enum_typename_attribute("weather")],
        ..Default::default()
    };
    assert_eq!(
        content.to_string(),
        format_rust_content_string(
            r#"
                #[sqlx(type_name = "weather")]
                pub enum Weather {}
            "#
        )
    )
}

#[test]
fn should_write_enum_with_derives_to_string() {
    let content = RustDbSetEnum {
        name: "Weather".to_string(),
        derives: vec!["Debug".to_string()],
        ..Default::default()
    };
    assert_eq!(
        content.to_string().trim(),
        "#[derive(Debug)]\npub enum Weather {}"
    )
}

#[test]
fn should_write_enum_with_attributes_and_derives_to_string() {
    let content = RustDbSetEnum {
        name: "Weather".to_string(),
        derives: vec!["Debug".to_string(), "PartialEq".to_string()],
        attributes: vec![enum_typename_attribute("weather")],

        ..Default::default()
    };
    assert_eq!(
        content.to_string(),
        format_rust_content_string(
            r#"
                #[derive(Debug, PartialEq)]
                #[sqlx(type_name = "weather")]
                pub enum Weather {}
            "#
        )
    )
}

#[test]
fn should_write_basic_enum_to_string() {
    let content = RustDbSetEnum {
        name: "Mood".to_string(),
        variants: vec![
            RustDbSetEnumVariant {
                name: "Happy".to_string(),
                ..Default::default()
            },
            RustDbSetEnumVariant {
                name: "Sadge".to_string(),
                ..Default::default()
            },
        ],
        ..Default::default()
    };
    assert_eq!(
        content.to_string(),
        format_rust_content_string(
            "pub enum Mood {
                Happy,
                Sadge,
        }"
        )
    )
}

#[test]
fn should_write_enum_with_sqlx_fields_to_string() {
    let content = RustDbSetEnum {
        name: "Mood".to_string(),
        attributes: vec![enum_typename_attribute("mood")],
        derives: vec!["sqlx::Type".to_string()],
        variants: vec![
            RustDbSetEnumVariant {
                name: "Happy".to_string(),
                attributes: vec![enum_variant_rename_attribute("happy")],
            },
            RustDbSetEnumVariant {
                name: "Sadge".to_string(),
                attributes: vec![enum_variant_rename_attribute("sadge")],
            },
        ],
        ..Default::default()
    };
    assert_eq!(
        content.to_string(),
        format_rust_content_string(
            r#"

            #[derive(sqlx::Type)]
            #[sqlx(type_name = "mood")]
            pub enum Mood {
                #[sqlx(rename = "happy")]
                Happy,
                #[sqlx(rename = "sadge")]
                Sadge,
            }

        "#
        )
    )
}