apollo-errors 0.7.0

Structured error handling with automatic format conversion
Documentation
//! Tests for GraphQL format output (to_graphql)

mod common;

use apollo_errors::{CodeCase, Error as ErrorTrait, FieldCase, FormatConfig};
use common::{ErrorWithFields, ErrorWithRenamedField, SimpleError};
use insta::assert_json_snapshot;

#[test]
fn test_simple_error_graphql() {
    let error = SimpleError::Simple;
    let graphql = error.to_graphql(FormatConfig::default()).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "code": "errors::simple"
      },
      "message": "Something went wrong"
    }
    "#);
}

#[test]
fn test_another_error_graphql() {
    let error = SimpleError::Another;
    let graphql = error.to_graphql(FormatConfig::default()).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "code": "errors::another"
      },
      "message": "Another error occurred"
    }
    "#);
}

#[test]
fn test_error_with_fields_graphql() {
    let error = ErrorWithFields::InvalidPort {
        port: 8080,
        config_file: "/etc/config.toml".to_string(),
    };
    let graphql = error.to_graphql(FormatConfig::default()).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "code": "config::invalid_port",
        "config_file": "/etc/config.toml",
        "port": 8080
      },
      "message": "Invalid port"
    }
    "#);
}

#[test]
fn test_error_with_single_field_graphql() {
    let error = ErrorWithFields::MissingConfig {
        expected_path: "/app/config.yaml".to_string(),
    };
    let graphql = error.to_graphql(FormatConfig::default()).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "code": "config::missing",
        "expected_path": "/app/config.yaml"
      },
      "message": "Missing configuration"
    }
    "#);
}

#[test]
fn test_error_with_single_field_graphql_camel_case_code_case_camel_case() {
    let config = FormatConfig {
        field_case: FieldCase::CamelCase,
        code_case: CodeCase::CamelCase,
    };
    let error = ErrorWithFields::MissingConfig {
        expected_path: "/app/config.yaml".to_string(),
    };
    let graphql = error.to_graphql(config).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "code": "configMissing",
        "expectedPath": "/app/config.yaml"
      },
      "message": "Missing configuration"
    }
    "#);
}

#[test]
fn test_error_with_fields_kebab_case_code_case_screaming_snake_case() {
    let config = FormatConfig {
        field_case: FieldCase::KebabCase,
        code_case: CodeCase::ScreamingSnakeCase,
    };
    let error = ErrorWithFields::InvalidPort {
        port: 8080,
        config_file: "/etc/config.toml".to_string(),
    };
    let graphql = error.to_graphql(config).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "code": "CONFIG_INVALID_PORT",
        "config-file": "/etc/config.toml",
        "port": 8080
      },
      "message": "Invalid port"
    }
    "#);
}

#[test]
fn test_error_with_fields_pascal_case_code_case_pascal() {
    let config = FormatConfig {
        field_case: FieldCase::PascalCase,
        code_case: CodeCase::PascalCase,
    };
    let error = ErrorWithFields::InvalidPort {
        port: 8080,
        config_file: "/etc/config.toml".to_string(),
    };
    let graphql = error.to_graphql(config).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "ConfigFile": "/etc/config.toml",
        "Port": 8080,
        "code": "ConfigInvalidPort"
      },
      "message": "Invalid port"
    }
    "#);
}

#[test]
fn test_error_with_fields_pascal_case_code_case_default() {
    let config = FormatConfig {
        field_case: FieldCase::PascalCase,
        ..FormatConfig::default()
    };
    let error = ErrorWithFields::InvalidPort {
        port: 8080,
        config_file: "/etc/config.toml".to_string(),
    };
    let graphql = error.to_graphql(config).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "ConfigFile": "/etc/config.toml",
        "Port": 8080,
        "code": "config::invalid_port"
      },
      "message": "Invalid port"
    }
    "#);
}

#[test]
fn test_error_with_fields_default_case_code_case_screaming_snake() {
    let config = FormatConfig {
        code_case: CodeCase::ScreamingSnakeCase,
        ..FormatConfig::default()
    };
    let error = ErrorWithFields::InvalidPort {
        port: 8080,
        config_file: "/etc/config.toml".to_string(),
    };
    let graphql = error.to_graphql(config).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "code": "CONFIG_INVALID_PORT",
        "config_file": "/etc/config.toml",
        "port": 8080
      },
      "message": "Invalid port"
    }
    "#);
}

#[test]
fn test_renamed_field_pascal_case_screaming_snake_code_graphql() {
    let error = ErrorWithRenamedField::WithRename {
        my_field: "value".to_string(),
    };
    let config = FormatConfig {
        field_case: FieldCase::PascalCase,
        code_case: CodeCase::ScreamingSnakeCase,
    };
    let graphql = error.to_graphql(config).unwrap();
    assert_json_snapshot!(graphql, @r#"
    {
      "extensions": {
        "MyRenamedField": "value",
        "code": "TEST_RENAMED_FIELD"
      },
      "message": "Field was renamed"
    }
    "#);
}