use cynic::Enum;
use serde::Deserialize;
use serde_json::json;

#[derive(Enum, Debug, PartialEq)]
#[cynic(graphql_type = "PostState", schema_path = "tests/test-schema.graphql")]
enum PostStateEmptyFallback {
    Posted,
    Draft,
    #[cynic(fallback)]
    Unknown,
}

#[derive(Enum, Debug, PartialEq)]
#[cynic(graphql_type = "PostState", schema_path = "tests/test-schema.graphql")]
enum PostStateStringFallback {
    Posted,
    Draft,
    #[cynic(fallback)]
    Unknown(String),
}

#[allow(non_snake_case, non_camel_case_types)]
mod schema {
    cynic::use_schema!("tests/test-schema.graphql");
}

#[test]
fn test_empty_fallback() {
    assert_eq!(
        PostStateEmptyFallback::deserialize(json!("BLAH")).unwrap(),
        PostStateEmptyFallback::Unknown
    );

    serde_json::to_value(PostStateEmptyFallback::Unknown).expect_err("should fail");
}

#[test]
fn test_string_fallback() {
    assert_eq!(
        PostStateStringFallback::deserialize(json!("BLAH")).unwrap(),
        PostStateStringFallback::Unknown("BLAH".to_string())
    );

    let val = serde_json::to_value(PostStateStringFallback::Unknown("BLAH".to_string())).unwrap();

    assert_eq!(val, serde_json::Value::String("BLAH".into()));
}
