rulemorph 0.3.4

YAML-based declarative data transformation engine for CSV/JSON to JSON
Documentation
use serde_json::json;

use crate::{TransformErrorKind, run_err, run_ok};

#[test]
fn v2_sort_by_order_type_and_stable_ties_are_characterized() {
    let yaml = r#"
version: 2
input:
  format: json
mappings:
  - target: "score_desc"
    expr:
      - "@input.users"
      - sort_by:
          - "@item.score"
          - desc
  - target: "name_asc"
    expr:
      - "@input.users"
      - sort_by: ["@item.name"]
  - target: "flag_asc"
    expr:
      - "@input.users"
      - sort_by: ["@item.flag"]
"#;
    let input = r#"[{
        "users": [
            {"id":"a","score":2,"name":"Bob","flag":true},
            {"id":"b","score":1,"name":"Alice","flag":false},
            {"id":"c","score":2,"name":"Carol","flag":true}
        ]
    }]"#;

    assert_eq!(
        run_ok(yaml, input),
        json!([{
            "score_desc": [
                {"id":"a","score":2,"name":"Bob","flag":true},
                {"id":"c","score":2,"name":"Carol","flag":true},
                {"id":"b","score":1,"name":"Alice","flag":false}
            ],
            "name_asc": [
                {"id":"b","score":1,"name":"Alice","flag":false},
                {"id":"a","score":2,"name":"Bob","flag":true},
                {"id":"c","score":2,"name":"Carol","flag":true}
            ],
            "flag_asc": [
                {"id":"b","score":1,"name":"Alice","flag":false},
                {"id":"a","score":2,"name":"Bob","flag":true},
                {"id":"c","score":2,"name":"Carol","flag":true}
            ]
        }])
    );
}

#[test]
fn v2_sort_by_invalid_order_and_mixed_key_errors_keep_paths() {
    let invalid_order_yaml = r#"
version: 2
input:
  format: json
mappings:
  - target: "out"
    expr:
      - "@input.users"
      - sort_by:
          - "@item.score"
          - sideways
"#;
    let err = run_err(invalid_order_yaml, r#"[{"users":[{"score":1}]}]"#);
    assert_eq!(err.kind, TransformErrorKind::ExprError);
    assert_eq!(err.path.as_deref(), Some("mappings[0].expr[1].args[1]"));
    assert_eq!(err.message, "order must be asc or desc");

    let mixed_key_yaml = r#"
version: 2
input:
  format: json
mappings:
  - target: "out"
    expr:
      - "@input.users"
      - sort_by: ["@item.key"]
"#;
    let err = run_err(mixed_key_yaml, r#"[{"users":[{"key":1},{"key":"two"}]}]"#);
    assert_eq!(err.kind, TransformErrorKind::ExprError);
    assert_eq!(err.path.as_deref(), Some("mappings[0].expr[1].args[0]"));
    assert_eq!(err.message, "sort_by keys must be all the same type");
}