yerba 0.4.1

YAML Editing and Refactoring with Better Accuracy
use indoc::indoc;

#[test]
fn test_duplicate_key_at_root() {
  let result = yerba::parse(indoc! {"
    host: localhost
    port: 5432
    host: 0.0.0.0
  "});

  let error = result.unwrap_err();
  let message = format!("{}", error);

  assert!(message.contains("duplicate key \"host\""));
  assert!(message.contains("on line 3"));
  assert!(message.contains("first defined on line 1"));
}

#[test]
fn test_duplicate_key_in_nested_map() {
  let result = yerba::parse(indoc! {"
    database:
      host: localhost
      port: 5432
      host: 0.0.0.0
  "});

  let error = result.unwrap_err();
  let message = format!("{}", error);

  assert!(message.contains("duplicate key \"host\""));
  assert!(message.contains("on line 4"));
  assert!(message.contains("first defined on line 2"));
}

#[test]
fn test_duplicate_key_in_sequence_item() {
  let result = yerba::parse(indoc! {"
    - id: talk-1
      title: First
      id: duplicate
  "});

  let error = result.unwrap_err();
  let message = format!("{}", error);

  assert!(message.contains("duplicate key \"id\""));
}

#[test]
fn test_no_duplicate_keys_across_sequence_items() {
  let result = yerba::parse(indoc! {"
    - id: talk-1
      title: First
    - id: talk-2
      title: Second
  "});

  assert!(result.is_ok());
}

#[test]
fn test_no_duplicate_keys_across_nested_maps() {
  let result = yerba::parse(indoc! {"
    database:
      host: localhost
    cache:
      host: redis
  "});

  assert!(result.is_ok());
}

#[test]
fn test_no_error_on_valid_file() {
  let result = yerba::parse(indoc! {"
    host: localhost
    port: 5432
    name: myapp
  "});

  assert!(result.is_ok());
}

#[test]
fn test_duplicate_key_shows_line_content() {
  let result = yerba::parse(indoc! {"
    host: localhost
    port: 5432
    host: 0.0.0.0
  "});

  let error = result.unwrap_err();
  let message = format!("{}", error);

  assert!(message.contains("host: 0.0.0.0"));
}