yerba 0.1.0

YAML Editing and Refactoring with Better Accuracy
Documentation
use yerba::{Document, InsertPosition};

#[test]
fn test_insert_key_at_end() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("database.ssl", "true", InsertPosition::Last)
    .unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  host: localhost\n  port: 5432\n  ssl: true\n"
  );
}

#[test]
fn test_insert_key_at_index() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("database.ssl", "true", InsertPosition::At(0))
    .unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  ssl: true\n  host: localhost\n  port: 5432\n"
  );
}

#[test]
fn test_insert_key_after() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n  name: myapp\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("database.ssl", "true", InsertPosition::After("host".to_string()))
    .unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  host: localhost\n  ssl: true\n  port: 5432\n  name: myapp\n"
  );
}

#[test]
fn test_insert_key_before() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n  name: myapp\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("database.ssl", "true", InsertPosition::Before("port".to_string()))
    .unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  host: localhost\n  ssl: true\n  port: 5432\n  name: myapp\n"
  );
}

#[test]
fn test_insert_key_preserves_comments() {
  let yaml = "# Config\ndatabase:\n  host: localhost\n  port: 5432\n# End\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("database.ssl", "true", InsertPosition::Last)
    .unwrap();

  assert_eq!(
    document.to_string(),
    "# Config\ndatabase:\n  host: localhost\n  port: 5432\n  ssl: true\n# End\n"
  );
}

#[test]
fn test_insert_duplicate_key_errors() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n";
  let mut document = Document::parse(yaml).unwrap();

  assert!(document
    .insert_into("database.host", "newvalue", InsertPosition::Last)
    .is_err());
}

#[test]
fn test_insert_root_level_key() {
  let yaml = "host: localhost\nport: 5432\n";
  let mut document = Document::parse(yaml).unwrap();

  document.insert_into("ssl", "true", InsertPosition::Last).unwrap();

  assert_eq!(document.to_string(), "host: localhost\nport: 5432\nssl: true\n");
}

#[test]
fn test_insert_key_after_nonexistent_errors() {
  let yaml = "database:\n  host: localhost\n";
  let mut document = Document::parse(yaml).unwrap();

  assert!(document
    .insert_into("database.ssl", "true", InsertPosition::After("missing".to_string()),)
    .is_err());
}

#[test]
fn test_insert_from_sort_order_middle() {
  let yaml = "database:\n  host: localhost\n  name: myapp\n";
  let mut document = Document::parse(yaml).unwrap();

  let order = vec!["host".to_string(), "port".to_string(), "name".to_string()];

  document
    .insert_into("database.port", "5432", InsertPosition::FromSortOrder(order))
    .unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  host: localhost\n  port: 5432\n  name: myapp\n"
  );
}

#[test]
fn test_insert_from_sort_order_first() {
  let yaml = "database:\n  port: 5432\n  name: myapp\n";
  let mut document = Document::parse(yaml).unwrap();

  let order = vec!["host".to_string(), "port".to_string(), "name".to_string()];

  document
    .insert_into("database.host", "localhost", InsertPosition::FromSortOrder(order))
    .unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  host: localhost\n  port: 5432\n  name: myapp\n"
  );
}

#[test]
fn test_insert_from_sort_order_key_not_in_order() {
  let yaml = "database:\n  host: localhost\n  port: 5432\n";
  let mut document = Document::parse(yaml).unwrap();

  let order = vec!["host".to_string(), "port".to_string()];

  document
    .insert_into("database.ssl", "true", InsertPosition::FromSortOrder(order))
    .unwrap();

  assert_eq!(
    document.to_string(),
    "database:\n  host: localhost\n  port: 5432\n  ssl: true\n"
  );
}

#[test]
fn test_insert_into_nested_map() {
  let yaml = "settings:\n  debug: true\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("settings.db_host", "localhost", InsertPosition::Last)
    .unwrap();

  assert_eq!(document.to_string(), "settings:\n  debug: true\n  db_host: localhost\n");
}

#[test]
fn test_insert_into_deeply_nested_map() {
  let yaml = "a:\n  b:\n    c: 1\n";
  let mut document = Document::parse(yaml).unwrap();

  document.insert_into("a.b.d", "2", InsertPosition::Last).unwrap();

  assert_eq!(document.to_string(), "a:\n  b:\n    c: 1\n    d: 2\n");
}

#[test]
fn test_insert_into_sequence_at_end() {
  let yaml = "tags:\n  - ruby\n  - rust\n";
  let mut document = Document::parse(yaml).unwrap();

  document.insert_into("tags", "yaml", InsertPosition::Last).unwrap();

  assert_eq!(document.to_string(), "tags:\n  - ruby\n  - rust\n  - yaml\n");
}

#[test]
fn test_insert_into_sequence_at_index() {
  let yaml = "tags:\n  - ruby\n  - rust\n";
  let mut document = Document::parse(yaml).unwrap();

  document.insert_into("tags", "yaml", InsertPosition::At(0)).unwrap();

  assert_eq!(document.to_string(), "tags:\n  - yaml\n  - ruby\n  - rust\n");
}

#[test]
fn test_insert_into_sequence_before() {
  let yaml = "tags:\n  - ruby\n  - rust\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("tags", "yaml", InsertPosition::Before("rust".to_string()))
    .unwrap();

  assert_eq!(document.to_string(), "tags:\n  - ruby\n  - yaml\n  - rust\n");
}

#[test]
fn test_insert_into_sequence_after() {
  let yaml = "tags:\n  - ruby\n  - rust\n";
  let mut document = Document::parse(yaml).unwrap();

  document
    .insert_into("tags", "yaml", InsertPosition::After("ruby".to_string()))
    .unwrap();

  assert_eq!(document.to_string(), "tags:\n  - ruby\n  - yaml\n  - rust\n");
}