feat: set message for multiple revsets
Allows to set the revision message of multiple revisions by passing them as arguments. This only supports simple revisions, such as `@`, `@-`, `xs`, and so on. Comple revisions such as `@..@-` are not supported. Fixes: #5
This commit is contained in:
@@ -15,6 +15,10 @@ pub struct MockJjExecutor {
|
||||
is_repo_response: Result<bool, Error>,
|
||||
/// Response to return from describe()
|
||||
describe_response: Result<(), Error>,
|
||||
/// Track described revsets
|
||||
described_revsets: Mutex<Vec<String>>,
|
||||
/// Track response to return from get_description()
|
||||
get_description_response: Result<String, Error>,
|
||||
/// Track calls to is_repository()
|
||||
is_repo_called: AtomicBool,
|
||||
/// Track calls to describe() with the message passed
|
||||
@@ -26,6 +30,8 @@ impl Default for MockJjExecutor {
|
||||
Self {
|
||||
is_repo_response: Ok(true),
|
||||
describe_response: Ok(()),
|
||||
described_revsets: Mutex::new(Vec::new()),
|
||||
get_description_response: Ok(String::new()),
|
||||
is_repo_called: AtomicBool::new(false),
|
||||
describe_calls: Mutex::new(Vec::new()),
|
||||
}
|
||||
@@ -50,6 +56,12 @@ impl MockJjExecutor {
|
||||
self
|
||||
}
|
||||
|
||||
/// Configure get_description() to return a specific value
|
||||
pub fn with_get_description_response(mut self, response: Result<String, Error>) -> Self {
|
||||
self.get_description_response = response;
|
||||
self
|
||||
}
|
||||
|
||||
/// Check if is_repository() was called
|
||||
pub fn was_is_repo_called(&self) -> bool {
|
||||
self.is_repo_called
|
||||
@@ -60,6 +72,11 @@ impl MockJjExecutor {
|
||||
pub fn describe_messages(&self) -> Vec<String> {
|
||||
self.describe_calls.lock().unwrap().clone()
|
||||
}
|
||||
|
||||
/// Get all revsets visited
|
||||
pub fn described_revsets(&self) -> Vec<String> {
|
||||
self.described_revsets.lock().unwrap().clone()
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait(?Send)]
|
||||
@@ -73,7 +90,11 @@ impl JjExecutor for MockJjExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
async fn describe(&self, message: &str) -> Result<(), Error> {
|
||||
async fn describe(&self, revset: &str, message: &str) -> Result<(), Error> {
|
||||
self.described_revsets
|
||||
.lock()
|
||||
.unwrap()
|
||||
.push(revset.to_string());
|
||||
self.describe_calls
|
||||
.lock()
|
||||
.unwrap()
|
||||
@@ -83,6 +104,10 @@ impl JjExecutor for MockJjExecutor {
|
||||
Err(e) => Err(e.clone()),
|
||||
}
|
||||
}
|
||||
|
||||
async fn get_description(&self, _revset: &str) -> Result<String, Error> {
|
||||
self.get_description_response.clone()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -130,7 +155,7 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn mock_describe_records_message() {
|
||||
let mock = MockJjExecutor::new();
|
||||
let result = mock.describe("test message").await;
|
||||
let result = mock.describe("@", "test message").await;
|
||||
assert!(result.is_ok());
|
||||
let messages = mock.describe_messages();
|
||||
assert_eq!(messages.len(), 1);
|
||||
@@ -141,8 +166,8 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn mock_describe_records_multiple_messages() {
|
||||
let mock = MockJjExecutor::new();
|
||||
mock.describe("first message").await.unwrap();
|
||||
mock.describe("second message").await.unwrap();
|
||||
mock.describe("@", "first message").await.unwrap();
|
||||
mock.describe("@", "second message").await.unwrap();
|
||||
let messages = mock.describe_messages();
|
||||
assert_eq!(messages.len(), 2);
|
||||
assert_eq!(messages[0], "first message");
|
||||
@@ -153,7 +178,7 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn mock_describe_returns_error() {
|
||||
let mock = MockJjExecutor::new().with_describe_response(Err(Error::RepositoryLocked));
|
||||
let result = mock.describe("test").await;
|
||||
let result = mock.describe("@", "test").await;
|
||||
assert!(result.is_err());
|
||||
assert!(matches!(result.unwrap_err(), Error::RepositoryLocked));
|
||||
}
|
||||
@@ -164,7 +189,7 @@ mod tests {
|
||||
let mock = MockJjExecutor::new().with_describe_response(Err(Error::JjOperation {
|
||||
context: "transaction failed".to_string(),
|
||||
}));
|
||||
let result = mock.describe("test").await;
|
||||
let result = mock.describe("@", "test").await;
|
||||
assert!(result.is_err());
|
||||
match result.unwrap_err() {
|
||||
Error::JjOperation { context } => {
|
||||
@@ -208,7 +233,7 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn mock_describe_accepts_empty_message() {
|
||||
let mock = MockJjExecutor::new();
|
||||
let result = mock.describe("").await;
|
||||
let result = mock.describe("@", "").await;
|
||||
assert!(result.is_ok());
|
||||
assert_eq!(mock.describe_messages()[0], "");
|
||||
}
|
||||
@@ -218,7 +243,7 @@ mod tests {
|
||||
async fn mock_describe_accepts_long_message() {
|
||||
let mock = MockJjExecutor::new();
|
||||
let long_message = "a".repeat(1000);
|
||||
let result = mock.describe(&long_message).await;
|
||||
let result = mock.describe("@", &long_message).await;
|
||||
assert!(result.is_ok());
|
||||
assert_eq!(mock.describe_messages()[0].len(), 1000);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user