Files
radicle-git/git-trailers/t/src/tests.rs
T
Fintan Halpenny 70b571b67b radicle-git init
Port over all git relevant parts of the radicle-link repository[0].
The packages that are kept are:
* git-ext
* git-ref-format
* git-trailers
* link-git
* macros
* std-ext
* test -- only the portions that test the above

The development and testing scripts are also added for local and CI
testing.

[0]: https://github.com/radicle-dev/radicle-link/
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
2022-09-08 12:07:51 +01:00

156 lines
3.8 KiB
Rust

// Copyright © 2019-2020 The Radicle Foundation <hello@radicle.foundation>
//
// This file is part of radicle-link, distributed under the GPLv3 with Radicle
// Linking Exception. For full terms see the included LICENSE file.
use std::{borrow::Cow, convert::TryFrom as _, ops::Deref as _};
use assert_matches::assert_matches;
use git_trailers::{display, parse, Error, Token, Trailer};
use pretty_assertions::assert_eq;
#[test]
fn parse_message_with_valid_trailers() {
let msg = r#"Subject
A multiline
description.
Co-authored-by: John Doe <john.doe@test.com>
Ticket: #42
Tested-by:
John <john@test.com>
Jane <jane@test.com>
Just-a-token:
"#;
assert_eq!(
parse(msg, ":").unwrap(),
vec![
new_trailer("Co-authored-by", &["John Doe <john.doe@test.com>"]),
new_trailer("Ticket", &["#42"]),
new_trailer(
"Tested-by",
&["John <john@test.com>", "Jane <jane@test.com>"]
),
new_trailer("Just-a-token", &[]),
]
)
}
#[test]
fn parse_message_trailers_with_custom_separators() {
let separators = ":=$";
let msg = r#"Subject
A multiline
description.
Co-authored-by: John Doe <john.doe@test.com>
Ticket = #42
Tested-by $User <user@test.com>
John <john@test.com>
Jane <jane@test.com>
"#;
assert_eq!(
parse(msg, separators).unwrap(),
vec![
new_trailer("Co-authored-by", &["John Doe <john.doe@test.com>"]),
new_trailer("Ticket", &["#42"]),
new_trailer(
"Tested-by",
&[
"User <user@test.com>",
"John <john@test.com>",
"Jane <jane@test.com>"
]
),
]
)
}
#[test]
fn parse_message_trailers_with_missing_token() {
let msg = r#"Subject
Good-trailer: true
John Doe <john.doe@test.com> # Unparsable token due to missing token"#;
assert_matches!(
parse(msg, ":"),
Err(Error::Trailing(s))
if s == "John Doe <john.doe@test.com> # Unparsable token due to missing token"
)
}
#[test]
fn parse_message_trailers_with_invalid_token() {
let msg = r#"Subject
Good-trailer: true
&!#: John Doe <john.doe@test.com> # Unparsable token due to invalid token"#;
assert_matches!(
parse(msg, ":"),
Err(Error::Trailing(s))
if s == "&!#: John Doe <john.doe@test.com> # Unparsable token due to invalid token"
)
}
#[test]
fn parse_message_with_only_trailers() {
let msg = r#"Co-authored-by: John Doe <john.doe@test.com>
Ticket: #42
Tested-by: Tester <tester@test.com>
"#;
assert_eq!(
parse(msg, ":").unwrap(),
vec![
new_trailer("Co-authored-by", &["John Doe <john.doe@test.com>"]),
new_trailer("Ticket", &["#42"]),
new_trailer("Tested-by", &["Tester <tester@test.com>"]),
]
)
}
#[test]
fn parse_empty_message() {
let msg = "";
assert_matches!(parse(msg, ":"), Err(Error::MissingParagraph))
}
#[test]
fn display_static() {
let msg = r#"Tested-by: Alice
Bob
Carol
Dylan
Acked-by: Eve"#;
let parsed = parse(msg, ":").unwrap();
let rendered = format!("{}", display(": ", &parsed));
assert_eq!(&rendered, msg);
}
#[test]
fn display_dynamic() {
let msg = r#"Co-authored-by: John Doe <john.doe@test.com>
Tested-by: Tester <tester@test.com>
Fixes #42"#;
let parsed = parse(msg, ":#").unwrap();
let rendered = format!(
"{}",
display(
|t: &Token| if t.deref() == "Fixes" { " #" } else { ": " },
&parsed
)
);
assert_eq!(rendered, msg)
}
fn new_trailer<'a>(token: &'a str, values: &[&'a str]) -> Trailer<'a> {
Trailer {
token: Token::try_from(token).unwrap(),
values: values.iter().map(|s| Cow::from(*s)).collect(),
}
}